Module: Queries::Concerns::DataAttributes
- Extended by:
- ActiveSupport::Concern
- Includes:
- Helpers
- Included in:
- AssertedDistribution::Filter, BiologicalAssociation::Filter, BiologicalAssociationsGraph::Filter, Queries::CollectingEvent::Filter, Queries::CollectionObject::Filter, FieldOccurrence::Filter, Observation::Filter, Otu::Filter, Person::Filter, Serial::Filter, Source::Filter, TaxonName::Filter
- Defined in:
- lib/queries/concerns/data_attributes.rb
Overview
Linking DataAttribute to queries that reference DataAttributes
For filter queries: !! requires ‘set_data_attributes_params` be called in initialize()
Class Method Summary collapse
-
.merge_clauses ⇒ Object
TODO: this as class method is bad, it prevents us from adding optimizing logic that restricts the number of clauses.
- .params ⇒ Object
Instance Method Summary collapse
- #data_attribute_exact_pair_facet ⇒ Object
- #data_attribute_import_exact_pair_facet ⇒ Object
- #data_attribute_import_predicate_facet ⇒ Object
- #data_attribute_import_wildcard_pair_facet ⇒ Object
- #data_attribute_predicate_id_facet ⇒ Object
- #data_attribute_table ⇒ Arel::Table
- #data_attribute_wildcard_pair_facet ⇒ Object
- #data_attribute_without_predicate_id_facet ⇒ Object
- #data_attributes_facet ⇒ Object
- #import_value_facet ⇒ Object
- #set_data_attributes_params(params) ⇒ Object
- #value_facet ⇒ Object
-
#wildcard_value(value) ⇒ Object
TODO: get rid of this.
Methods included from Helpers
#boolean_param, #integer_param, #split_pairs, #split_repeated_pairs
Class Method Details
.merge_clauses ⇒ Object
TODO: this as class method is bad,
it prevents us from adding optimizing logic
that restricts the number of clauses
329 330 331 332 333 334 335 336 337 338 339 340 341 342 |
# File 'lib/queries/concerns/data_attributes.rb', line 329 def self.merge_clauses [ :data_attribute_import_exact_pair_facet, :data_attribute_exact_pair_facet, :data_attribute_import_predicate_facet, :data_attribute_predicate_id_facet, :data_attribute_wildcard_pair_facet, :data_attribute_import_wildcard_pair_facet, :data_attribute_without_predicate_id_facet, :data_attributes_facet, :value_facet, :import_value_facet ] end |
.params ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/queries/concerns/data_attributes.rb', line 9 def self.params [ :data_attributes, :data_attribute_import_exact_pair, :data_attribute_import_exact_value, :data_attribute_import_predicate, :data_attribute_import_wildcard_value, :data_attribute_import_wildcard_pair, :data_attribute_exact_pair, :data_attribute_exact_value, :data_attribute_predicate_id, :data_attribute_wildcard_pair, :data_attribute_wildcard_value, :data_attribute_without_predicate_id, data_attribute_exact_pair: [], data_attribute_exact_value: [], data_attribute_predicate_id: [], data_attribute_wildcard_pair: [], data_attribute_wildcard_value: [], data_attribute_without_predicate_id: [], data_attribute_import_wildcard_pair: [], data_attribute_import_exact_pair: [], data_attribute_import_exact_value: [], data_attribute_import_predicate: [], data_attribute_import_wildcard_value: [], ] end |
Instance Method Details
#data_attribute_exact_pair_facet ⇒ Object
289 290 291 292 293 294 295 296 297 298 299 300 301 |
# File 'lib/queries/concerns/data_attributes.rb', line 289 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(:internal_attributes).where(w).distinct end |
#data_attribute_import_exact_pair_facet ⇒ Object
303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'lib/queries/concerns/data_attributes.rb', line 303 def data_attribute_import_exact_pair_facet return nil if data_attribute_import_exact_pair.blank? a = [] data_attribute_import_exact_pair.each do |k,v| a.push data_attribute_table[:import_predicate].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(:import_attributes).where(w) end |
#data_attribute_import_predicate_facet ⇒ Object
188 189 190 191 |
# File 'lib/queries/concerns/data_attributes.rb', line 188 def data_attribute_import_predicate_facet return nil if data_attribute_import_predicate.empty? referenced_klass.joins(:import_attributes).where(data_attributes: {import_predicate: data_attribute_import_predicate}) end |
#data_attribute_import_wildcard_pair_facet ⇒ Object
275 276 277 278 279 280 281 282 283 284 285 286 287 |
# File 'lib/queries/concerns/data_attributes.rb', line 275 def data_attribute_import_wildcard_pair_facet return nil if data_attribute_import_wildcard_pair.blank? a = [] data_attribute_import_wildcard_pair.each do |k,v| a.push data_attribute_table[:import_predicate].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(:import_attributes).where(w) end |
#data_attribute_predicate_id_facet ⇒ Object
183 184 185 186 |
# File 'lib/queries/concerns/data_attributes.rb', line 183 def data_attribute_predicate_id_facet return nil if data_attribute_predicate_id.blank? referenced_klass.joins(:internal_attributes).where(data_attributes: {controlled_vocabulary_term_id: data_attribute_predicate_id}) end |
#data_attribute_table ⇒ Arel::Table
179 180 181 |
# File 'lib/queries/concerns/data_attributes.rb', line 179 def data_attribute_table ::DataAttribute.arel_table end |
#data_attribute_wildcard_pair_facet ⇒ Object
261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/queries/concerns/data_attributes.rb', line 261 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(:internal_attributes).where(w).distinct end |
#data_attribute_without_predicate_id_facet ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/queries/concerns/data_attributes.rb', line 194 def data_attribute_without_predicate_id_facet return nil if data_attribute_without_predicate_id.blank? not_these = referenced_klass.left_joins(:internal_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_facet ⇒ Object
317 318 319 320 321 322 323 324 |
# File 'lib/queries/concerns/data_attributes.rb', line 317 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 |
#import_value_facet ⇒ Object
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/queries/concerns/data_attributes.rb', line 236 def import_value_facet return nil if data_attribute_import_exact_value.blank? && data_attribute_import_wildcard_value.blank? a,b = nil, nil if data_attribute_import_wildcard_value.present? v = data_attribute_import_wildcard_value.collect{|z| wildcard_value(z) } # TODO: should be standardized much earlier on a = data_attribute_table[:value].matches_any(v) end b = data_attribute_table[:value].in(data_attribute_import_exact_value) if data_attribute_import_exact_value.present? q = referenced_klass.joins(:import_attributes) if a && b q.where(a.or(b)) elsif a q.where(a) elsif b q.where(b) else nil end end |
#set_data_attributes_params(params) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/queries/concerns/data_attributes.rb', line 161 def set_data_attributes_params(params) @data_attribute_import_exact_pair = params[:data_attribute_import_exact_pair] @data_attribute_import_exact_value = params[:data_attribute_import_exact_value] @data_attribute_import_predicate = params[:data_attribute_import_predicate] @data_attribute_import_wildcard_value = params[:data_attribute_import_wildcard_value] @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_attribute_import_wildcard_pair = params[:data_attribute_import_wildcard_pair] @data_attributes = boolean_param(params, :data_attributes) end |
#value_facet ⇒ Object
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/queries/concerns/data_attributes.rb', line 211 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 = 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].in(data_attribute_exact_value) if data_attribute_exact_value.present? q = referenced_klass.joins(:internal_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
207 208 209 |
# File 'lib/queries/concerns/data_attributes.rb', line 207 def wildcard_value(value) '%' + value.to_s.strip.gsub(/\s+/, '%') + '%' end |