Class: Queries::Serial::Autocomplete
- Inherits:
-
Query::Autocomplete
- Object
- Query
- Query::Autocomplete
- Queries::Serial::Autocomplete
- Defined in:
- lib/queries/serial/autocomplete.rb
Instance Attribute Summary
Attributes inherited from Query::Autocomplete
#dynamic_limit, #project_id, #query_string
Attributes inherited from Query
Instance Method Summary collapse
- #alternate_value_table ⇒ Arel::Table
- #autocomplete ⇒ Array
- #autocomplete_begining_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
-
#autocomplete_begining_name ⇒ ActiveRecord::Relation
Match begining of name.
- #autocomplete_exact_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
-
#autocomplete_exact_name ⇒ ActiveRecord::Relation
Match exact name.
-
#autocomplete_ordered_wildcard_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
TODO: these three should be factored out to just the join, made more Arel like.
- #autocomplete_ordered_wildcard_pieces_in_name ⇒ ActiveRecord::Relation
- #base_query ⇒ Scope
-
#initialize(string, project_id: nil) ⇒ Autocomplete
constructor
A new instance of Autocomplete.
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, #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, #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) ⇒ Autocomplete
Returns a new instance of Autocomplete.
6 7 8 |
# File 'lib/queries/serial/autocomplete.rb', line 6 def initialize(string, project_id: nil) super end |
Instance Method Details
#alternate_value_table ⇒ Arel::Table
120 121 122 |
# File 'lib/queries/serial/autocomplete.rb', line 120 def alternate_value_table ::AlternateValue.arel_table end |
#autocomplete ⇒ Array
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/queries/serial/autocomplete.rb', line 16 def autocomplete queries = [ autocomplete_exact_name, #autocomplete_exact_alternate_value, autocomplete_exact_alternate_value('name', 'AlternateValue::Translation'), autocomplete_exact_alternate_value('name', 'AlternateValue::Abbreviation'), autocomplete_begining_name, #autocomplete_begining_alternate_value, autocomplete_begining_alternate_value('name', 'AlternateValue::Translation'), autocomplete_begining_alternate_value('name', 'AlternateValue::Abbreviation'), autocomplete_ordered_wildcard_pieces_in_name, #autocomplete_ordered_wildcard_alternate_value, autocomplete_ordered_wildcard_alternate_value('name', 'AlternateValue::Translation'), autocomplete_ordered_wildcard_alternate_value('name', 'AlternateValue::Abbreviation') ] queries.compact! updated_queries = [] pr_id = project_id.join(',') if project_id queries.each_with_index do |q ,i| a = q if project_id a = a.select("serials.*, COUNT(project_sources.source_id) AS use_count, CASE WHEN project_sources.project_id IN (#{pr_id}) THEN project_sources.project_id ELSE NULL END AS in_project") .left_outer_joins(:sources) .joins('LEFT OUTER JOIN project_sources ON sources.id = project_sources.source_id') .group('serials.id, project_sources.project_id') .order('in_project, use_count DESC') end 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 if result.first.try(:use_count).nil? return result[0..19] else return result.sort_by{|i| -i.use_count}[0..19] end end |
#autocomplete_begining_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
103 104 105 106 107 108 109 |
# File 'lib/queries/serial/autocomplete.rb', line 103 def autocomplete_begining_alternate_value(attribute = 'name', type = 'AlternateValue') ::Serial.joins(:alternate_values).where( alternate_value_table[:type].eq(type).and( alternate_value_table[:alternate_value_object_attribute].eq(attribute). and(alternate_value_table[:value].matches(query_string + '%'))).to_sql ).limit(20) end |
#autocomplete_begining_name ⇒ ActiveRecord::Relation
Returns match begining of name.
74 75 76 77 |
# File 'lib/queries/serial/autocomplete.rb', line 74 def autocomplete_begining_name a = table[:name].matches(query_string + '%') base_query.where(a.to_sql).limit(20) end |
#autocomplete_exact_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
95 96 97 98 99 100 101 |
# File 'lib/queries/serial/autocomplete.rb', line 95 def autocomplete_exact_alternate_value(attribute = 'name', type = 'AlternateValue') ::Serial.joins(:alternate_values).where( alternate_value_table[:type].eq(type).and( alternate_value_table[:alternate_value_object_attribute].eq(attribute). and(alternate_value_table[:value].eq(query_string))).to_sql ).limit(20) end |
#autocomplete_exact_name ⇒ ActiveRecord::Relation
Returns match exact name.
67 68 69 70 |
# File 'lib/queries/serial/autocomplete.rb', line 67 def autocomplete_exact_name a = table[:name].eq(query_string) base_query.where(a.to_sql).limit(20) end |
#autocomplete_ordered_wildcard_alternate_value(attribute = 'name', type = 'AlternateValue') ⇒ Object
TODO: these three should be factored out to just the join, made more Arel like
87 88 89 90 91 92 93 |
# File 'lib/queries/serial/autocomplete.rb', line 87 def autocomplete_ordered_wildcard_alternate_value(attribute = 'name', type = 'AlternateValue') ::Serial.joins(:alternate_values).where( alternate_value_table[:type].eq(type).and( alternate_value_table[:alternate_value_object_attribute].eq(attribute). and(alternate_value_table[:value].matches(wildcard_pieces))).to_sql ).limit(10) end |
#autocomplete_ordered_wildcard_pieces_in_name ⇒ ActiveRecord::Relation
80 81 82 83 |
# File 'lib/queries/serial/autocomplete.rb', line 80 def autocomplete_ordered_wildcard_pieces_in_name a = table[:name].matches(wildcard_pieces) base_query.where( a.to_sql).limit(10) end |
#base_query ⇒ Scope
11 12 13 |
# File 'lib/queries/serial/autocomplete.rb', line 11 def base_query ::Serial.select('serials.*') end |