class Mincer::PgSearch::SearchEngines::Trigram

Private Class Methods

default_threshold() click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 46
def self.default_threshold
  if @@default_threshold.nil?
    grab_default_threshold
  else
    @@default_threshold
  end
end
grab_default_threshold() click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 54
def self.grab_default_threshold
  @@default_threshold = ::Mincer.connection.execute('SELECT show_limit();').first['show_limit'].to_r
end

Public Instance Methods

conditions() click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 7
def conditions
  return nil unless prepared_search_statements.any?
  arel_group do
    join_expressions(prepared_search_statements.map { |search_statement| document_for(search_statement) }, :or)
  end
end
rank() click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 14
def rank
  return nil unless prepared_search_statements.any?
  arel_group do
    join_expressions(prepared_search_statements.map { |search_statement| rank_for(search_statement) }, :+)
  end
end

Private Instance Methods

document_for(search_statement) click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 24
def document_for(search_statement)
  documents = search_statement.columns.map do |search_column|
    if self.class.default_threshold == search_statement.threshold
      arel_group(join_expressions([sanitize_column(search_column, search_statement.sanitizers(:document)), sanitize_string(search_statement.pattern, search_statement.sanitizers(:query))], '%'))
    else
      arel_group(similarity_function(search_column, search_statement).gteq(search_statement.threshold))
    end
  end
  join_expressions(documents, :or)
end
rank_for(search_statement) click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 35
def rank_for(search_statement)
  ranks = search_statement.columns.map do |search_column|
    similarity_function(search_column, search_statement)
  end
  join_expressions(ranks, :+)
end
similarity_function(search_column, search_statement) click to toggle source
# File lib/mincer/processors/pg_search/search_engines/trigram.rb, line 42
def similarity_function(search_column, search_statement)
  Arel::Nodes::NamedFunction.new('similarity', [sanitize_column(search_column, search_statement.sanitizers(:document)), sanitize_string(search_statement.pattern, search_statement.sanitizers(:query))])
end