Module: MongoidExt::Filter::ClassMethods
- Defined in:
- lib/mongoid_ext/filter.rb
Instance Method Summary collapse
- #_build_filter_query(parsed_query) ⇒ Object
- #filter(query, opts = {}) ⇒ Object
- #filter_conditions(query, opts = {}) ⇒ Object
- #filterable_keys(*keys) ⇒ Object
- #language(lang = 'en') ⇒ Object
- #map_filter_operators(quotes, ops) ⇒ Object
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 |