Class: Queries::Source::Autocomplete
- Inherits:
-
Query::Autocomplete
- Object
- Query
- Query::Autocomplete
- Queries::Source::Autocomplete
- Defined in:
- lib/queries/source/autocomplete.rb
Constant Summary collapse
- SOURCE_ROLE_TYPES =
['SourceAuthor', 'SourceEditor', 'SourceSource'].freeze
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_alternate ⇒ ActiveRecord::Relation
- #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
-
#autocomplete_start_of_title ⇒ ActiveRecord::Relation
Title matches start.
- #autocomplete_wildcard_anywhere_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 !! Not used currently.
-
#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_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.
13 14 15 16 |
# File 'lib/queries/source/autocomplete.rb', line 13 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
10 11 12 |
# File 'lib/queries/source/autocomplete.rb', line 10 def limit_to_project @limit_to_project end |
Instance Method Details
#author_from_author_year ⇒ String
242 243 244 245 |
# File 'lib/queries/source/autocomplete.rb', line 242 def query_string.match(/[[[:word:]]]+/).to_a.last #query_string.match(/^(.+?)\W/).to_a.last end |
#autocomplete ⇒ Array
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 319 |
# File 'lib/queries/source/autocomplete.rb', line 265 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], #[ 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.
38 39 40 41 |
# File 'lib/queries/source/autocomplete.rb', line 38 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.
20 21 22 23 |
# File 'lib/queries/source/autocomplete.rb', line 20 def a = table[:cached_author_string].matches(query_string) base_query.where(a.to_sql) end |
#autocomplete_exact_author_alternate ⇒ ActiveRecord::Relation
26 27 28 29 30 31 32 33 |
# File 'lib/queries/source/autocomplete.rb', line 26 def ::Source .joins(roles: {person: :alternate_values}) .where(roles: {type: SOURCE_ROLE_TYPES}) .where(alternate_values: {alternate_value_object_attribute: 'last_name'}) .where(alternate_values: {value: query_string}) .limit(20) end |
#autocomplete_exact_author_year ⇒ ActiveRecord::Relation?
137 138 139 140 141 142 143 144 |
# File 'lib/queries/source/autocomplete.rb', line 137 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?
147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/queries/source/autocomplete.rb', line 147 def return nil if query_string.split(' ').count > 2 = d = match_year_or_stated_year return nil if .nil? || d.nil? ::Source .joins(roles: {person: :alternate_values}) .where(roles: {type: SOURCE_ROLE_TYPES}) .where(d.to_sql) .where(alternate_values: {alternate_value_object_attribute: 'last_name'}) .where('alternate_values.value = ?', ) .limit(20) end |
#autocomplete_exact_author_year_letter ⇒ ActiveRecord::Relation?
110 111 112 113 114 115 116 117 |
# File 'lib/queries/source/autocomplete.rb', line 110 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?
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/queries/source/autocomplete.rb', line 120 def = d = match_year_suffix c = match_year_or_stated_year return nil if [,d,c].include?(nil) z = d.and(c) ::Source .joins(roles: {person: :alternate_values}) .where(roles: {type: SOURCE_ROLE_TYPES}) .where(z.to_sql) .where(alternate_values: {alternate_value_object_attribute: 'last_name'}) .where('alternate_values.value = ?', ) .limit(20) end |
#autocomplete_exact_in_cached ⇒ ActiveRecord::Relation?
189 190 191 192 193 |
# File 'lib/queries/source/autocomplete.rb', line 189 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.
63 64 65 66 |
# File 'lib/queries/source/autocomplete.rb', line 63 def a = table[:cached_author_string].matches('%' + query_string + '%') base_query.where(a.to_sql).limit(5) end |
#autocomplete_start_author_year ⇒ ActiveRecord::Relation?
163 164 165 166 167 168 169 170 |
# File 'lib/queries/source/autocomplete.rb', line 163 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?
173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/queries/source/autocomplete.rb', line 173 def return nil if query_string.split(' ').count > 2 = d = match_year_or_stated_year return nil if .nil? || d.nil? ::Source .joins(roles: {person: :alternate_values}) .where(roles: {type: SOURCE_ROLE_TYPES}) .where(d.to_sql) .where(alternate_values: {alternate_value_object_attribute: 'last_name'}) .where('alternate_values.value ILIKE ?', "#{}%") .limit(20) end |
#autocomplete_start_of_author ⇒ ActiveRecord::Relation
Returns author matches start.
45 46 47 48 |
# File 'lib/queries/source/autocomplete.rb', line 45 def a = table[:cached_author_string].matches(query_string + '%') base_query.where(a.to_sql) end |
#autocomplete_start_of_author_alternate ⇒ ActiveRecord::Relation
51 52 53 54 55 56 57 58 |
# File 'lib/queries/source/autocomplete.rb', line 51 def ::Source .joins(roles: {person: :alternate_values}) .where(roles: {type: SOURCE_ROLE_TYPES}) .where(alternate_values: {alternate_value_object_attribute: 'last_name'}) .where('alternate_values.value ILIKE ?', "#{query_string}%") .limit(20) end |
#autocomplete_start_of_title ⇒ ActiveRecord::Relation
Returns title matches start.
77 78 79 80 |
# File 'lib/queries/source/autocomplete.rb', line 77 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?
196 197 198 199 200 201 202 |
# File 'lib/queries/source/autocomplete.rb', line 196 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_of_title_alternate ⇒ ActiveRecord::Relation
Returns title matches wildcard on alternate.
84 85 86 87 |
# File 'lib/queries/source/autocomplete.rb', line 84 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
!! Not used currently.
92 93 94 95 96 97 98 |
# File 'lib/queries/source/autocomplete.rb', line 92 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.
70 71 72 73 |
# File 'lib/queries/source/autocomplete.rb', line 70 def autocomplete_year a = table[:year].in(years) base_query.where(a.to_sql).limit(5) end |
#autocomplete_year_letter ⇒ ActiveRecord::Relation?
101 102 103 104 105 106 107 |
# File 'lib/queries/source/autocomplete.rb', line 101 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.
254 255 256 257 258 259 260 261 262 |
# File 'lib/queries/source/autocomplete.rb', line 254 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
213 214 215 |
# File 'lib/queries/source/autocomplete.rb', line 213 def table[:cached_author_string].matches() end |
#match_start_author ⇒ Arel::Nodes::Equatity
218 219 220 221 222 |
# File 'lib/queries/source/autocomplete.rb', line 218 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
206 207 208 209 210 |
# File 'lib/queries/source/autocomplete.rb', line 206 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?
231 232 233 234 235 236 237 238 239 |
# File 'lib/queries/source/autocomplete.rb', line 231 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
225 226 227 228 |
# File 'lib/queries/source/autocomplete.rb', line 225 def match_year_suffix return nil if year_letter.blank? table[:year_suffix].eq(year_letter) end |
#member_of_project_id ⇒ Arel::Nodes::Equatity
248 249 250 |
# File 'lib/queries/source/autocomplete.rb', line 248 def member_of_project_id project_sources_table[:project_id].in(project_id) end |
#project_sources_table ⇒ Arel::Table
322 323 324 |
# File 'lib/queries/source/autocomplete.rb', line 322 def project_sources_table ::ProjectSource.arel_table end |