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
apply_pg_search(relation, args)
click to toggle source
# File lib/mincer/processors/pg_search/processor.rb, line 20 def apply_pg_search(relation, args) rel = relation.where(conditions(args)) rank = rank(args) if rank.blank? || (@mincer.respond_to?(:skip_order_by_rank) && @mincer.skip_order_by_rank) rel elsif @mincer.default_sorting rel.reorder(rank) else rel.order(rank) 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