Module: MongoidExt::Filter::ClassMethods

Defined in:
lib/mongoid_ext/filter.rb

Instance Method Summary collapse

Instance Method Details

#_build_filter_query(parsed_query) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/mongoid_ext/filter.rb', line 72

def _build_filter_query(parsed_query)
  mongoquery = {}

  if !parsed_query[:tokens].empty?
    keywords = []

    parsed_query[:tokens].each do |t|
      keywords << /^#{Regexp.escape(t)}/i if t.size > 2
    end

    mongoquery[:_keywords] = { :$in => keywords }
  end

  mongoquery.merge!(map_filter_operators(parsed_query[:quotes], parsed_query[:operators]))

  mongoquery
end

#filter(query, opts = {}) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/mongoid_ext/filter.rb', line 48

def filter(query, opts = {})
  min_score = opts.delete(:min_score) || 0.0
  limit = opts.delete(:per_page) || 25
  page = opts.delete(:page) || 1
  select = opts.delete(:select) || self.fields.keys

  parsed_query, conds = self.filter_conditions(query, opts)
  query = Mongoid::Criteria.new(self)
  conds = query.where(opts).where(conds).selector

  results = self.db.nolock_eval("function(collection, q, config) { return filter(collection, q, config); }", self.collection_name, conds, {:words => parsed_query[:words].to_a, :stemmed => parsed_query[:stemmed].to_a, :limit => limit, :min_score => min_score, :select => select })

  pagination = MongoidExt::Filter::ResultSet.new(results["total_entries"], parsed_query, conds, page, limit)

  pagination.subject = results['results'].map do |result|
    item = self.new(result['doc'])
    item.search_score = result['score']

    item
  end

  pagination
end

#filter_conditions(query, opts = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/mongoid_ext/filter.rb', line 34

def filter_conditions(query, opts = {})
  stemmer = nil
  language = opts.delete(:language) || 'en'

  if defined?(Lingua::Stemmer)
    stemmer = MongoidExt::Filter.build_stemmer(language)
  end

  @parser = MongoidExt::Filter::Parser.new(stemmer)
  parsed_query = @parser.parse(query)

  [parsed_query, _build_filter_query(parsed_query)]
end

#filterable_keys(*keys) ⇒ Object



23
24
25
26
27
28
# File 'lib/mongoid_ext/filter.rb', line 23

def filterable_keys(*keys)
  @filterable_keys ||= Set.new
  @filterable_keys += keys

  @filterable_keys
end

#language(lang = 'en') ⇒ Object



30
31
32
# File 'lib/mongoid_ext/filter.rb', line 30

def language(lang = 'en')
  @language ||= lang
end

#map_filter_operators(quotes, ops) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/mongoid_ext/filter.rb', line 90

def map_filter_operators(quotes, ops)
  mongoquery = {}

  if ops["is"]
    ops["is"].each do |d|
      mongoquery[d] = true
    end
  end

  if ops["not"]
    ops["not"].each do |d|
      mongoquery[d] = false
    end
  end

  mongoquery
end