Class: Queries::Source::Autocomplete
- Inherits:
-
Query::Autocomplete
- Object
- Query
- Query::Autocomplete
- Queries::Source::Autocomplete
- Defined in:
- lib/queries/source/autocomplete.rb
Instance Attribute Summary collapse
-
#limit_to_project ⇒ Boolean
Either match against all Sources (default) or just those with ProjectSource.
Attributes inherited from Query::Autocomplete
#dynamic_limit, #project_id, #query_string
Attributes inherited from Query
Instance Method Summary collapse
- #alternate_values_table ⇒ Arel::Table
- #author_from_author_year ⇒ String
- #autocomplete ⇒ Array
-
#autocomplete_any_author ⇒ ActiveRecord::Relation
Author matches any full word exactly !! Not used currently.
-
#autocomplete_exact_author ⇒ ActiveRecord::Relation
If and only iff author string matches.
-
#autocomplete_exact_author_alternate ⇒ ActiveRecord::Relation
Author matches exactly in alternate values.
- #autocomplete_exact_author_year ⇒ ActiveRecord::Relation?
- #autocomplete_exact_author_year_alternate ⇒ ActiveRecord::Relation?
- #autocomplete_exact_author_year_letter ⇒ ActiveRecord::Relation?
- #autocomplete_exact_author_year_letter_alternate ⇒ ActiveRecord::Relation?
- #autocomplete_exact_in_cached ⇒ ActiveRecord::Relation?
-
#autocomplete_partial_author ⇒ ActiveRecord::Relation
Author matches partial string !! Not used currently.
- #autocomplete_start_author_year ⇒ ActiveRecord::Relation?
- #autocomplete_start_author_year_alternate ⇒ ActiveRecord::Relation?
-
#autocomplete_start_of_author ⇒ ActiveRecord::Relation
Author matches start.
-
#autocomplete_start_of_author_alternate ⇒ ActiveRecord::Relation
Author matches start in alternate values.
-
#autocomplete_start_of_title ⇒ ActiveRecord::Relation
Title matches start.
- #autocomplete_wildcard_anywhere_exact_year ⇒ ActiveRecord::Relation?
- #autocomplete_wildcard_author_exact_year ⇒ ActiveRecord::Relation?
-
#autocomplete_wildcard_of_title_alternate ⇒ ActiveRecord::Relation
Title matches wildcard on alternate.
-
#autocomplete_wildcard_pieces_and_year ⇒ ActiveRecord::Relation
Author matches partial string.
-
#autocomplete_year ⇒ ActiveRecord::Relation
Multi-year match? otherwise pointless.
- #autocomplete_year_letter ⇒ ActiveRecord::Relation?
-
#fragment_year_matches ⇒ ActiveRecord::Relation?
If user provides 5 or fewer strings and any number of years look for any string && year.
-
#initialize(string, project_id: nil, limit_to_project: false) ⇒ Autocomplete
constructor
A new instance of Autocomplete.
- #match_exact_author ⇒ Arel::Nodes::Equatity
- #match_exact_author_alternate ⇒ Arel::Nodes::Grouping
- #match_start_author ⇒ Arel::Nodes::Equatity
- #match_start_author_alternate ⇒ Arel::Nodes::Grouping
-
#match_wildcard_author ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided.
- #match_year_or_stated_year ⇒ Arel::Nodes::Grouping?
- #match_year_suffix ⇒ Arel::Nodes::Equatity
- #member_of_project_id ⇒ Arel::Nodes::Equatity
- #project_sources_table ⇒ Arel::Table
Methods inherited from Query::Autocomplete
#autocomplete_cached, #autocomplete_cached_wildcard_anywhere, #autocomplete_common_name_exact, #autocomplete_common_name_like, #autocomplete_exact_id, #autocomplete_exactly_named, #autocomplete_named, #autocomplete_ordered_wildcard_pieces_in_cached, #cached_facet, #combine_or_clauses, #common_name_name, #common_name_table, #common_name_wild_pieces, #exactly_named, #fragments, #integers, #least_levenshtein, #match_wildcard_end_in_cached, #match_wildcard_in_cached, #named, #only_ids, #only_integers?, #parent, #parent_child_join, #parent_child_where, #pieces, #safe_integers, #scope, #string_fragments, #wildcard_wrapped_integers, #wildcard_wrapped_years, #with_cached, #with_cached_like, #with_id, #with_project_id, #year_letter, #years
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(string, project_id: nil, limit_to_project: false) ⇒ Autocomplete
Returns a new instance of Autocomplete.
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_project ⇒ Boolean
Either match against all Sources (default) or just those with ProjectSource
8 9 10 |
# File 'lib/queries/source/autocomplete.rb', line 8 def limit_to_project @limit_to_project end |
Instance Method Details
#alternate_values_table ⇒ Arel::Table
326 327 328 |
# File 'lib/queries/source/autocomplete.rb', line 326 def alternate_values_table ::AlternateValue.arel_table end |
#author_from_author_year ⇒ String
240 241 242 243 |
# File 'lib/queries/source/autocomplete.rb', line 240 def query_string.match(/[[[:word:]]]+/).to_a.last #query_string.match(/^(.+?)\W/).to_a.last end |
#autocomplete ⇒ Array
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/queries/source/autocomplete.rb', line 263 def autocomplete # [ query, order by use if true- don't if nil ] queries = [ [ autocomplete_exact_id, false], [ autocomplete_identifier_identifier_exact, false], [ &.limit(20), true], [ &.limit(20), true], [ autocomplete_identifier_cached_exact, false], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], [ &.limit(20), true], #[ autocomplete_wildcard_anywhere_exact_year&.limit(10), true], [ autocomplete_identifier_cached_like, true], [ autocomplete_exact_in_cached&.limit(20), true], [ autocomplete_ordered_wildcard_pieces_in_cached&.limit(20), true], [ autocomplete_cached_wildcard_anywhere&.limit(20), true], [ autocomplete_start_of_title&.limit(20), true], [ autocomplete_wildcard_of_title_alternate&.limit(20), true] ] queries.delete_if{|a,b| a.nil?} # Note this pattern differs because [[]] so we don't use compact. /lib/queries/repository/autocomplete.rb follows same pattern result = [] pr_id = project_id.join(',') if project_id queries.each do |q, scope| a = q # Limit autocomplete to ONLY project sources if limit_to_project == true if project_id.present? && limit_to_project a = a.joins(:project_sources).where(member_of_project_id.to_sql) end # Order results by number of times used *in this project* if project_id.present? && scope && query_string.length > 3 a = a.left_outer_joins(:citations) .left_outer_joins(:project_sources) .select("sources.*, COUNT(citations.id) AS use_count, CASE WHEN project_sources.project_id IN (#{pr_id}) THEN project_sources.project_id ELSE NULL END AS in_project") .where('citations.project_id IN (?) OR citations.project_id NOT IN (?) OR citations.project_id IS NULL', pr_id, pr_id) .group('sources.id, citations.project_id, project_sources.project_id') .order('in_project, use_count DESC') end a ||= q result += a.to_a result.uniq! break if result.count > 19 end result[0..19] end |
#autocomplete_any_author ⇒ ActiveRecord::Relation
Returns author matches any full word exactly
!! Not used currently.
33 34 35 36 |
# File 'lib/queries/source/autocomplete.rb', line 33 def a = table[:cached_author_string].matches_regexp('\m' + query_string + '\M') base_query.where(a.to_sql).limit(20) end |
#autocomplete_exact_author ⇒ ActiveRecord::Relation
Returns if and only iff author string matches.
18 19 20 21 |
# File 'lib/queries/source/autocomplete.rb', line 18 def a = table[:cached_author_string].matches(query_string) base_query.where(a.to_sql) end |
#autocomplete_exact_author_alternate ⇒ ActiveRecord::Relation
Returns author matches exactly in alternate values.
25 26 27 28 |
# File 'lib/queries/source/autocomplete.rb', line 25 def base_query.joins(:alternate_values). where("alternate_values.alternate_value_object_attribute = 'author' AND alternate_values.value ILIKE ?", query_string) end |
#autocomplete_exact_author_year ⇒ ActiveRecord::Relation?
121 122 123 124 125 126 127 128 |
# File 'lib/queries/source/autocomplete.rb', line 121 def return nil if query_string.split(' ').count > 2 a = d = match_year_or_stated_year return nil if a.nil? || d.nil? z = a.and(d) base_query.where(z.to_sql) end |
#autocomplete_exact_author_year_alternate ⇒ ActiveRecord::Relation?
131 132 133 134 135 136 137 138 |
# File 'lib/queries/source/autocomplete.rb', line 131 def return nil if query_string.split(' ').count > 2 a = d = match_year_or_stated_year return nil if a.nil? || d.nil? z = a.and(d) base_query.joins(:alternate_values).where(z.to_sql) end |
#autocomplete_exact_author_year_letter ⇒ ActiveRecord::Relation?
101 102 103 104 105 106 107 108 |
# File 'lib/queries/source/autocomplete.rb', line 101 def a = d = match_year_suffix c = match_year_or_stated_year return nil if [a,d,c].include?(nil) z = a.and(d).and(c) base_query.where(z.to_sql) end |
#autocomplete_exact_author_year_letter_alternate ⇒ ActiveRecord::Relation?
111 112 113 114 115 116 117 118 |
# File 'lib/queries/source/autocomplete.rb', line 111 def a = d = match_year_suffix c = match_year_or_stated_year return nil if [a,d,c].include?(nil) z = a.and(d).and(c) base_query.joins(:alternate_values).where(z.to_sql) end |
#autocomplete_exact_in_cached ⇒ ActiveRecord::Relation?
171 172 173 174 175 |
# File 'lib/queries/source/autocomplete.rb', line 171 def autocomplete_exact_in_cached a = with_cached_like return nil if a.nil? base_query.where(a.to_sql) end |
#autocomplete_partial_author ⇒ ActiveRecord::Relation
Returns author matches partial string
!! Not used currently.
55 56 57 58 |
# File 'lib/queries/source/autocomplete.rb', line 55 def a = table[:cached_author_string].matches('%' + query_string + '%') base_query.where(a.to_sql).limit(5) end |
#autocomplete_start_author_year ⇒ ActiveRecord::Relation?
141 142 143 144 145 146 147 148 |
# File 'lib/queries/source/autocomplete.rb', line 141 def return nil if query_string.split(' ').count > 2 a = d = match_year_or_stated_year return nil if a.nil? || d.nil? z = a.and(d) base_query.where(z.to_sql) end |
#autocomplete_start_author_year_alternate ⇒ ActiveRecord::Relation?
151 152 153 154 155 156 157 158 |
# File 'lib/queries/source/autocomplete.rb', line 151 def return nil if query_string.split(' ').count > 2 a = d = match_year_or_stated_year return nil if a.nil? || d.nil? z = a.and(d) base_query.joins(:alternate_values).where(z.to_sql) end |
#autocomplete_start_of_author ⇒ ActiveRecord::Relation
Returns author matches start.
40 41 42 43 |
# File 'lib/queries/source/autocomplete.rb', line 40 def a = table[:cached_author_string].matches(query_string + '%') base_query.where(a.to_sql) end |
#autocomplete_start_of_author_alternate ⇒ ActiveRecord::Relation
Returns author matches start in alternate values.
47 48 49 50 |
# File 'lib/queries/source/autocomplete.rb', line 47 def base_query.joins(:alternate_values). where("alternate_values.alternate_value_object_attribute = 'author' AND alternate_values.value ILIKE ?", query_string + '%') end |
#autocomplete_start_of_title ⇒ ActiveRecord::Relation
Returns title matches start.
69 70 71 72 |
# File 'lib/queries/source/autocomplete.rb', line 69 def autocomplete_start_of_title a = table[:title].matches(query_string + '%') base_query.where(a.to_sql) end |
#autocomplete_wildcard_anywhere_exact_year ⇒ ActiveRecord::Relation?
178 179 180 181 182 183 184 |
# File 'lib/queries/source/autocomplete.rb', line 178 def autocomplete_wildcard_anywhere_exact_year a = match_year_or_stated_year b = match_wildcard_in_cached return nil if a.nil? || b.nil? c = a.and(b) base_query.where(c.to_sql) end |
#autocomplete_wildcard_author_exact_year ⇒ ActiveRecord::Relation?
161 162 163 164 165 166 167 168 |
# File 'lib/queries/source/autocomplete.rb', line 161 def return nil if query_string.split(' ').count > 2 a = match_year_or_stated_year d = return nil if a.nil? || d.nil? z = a.and(d) base_query.where(z.to_sql) end |
#autocomplete_wildcard_of_title_alternate ⇒ ActiveRecord::Relation
Returns title matches wildcard on alternate.
76 77 78 79 |
# File 'lib/queries/source/autocomplete.rb', line 76 def autocomplete_wildcard_of_title_alternate base_query.joins(:alternate_values). where("alternate_values.alternate_value_object_attribute = 'title' AND alternate_values.value ILIKE ?", '%' + query_string + '%') end |
#autocomplete_wildcard_pieces_and_year ⇒ ActiveRecord::Relation
Returns author matches partial string.
83 84 85 86 87 88 89 |
# File 'lib/queries/source/autocomplete.rb', line 83 def autocomplete_wildcard_pieces_and_year a = match_ordered_wildcard_pieces_in_cached b = match_year_or_stated_year return nil if a.nil? || b.nil? c = a.and(b) base_query.where(c.to_sql).limit(5) end |
#autocomplete_year ⇒ ActiveRecord::Relation
Returns multi-year match? otherwise pointless.
62 63 64 65 |
# File 'lib/queries/source/autocomplete.rb', line 62 def autocomplete_year a = table[:year].in(years) base_query.where(a.to_sql).limit(5) end |
#autocomplete_year_letter ⇒ ActiveRecord::Relation?
92 93 94 95 96 97 98 |
# File 'lib/queries/source/autocomplete.rb', line 92 def autocomplete_year_letter a = match_year_or_stated_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 |
#fragment_year_matches ⇒ ActiveRecord::Relation?
Returns if user provides 5 or fewer strings and any number of years look for any string && year.
252 253 254 255 256 257 258 259 260 |
# File 'lib/queries/source/autocomplete.rb', line 252 def fragment_year_matches if fragments.any? s = table[:cached].matches_any(fragments) s = s.and(table[:year].in(years)) if !years.empty? s else nil end end |
#match_exact_author ⇒ Arel::Nodes::Equatity
195 196 197 |
# File 'lib/queries/source/autocomplete.rb', line 195 def table[:cached_author_string].matches() end |
#match_exact_author_alternate ⇒ Arel::Nodes::Grouping
207 208 209 210 211 212 |
# File 'lib/queries/source/autocomplete.rb', line 207 def a = return nil if a.blank? alternate_values_table[:alternate_value_object_attribute].eq('author') .and(alternate_values_table[:value].matches(a)) end |
#match_start_author ⇒ Arel::Nodes::Equatity
200 201 202 203 204 |
# File 'lib/queries/source/autocomplete.rb', line 200 def a = return nil if a.blank? table[:cached_author_string].matches(a + '%') end |
#match_start_author_alternate ⇒ Arel::Nodes::Grouping
215 216 217 218 219 220 |
# File 'lib/queries/source/autocomplete.rb', line 215 def a = return nil if a.blank? alternate_values_table[:alternate_value_object_attribute].eq('author') .and(alternate_values_table[:value].matches(a + '%')) end |
#match_wildcard_author ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided
188 189 190 191 192 |
# File 'lib/queries/source/autocomplete.rb', line 188 def b = fragments return nil if b.empty? a = table[:cached_author_string].matches_all(b) end |
#match_year_or_stated_year ⇒ Arel::Nodes::Grouping?
229 230 231 232 233 234 235 236 237 |
# File 'lib/queries/source/autocomplete.rb', line 229 def match_year_or_stated_year a = years.first return nil if a.nil? year_match = table[:year].eq(a) stated_year_match = table[:stated_year].eq(a.to_s) year_match.or(stated_year_match) end |
#match_year_suffix ⇒ Arel::Nodes::Equatity
223 224 225 226 |
# File 'lib/queries/source/autocomplete.rb', line 223 def match_year_suffix return nil if year_letter.blank? table[:year_suffix].eq(year_letter) end |
#member_of_project_id ⇒ Arel::Nodes::Equatity
246 247 248 |
# File 'lib/queries/source/autocomplete.rb', line 246 def member_of_project_id project_sources_table[:project_id].in(project_id) end |
#project_sources_table ⇒ Arel::Table
321 322 323 |
# File 'lib/queries/source/autocomplete.rb', line 321 def project_sources_table ::ProjectSource.arel_table end |