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