class Mincer::PgSearch::SearchEngines::Fulltext
Constants
- DISALLOWED_TSQUERY_CHARACTERS
Public Instance Methods
conditions()
click to toggle source
# File lib/mincer/processors/pg_search/search_engines/fulltext.rb, line 7 def conditions return nil unless prepared_search_statements.any? arel_group do documents = prepared_search_statements.map do |search_statement| ts_query = ts_query_for(search_statement) ts_vectors_for(search_statement).map do |ts_vector| arel_group(Arel::Nodes::InfixOperation.new('@@', ts_vector, ts_query)) end end.flatten join_expressions(documents, :or) end end
rank()
click to toggle source
# File lib/mincer/processors/pg_search/search_engines/fulltext.rb, line 21 def rank return nil unless prepared_search_statements.any? arel_group do ranks = prepared_search_statements.map do |search_statement| ts_query = ts_query_for(search_statement) ts_vectors_for(search_statement).map do |ts_vector| Arel::Nodes::NamedFunction.new('ts_rank', [ts_vector, ts_query]) end end.flatten join_expressions(ranks, '+') end end
Private Instance Methods
prepared_search_statements()
click to toggle source
# File lib/mincer/processors/pg_search/search_engines/fulltext.rb, line 37 def prepared_search_statements @prepared_search_statements ||= search_engine_statements.map do |search_statement| pattern = args[search_statement.param_name] search_statement.pattern = pattern && pattern.gsub(DISALLOWED_TSQUERY_CHARACTERS, ' ').split(' ').compact search_statement.pattern.present? && search_statement.pattern.any? ? search_statement : nil end.compact end
ts_query_for(search_statement)
click to toggle source
# File lib/mincer/processors/pg_search/search_engines/fulltext.rb, line 54 def ts_query_for(search_statement) terms_delimiter = search_statement.options[:any_word] ? '|' : '&' tsquery = search_statement.terms.map do |term| _term = search_statement.options[:prefix_matching] ? "#{term}:*" : term sanitize_string_quoted(_term, search_statement.sanitizers(:query)).to_sql end.join(" || ' #{terms_delimiter} ' || ") Arel::Nodes::NamedFunction.new('to_tsquery', [quote(search_statement.dictionary), Arel.sql(tsquery)]) end
ts_vectors_for(search_statement)
click to toggle source
# File lib/mincer/processors/pg_search/search_engines/fulltext.rb, line 45 def ts_vectors_for(search_statement) sanitizers = search_statement.sanitizers(:document) # sanitizers += [:coalesce] if (search_statement.columns.size > 1) documents = search_statement.columns.map do |search_column| sanitized_term = sanitize_column(search_column, sanitizers) ts_vector = Arel::Nodes::NamedFunction.new('to_tsvector', [quote(search_statement.dictionary), sanitized_term]) end end