Class: Queries::AnatomicalPart::Filter
- Inherits:
-
Query::Filter
- Object
- Query
- Query::Filter
- Queries::AnatomicalPart::Filter
- Includes:
- Concerns::Citations, Concerns::DataAttributes, Concerns::PreparationTypes, Concerns::Tags
- Defined in:
- lib/queries/anatomical_part/filter.rb
Constant Summary collapse
- PARAMS =
[ :anatomical_part_id, :collection_object_id, :field_occurrence_id, :is_material, :name, :name_exact, :origin_object_type, :otu_id, :uri, :uri_exact, :uri_label, :uri_label_exact, anatomical_part_id: [], collection_object_id: [], field_occurrence_id: [], origin_object_type: [], otu_id: [] ].freeze
Constants inherited from Query::Filter
Query::Filter::FILTER_QUERIES, Query::Filter::SUBQUERIES
Instance Attribute Summary collapse
- #anatomical_part_id ⇒ Array
- #collection_object_id ⇒ Array
- #field_occurrence_id ⇒ Array
- #is_material ⇒ Boolean?
-
#name ⇒ Object
String.
- #name_exact ⇒ Boolean?
-
#origin_object_type ⇒ Array
Base class name(s) (e.g. 'CollectionObject', 'FieldOccurrence', 'Otu', 'AnatomicalPart') of the immediate parent in the OriginRelationship chain, i.e.
-
#otu_id ⇒ Array
OTU id of the ancestor origin OTU or CO/FO taxon determination.
-
#uri ⇒ Object
String.
-
#uri_exact ⇒ Object
String.
-
#uri_label ⇒ Object
String.
-
#uri_label_exact ⇒ Object
String.
Attributes inherited from Query::Filter
#anatomical_part_query, #api, #asserted_distribution_query, #asserted_environment_query, #biological_association_query, #biological_associations_graph_query, #collecting_event_query, #collection_object_query, #content_query, #controlled_vocabulary_term_query, #conveyance_query, #data_attribute_query, #depiction_query, #descriptor_query, #document_query, #dwc_occurrence_query, #extract_query, #field_occurrence_query, #image_query, #loan_query, #object_global_id, #observation_query, #order_by, #otu_query, #page, #paginate, #params, #per, #person_query, #project_id, #recent, #recent_target, #roll_call, #sound_query, #taxon_name_query, #taxon_name_relationship_query, #venn, #venn_ignore_pagination, #venn_mode
Attributes inherited from Query
Instance Method Summary collapse
- #and_clauses ⇒ Object
- #biological_association_query_facet ⇒ Object
-
#collection_object_id_facet ⇒ Object
TODO: only matches AnatomicalParts that are a direct child of the CollectionObject; AP descendants of that AP (e.g. a punch taken from a feather removed from this CO) are not included.
-
#collection_object_query_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
- #extract_query_facet ⇒ Object
-
#field_occurrence_id_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
-
#field_occurrence_query_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
-
#initialize(query_params) ⇒ Filter
constructor
A new instance of Filter.
- #is_material_facet ⇒ Object
- #merge_clauses ⇒ Object
- #name_facet ⇒ Object
- #observation_query_facet ⇒ Object
-
#origin_object_type_facet ⇒ Object
Matches on the immediate parent's type, i.e.
- #original_otu_id_facet ⇒ Object
-
#otu_query_facet ⇒ Object
Matches the taxonomic origin OTU (the ancestor origin OTU or the CollectionObject/FieldOccurrence taxon determination), i.e.
- #sound_query_facet ⇒ Object
- #uri_facet ⇒ Object
- #uri_label_facet ⇒ Object
Methods inherited from Query::Filter
#all, #all_and_clauses, #all_merge_clauses, #annotator_and_clauses, #annotator_merge_clauses, annotator_params, api_except_params, api_excluded_params, #apply_venn, #attribute_exact_facet, base_filter, base_query_name, base_query_to_h, #deep_permit, #disable_paging, included_annotator_facets, instantiated_base_filter, inverted_subqueries, #model_id_facet, #object_global_id_facet, #only_project?, #only_project_or_less?, #paging_state, params, #permitted_params, #process_url_into_params, #project_id_facet, query_name, #set_nested_queries, #set_paging, set_paging, #shared_and_clauses, #subquery_vector, #target_and_clauses, #venn_query
Methods inherited from Query
#alphabetic_strings, #alphanumeric_strings, base_name, #base_name, #base_query, #build_terms, #cached_facet, #end_wildcard, #levenshtein_distance, #match_ordered_wildcard_pieces_in_cached, #no_terms?, referenced_klass, #referenced_klass, #referenced_klass_except, #referenced_klass_intersection, #referenced_klass_union, #start_and_end_wildcard, #start_wildcard, #table, #wildcard_pieces
Constructor Details
#initialize(query_params) ⇒ Filter
Returns a new instance of Filter.
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/queries/anatomical_part/filter.rb', line 74 def initialize(query_params) super @anatomical_part_id = params[:anatomical_part_id] @collection_object_id = params[:collection_object_id] @field_occurrence_id = params[:field_occurrence_id] @is_material = boolean_param(params, :is_material) @name = params[:name] @name_exact = boolean_param(params, :name_exact) @origin_object_type = params[:origin_object_type] @otu_id = params[:otu_id] @uri = params[:uri] @uri_exact = boolean_param(params, :uri_exact) @uri_label = params[:uri_label] @uri_label_exact = boolean_param(params, :uri_label_exact) set_citations_params(params) set_data_attributes_params(params) (params) set_preparation_types_params(params) end |
Instance Attribute Details
#anatomical_part_id ⇒ Array
31 32 33 |
# File 'lib/queries/anatomical_part/filter.rb', line 31 def anatomical_part_id @anatomical_part_id end |
#collection_object_id ⇒ Array
34 35 36 |
# File 'lib/queries/anatomical_part/filter.rb', line 34 def collection_object_id @collection_object_id end |
#field_occurrence_id ⇒ Array
37 38 39 |
# File 'lib/queries/anatomical_part/filter.rb', line 37 def field_occurrence_id @field_occurrence_id end |
#is_material ⇒ Boolean?
40 41 42 |
# File 'lib/queries/anatomical_part/filter.rb', line 40 def is_material @is_material end |
#name ⇒ Object
Returns String.
43 44 45 |
# File 'lib/queries/anatomical_part/filter.rb', line 43 def name @name end |
#name_exact ⇒ Boolean?
46 47 48 |
# File 'lib/queries/anatomical_part/filter.rb', line 46 def name_exact @name_exact end |
#origin_object_type ⇒ Array
Returns Base class name(s) (e.g. 'CollectionObject', 'FieldOccurrence', 'Otu', 'AnatomicalPart') of the immediate parent in the OriginRelationship chain, i.e. this AnatomicalPart's inbound_origin_relationship.old_object type. Not the deep/ultimate taxonomic origin (see AnatomicalPart#taxonomic_origin_object), which can never itself be an AnatomicalPart.
55 56 57 |
# File 'lib/queries/anatomical_part/filter.rb', line 55 def origin_object_type @origin_object_type end |
#otu_id ⇒ Array
OTU id of the ancestor origin OTU or CO/FO taxon determination.
59 60 61 |
# File 'lib/queries/anatomical_part/filter.rb', line 59 def otu_id @otu_id end |
#uri ⇒ Object
Returns String.
62 63 64 |
# File 'lib/queries/anatomical_part/filter.rb', line 62 def uri @uri end |
#uri_exact ⇒ Object
Returns String.
65 66 67 |
# File 'lib/queries/anatomical_part/filter.rb', line 65 def uri_exact @uri_exact end |
#uri_label ⇒ Object
Returns String.
68 69 70 |
# File 'lib/queries/anatomical_part/filter.rb', line 68 def uri_label @uri_label end |
#uri_label_exact ⇒ Object
Returns String.
71 72 73 |
# File 'lib/queries/anatomical_part/filter.rb', line 71 def uri_label_exact @uri_label_exact end |
Instance Method Details
#and_clauses ⇒ Object
271 272 273 274 275 276 277 278 279 |
# File 'lib/queries/anatomical_part/filter.rb', line 271 def and_clauses [ is_material_facet, name_facet, uri_facet, uri_label_facet, original_otu_id_facet ] end |
#biological_association_query_facet ⇒ Object
256 257 258 259 260 261 262 263 264 265 266 267 268 |
# File 'lib/queries/anatomical_part/filter.rb', line 256 def biological_association_query_facet return nil if biological_association_query.nil? a = ::AnatomicalPart .with(ba_query1: biological_association_query.all) .joins("JOIN ba_query1 ON ba_query1.biological_association_subject_id = anatomical_parts.id AND ba_query1.biological_association_subject_type = 'AnatomicalPart'") b = ::AnatomicalPart .with(ba_query2: biological_association_query.all) .joins("JOIN ba_query2 ON ba_query2.biological_association_object_id = anatomical_parts.id AND ba_query2.biological_association_object_type = 'AnatomicalPart'") referenced_klass_union([a,b]) end |
#collection_object_id_facet ⇒ Object
TODO: only matches AnatomicalParts that are a direct child of the CollectionObject; AP descendants of that AP (e.g. a punch taken from a feather removed from this CO) are not included. Unlike otu_query_facet, there is no cached top-origin id to check against, so this would need a recursive walk (or a new cached column) to cover the full depth. See taxonomic_origin_object in AnatomicalPart.
172 173 174 175 176 177 178 179 |
# File 'lib/queries/anatomical_part/filter.rb', line 172 def collection_object_id_facet return nil if collection_object_id.empty? ::AnatomicalPart .joins(:related_origin_relationships) .where(origin_relationships: { old_object_type: 'CollectionObject', old_object_id: collection_object_id }) .distinct end |
#collection_object_query_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
198 199 200 201 202 203 204 205 |
# File 'lib/queries/anatomical_part/filter.rb', line 198 def collection_object_query_facet return nil if collection_object_query.nil? ::AnatomicalPart .joins(:related_origin_relationships) .where(origin_relationships: { old_object_type: 'CollectionObject' }) .where("origin_relationships.old_object_id IN (#{collection_object_query.all.select(:id).to_sql })") end |
#extract_query_facet ⇒ Object
236 237 238 239 240 241 242 243 244 |
# File 'lib/queries/anatomical_part/filter.rb', line 236 def extract_query_facet return nil if extract_query.nil? ::AnatomicalPart .joins(:origin_relationships) .where(origin_relationships: { new_object_type: 'Extract' }) .where("origin_relationships.new_object_id IN (#{extract_query.all.select(:id).to_sql })") .distinct end |
#field_occurrence_id_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
182 183 184 185 186 187 188 189 |
# File 'lib/queries/anatomical_part/filter.rb', line 182 def field_occurrence_id_facet return nil if field_occurrence_id.empty? ::AnatomicalPart .joins(:related_origin_relationships) .where(origin_relationships: { old_object_type: 'FieldOccurrence', old_object_id: field_occurrence_id }) .distinct end |
#field_occurrence_query_facet ⇒ Object
TODO: same direct-child-only limitation as collection_object_id_facet.
208 209 210 211 212 213 214 215 |
# File 'lib/queries/anatomical_part/filter.rb', line 208 def field_occurrence_query_facet return nil if field_occurrence_query.nil? ::AnatomicalPart .joins(:related_origin_relationships) .where(origin_relationships: { old_object_type: 'FieldOccurrence' }) .where("origin_relationships.old_object_id IN (#{field_occurrence_query.all.select(:id).to_sql })") end |
#is_material_facet ⇒ Object
145 146 147 148 149 150 151 152 153 |
# File 'lib/queries/anatomical_part/filter.rb', line 145 def is_material_facet return nil if is_material.nil? if is_material === false table[:is_material].eq(is_material) else table[:is_material].eq(true).or(table[:is_material].eq(nil)) end end |
#merge_clauses ⇒ Object
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
# File 'lib/queries/anatomical_part/filter.rb', line 281 def merge_clauses [ collection_object_id_facet, collection_object_query_facet, extract_query_facet, field_occurrence_id_facet, field_occurrence_query_facet, otu_query_facet, observation_query_facet, sound_query_facet, biological_association_query_facet, origin_object_type_facet ] end |
#name_facet ⇒ Object
116 117 118 119 120 121 122 123 |
# File 'lib/queries/anatomical_part/filter.rb', line 116 def name_facet return nil if name.blank? if name_exact table[:name].eq(name.strip) else table[:name].matches('%' + name.strip.gsub(/\s/, '%') + '%') end end |
#observation_query_facet ⇒ Object
227 228 229 230 231 232 233 234 |
# File 'lib/queries/anatomical_part/filter.rb', line 227 def observation_query_facet return nil if observation_query.nil? ::AnatomicalPart .joins(:observations) .where(observations: { id: observation_query.all.select(:id) }) .distinct end |
#origin_object_type_facet ⇒ Object
Matches on the immediate parent's type, i.e. AnatomicalPart is the new_object side of the relationship, old_object_type is the origin.
157 158 159 160 161 162 163 164 |
# File 'lib/queries/anatomical_part/filter.rb', line 157 def origin_object_type_facet return nil if origin_object_type.empty? ::AnatomicalPart .joins(:related_origin_relationships) .where(origin_relationships: { old_object_type: origin_object_type }) .distinct # remove if model adds validations to make this unnecessary end |
#original_otu_id_facet ⇒ Object
191 192 193 194 195 |
# File 'lib/queries/anatomical_part/filter.rb', line 191 def original_otu_id_facet return nil if otu_id.empty? table[:cached_otu_id].in(otu_id) end |
#otu_query_facet ⇒ Object
Matches the taxonomic origin OTU (the ancestor origin OTU or the CollectionObject/FieldOccurrence taxon determination), i.e. the same OTU targeted by :otu_id.
220 221 222 223 224 225 |
# File 'lib/queries/anatomical_part/filter.rb', line 220 def otu_query_facet return nil if otu_query.nil? ::AnatomicalPart .where(cached_otu_id: otu_query.all.select(:id)) end |
#sound_query_facet ⇒ Object
246 247 248 249 250 251 252 253 254 |
# File 'lib/queries/anatomical_part/filter.rb', line 246 def sound_query_facet return nil if sound_query.nil? ::AnatomicalPart .joins(:origin_relationships) .where(origin_relationships: { new_object_type: 'Sound' }) .where("origin_relationships.new_object_id IN (#{sound_query.all.select(:id).to_sql })") .distinct end |
#uri_facet ⇒ Object
125 126 127 128 129 130 131 132 133 |
# File 'lib/queries/anatomical_part/filter.rb', line 125 def uri_facet return nil if uri.blank? if uri_exact table[:uri].eq(uri.strip) else table[:uri].matches('%' + uri.strip.gsub(/\s/, '%') + '%') end end |
#uri_label_facet ⇒ Object
135 136 137 138 139 140 141 142 143 |
# File 'lib/queries/anatomical_part/filter.rb', line 135 def uri_label_facet return nil if uri_label.blank? if uri_label_exact table[:uri_label].eq(uri_label.strip) else table[:uri_label].matches('%' + uri_label.strip.gsub(/\s/, '%') + '%') end end |