module Texticle
Constants
- VERSION
Public Class Methods
searchable_language()
click to toggle source
# File lib/texticle.rb, line 6 def self.searchable_language 'english' end
version()
click to toggle source
# File lib/texticle/version.rb, line 6 def self.version VERSION end
Public Instance Methods
advanced_search(query = "", exclusive = true)
click to toggle source
# File lib/texticle.rb, line 22 def advanced_search(query = "", exclusive = true) exclusive, query = munge_exclusive_and_query(exclusive, query) parsed_query_hash = parse_query_hash(query) similarities, conditions = advanced_similarities_and_conditions(parsed_query_hash) assemble_query(similarities, conditions, exclusive) end
basic_search(query = "", exclusive = true)
click to toggle source
# File lib/texticle.rb, line 15 def basic_search(query = "", exclusive = true) exclusive, query = munge_exclusive_and_query(exclusive, query) parsed_query_hash = parse_query_hash(query) similarities, conditions = basic_similarities_and_conditions(parsed_query_hash) assemble_query(similarities, conditions, exclusive) end
fuzzy_search(query = '', exclusive = true)
click to toggle source
# File lib/texticle.rb, line 29 def fuzzy_search(query = '', exclusive = true) exclusive, query = munge_exclusive_and_query(exclusive, query) parsed_query_hash = parse_query_hash(query) similarities, conditions = fuzzy_similarities_and_conditions(parsed_query_hash) assemble_query(similarities, conditions, exclusive) end
method_missing(method, *search_terms)
click to toggle source
Calls superclass method
# File lib/texticle.rb, line 36 def method_missing(method, *search_terms) return super if self == ActiveRecord::Base if Helper.dynamic_search_method?(method, self.columns) exclusive = Helper.exclusive_dynamic_search_method?(method, self.columns) columns = exclusive ? Helper.exclusive_dynamic_search_columns(method) : Helper.inclusive_dynamic_search_columns(method) metaclass = class << self; self; end metaclass.__send__(:define_method, method) do |*args| query = columns.inject({}) do |query, column| query.merge column => args.shift end self.send(Helper.search_type(method), query, exclusive) end __send__(method, *search_terms, exclusive) else super end rescue ActiveRecord::StatementInvalid super end
respond_to?(method, include_private = false)
click to toggle source
Calls superclass method
# File lib/texticle.rb, line 56 def respond_to?(method, include_private = false) return super if self == ActiveRecord::Base Helper.dynamic_search_method?(method, self.columns) or super rescue StandardError super end
search(query = "", exclusive = true)
click to toggle source
# File lib/texticle.rb, line 10 def search(query = "", exclusive = true) warn "[DEPRECATION] `search` is deprecated. Please use `advanced_search` instead. At the next major release `search` will become an alias for `basic_search`." advanced_search(query, exclusive) end
Private Instance Methods
advanced_condition_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 125 def advanced_condition_string(table_name, column, search_term) "to_tsvector(#{quoted_language}, #{table_name}.#{column}::text) @@ to_tsquery(#{quoted_language}, #{search_term}::text)" end
advanced_similarities_and_conditions(parsed_query_hash)
click to toggle source
# File lib/texticle.rb, line 112 def advanced_similarities_and_conditions(parsed_query_hash) parsed_query_hash.inject([[], []]) do |(similarities, conditions), query_args| similarities << advanced_similarity_string(*query_args) conditions << advanced_condition_string(*query_args) [similarities, conditions] end end
advanced_similarity_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 121 def advanced_similarity_string(table_name, column, search_term) "ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), to_tsquery(#{quoted_language}, #{search_term}::text))" end
assemble_query(similarities, conditions, exclusive)
click to toggle source
# File lib/texticle.rb, line 146 def assemble_query(similarities, conditions, exclusive) rank = connection.quote_column_name('rank' + rand.to_s) select("#{quoted_table_name + '.*,' if scoped.select_values.empty?} #{similarities.join(" + ")} AS #{rank}"). where(conditions.join(exclusive ? " AND " : " OR ")). order("#{rank} DESC") end
basic_condition_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 108 def basic_condition_string(table_name, column, search_term) "to_tsvector(#{quoted_language}, #{table_name}.#{column}::text) @@ plainto_tsquery(#{quoted_language}, #{search_term}::text)" end
basic_similarities_and_conditions(parsed_query_hash)
click to toggle source
# File lib/texticle.rb, line 95 def basic_similarities_and_conditions(parsed_query_hash) parsed_query_hash.inject([[], []]) do |(similarities, conditions), query_args| similarities << basic_similarity_string(*query_args) conditions << basic_condition_string(*query_args) [similarities, conditions] end end
basic_similarity_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 104 def basic_similarity_string(table_name, column, search_term) "ts_rank(to_tsvector(#{quoted_language}, #{table_name}.#{column}::text), plainto_tsquery(#{quoted_language}, #{search_term}::text))" end
fuzzy_condition_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 142 def fuzzy_condition_string(table_name, column, search_term) "(#{table_name}.#{column} % #{search_term})" end
fuzzy_similarities_and_conditions(parsed_query_hash)
click to toggle source
# File lib/texticle.rb, line 129 def fuzzy_similarities_and_conditions(parsed_query_hash) parsed_query_hash.inject([[], []]) do |(similarities, conditions), query_args| similarities << fuzzy_similarity_string(*query_args) conditions << fuzzy_condition_string(*query_args) [similarities, conditions] end end
fuzzy_similarity_string(table_name, column, search_term)
click to toggle source
# File lib/texticle.rb, line 138 def fuzzy_similarity_string(table_name, column, search_term) "similarity(#{table_name}.#{column}, #{search_term})" end
munge_exclusive_and_query(exclusive, query)
click to toggle source
# File lib/texticle.rb, line 65 def munge_exclusive_and_query(exclusive, query) unless query.is_a?(Hash) exclusive = false query = searchable_columns.inject({}) do |terms, column| terms.merge column => query.to_s end end [exclusive, query] end
normalize(query)
click to toggle source
# File lib/texticle.rb, line 154 def normalize(query) query end
parse_query_hash(query, table_name = quoted_table_name)
click to toggle source
# File lib/texticle.rb, line 76 def parse_query_hash(query, table_name = quoted_table_name) table_name = connection.quote_table_name(table_name) results = [] query.each do |column_or_table, search_term| if search_term.is_a?(Hash) results += parse_query_hash(search_term, column_or_table) else column = connection.quote_column_name(column_or_table) search_term = connection.quote normalize(Helper.normalize(search_term)) results << [table_name, column, search_term] end end results end
quoted_language()
click to toggle source
# File lib/texticle.rb, line 162 def quoted_language @quoted_language ||= connection.quote(searchable_language) end
searchable_columns()
click to toggle source
# File lib/texticle.rb, line 158 def searchable_columns columns.select {|column| [:string, :text].include? column.type }.map(&:name) end
searchable_language()
click to toggle source
# File lib/texticle.rb, line 166 def searchable_language Texticle.searchable_language end