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_row_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, #tri_value_array
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
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 |
# File 'lib/queries/concerns/data_attributes.rb', line 484 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_row_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 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/queries/concerns/data_attributes.rb', line 9 def self.params [ :data_attributes, # API only :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, # API only :data_attribute_exact_value, # API only :data_attribute_predicate_id, # API only :data_attribute_wildcard_pair, # API only :data_attribute_wildcard_value, # API only :data_attribute_without_predicate_id, # API only :data_attribute_predicate_row_id, :data_attribute_value, :data_attribute_value_negator, :data_attribute_value_type, :data_attribute_combine_logic, data_attribute_exact_pair: [], # API only data_attribute_exact_value: [], # API only data_attribute_predicate_id: [], # API only data_attribute_wildcard_pair: [], # API only data_attribute_wildcard_value: [], # API only data_attribute_without_predicate_id: [], # API only data_attribute_predicate_row_id: [], data_attribute_value: [], data_attribute_value_negator: [], data_attribute_value_type: [], data_attribute_combine_logic: [], 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
444 445 446 447 448 449 450 451 452 453 454 455 456 |
# File 'lib/queries/concerns/data_attributes.rb', line 444 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
458 459 460 461 462 463 464 465 466 467 468 469 470 |
# File 'lib/queries/concerns/data_attributes.rb', line 458 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
344 345 346 347 |
# File 'lib/queries/concerns/data_attributes.rb', line 344 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
430 431 432 433 434 435 436 437 438 439 440 441 442 |
# File 'lib/queries/concerns/data_attributes.rb', line 430 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
271 272 273 274 |
# File 'lib/queries/concerns/data_attributes.rb', line 271 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_row_facet ⇒ Object
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 |
# File 'lib/queries/concerns/data_attributes.rb', line 276 def data_attribute_row_facet return nil if data_attribute_predicate_row_id.empty? queries = [] data_attribute_value_type.map(&:to_sym).each_with_index do |value_type, i| id = data_attribute_predicate_row_id[i].to_i value = data_attribute_value[i] negator = data_attribute_value_negator[i] q = nil case value_type when :exact, :wildcard value_clause = if value_type == :exact data_attribute_table[:value].eq(value) else data_attribute_table[:value].matches("%#{value}%") end value_clause = value_clause.not if negator if id > 0 value_clause = value_clause.and( data_attribute_table[:controlled_vocabulary_term_id].eq(id) ) end q = referenced_klass .joins(:internal_attributes) .where(value_clause) .distinct when :any, :no has_attr = (value_type == :any && !negator) || (value_type == :no && negator) if id == 0 # any predicate q = has_attr ? referenced_klass.joins(:internal_attributes) : referenced_klass.left_joins(:internal_attributes) .where(data_attributes: { id: nil }) else with_predicate = referenced_klass .joins(:internal_attributes) .where(data_attributes: { controlled_vocabulary_term_id: id }) q = has_attr ? with_predicate : referenced_klass.where.not(id: with_predicate) end q.distinct end queries << q end return nil if queries.empty? q = queries.first data_attribute_combine_logic.each_with_index do |c, i| if c.nil? q = referenced_klass_intersection([q, queries[i + 1]]) elsif c == true q = referenced_klass_union([q, queries[i + 1]]) else q = q.where.not(id: queries[i + 1]) end end q end |
#data_attribute_table ⇒ Arel::Table
267 268 269 |
# File 'lib/queries/concerns/data_attributes.rb', line 267 def data_attribute_table ::DataAttribute.arel_table end |
#data_attribute_wildcard_pair_facet ⇒ Object
416 417 418 419 420 421 422 423 424 425 426 427 428 |
# File 'lib/queries/concerns/data_attributes.rb', line 416 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
349 350 351 352 353 354 355 356 357 358 359 |
# File 'lib/queries/concerns/data_attributes.rb', line 349 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
472 473 474 475 476 477 478 479 |
# File 'lib/queries/concerns/data_attributes.rb', line 472 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
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'lib/queries/concerns/data_attributes.rb', line 391 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
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/queries/concerns/data_attributes.rb', line 218 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) row_count = [params[:data_attribute_predicate_row_id]].flatten.compact.count return if ( row_count == 0 || [params[:data_attribute_value]].flatten.compact.count != row_count || [params[:data_attribute_value_type]].flatten.compact.count != row_count ) negators = tri_value_array(params[:data_attribute_value_negator]) negators = Array.new(row_count) if negators.empty? && params[:data_attribute_value_negator].nil? combine_logic = tri_value_array(params[:data_attribute_combine_logic]) if combine_logic.empty? && params[:data_attribute_combine_logic].nil? combine_logic = Array.new(row_count) elsif combine_logic.length == row_count - 1 combine_logic = combine_logic + [nil] end return if ( negators.length != row_count || combine_logic.length != row_count ) @data_attribute_predicate_row_id = [params[:data_attribute_predicate_row_id]].flatten.compact @data_attribute_value = [params[:data_attribute_value]].flatten.compact @data_attribute_value_negator = negators @data_attribute_value_type = [params[:data_attribute_value_type]].flatten.compact @data_attribute_combine_logic = combine_logic end |
#value_facet ⇒ Object
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 |
# File 'lib/queries/concerns/data_attributes.rb', line 366 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
362 363 364 |
# File 'lib/queries/concerns/data_attributes.rb', line 362 def wildcard_value(value) '%' + value.to_s.strip.gsub(/\s+/, '%') + '%' end |