class Mincer::Processors::PgSearch::Processor

Public Class Methods

new(mincer) click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 8
def initialize(mincer)
  @mincer, @args, @relation = mincer, mincer.args, mincer.relation
end

Public Instance Methods

apply() click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 12
def apply
  if Mincer.postgres?
    @relation = apply_pg_search(@relation, @args)
  else
    @relation
  end
end
conditions(args) click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 32
def conditions(args)
  search_statements_conditions = search_statements.map do |search_statement|
    conditions = pg_search_engines(args, search_statement).map do |pg_search_engine|
      pg_search_engine.conditions
    end.compact
    join_expressions(conditions, options[:join_with] || :or)
  end.compact
  join_expressions(search_statements_conditions, options[:join_with] || :or).try(:to_sql)
end
default_search_statements() click to toggle source

We use only text/string columns and avoid array

# File lib/mincer/processors/pg_search/processor.rb, line 71
def default_search_statements
  column_names = @relation.columns.reject do |column|
    ![:string, :text].include?(column.type) || column.array
  end.map do |column|
    "#{@relation.table_name}.#{column.name}"
  end
  [SearchStatement.new(column_names, search_statement_default_options([:fulltext]).merge(engines: [:fulltext]))]
end
options() click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 84
def options
  @mincer.send(:pg_search_options)
end
params() click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 80
def params
  Array.wrap(@mincer.send(:pg_search_params))
end
pg_search_engines(args, search_statement) click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 53
def pg_search_engines(args, search_statement)
  Mincer.config.pg_search.engines.map do |engine_class|
    engine_class.new(args, [search_statement])
  end
end
rank(args) click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 42
def rank(args)
  search_statements_conditions = search_statements.map do |search_statement|
    conditions = pg_search_engines(args, search_statement).map do |pg_search_engine|
      pg_search_engine.rank
    end.compact
    join_expressions(conditions, :+)
  end.compact
  rank = join_expressions(search_statements_conditions, :+).try(:to_sql)
  Arel.sql("#{rank} DESC") if rank.present?
end
search_statement_default_options(engines) click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 88
def search_statement_default_options(engines)
  (engines & [:fulltext, :trigram, :array]).inject({}) do |options, engine|
    options = Mincer.config.pg_search.send("#{engine}_engine").merge(options)
    options
  end
end
search_statements() click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 59
def search_statements
  @search_statements ||= params.any? { |param| param[:columns] } ? search_statements_from_params : default_search_statements
end
search_statements_from_params() click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 63
def search_statements_from_params
  params.map do |param|
    par = param.dup
    SearchStatement.new(par.delete(:columns), search_statement_default_options(param[:engines]).merge(par))
  end
end