mongomapper_ext 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -30,14 +30,55 @@ module MongoMapperExt
30
30
  end
31
31
 
32
32
  def filter(query, opts = {})
33
- q = query.downcase.split.map do |k|
34
- Regexp.escape(k)
35
- end.join("|")
33
+ stemmer = nil
34
+ original_words = Set.new(query.downcase.split)
35
+ language = opts.delete(:language) || 'en'
36
+
37
+ stemmed = []
38
+ if defined?(Lingua)
39
+ stemmer = Lingua::Stemmer.new(:language => language)
40
+ original_words.each do |word|
41
+ stemmed_word = stemmer.stem(word)
42
+ stemmed << stemmed_word unless original_words.include?(stemmed_word)
43
+ end
44
+ end
45
+
46
+ regex = (original_words+stemmed).map do |k|
47
+ /^#{Regexp.escape(k)}/
48
+ end
49
+
36
50
  if opts[:per_page]
37
- self.paginate(opts.deep_merge(:conditions => {:_keywords => /^(#{q}).*/ }))
51
+ result = self.paginate(opts.deep_merge(:conditions => {:_keywords => regex }))
52
+ pagination = MongoMapper::Plugins::Pagination::Proxy.new(result.total_entries, result.current_page, result.per_page)
53
+
54
+ pagination.subject = result.sort_by do |e|
55
+ evaluate_result(e._keywords, original_words, stemmed) * -1
56
+ end
57
+
58
+ pagination
38
59
  else
39
- self.all(opts.deep_merge(:conditions => {:_keywords => /^(#{q}).*/ }))
60
+ self.all(opts.deep_merge(:conditions => {:_keywords => regex })).sort_by do |e|
61
+ evaluate_result(e._keywords, original_words, stemmed)
62
+ end
63
+ end
64
+ end
65
+
66
+ private
67
+ def evaluate_result(keywords, original_words, stemmed)
68
+ score = 0.0
69
+ original_words.each do |word|
70
+ if keywords.include?(word)
71
+ score += 15.0
72
+ end
73
+ end
74
+
75
+ stemmed.each do |word|
76
+ if keywords.include?(word)
77
+ score += 1.0 + word.length
78
+ end
40
79
  end
80
+
81
+ score
41
82
  end
42
83
  end
43
84
 
@@ -72,18 +113,23 @@ module MongoMapperExt
72
113
  words = []
73
114
  val.downcase.split.each do |word|
74
115
  next if word.length < 3
75
- next if word =~ %r{'|"|\/|\\}
76
116
  next if stop_words.include?(word)
77
117
 
78
- stem = word
79
- if stemmer
80
- stem = stemmer.stem(word)
81
- end
118
+ deword = word.split(%r{'|"|\/|\\|\?|\+|_|\-|\>|\>})
119
+
120
+ deword.each do |word|
121
+ next if word.empty?
122
+
123
+ stem = word
124
+ if stemmer
125
+ stem = stemmer.stem(word)
126
+ end
82
127
 
83
- if stem && stem != word
84
- words += [stem, word]
85
- else
86
- words << word
128
+ if stem && stem != word
129
+ words += [stem, word]
130
+ else
131
+ words << word
132
+ end
87
133
  end
88
134
  end
89
135
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongomapper_ext}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David A. Cuadrado"]
12
- s.date = %q{2010-04-12}
12
+ s.date = %q{2010-04-20}
13
13
  s.description = %q{MongoMapper extensions}
14
14
  s.email = %q{krawek@gmail.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 1
9
- version: 0.2.1
8
+ - 2
9
+ version: 0.2.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - David A. Cuadrado
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-12 00:00:00 -05:00
17
+ date: 2010-04-20 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency