Module: Queries::BiologicalAssociation

Defined in:
lib/queries/biological_association/filter.rb,
lib/queries/biological_association/autocomplete.rb

Defined Under Namespace

Classes: Autocomplete, Filter

Instance Method Summary collapse

Instance Method Details

#collection_object_facetObject

Unused



1136
1137
1138
# File 'lib/queries/biological_association/filter.rb', line 1136

def collection_object_facet
  subject_object_scope(subject_collection_object_query, object_collection_object_query, 'CollectionObject' )
end

#otu_facetObject

Unused



1131
1132
1133
# File 'lib/queries/biological_association/filter.rb', line 1131

def otu_facet
  subject_object_scope(subject_otu_query, object_otu_query, 'Otu' )
end

#subject_object_scope(subject_query, object_query, target = 'Otu') ⇒ Object

rubocop:disable Metrics/MethodLength This is “or”



1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
# File 'lib/queries/biological_association/filter.rb', line 1075

def subject_object_scope(subject_query, object_query, target = 'Otu')
  a = subject_query
  b = object_query

  a_sql, b_sql = nil, nil

  if !a.nil? && !a.only_project?
    a_sql = a.all.to_sql
  end

  if !b.nil? && !b.only_project?
    b_sql = b.all.to_sql
  end

  return nil if a_sql.nil? and b_sql.nil?

  # Setup for "WITH" use
  t = []
  t.push 'a_objects AS (' + a_sql + ')' if a_sql
  t.push 'b_objects AS (' + b_sql + ')' if b_sql && (b_sql != a_sql)

  s = 'WITH ' + t.join(', ')

  # subject/object queries reference different params
  if a_sql && b_sql && (a_sql != b_sql)
    s << ' ' + ::BiologicalAssociation
      .joins("LEFT JOIN a_objects as a_objects1 on a_objects1.id = biological_associations.biological_association_subject_id AND biological_associations.biological_association_subject_type = '" + target + "'")
      .joins("LEFT JOIN b_objects as b_objects1 on b_objects1.id = biological_associations.biological_association_object_id AND biological_associations.biological_association_object_type = '" + target + "'")
      .where('a_objects1.id is not null').or('b_objects1.id is not null')
      .to_sql

    # subject/object queries reference same params
  elsif a_sql && b_sql
    s << ' ' + ::BiologicalAssociation
      .joins("LEFT JOIN a_objects as a_objects1 on a_objects1.id = biological_associations.biological_association_subject_id AND biological_associations.biological_association_subject_type = '" + target + "'")
      .joins("LEFT JOIN a_objects as a_objects2 on a_objects2.id = biological_associations.biological_association_object_id AND biological_associations.biological_association_object_type = '" + target + "'")
      .where('a_objects1.id is not null').or('a_objects2.id is not null')
      .to_sql

    # subject only
  elsif a_sql
    s << ' ' + ::BiologicalAssociation
      .joins("JOIN a_objects as a_objects1 on a_objects1.id = biological_associations.biological_association_subject_id AND biological_associations.biological_association_subject_type = '" + target + "'")
      .to_sql

    # object_only
  else
    s << ' ' + ::BiologicalAssociation
      .joins("JOIN b_objects as b_objects1 on b_objects1.id = biological_associations.biological_association_object_id AND biological_associations.biological_association_object_type = '" + target + "'")
      .to_sql
  end

  return ::BiologicalAssociation.from('(' + s + ') as biological_associations')
end