Class: Queries::Query::Autocomplete
- Inherits:
-
Queries::Query
show all
- Includes:
- Arel::Nodes, Concerns::Identifiers
- Defined in:
- lib/queries/query/autocomplete.rb
Direct Known Subclasses
AssertedDistribution::Autocomplete, BiologicalAssociationsGraph::Autocomplete, BiologicalRelationship::Autocomplete, CollectingEvent::Autocomplete, CollectionObject::Autocomplete, Container::Autocomplete, ControlledVocabularyTerm::Autocomplete, DataAttribute::Autocomplete, DataAttribute::ValueAutocomplete, Descriptor::Autocomplete, Document::Autocomplete, Extract::Autocomplete, GeographicArea::Autocomplete, Identifier::Autocomplete, Image::Autocomplete, Loan::Autocomplete, Namespace::Autocomplete, Note::Autocomplete, Organization::Autocomplete, Otu::Autocomplete, Person::Autocomplete, Serial::Autocomplete, Source::Autocomplete, TaxonName::Autocomplete, TaxonName::Tabular, TypeMaterial::Autocomplete, User::Autocomplete
Instance Attribute Summary collapse
#terms
Instance Method Summary
collapse
-
#autocomplete ⇒ Array
Default the autocomplete result to all TODO: eliminate.
-
#autocomplete_cached ⇒ ActiveRecord::Relation
-
#autocomplete_cached_wildcard_anywhere ⇒ ActiveRecord::Relation
-
#autocomplete_common_name_exact ⇒ Object
-
#autocomplete_common_name_like ⇒ Object
-
#autocomplete_exact_id ⇒ ActiveRecord::Relation
-
#autocomplete_exactly_named ⇒ ActiveRecord::Relation
-
#autocomplete_named ⇒ ActiveRecord::Relation
-
#autocomplete_ordered_wildcard_pieces_in_cached ⇒ ActiveRecord::Relation
-
#combine_or_clauses(clauses) ⇒ Arel::Nodes::Grouping
-
#common_name_name ⇒ Object
-
#common_name_table ⇒ Object
-
#common_name_wild_pieces ⇒ Object
-
#exactly_named ⇒ Arel::Nodes::Matches
-
#fragments ⇒ Array
Used in unordered AND searches.
-
#initialize(string, project_id: nil, **keyword_args) ⇒ Autocomplete
constructor
A new instance of Autocomplete.
-
#integers ⇒ Array
Of strings representing integers.
-
#match_wildcard_end_in_cached ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided.
-
#match_wildcard_in_cached ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided.
-
#named ⇒ Arel::Nodes::Matches
-
#only_ids ⇒ Arek::Npdes?
Used in or_clauses, match on id only if integers alone provided.
-
#only_integers? ⇒ Boolean
-
#parent ⇒ Arel::Nodes::TableAlias
-
#parent_child_join ⇒ Scope
-
#parent_child_where ⇒ Arel::Nodes::Grouping
Match at two levels, for example, 'wa te“ will match ”Washington Co., Texas“.
-
#pieces ⇒ Array
-
#scope ⇒ Scope
stub TODO: deprecate? probably unused.
-
#string_fragments ⇒ Array
Used in unordered AND searches.
-
#wildcard_wrapped_integers ⇒ Array
-
#wildcard_wrapped_years ⇒ Array
-
#with_cached ⇒ Arel::Nodes::Matches
-
#with_cached_like ⇒ Arel::Nodes::Matches
-
#with_id ⇒ Arel::Nodes?
-
#with_project_id ⇒ Arel::Nodes::Equality
TODO: nil/or clause this.
-
#year_letter ⇒ String?
-
#years ⇒ Array
#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_union, #start_and_end_wildcard, #start_wildcard, #table, #wildcard_pieces
Constructor Details
#initialize(string, project_id: nil, **keyword_args) ⇒ Autocomplete
Returns a new instance of Autocomplete.
20
21
22
23
24
|
# File 'lib/queries/query/autocomplete.rb', line 20
def initialize(string, project_id: nil, **keyword_args)
@query_string = ::ApplicationRecord.sanitize_sql(string)&.delete("\u0000") @project_id = project_id
build_terms
end
|
Instance Attribute Details
#dynamic_limit ⇒ Integer
17
18
19
|
# File 'lib/queries/query/autocomplete.rb', line 17
def dynamic_limit
@dynamic_limit
end
|
#project_id ⇒ Array
9
10
11
|
# File 'lib/queries/query/autocomplete.rb', line 9
def project_id
@project_id
end
|
#query_string ⇒ String?
Returns the initial, unparsed value.
13
14
15
|
# File 'lib/queries/query/autocomplete.rb', line 13
def query_string
@query_string
end
|
Instance Method Details
#autocomplete ⇒ Array
Returns default the autocomplete result to all TODO: eliminate.
213
214
215
|
# File 'lib/queries/query/autocomplete.rb', line 213
def autocomplete
all.to_a
end
|
#autocomplete_cached ⇒ ActiveRecord::Relation
241
242
243
244
245
246
247
|
# File 'lib/queries/query/autocomplete.rb', line 241
def autocomplete_cached
if a = cached_facet
base_query.where(a.to_sql).limit(20)
else
nil
end
end
|
#autocomplete_cached_wildcard_anywhere ⇒ ActiveRecord::Relation
Returns removes years/integers!.
234
235
236
237
238
|
# File 'lib/queries/query/autocomplete.rb', line 234
def autocomplete_cached_wildcard_anywhere
a = match_wildcard_in_cached
return nil if a.nil?
base_query.where(a.to_sql)
end
|
#autocomplete_common_name_exact ⇒ Object
273
274
275
276
|
# File 'lib/queries/query/autocomplete.rb', line 273
def autocomplete_common_name_exact
return nil if no_terms?
base_query.joins(:common_names).where(common_name_name.to_sql).limit(1)
end
|
#autocomplete_common_name_like ⇒ Object
278
279
280
281
|
# File 'lib/queries/query/autocomplete.rb', line 278
def autocomplete_common_name_like
return nil if no_terms?
base_query.joins(:common_names).where(common_name_wild_pieces.to_sql).limit(5)
end
|
#autocomplete_exact_id ⇒ ActiveRecord::Relation
218
219
220
221
222
223
224
|
# File 'lib/queries/query/autocomplete.rb', line 218
def autocomplete_exact_id
if i = ::Utilities::Strings::only_integer(query_string)
base_query.where(id: i).limit(1)
else
nil
end
end
|
#autocomplete_exactly_named ⇒ ActiveRecord::Relation
250
251
252
253
|
# File 'lib/queries/query/autocomplete.rb', line 250
def autocomplete_exactly_named
return nil if no_terms?
base_query.where(exactly_named.to_sql).limit(20)
end
|
#autocomplete_named ⇒ ActiveRecord::Relation
256
257
258
259
|
# File 'lib/queries/query/autocomplete.rb', line 256
def autocomplete_named
return nil if no_terms?
base_query.where(named.to_sql).limit(20)
end
|
#autocomplete_ordered_wildcard_pieces_in_cached ⇒ ActiveRecord::Relation
227
228
229
230
|
# File 'lib/queries/query/autocomplete.rb', line 227
def autocomplete_ordered_wildcard_pieces_in_cached
return nil if no_terms?
base_query.where(match_ordered_wildcard_pieces_in_cached.to_sql)
end
|
#combine_or_clauses(clauses) ⇒ Arel::Nodes::Grouping
195
196
197
198
199
200
201
202
203
|
# File 'lib/queries/query/autocomplete.rb', line 195
def combine_or_clauses(clauses)
clauses.compact!
raise TaxonWorks::Error, 'combine_or_clauses called without a clause, ensure at least one exists' unless !clauses.empty?
a = clauses.shift
clauses.each do |b|
a = a.or(b)
end
a
end
|
#common_name_name ⇒ Object
265
266
267
|
# File 'lib/queries/query/autocomplete.rb', line 265
def common_name_name
common_name_table[:name].eq(query_string)
end
|
#common_name_table ⇒ Object
261
262
263
|
# File 'lib/queries/query/autocomplete.rb', line 261
def common_name_table
::CommonName.arel_table
end
|
#common_name_wild_pieces ⇒ Object
269
270
271
|
# File 'lib/queries/query/autocomplete.rb', line 269
def common_name_wild_pieces
common_name_table[:name].matches(wildcard_pieces)
end
|
#exactly_named ⇒ Arel::Nodes::Matches
150
151
152
|
# File 'lib/queries/query/autocomplete.rb', line 150
def exactly_named
table[:name].eq(query_string) if query_string.present?
end
|
#fragments ⇒ Array
Used in unordered AND searches
61
62
63
64
65
66
67
68
|
# File 'lib/queries/query/autocomplete.rb', line 61
def fragments
a = alphanumeric_strings
if a.size > 0 && a.size < 6
a.collect{|a| "%#{a}%"}
else
[]
end
end
|
#integers ⇒ Array
Returns of strings representing integers.
#match_wildcard_end_in_cached ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided
182
183
184
|
# File 'lib/queries/query/autocomplete.rb', line 182
def match_wildcard_end_in_cached
table[:cached].matches(end_wildcard)
end
|
#match_wildcard_in_cached ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided
188
189
190
191
192
|
# File 'lib/queries/query/autocomplete.rb', line 188
def match_wildcard_in_cached
b = fragments
return nil if b.empty?
table[:cached].matches_all(b)
end
|
#named ⇒ Arel::Nodes::Matches
145
146
147
|
# File 'lib/queries/query/autocomplete.rb', line 145
def named
table[:name].matches_any(terms) if terms.any?
end
|
#only_ids ⇒ Arek::Npdes?
Returns used in or_clauses, match on id only if integers alone provided.
136
137
138
139
140
141
142
|
# File 'lib/queries/query/autocomplete.rb', line 136
def only_ids
if only_integers?
with_id
else
nil
end
end
|
#only_integers? ⇒ Boolean
#parent ⇒ Arel::Nodes::TableAlias
Returns used in heirarchy joins.
156
157
158
|
# File 'lib/queries/query/autocomplete.rb', line 156
def parent
table.alias
end
|
#parent_child_join ⇒ Scope
112
113
114
|
# File 'lib/queries/query/autocomplete.rb', line 112
def parent_child_join
table.join(parent).on(table[:parent_id].eq(parent[:id])).join_sources
end
|
#parent_child_where ⇒ Arel::Nodes::Grouping
Match at two levels, for example, 'wa te“ will match ”Washington Co., Texas“
118
119
120
121
122
|
# File 'lib/queries/query/autocomplete.rb', line 118
def parent_child_where
a,b = query_string.split(/\s+/, 2)
return table[:id].eq(-1) if a.nil? || b.nil?
table[:name].matches("#{a}%").and(parent[:name].matches("#{b}%"))
end
|
#pieces ⇒ Array
85
86
87
|
# File 'lib/queries/query/autocomplete.rb', line 85
def pieces
query_string.split(/\s+/)
end
|
#scope ⇒ Scope
stub TODO: deprecate? probably unused
33
34
35
|
# File 'lib/queries/query/autocomplete.rb', line 33
def scope
where('1 = 2')
end
|
#string_fragments ⇒ Array
Used in unordered AND searches
73
74
75
76
77
78
79
80
|
# File 'lib/queries/query/autocomplete.rb', line 73
def string_fragments
a = alphabetic_strings
if a.size > 0 && a.size < 6
a.collect{|a| "%#{a}%"}
else
[]
end
end
|
#wildcard_wrapped_integers ⇒ Array
90
91
92
|
# File 'lib/queries/query/autocomplete.rb', line 90
def wildcard_wrapped_integers
integers.collect{|i| "%#{i}%"}
end
|
#wildcard_wrapped_years ⇒ Array
95
96
97
|
# File 'lib/queries/query/autocomplete.rb', line 95
def wildcard_wrapped_years
years.collect{|i| "%#{i}%"}
end
|
#with_cached ⇒ Arel::Nodes::Matches
171
172
173
|
# File 'lib/queries/query/autocomplete.rb', line 171
def with_cached
table[:cached].eq(query_string)
end
|
#with_cached_like ⇒ Arel::Nodes::Matches
176
177
178
|
# File 'lib/queries/query/autocomplete.rb', line 176
def with_cached_like
table[:cached].matches(start_and_end_wildcard)
end
|
#with_id ⇒ Arel::Nodes?
Returns used in or_clauses.
126
127
128
129
130
131
132
|
# File 'lib/queries/query/autocomplete.rb', line 126
def with_id
if integers.any?
table[:id].eq_any(integers)
else
nil
end
end
|
#with_project_id ⇒ Arel::Nodes::Equality
162
163
164
165
166
167
168
|
# File 'lib/queries/query/autocomplete.rb', line 162
def with_project_id
if project_id.present?
table[:project_id].eq_any(project_id)
else
nil
end
end
|
#years ⇒ Array
38
39
40
|
# File 'lib/queries/query/autocomplete.rb', line 38
def years
Utilities::Strings.years(query_string)
end
|