Class: FullSearch::ExactMatch

Inherits:
Object
  • Object
show all
Defined in:
lib/full_search/exact_match.rb

Class Method Summary collapse

Class Method Details

.ids_for(model, query, filters) ⇒ Object



5
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
34
35
36
37
38
39
40
41
# File 'lib/full_search/exact_match.rb', line 5

def self.ids_for(model, query, filters)
  dsl = model.full_search_dsl
  return [] if dsl.exact_matches.empty?

  cleaned = query.to_s.strip
  return [] if cleaned.empty?

  sql_matches = dsl.exact_matches.select(&:sql)
  ruby_matches = dsl.exact_matches.reject(&:sql)

  ids = []

  if sql_matches.any?
    base = model.all
    filters.each { |name, value| base = base.where(name => value) }

    conditions = sql_matches.map do |em|
      "(#{em.sql}) = #{model.connection.quote(cleaned)}"
    end.join(" OR ")

    ids += base.where(conditions).pluck(:id)
  end

  if ruby_matches.any?
    base = model.all
    filters.each { |name, value| base = base.where(name => value) }

    base.find_each do |record|
      ruby_matches.each do |em|
        value = record.instance_exec(&em.source)
        ids << record.id if value.to_s.casecmp?(cleaned)
      end
    end
  end

  ids.uniq
end