Class: Queries::Query::Autocomplete

Inherits:
Queries::Query show all
Includes:
Arel::Nodes, Concerns::Identifiers
Defined in:
lib/queries/query/autocomplete.rb

Instance Attribute Summary collapse

Attributes inherited from Queries::Query

#terms

Instance Method Summary collapse

Methods inherited from Queries::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_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.

Parameters:

  • args (Hash)


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") # remove null bytes
  @project_id = project_id
  build_terms
end

Instance Attribute Details

#dynamic_limitInteger

Returns:

  • (Integer)


17
18
19
# File 'lib/queries/query/autocomplete.rb', line 17

def dynamic_limit
  @dynamic_limit
end

#project_idArray

Returns:

  • (Array)


9
10
11
# File 'lib/queries/query/autocomplete.rb', line 9

def project_id
  @project_id
end

#query_stringString?

Returns the initial, unparsed value.

Returns:

  • (String, nil)

    the initial, unparsed value



13
14
15
# File 'lib/queries/query/autocomplete.rb', line 13

def query_string
  @query_string
end

Instance Method Details

#autocompleteArray

Returns default the autocomplete result to all TODO: eliminate.

Returns:

  • (Array)

    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_cachedActiveRecord::Relation

Returns:

  • (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_anywhereActiveRecord::Relation

Returns removes years/integers!.

Returns:

  • (ActiveRecord::Relation)

    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_exactObject



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_likeObject



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_idActiveRecord::Relation

Returns:

  • (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_namedActiveRecord::Relation

Returns:

  • (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_namedActiveRecord::Relation

Returns:

  • (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_cachedActiveRecord::Relation

Returns:

  • (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

Returns:

  • (Arel::Nodes::Grouping)

Raises:

  • (TaxonWorks::Error)


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_nameObject



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_tableObject



261
262
263
# File 'lib/queries/query/autocomplete.rb', line 261

def common_name_table
  ::CommonName.arel_table
end

#common_name_wild_piecesObject



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_namedArel::Nodes::Matches

Returns:

  • (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

#fragmentsArray

Used in unordered AND searches

Returns:

  • (Array)

    if 1-5 alphanumeric_strings, those alphabetic_strings wrapped in wildcards, else none.



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

#integersArray

Returns of strings representing integers.

Returns:

  • (Array)

    of strings representing integers



49
50
51
# File 'lib/queries/query/autocomplete.rb', line 49

def integers
  Utilities::Strings.integers(query_string)
end

#match_wildcard_end_in_cachedArel::Nodes::Matches

match ALL wildcards, but unordered, if 2 - 6 pieces provided

Returns:

  • (Arel::Nodes::Matches)


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_cachedArel::Nodes::Matches

match ALL wildcards, but unordered, if 2 - 6 pieces provided

Returns:

  • (Arel::Nodes::Matches)


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

#namedArel::Nodes::Matches

Returns:

  • (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_idsArek::Npdes?

Returns used in or_clauses, match on id only if integers alone provided.

Returns:

  • (Arek::Npdes, nil)

    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

Returns:

  • (Boolean)


54
55
56
# File 'lib/queries/query/autocomplete.rb', line 54

def only_integers?
  Utilities::Strings.only_integers?(query_string)
end

#parentArel::Nodes::TableAlias

Returns used in heirarchy joins.

Returns:

  • (Arel::Nodes::TableAlias)

    used in heirarchy joins



156
157
158
# File 'lib/queries/query/autocomplete.rb', line 156

def parent
  table.alias
end

#parent_child_joinScope

Returns:

  • (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_whereArel::Nodes::Grouping

Match at two levels, for example, 'wa te“ will match ”Washington Co., Texas“

Returns:

  • (Arel::Nodes::Grouping)


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

#piecesArray

TODO: used?!

Returns:

  • (Array)

    split on whitespace



85
86
87
# File 'lib/queries/query/autocomplete.rb', line 85

def pieces
  query_string.split(/\s+/)
end

#scopeScope

stub TODO: deprecate? probably unused

Returns:

  • (Scope)


33
34
35
# File 'lib/queries/query/autocomplete.rb', line 33

def scope
  where('1 = 2')
end

#string_fragmentsArray

Used in unordered AND searches

Returns:

  • (Array)

    if 1-5 alphabetic_strings, those alphabetic_strings wrapped in wildcards, else none.



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_integersArray

Returns:

  • (Array)


90
91
92
# File 'lib/queries/query/autocomplete.rb', line 90

def wildcard_wrapped_integers
  integers.collect{|i| "%#{i}%"}
end

#wildcard_wrapped_yearsArray

Returns:

  • (Array)


95
96
97
# File 'lib/queries/query/autocomplete.rb', line 95

def wildcard_wrapped_years
  years.collect{|i| "%#{i}%"}
end

#with_cachedArel::Nodes::Matches

Returns:

  • (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_likeArel::Nodes::Matches

Returns:

  • (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_idArel::Nodes?

Returns used in or_clauses.

Returns:

  • (Arel::Nodes, nil)

    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_idArel::Nodes::Equality

TODO: nil/or clause this

Returns:

  • (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

#year_letterString?

Returns:

  • (String, nil)


43
44
45
# File 'lib/queries/query/autocomplete.rb', line 43

def year_letter
  Utilities::Strings.year_letter(query_string)
end

#yearsArray

Returns:

  • (Array)


38
39
40
# File 'lib/queries/query/autocomplete.rb', line 38

def years
  Utilities::Strings.years(query_string)
end