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
- #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_year ⇒ ActiveRecord::Relation?
- #autocomplete_exact_author_year_letter ⇒ 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_of_author ⇒ ActiveRecord::Relation
Author matches start.
-
#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_start_author ⇒ Arel::Nodes::Equatity
-
#match_wildcard_author ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided.
- #match_year ⇒ Arel::Nodes::Equatity
- #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, #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, #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
#author_from_author_year ⇒ String
176 177 178 179 |
# File 'lib/queries/source/autocomplete.rb', line 176 def query_string.match(/[[[:word:]]]+/).to_a.last #query_string.match(/^(.+?)\W/).to_a.last end |
#autocomplete ⇒ Array
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'lib/queries/source/autocomplete.rb', line 199 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], [ autocomplete_identifier_cached_exact, false], [ &.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.
26 27 28 29 |
# File 'lib/queries/source/autocomplete.rb', line 26 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_year ⇒ ActiveRecord::Relation?
97 98 99 100 101 102 103 104 |
# File 'lib/queries/source/autocomplete.rb', line 97 def return nil if query_string.split(' ').count > 2 a = d = match_year return nil if a.nil? || d.nil? z = a.and(d) base_query.where(z.to_sql) end |
#autocomplete_exact_author_year_letter ⇒ ActiveRecord::Relation?
87 88 89 90 91 92 93 94 |
# File 'lib/queries/source/autocomplete.rb', line 87 def a = d = match_year_suffix c = match_year return nil if [a,d,c].include?(nil) z = a.and(d).and(c) base_query.where(z.to_sql) end |
#autocomplete_exact_in_cached ⇒ ActiveRecord::Relation?
127 128 129 130 131 |
# File 'lib/queries/source/autocomplete.rb', line 127 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.
41 42 43 44 |
# File 'lib/queries/source/autocomplete.rb', line 41 def a = table[:cached_author_string].matches('%' + query_string + '%') base_query.where(a.to_sql).limit(5) end |
#autocomplete_start_author_year ⇒ ActiveRecord::Relation?
107 108 109 110 111 112 113 114 |
# File 'lib/queries/source/autocomplete.rb', line 107 def return nil if query_string.split(' ').count > 2 a = d = match_year return nil if a.nil? || d.nil? z = a.and(d) base_query.where(z.to_sql) end |
#autocomplete_start_of_author ⇒ ActiveRecord::Relation
Returns author matches start.
33 34 35 36 |
# File 'lib/queries/source/autocomplete.rb', line 33 def a = table[:cached_author_string].matches(query_string + '%') base_query.where(a.to_sql) end |
#autocomplete_start_of_title ⇒ ActiveRecord::Relation
Returns title matches start.
55 56 57 58 |
# File 'lib/queries/source/autocomplete.rb', line 55 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?
134 135 136 137 138 139 140 |
# File 'lib/queries/source/autocomplete.rb', line 134 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) end |
#autocomplete_wildcard_author_exact_year ⇒ ActiveRecord::Relation?
117 118 119 120 121 122 123 124 |
# File 'lib/queries/source/autocomplete.rb', line 117 def return nil if query_string.split(' ').count > 2 a = match_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.
62 63 64 65 |
# File 'lib/queries/source/autocomplete.rb', line 62 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.
69 70 71 72 73 74 75 |
# File 'lib/queries/source/autocomplete.rb', line 69 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_year ⇒ ActiveRecord::Relation
Returns multi-year match? otherwise pointless.
48 49 50 51 |
# File 'lib/queries/source/autocomplete.rb', line 48 def autocomplete_year a = table[:year].in(years) base_query.where(a.to_sql).limit(5) end |
#autocomplete_year_letter ⇒ ActiveRecord::Relation?
78 79 80 81 82 83 84 |
# File 'lib/queries/source/autocomplete.rb', line 78 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 |
#fragment_year_matches ⇒ ActiveRecord::Relation?
Returns if user provides 5 or fewer strings and any number of years look for any string && year.
188 189 190 191 192 193 194 195 196 |
# File 'lib/queries/source/autocomplete.rb', line 188 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
151 152 153 |
# File 'lib/queries/source/autocomplete.rb', line 151 def table[:cached_author_string].matches() end |
#match_start_author ⇒ Arel::Nodes::Equatity
156 157 158 159 160 |
# File 'lib/queries/source/autocomplete.rb', line 156 def a = return nil if a.blank? table[:cached_author_string].matches(a + '%') end |
#match_wildcard_author ⇒ Arel::Nodes::Matches
match ALL wildcards, but unordered, if 2 - 6 pieces provided
144 145 146 147 148 |
# File 'lib/queries/source/autocomplete.rb', line 144 def b = fragments return nil if b.empty? a = table[:cached_author_string].matches_all(b) end |
#match_year ⇒ Arel::Nodes::Equatity
169 170 171 172 173 |
# File 'lib/queries/source/autocomplete.rb', line 169 def match_year a = years.first return nil if a.nil? table[:year].eq(a) end |
#match_year_suffix ⇒ Arel::Nodes::Equatity
163 164 165 166 |
# File 'lib/queries/source/autocomplete.rb', line 163 def match_year_suffix return nil if year_letter.blank? table[:year_suffix].eq(year_letter) end |
#member_of_project_id ⇒ Arel::Nodes::Equatity
182 183 184 |
# File 'lib/queries/source/autocomplete.rb', line 182 def member_of_project_id project_sources_table[:project_id].in(project_id) end |
#project_sources_table ⇒ Arel::Table
252 253 254 |
# File 'lib/queries/source/autocomplete.rb', line 252 def project_sources_table ::ProjectSource.arel_table end |