Class: Queries::Source::Autocomplete

Inherits:
Query
  • Object
show all
Defined in:
lib/queries/source/autocomplete.rb

Instance Attribute Summary collapse

Attributes inherited from Query

#dynamic_limit, #options, #project_id, #query_string, #terms

Instance Method Summary collapse

Methods inherited from Query

#alphabetic_strings, #autocomplete_cached, #autocomplete_cached_wildcard_anywhere, #autocomplete_exact_id, #autocomplete_ordered_wildcard_pieces_in_cached, #autocomplete_start_date, #build_terms, #cached, #combine_or_clauses, #end_wildcard, #exactly_named, #fragments, #integers, #match_ordered_wildcard_pieces_in_cached, #match_wildcard_end_in_cached, #match_wildcard_in_cached, #named, #no_digits, #only_ids, #only_integers?, #parent, #parent_child_join, #parent_child_where, #pieces, #result, #scope, #simple_date, #start_and_end_wildcard, #start_wildcard, #wildcard_pieces, #wildcard_wrapped_integers, #wildcard_wrapped_years, #with_cached, #with_cached_like, #with_id, #with_project_id, #with_start_date, #year_letter, #years

Constructor Details

#initialize(string, project_id: nil, limit_to_project: false) ⇒ Autocomplete

Returns a new instance of Autocomplete

Parameters:

  • args (Hash)


11
12
13
14
# File 'lib/queries/source/autocomplete.rb', line 11

def initialize(string, project_id: nil, limit_to_project: false)
  @limit_to_project = limit_to_project
  super
end

Instance Attribute Details

#limit_to_projectBoolean

Either match against all Sources (default) or just those with ProjectSource

Parameters:

  • limit_to_project (String)

    `true` or `false`

Returns:

  • (Boolean)


8
9
10
# File 'lib/queries/source/autocomplete.rb', line 8

def limit_to_project
  @limit_to_project
end

Instance Method Details

#author_from_author_yearString

Returns:

  • (String)


145
146
147
# File 'lib/queries/source/autocomplete.rb', line 145

def author_from_author_year
  query_string.match(/^(.+?)\W/).to_a.last
end

#autocompleteArray

Returns:

  • (Array)


167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/queries/source/autocomplete.rb', line 167

def autocomplete
  queries = [
    autocomplete_exact_author_year_letter,
    autocomplete_exact_author_year,
    autocomplete_identifier_cached_exact, 
    autocomplete_wildcard_author_exact_year,
    autocomplete_exact_author,
    autocomplete_identifier_identifier_exact,
    autocomplete_start_of_author,  
    autocomplete_wildcard_anywhere_exact_year,
    autocomplete_identifier_cached_like,
    autocomplete_ordered_wildcard_pieces_in_cached,
    autocomplete_cached_wildcard_anywhere,
    autocomplete_start_of_title
  ]

  queries.compact!

  updated_queries = []
  queries.each_with_index do |q ,i|
    a = q.joins(:project_sources).where(member_of_project_id.to_sql) if project_id && limit_to_project
    a ||= q
    updated_queries[i] = a
  end

  result = []
  updated_queries.each do |q|
    result += q.to_a
    result.uniq!
    break if result.count > 19
  end
  result[0..19]
end

#autocomplete_any_authorActiveRecord::Relation

Returns author matches any full word exactly

Returns:

  • (ActiveRecord::Relation)

    author matches any full word exactly



30
31
32
33
# File 'lib/queries/source/autocomplete.rb', line 30

def autocomplete_any_author
  a = table[:cached_author_string].matches_regexp('\m' + query_string + '\M')
  base_query.where(a.to_sql).limit(20)
end

#autocomplete_exact_authorActiveRecord::Relation

Returns if and only iff author string matches

Returns:

  • (ActiveRecord::Relation)

    if and only iff author string matches



23
24
25
26
# File 'lib/queries/source/autocomplete.rb', line 23

def autocomplete_exact_author
  a = table[:cached_author_string].eq(query_string)
  base_query.where(a.to_sql).limit(20)
end

#autocomplete_exact_author_yearActiveRecord::Relation?

Returns:

  • (ActiveRecord::Relation, nil)


93
94
95
96
97
98
99
# File 'lib/queries/source/autocomplete.rb', line 93

def autocomplete_exact_author_year
  a = match_exact_author
  b = match_year
  return nil if a.nil? || b.nil?
  c = a.and(b)
  base_query.where(c.to_sql).limit(10)
end

#autocomplete_exact_author_year_letterActiveRecord::Relation?

Returns:

  • (ActiveRecord::Relation, nil)


83
84
85
86
87
88
89
90
# File 'lib/queries/source/autocomplete.rb', line 83

def autocomplete_exact_author_year_letter
  a = match_exact_author
  b = match_year_suffix
  c = match_year
  return nil if [a,b,c].include?(nil)
  d = a.and(b).and(c)
  base_query.where(d.to_sql).limit(2)
end

#autocomplete_partial_authorActiveRecord::Relation

Returns author matches partial string

Returns:

  • (ActiveRecord::Relation)

    author matches partial string



44
45
46
47
# File 'lib/queries/source/autocomplete.rb', line 44

def autocomplete_partial_author
  a = table[:cached_author_string].matches('%' + query_string + '%')
  base_query.where(a.to_sql).limit(5)
end

#autocomplete_start_of_authorActiveRecord::Relation

Returns author matches start

Returns:

  • (ActiveRecord::Relation)

    author matches start



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

def autocomplete_start_of_author
  a = table[:cached_author_string].matches(query_string + '%')
  base_query.where(a.to_sql).limit(8)
end

#autocomplete_start_of_titleActiveRecord::Relation

Returns title matches start

Returns:

  • (ActiveRecord::Relation)

    title matches start



58
59
60
61
# File 'lib/queries/source/autocomplete.rb', line 58

def autocomplete_start_of_title
  a = table[:title].matches(query_string + '%')
  base_query.where(a.to_sql).limit(5)
end

#autocomplete_wildcard_anywhere_exact_yearActiveRecord::Relation?

Returns:

  • (ActiveRecord::Relation, nil)


111
112
113
114
115
116
117
# File 'lib/queries/source/autocomplete.rb', line 111

def autocomplete_wildcard_anywhere_exact_year
  a = match_year
  b = match_wildcard_in_cached
  return nil if a.nil? || b.nil?
  c = a.and(b)
  base_query.where(c.to_sql).limit(10)
end

#autocomplete_wildcard_author_exact_yearActiveRecord::Relation?

Returns:

  • (ActiveRecord::Relation, nil)


102
103
104
105
106
107
108
# File 'lib/queries/source/autocomplete.rb', line 102

def autocomplete_wildcard_author_exact_year
  a = match_year
  b = match_wildcard_author
  return nil if a.nil? || b.nil?
  c = a.and(b)
  base_query.where(c.to_sql).limit(10)
end

#autocomplete_wildcard_pieces_and_yearActiveRecord::Relation

Returns author matches partial string

Returns:

  • (ActiveRecord::Relation)

    author matches partial string



65
66
67
68
69
70
71
# File 'lib/queries/source/autocomplete.rb', line 65

def autocomplete_wildcard_pieces_and_year
  a = match_ordered_wildcard_pieces_in_cached
  b = match_year
  return nil if a.nil? || b.nil?
  c = a.and(b)
  base_query.where(c.to_sql).limit(5)
end

#autocomplete_yearActiveRecord::Relation

Returns multi-year match? otherwise pointless

Returns:

  • (ActiveRecord::Relation)

    multi-year match? otherwise pointless



51
52
53
54
# File 'lib/queries/source/autocomplete.rb', line 51

def autocomplete_year
  a = table[:year].eq_any(years)
  base_query.where(a.to_sql).limit(5)
end

#autocomplete_year_letterActiveRecord::Relation?

Returns:

  • (ActiveRecord::Relation, nil)


74
75
76
77
78
79
80
# File 'lib/queries/source/autocomplete.rb', line 74

def autocomplete_year_letter
  a = match_year
  b = match_year_suffix
  return nil if a.nil? || b.nil?
  c = a.and(b)
  base_query.where(c.to_sql).limit(10)
end

#base_queryScope

Returns:

  • (Scope)


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

def base_query
  ::Source.select('sources.*')
end

#fragment_year_matchesActiveRecord::Relation?

Returns if user provides 5 or fewer strings and any number of years look for any string && year

Returns:

  • (ActiveRecord::Relation, nil)

    if user provides 5 or fewer strings and any number of years look for any string && year



156
157
158
159
160
161
162
163
164
# File 'lib/queries/source/autocomplete.rb', line 156

def fragment_year_matches
  if fragments.any?
    s = table[:cached].matches_any(fragments)
    s = s.and(table[:year].eq_any(years)) if !years.empty?
    s
  else
    nil
  end
end

#match_exact_authorArel::Nodes::Equatity

Returns:

  • (Arel::Nodes::Equatity)


128
129
130
# File 'lib/queries/source/autocomplete.rb', line 128

def match_exact_author
  table[:cached_author_string].eq(author_from_author_year)
end

#match_wildcard_authorArel::Nodes::Matches

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

Returns:

  • (Arel::Nodes::Matches)


121
122
123
124
125
# File 'lib/queries/source/autocomplete.rb', line 121

def match_wildcard_author
  b = fragments
  return nil if b.empty?
  a = table[:cached_author_string].matches_all(b)
end

#match_yearArel::Nodes::Equatity

Returns:

  • (Arel::Nodes::Equatity)


138
139
140
141
142
# File 'lib/queries/source/autocomplete.rb', line 138

def match_year
  a = years.first
  return nil if a.nil?
  table[:year].eq(a)
end

#match_year_suffixArel::Nodes::Equatity

Returns:

  • (Arel::Nodes::Equatity)


133
134
135
# File 'lib/queries/source/autocomplete.rb', line 133

def match_year_suffix
  table[:year_suffix].eq(year_letter)
end

#member_of_project_idArel::Nodes::Equatity

Returns:

  • (Arel::Nodes::Equatity)


150
151
152
# File 'lib/queries/source/autocomplete.rb', line 150

def member_of_project_id
  project_sources_table[:project_id].eq(project_id)
end

#project_sources_tableArel::Table

Returns:

  • (Arel::Table)


207
208
209
# File 'lib/queries/source/autocomplete.rb', line 207

def project_sources_table
  ::ProjectSource.arel_table
end

#tableArel::Table

Returns:

  • (Arel::Table)


202
203
204
# File 'lib/queries/source/autocomplete.rb', line 202

def table
  ::Source.arel_table
end