Module: Queries::Concerns::DataAttributes

Extended by:
ActiveSupport::Concern
Includes:
Helpers
Included in:
BiologicalAssociationsGraph::Filter, Queries::CollectingEvent::Filter, Otu::Filter, Person::Filter, Serial::Filter
Defined in:
lib/queries/concerns/data_attributes.rb

Overview

Linking DataAttribute to queries that reference DataAttributes

For filter queries: !! requires a `base_query` method ?! … or not !! requires `set_data_attributes_params` be called in initialize()

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers

#boolean_param

Class Method Details

.merge_clausesObject

TODO: this as class method is bad,

it prevents us from adding optimizing logic
that restricts the number of clauses


226
227
228
229
230
231
232
233
234
235
# File 'lib/queries/concerns/data_attributes.rb', line 226

def self.merge_clauses
  [
    :data_attribute_exact_pair_facet,
    :data_attribute_predicate_id_facet,
    :data_attribute_wildcard_pair_facet,
    :data_attribute_without_predicate_id_facet,
    :data_attributes_facet,
    :value_facet
  ]
end

.paramsObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/queries/concerns/data_attributes.rb', line 10

def self.params
  [
    :data_attributes,

    :data_attribute_predicate_id,
    :data_attribute_without_predicate_id,
    :data_attribute_exact_value,
    :data_attribute_wildcard_value,
    :data_attribute_exact_pair,
    :data_attribute_wildcard_pair,

    data_attribute_predicate_id: [],
    data_attribute_without_predicate_id: [],
    data_attribute_exact_value: [],
    data_attribute_wildcard_value: [],
    data_attribute_exact_pair: [],
    data_attribute_wildcard_pair: [],
  ]
end

Instance Method Details

#data_attribute_exact_pair_facetObject



200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/queries/concerns/data_attributes.rb', line 200

def data_attribute_exact_pair_facet
  return nil if data_attribute_exact_pair.blank?
  a = []
  data_attribute_exact_pair.each do |k,v|
    a.push data_attribute_table[:controlled_vocabulary_term_id].eq(k).and( data_attribute_table[:value].eq(v) )
  end
  w = a.shift
  a.each do |c|
    w = w.or(c)
  end

  referenced_klass.joins(:data_attributes).where(w)
end

#data_attribute_predicate_id_facetObject



139
140
141
142
# File 'lib/queries/concerns/data_attributes.rb', line 139

def data_attribute_predicate_id_facet
  return nil if data_attribute_predicate_id.blank?
  referenced_klass.joins(:data_attributes).where(data_attributes: {controlled_vocabulary_term_id: data_attribute_predicate_id})
end

#data_attribute_tableArel::Table

Returns:

  • (Arel::Table)


135
136
137
# File 'lib/queries/concerns/data_attributes.rb', line 135

def data_attribute_table
  ::DataAttribute.arel_table
end

#data_attribute_wildcard_pair_facetObject



186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/queries/concerns/data_attributes.rb', line 186

def data_attribute_wildcard_pair_facet
  return nil if data_attribute_wildcard_pair.blank?
  a = []
  data_attribute_wildcard_pair.each do |k,v|
    a.push data_attribute_table[:controlled_vocabulary_term_id].eq(k).and( data_attribute_table[:value].matches(wildcard_value(v)) )
  end
  w = a.shift
  a.each do |c|
    w = w.or(c)
  end

  referenced_klass.joins(:data_attributes).where(w)
end

#data_attribute_without_predicate_id_facetObject



144
145
146
147
148
149
150
151
152
153
154
# File 'lib/queries/concerns/data_attributes.rb', line 144

def data_attribute_without_predicate_id_facet
  return nil if data_attribute_without_predicate_id.blank?
  not_these = referenced_klass.left_joins(:data_attributes).where(data_attributes: {controlled_vocabulary_term_id: data_attribute_without_predicate_id})

  # a Not exists without using .exists
  s = 'WITH not_these AS (' + not_these.to_sql + ') ' +
    referenced_klass.joins("LEFT JOIN not_these AS not_these1 ON not_these1.id = #{table.name}.id")
    .where('not_these1.id IS NULL').to_sql

  referenced_klass.from("(#{s}) as #{table.name}")
end

#data_attributes_facetObject



214
215
216
217
218
219
220
221
# File 'lib/queries/concerns/data_attributes.rb', line 214

def data_attributes_facet
  return nil if data_attributes.nil?
  if data_attributes
    referenced_klass.joins(:data_attributes).distinct
  else
    referenced_klass.where.missing(:data_attributes)
  end
end

#set_data_attributes_params(params) ⇒ Object



123
124
125
126
127
128
129
130
131
132
# File 'lib/queries/concerns/data_attributes.rb', line 123

def set_data_attributes_params(params)
  @data_attribute_predicate_id = params[:data_attribute_predicate_id]
  @data_attribute_without_predicate_id = params[:data_attribute_without_predicate_id]
  @data_attribute_exact_value = params[:data_attribute_exact_value]
  @data_attribute_wildcard_value = params[:data_attribute_wildcard_value]
  @data_attribute_exact_pair = params[:data_attribute_exact_pair]
  @data_attribute_wildcard_pair = params[:data_attribute_wildcard_pair]

  @data_attributes = boolean_param(params, :data_attributes)
end

#value_facetObject



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/queries/concerns/data_attributes.rb', line 161

def value_facet
  return nil if data_attribute_exact_value.blank?  && data_attribute_wildcard_value.blank?

  a,b = nil, nil

  if data_attribute_wildcard_value.present?
    v = self.data_attribute_wildcard_value.collect{|a| wildcard_value(a) } # TODO: should be standardized much earlier on
    a = data_attribute_table[:value].matches_any(v)
  end

  b = data_attribute_table[:value].eq_any(data_attribute_exact_value) if data_attribute_exact_value.present?

  q = referenced_klass.joins(:data_attributes)

  if a && b
    q.where(a.or(b))
  elsif a
    q.where(a)
  elsif b
    q.where(b)
  else
    nil
  end
end

#wildcard_value(value) ⇒ Object

TODO: get rid of this



157
158
159
# File 'lib/queries/concerns/data_attributes.rb', line 157

def wildcard_value(value)
  '%' + value.to_s.strip.gsub(/\s+/, '%') + '%'
end