Class: Queries::DwcOccurrence::Filter
Overview
Keep this minimal, in pricinple filtering should be done on the base objects, not the core here.
Constant Summary
collapse
- OCCURRENCE_SOURCES =
%w{ asserted_distribution collection_object field_occurrence }.freeze
- ATTRIBUTES =
::DwcOccurrence.column_names.reject{ |c|
%w{
id project_id created_by_id updated_by_id created_at updated_at
rebuild_set
}.include?(c)
}.map(&:to_sym).freeze
- PARAMS =
[
*Queries::Concerns::Attributes.params,
*ATTRIBUTES,
:dwc_occurrence_id,
:person_id,
:taxon_name_id,
:empty_rank,
:otu_id,
empty_rank: [],
dwc_occurrence_id: [],
otu_id: [],
person_id: [],
taxon_name_id: []
].inject([{}]){|ary, k| k.is_a?(Hash) ? ary.last.merge!(k) : ary.unshift(k); ary}.freeze
Query::Filter::FILTER_QUERIES, Query::Filter::SUBQUERIES
Instance Attribute Summary collapse
#api, #asserted_distribution_query, #biological_association_query, #biological_associations_graph_query, #collecting_event_query, #collection_object_query, #content_query, #controlled_vocabulary_term_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, #taxon_name_query, #venn, #venn_mode
Attributes inherited from Query
#query_string, #terms
Instance Method Summary
collapse
Methods included from Helpers
#boolean_param, #integer_param
#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, included_annotator_facets, instantiated_base_filter, inverted_subqueries, #model_id_facet, #object_global_id_facet, #only_project?, params, #permitted_params, #process_url_into_params, #project_id_facet, query_name, #query_name, #set_nested_queries, #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.
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 49
def initialize(query_params)
super
@dwc_occurrence_id = params[:dwc_occurrence_id]
@otu_id = params[:otu_id]
@person_id = params[:person_id]
@taxon_name_id = params[:taxon_name_id]
@empty_rank = params[:empty_rank]
set_attributes_params(params)
end
|
Instance Attribute Details
#dwc_occurrence_id ⇒ Object
Returns the value of attribute dwc_occurrence_id.
39
40
41
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 39
def dwc_occurrence_id
@dwc_occurrence_id
end
|
#empty_rank ⇒ Object
Returns Array of labels of ranks in DwcOccurrence.
47
48
49
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 47
def empty_rank
@empty_rank
end
|
#otu_id ⇒ Object
Returns the value of attribute otu_id.
41
42
43
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 41
def otu_id
@otu_id
end
|
#person_id ⇒ Object
Returns the value of attribute person_id.
42
43
44
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 42
def person_id
@person_id
end
|
#taxon_name_id ⇒ Object
Returns the value of attribute taxon_name_id.
43
44
45
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 43
def taxon_name_id
@taxon_name_id
end
|
Instance Method Details
#all_collected_by ⇒ Object
143
144
145
146
147
148
149
150
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 143
def all_collected_by
::DwcOccurrence
.joins("JOIN collection_objects co on co.id = dwc_occurrences.dwc_occurrence_object_id AND dwc_occurrences.dwc_occurrence_object_type = 'CollectionObject'")
.joins('JOIN collecting_events ce on co.collecting_event_id = ce.id')
.joins("JOIN roles r on r.role_object_id = ce.id AND r.role_object_type = 'CollectingEvent' AND r.type = 'Collector'")
.where(r: {person_id:})
.distinct
end
|
#all_determined_by ⇒ Object
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 115
def all_determined_by
co = ::DwcOccurrence
.joins("JOIN collection_objects co on co.id = dwc_occurrences.dwc_occurrence_object_id AND dwc_occurrences.dwc_occurrence_object_type = 'CollectionObject'")
.joins("JOIN taxon_determinations td on td.taxon_determination_object_id = co.id AND td.taxon_determination_object_type = 'CollectionObject'")
.joins("JOIN roles r on r.role_object_id = td.id AND r.role_object_type = 'TaxonDetermination' AND r.type = 'Determiner'")
.where(r: {person_id:})
.distinct
fo = ::DwcOccurrence
.joins("JOIN field_occurrences fo ON fo.id = dwc_occurrences.dwc_occurrence_object_id AND dwc_occurrences.dwc_occurrence_object_type = 'FieldOccurrence'")
.joins("JOIN taxon_determinations td on td.taxon_determination_object_id = fo.id AND td.taxon_determination_object_type = 'FieldOccurrence'")
.joins("JOIN roles r on r.role_object_id = td.id AND r.role_object_type = 'TaxonDetermination' AND r.type = 'Determiner'")
.where(r: {person_id:})
.distinct
::Queries.union(::DwcOccurrence, [co, fo])
end
|
#all_georeferenced_by ⇒ Object
133
134
135
136
137
138
139
140
141
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 133
def all_georeferenced_by
::DwcOccurrence
.joins("JOIN collection_objects co on co.id = dwc_occurrences.dwc_occurrence_object_id AND dwc_occurrences.dwc_occurrence_object_type = 'CollectionObject'")
.joins('JOIN collecting_events ce on co.collecting_event_id = ce.id')
.joins('JOIN georeferences g on g.collecting_event_id = ce.id')
.joins("JOIN roles r on r.role_object_id = g.id AND r.role_object_type = 'Georeference' AND r.type = 'Georeferencer'")
.where(r: {person_id:})
.distinct
end
|
#all_observed_by ⇒ Object
152
153
154
155
156
157
158
159
160
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 152
def all_observed_by
fo = ::Queries::FieldOccurrence::Filter.new({
collector_id: person_id
}).all
::DwcOccurrence
.joins("JOIN (#{fo.to_sql}) AS fo ON dwc_occurrences.dwc_occurrence_object_id = fo.id AND dwc_occurrences.dwc_occurrence_object_type = 'FieldOccurrence'")
.distinct
end
|
#and_clauses ⇒ Object
255
256
257
258
259
260
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 255
def and_clauses
[
empty_rank_facet,
dwc_occurrence_id_facet
]
end
|
#asserted_distribution_query_facet ⇒ Object
198
199
200
201
202
203
204
205
206
207
208
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 198
def asserted_distribution_query_facet
return nil if asserted_distribution_query.nil?
s = 'WITH query_ad_dwco AS (' + asserted_distribution_query.all.unscope(:select).select(:id).to_sql + ') ' +
::DwcOccurrence
.select(:id, :dwc_occurrence_object_type, :dwc_occurrence_object_id)
.joins("JOIN query_ad_dwco as query_ad_dwco1 on dwc_occurrences.dwc_occurrence_object_id = query_ad_dwco1.id
AND dwc_occurrences.dwc_occurrence_object_type = 'AssertedDistribution'")
.to_sql
::DwcOccurrence.from('(' + s + ') as dwc_occurrences').distinct
end
|
#collecting_event_query_facet ⇒ Object
231
232
233
234
235
236
237
238
239
240
241
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 231
def collecting_event_query_facet
return nil if collecting_event_query.nil?
s = 'WITH query_ce_dwco AS (' + collecting_event_query.all.unscope(:select).select(:id).to_sql + ') ' +
::DwcOccurrence
.select(:id, :dwc_occurrence_object_type, :dwc_occurrence_object_id)
.joins("JOIN collection_objects co on co.id = dwc_occurrences.dwc_occurrence_object_id AND dwc_occurrences.dwc_occurrence_object_type = 'CollectionObject'")
.joins('JOIN query_ce_dwco as query_ce_dwco1 on co.collecting_event_id = query_ce_dwco1.id')
.to_sql
::DwcOccurrence.from('(' + s + ') as dwc_occurrences').select(:id).distinct
end
|
#collection_object_query_facet ⇒ Object
210
211
212
213
214
215
216
217
218
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 210
def collection_object_query_facet
return nil if collection_object_query.nil?
s = ::DwcOccurrence.with(query_co_dwco: collection_object_query.all.unscope(:select).select(:id))
.select(:id, :dwc_occurrence_object_type, :dwc_occurrence_object_id)
.joins("JOIN query_co_dwco as query_co_dwco1 on dwc_occurrences.dwc_occurrence_object_id = query_co_dwco1.id
AND dwc_occurrences.dwc_occurrence_object_type = 'CollectionObject'").to_sql
::DwcOccurrence.from('(' + s + ') as dwc_occurrences').distinct
end
|
#dwc_occurrence_id_facet ⇒ Object
83
84
85
86
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 83
def dwc_occurrence_id_facet
return nil if dwc_occurrence_id.empty?
table[:id].in(dwc_occurrence_id)
end
|
#empty_rank_facet ⇒ Object
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 88
def empty_rank_facet
return nil if empty_rank.empty?
q = table[empty_rank.shift].eq(nil)
empty_rank.each do |r|
q = q.and(table[r].eq(nil))
end
q
end
|
#field_occurrence_query_facet ⇒ Object
220
221
222
223
224
225
226
227
228
229
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 220
def field_occurrence_query_facet
return nil if field_occurrence_query.nil?
s = 'WITH query_fo_dwco AS (' + field_occurrence_query.all.unscope(:select).select(:id).to_sql + ') ' +
::DwcOccurrence
.select(:id, :dwc_occurrence_object_type, :dwc_occurrence_object_id)
.joins('JOIN query_fo_dwco as query_fo_dwco1 on dwc_occurrences.dwc_occurrence_object_id = query_fo_dwco1.id' \
" AND dwc_occurrences.dwc_occurrence_object_type = 'FieldOccurrence'").to_sql
::DwcOccurrence.from('(' + s + ') as dwc_occurrences').distinct
end
|
#merge_clauses ⇒ Object
243
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 243
def merge_clauses
[
asserted_distribution_query_facet,
collecting_event_query_facet,
collection_object_query_facet,
field_occurrence_query_facet,
otu_id_facet,
person_id_facet,
taxon_name_id_facet
]
end
|
#person_id_facet ⇒ Object
TODO: these should be referenced through base queries not logic here i.e. ::Queries::CollectionObject::Filter…
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 103
def person_id_facet
return nil if person_id.empty?
::Queries.union(
::DwcOccurrence, [
all_determined_by,
all_georeferenced_by,
all_collected_by,
all_observed_by
])
end
|
#taxon_name_id_facet ⇒ Object
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/queries/dwc_occurrence/filter.rb', line 162
def taxon_name_id_facet
return nil if taxon_name_id.empty?
queries = OCCURRENCE_SOURCES.map do |k|
::Queries::DwcOccurrence::Filter.new(
"#{k}_query": {
taxon_name_query: {
taxon_name_id:,
descendants: false, synonymify: true
}
}
).all
end
::Queries.union(
::DwcOccurrence, queries
)
end
|