6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# File 'lib/pg_searchable/active_record/relation.rb', line 6
def search_for(term, options = {})
using = Array(options.delete(:using) || :default)
models = Array(options[:in]).map {|association| klass.reflect_on_association(association).klass }
conditions = []
orders = []
[self.klass, models].flatten.each do |klass|
name = using.find {|name| klass.pg_searchable_configs.key?(name.to_sym) }
config = klass.pg_searchable_configs[name]
Array(config[:tsearch][:columns]).each do |name|
conditions << klass.arel_table[name].tsearch(term, config[:tsearch][:dictionary]).to_sql
orders << "ts_rank_cd(ARRAY[#{config[:tsearch][:weights][0]}, #{config[:tsearch][:weights][1]}, #{config[:tsearch][:weights][2]}, #{config[:tsearch][:weights][3]}], #{arel_table.name}.#{name}, to_tsquery('#{config[:tsearch][:dictionary]}', '#{term}'), #{config[:tsearch][:normalization]})"
end
Array(config[:tgrm][:columns]).each do |name|
conditions << klass.arel_table[name].tgrm(term).to_sql
orders << "(coalesce(similarity(#{klass.arel_table.name}.#{name}, '#{term}'), 0) / 4)"
end
Array(config[:dmetaphone][:columns]).each do |name|
conditions << klass.arel_table[name].dmetaphone(term, config[:dmetaphone][:dictionary]).to_sql
orders << "(ts_rank_cd(ARRAY[#{config[:dmetaphone][:weights][0]}, #{config[:dmetaphone][:weights][1]}, #{config[:dmetaphone][:weights][2]}, #{config[:dmetaphone][:weights][3]}], #{arel_table.name}.#{name}, to_tsquery('#{config[:dmetaphone][:dictionary]}', pg_searchable_dmetaphone('#{term}')), #{config[:dmetaphone][:normalization]}) / 2)"
end
end
where("#{conditions.join(' OR ')}")end
|