supernova 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -24,6 +24,11 @@
24
24
  end
25
25
  end
26
26
 
27
+ === Indexing
28
+
29
+ index = LocationIndex.new(:db => db, :ids => [1, 3, 4])
30
+ index.index!
31
+
27
32
  === Anonymous Scopes
28
33
 
29
34
  scope = Offer.order("popularity desc").with(:city => "Hamburg").paginate(:page => 2, :per_page => 10)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.6.3
@@ -22,6 +22,14 @@ class Supernova::Condition
22
22
  "#{self.key}:{* TO #{value}}"
23
23
  when :lte
24
24
  "#{self.key}:[* TO #{value}]"
25
+ when :nin
26
+ "!(#{or_key_and_value(key, value)})"
27
+ when :in
28
+ or_key_and_value(key, value)
25
29
  end
26
30
  end
31
+
32
+ def or_key_and_value(key, values)
33
+ values.map { |v| "#{key}:#{v}"}.join(" OR ")
34
+ end
27
35
  end
@@ -67,7 +67,7 @@ class Supernova::SolrCriteria < Supernova::Criteria
67
67
  []
68
68
  else
69
69
  with.map do |key_or_condition, values|
70
- [values].flatten.map do |value|
70
+ values_from_key_or_condition_and_values(key_or_condition, values).map do |value|
71
71
  if key_or_condition.respond_to?(:solr_filter_for)
72
72
  key_or_condition.key = solr_field_from_field(key_or_condition.key)
73
73
  key_or_condition.solr_filter_for(value)
@@ -79,6 +79,14 @@ class Supernova::SolrCriteria < Supernova::Criteria
79
79
  end
80
80
  end
81
81
 
82
+ def values_from_key_or_condition_and_values(key_or_condition, values)
83
+ if key_or_condition.is_a?(Supernova::Condition) && values.is_a?(Array) && [:nin, :in].include?(key_or_condition.type)
84
+ [values]
85
+ else
86
+ [values].flatten
87
+ end
88
+ end
89
+
82
90
  def fq_filter_for_key_and_value(key, value)
83
91
  if value.nil?
84
92
  "!#{key}:[* TO *]"
@@ -1,5 +1,5 @@
1
1
  Symbol.class_eval do
2
- [:not, :gt, :gte, :lt, :lte, :ne].each do |method|
2
+ [:not, :gt, :gte, :lt, :lte, :ne, :nin, :in].each do |method|
3
3
  define_method(method) do
4
4
  Supernova::Condition.new(self, method)
5
5
  end
@@ -266,5 +266,27 @@ describe "Solr" do
266
266
  @clazz.new.index_rows([row1, row2, row3])
267
267
  @clazz.facet_fields(:location).execute.facets.should == { :location=>{ "Berlin"=>1, "Hamburg"=>2 } }
268
268
  end
269
+
270
+ describe "#nin and in" do
271
+ before(:each) do
272
+ row1 = { "id" => 1, "location" => "Hamburg", "type" => "Offer" }
273
+ row2 = { "id" => 2, "location" => "Hamburg", "type" => "Offer" }
274
+ row3 = { "id" => 3, "location" => "Berlin", "type" => "Offer" }
275
+ row4 = { "id" => 4, "location" => "München", "type" => "Offer" }
276
+ Supernova::Solr.truncate!
277
+ Supernova::Solr.connection.commit
278
+ @clazz.new.index_rows([row1, row2, row3, row4])
279
+ end
280
+
281
+ it "correctly handels nin searches" do
282
+ @clazz.with(:location.in => %w(Hamburg)).execute.map(&:id).should == [1, 2]
283
+ @clazz.with(:location.in => %w(Hamburg Berlin)).execute.map(&:id).should == [1, 2, 3]
284
+ end
285
+
286
+ it "correctly handels nin queries" do
287
+ @clazz.with(:location.nin => %w(Hamburg)).execute.map(&:id).should == [3, 4]
288
+ @clazz.with(:location.nin => %w(Hamburg Berlin)).execute.map(&:id).should == [4]
289
+ end
290
+ end
269
291
  end
270
292
  end
data/spec/spec_helper.rb CHANGED
@@ -8,7 +8,10 @@ require "fileutils"
8
8
  require "ruby-debug"
9
9
  require "geokit"
10
10
  require "active_record"
11
- PROJECT_ROOT = Pathname.new(File.expand_path("..", File.dirname(__FILE__)))
11
+
12
+ def project_root
13
+ Pathname.new(File.expand_path("..", File.dirname(__FILE__)))
14
+ end
12
15
 
13
16
  if defined?(Debugger) && Debugger.respond_to?(:settings)
14
17
  Debugger.settings[:autolist] = 1
@@ -35,7 +38,7 @@ ActiveRecord::Base.establish_connection(
35
38
  )
36
39
 
37
40
 
38
- FileUtils.mkdir_p(PROJECT_ROOT.join("log"))
41
+ FileUtils.mkdir_p(project_root.join("log"))
39
42
 
40
43
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS offers")
41
44
  ActiveRecord::Base.connection.execute("CREATE TABLE offers (id SERIAL, text TEXT, user_id INTEGER, enabled BOOLEAN, popularity INTEGER, lat FLOAT, lng FLOAT)")
@@ -16,6 +16,14 @@ describe "Supernova::Condition" do
16
16
  :user_id.ne.solr_filter_for(7).should == "!user_id:7"
17
17
  end
18
18
 
19
+ it "returns the correct filter for nin" do
20
+ :user_id.nin.solr_filter_for([1, 2, 3]).should == "!(user_id:1 OR user_id:2 OR user_id:3)"
21
+ end
22
+
23
+ it "returns the correct filter for nin" do
24
+ :user_id.in.solr_filter_for([1, 2, 3]).should == "user_id:1 OR user_id:2 OR user_id:3"
25
+ end
26
+
19
27
  it "returns the correct filter for not nil" do
20
28
  :user_id.not.solr_filter_for(nil).should == "user_id:[* TO *]"
21
29
  end
@@ -25,6 +25,14 @@ describe Supernova::SolrCriteria do
25
25
  criteria.fq_from_with(:user_id => Range.new(10, 12)).should == ["user_id:[10 TO 12]"]
26
26
  end
27
27
 
28
+ it "returns the correct filter for nin" do
29
+ criteria.fq_from_with(:user_id.nin => [1, 2]).should == ["!(user_id:1 OR user_id:2)"]
30
+ end
31
+
32
+ it "returns the correct filter for in" do
33
+ criteria.fq_from_with(:user_id.in => [1, 2]).should == ["user_id:1 OR user_id:2"]
34
+ end
35
+
28
36
  it "returns the correct filter for not queries" do
29
37
  criteria.fq_from_with(:user_id.not => nil).should == ["user_id:[* TO *]"]
30
38
  end
@@ -501,7 +501,7 @@ describe Supernova::SolrIndexer do
501
501
 
502
502
  it "separates the first and the second line" do
503
503
  file_stub.should_receive(:puts).with("\{")
504
- file_stub.should_receive(:print).with(/\"add\":{\"doc\"/)
504
+ file_stub.should_receive(:print).with(/\"add\":\{\"doc\"/)
505
505
  file_stub.should_receive(:print).with(%(,\n"add":{"doc":{"id":2}}))
506
506
  indexer.write_to_file(to_index)
507
507
  indexer.write_to_file({:id => 2})
data/supernova.gemspec CHANGED
@@ -5,11 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{supernova}
8
- s.version = "0.6.2"
8
+ s.version = "0.6.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tobias Schwab"]
12
- s.date = %q{2011-08-09}
12
+ s.date = %q{2011-08-23}
13
+ s.default_executable = %q{start_solr}
13
14
  s.description = %q{Unified search scopes}
14
15
  s.email = %q{tobias.schwab@dynport.de}
15
16
  s.executables = ["start_solr"]
@@ -94,7 +95,7 @@ Gem::Specification.new do |s|
94
95
  s.homepage = %q{http://github.com/dynport/supernova}
95
96
  s.licenses = ["MIT"]
96
97
  s.require_paths = ["lib"]
97
- s.rubygems_version = %q{1.7.2}
98
+ s.rubygems_version = %q{1.6.2}
98
99
  s.summary = %q{Unified search scopes}
99
100
 
100
101
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: supernova
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 2
10
- version: 0.6.2
9
+ - 3
10
+ version: 0.6.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tobias Schwab
@@ -15,10 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-08-09 00:00:00 Z
18
+ date: 2011-08-23 00:00:00 +02:00
19
+ default_executable: start_solr
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ name: rsolr
23
+ prerelease: false
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
22
25
  none: false
23
26
  requirements:
24
27
  - - ">="
@@ -27,12 +30,12 @@ dependencies:
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
30
- version_requirements: *id001
31
- name: rsolr
32
- prerelease: false
33
33
  type: :runtime
34
+ requirement: *id001
34
35
  - !ruby/object:Gem::Dependency
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
+ name: will_paginate
37
+ prerelease: false
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
36
39
  none: false
37
40
  requirements:
38
41
  - - ">="
@@ -41,12 +44,12 @@ dependencies:
41
44
  segments:
42
45
  - 0
43
46
  version: "0"
44
- version_requirements: *id002
45
- name: will_paginate
46
- prerelease: false
47
47
  type: :runtime
48
+ requirement: *id002
48
49
  - !ruby/object:Gem::Dependency
49
- requirement: &id003 !ruby/object:Gem::Requirement
50
+ name: json
51
+ prerelease: false
52
+ version_requirements: &id003 !ruby/object:Gem::Requirement
50
53
  none: false
51
54
  requirements:
52
55
  - - ">="
@@ -55,12 +58,12 @@ dependencies:
55
58
  segments:
56
59
  - 0
57
60
  version: "0"
58
- version_requirements: *id003
59
- name: json
60
- prerelease: false
61
61
  type: :runtime
62
+ requirement: *id003
62
63
  - !ruby/object:Gem::Dependency
63
- requirement: &id004 !ruby/object:Gem::Requirement
64
+ name: activesupport
65
+ prerelease: false
66
+ version_requirements: &id004 !ruby/object:Gem::Requirement
64
67
  none: false
65
68
  requirements:
66
69
  - - ">="
@@ -69,12 +72,12 @@ dependencies:
69
72
  segments:
70
73
  - 0
71
74
  version: "0"
72
- version_requirements: *id004
73
- name: activesupport
74
- prerelease: false
75
75
  type: :runtime
76
+ requirement: *id004
76
77
  - !ruby/object:Gem::Dependency
77
- requirement: &id005 !ruby/object:Gem::Requirement
78
+ name: i18n
79
+ prerelease: false
80
+ version_requirements: &id005 !ruby/object:Gem::Requirement
78
81
  none: false
79
82
  requirements:
80
83
  - - ">="
@@ -83,12 +86,12 @@ dependencies:
83
86
  segments:
84
87
  - 0
85
88
  version: "0"
86
- version_requirements: *id005
87
- name: i18n
88
- prerelease: false
89
89
  type: :development
90
+ requirement: *id005
90
91
  - !ruby/object:Gem::Dependency
91
- requirement: &id006 !ruby/object:Gem::Requirement
92
+ name: activerecord
93
+ prerelease: false
94
+ version_requirements: &id006 !ruby/object:Gem::Requirement
92
95
  none: false
93
96
  requirements:
94
97
  - - ~>
@@ -99,12 +102,12 @@ dependencies:
99
102
  - 0
100
103
  - 7
101
104
  version: 3.0.7
102
- version_requirements: *id006
103
- name: activerecord
104
- prerelease: false
105
105
  type: :development
106
+ requirement: *id006
106
107
  - !ruby/object:Gem::Dependency
107
- requirement: &id007 !ruby/object:Gem::Requirement
108
+ name: ruby-debug
109
+ prerelease: false
110
+ version_requirements: &id007 !ruby/object:Gem::Requirement
108
111
  none: false
109
112
  requirements:
110
113
  - - ">="
@@ -113,12 +116,12 @@ dependencies:
113
116
  segments:
114
117
  - 0
115
118
  version: "0"
116
- version_requirements: *id007
117
- name: ruby-debug
118
- prerelease: false
119
119
  type: :development
120
+ requirement: *id007
120
121
  - !ruby/object:Gem::Dependency
121
- requirement: &id008 !ruby/object:Gem::Requirement
122
+ name: mysql2
123
+ prerelease: false
124
+ version_requirements: &id008 !ruby/object:Gem::Requirement
122
125
  none: false
123
126
  requirements:
124
127
  - - ~>
@@ -129,12 +132,12 @@ dependencies:
129
132
  - 2
130
133
  - 7
131
134
  version: 0.2.7
132
- version_requirements: *id008
133
- name: mysql2
134
- prerelease: false
135
135
  type: :development
136
+ requirement: *id008
136
137
  - !ruby/object:Gem::Dependency
137
- requirement: &id009 !ruby/object:Gem::Requirement
138
+ name: ZenTest
139
+ prerelease: false
140
+ version_requirements: &id009 !ruby/object:Gem::Requirement
138
141
  none: false
139
142
  requirements:
140
143
  - - "="
@@ -145,12 +148,12 @@ dependencies:
145
148
  - 5
146
149
  - 0
147
150
  version: 4.5.0
148
- version_requirements: *id009
149
- name: ZenTest
150
- prerelease: false
151
151
  type: :development
152
+ requirement: *id009
152
153
  - !ruby/object:Gem::Dependency
153
- requirement: &id010 !ruby/object:Gem::Requirement
154
+ name: geokit
155
+ prerelease: false
156
+ version_requirements: &id010 !ruby/object:Gem::Requirement
154
157
  none: false
155
158
  requirements:
156
159
  - - ">="
@@ -159,12 +162,12 @@ dependencies:
159
162
  segments:
160
163
  - 0
161
164
  version: "0"
162
- version_requirements: *id010
163
- name: geokit
164
- prerelease: false
165
165
  type: :development
166
+ requirement: *id010
166
167
  - !ruby/object:Gem::Dependency
167
- requirement: &id011 !ruby/object:Gem::Requirement
168
+ name: autotest
169
+ prerelease: false
170
+ version_requirements: &id011 !ruby/object:Gem::Requirement
168
171
  none: false
169
172
  requirements:
170
173
  - - ">="
@@ -173,12 +176,12 @@ dependencies:
173
176
  segments:
174
177
  - 0
175
178
  version: "0"
176
- version_requirements: *id011
177
- name: autotest
178
- prerelease: false
179
179
  type: :development
180
+ requirement: *id011
180
181
  - !ruby/object:Gem::Dependency
181
- requirement: &id012 !ruby/object:Gem::Requirement
182
+ name: autotest-growl
183
+ prerelease: false
184
+ version_requirements: &id012 !ruby/object:Gem::Requirement
182
185
  none: false
183
186
  requirements:
184
187
  - - ">="
@@ -187,12 +190,12 @@ dependencies:
187
190
  segments:
188
191
  - 0
189
192
  version: "0"
190
- version_requirements: *id012
191
- name: autotest-growl
192
- prerelease: false
193
193
  type: :development
194
+ requirement: *id012
194
195
  - !ruby/object:Gem::Dependency
195
- requirement: &id013 !ruby/object:Gem::Requirement
196
+ name: rspec
197
+ prerelease: false
198
+ version_requirements: &id013 !ruby/object:Gem::Requirement
196
199
  none: false
197
200
  requirements:
198
201
  - - ~>
@@ -203,12 +206,12 @@ dependencies:
203
206
  - 3
204
207
  - 0
205
208
  version: 2.3.0
206
- version_requirements: *id013
207
- name: rspec
208
- prerelease: false
209
209
  type: :development
210
+ requirement: *id013
210
211
  - !ruby/object:Gem::Dependency
211
- requirement: &id014 !ruby/object:Gem::Requirement
212
+ name: bundler
213
+ prerelease: false
214
+ version_requirements: &id014 !ruby/object:Gem::Requirement
212
215
  none: false
213
216
  requirements:
214
217
  - - ~>
@@ -219,12 +222,12 @@ dependencies:
219
222
  - 0
220
223
  - 0
221
224
  version: 1.0.0
222
- version_requirements: *id014
223
- name: bundler
224
- prerelease: false
225
225
  type: :development
226
+ requirement: *id014
226
227
  - !ruby/object:Gem::Dependency
227
- requirement: &id015 !ruby/object:Gem::Requirement
228
+ name: jeweler
229
+ prerelease: false
230
+ version_requirements: &id015 !ruby/object:Gem::Requirement
228
231
  none: false
229
232
  requirements:
230
233
  - - ~>
@@ -235,12 +238,12 @@ dependencies:
235
238
  - 6
236
239
  - 0
237
240
  version: 1.6.0
238
- version_requirements: *id015
239
- name: jeweler
240
- prerelease: false
241
241
  type: :development
242
+ requirement: *id015
242
243
  - !ruby/object:Gem::Dependency
243
- requirement: &id016 !ruby/object:Gem::Requirement
244
+ name: rcov
245
+ prerelease: false
246
+ version_requirements: &id016 !ruby/object:Gem::Requirement
244
247
  none: false
245
248
  requirements:
246
249
  - - ">="
@@ -249,10 +252,8 @@ dependencies:
249
252
  segments:
250
253
  - 0
251
254
  version: "0"
252
- version_requirements: *id016
253
- name: rcov
254
- prerelease: false
255
255
  type: :development
256
+ requirement: *id016
256
257
  description: Unified search scopes
257
258
  email: tobias.schwab@dynport.de
258
259
  executables:
@@ -335,6 +336,7 @@ files:
335
336
  - spec/supernova/symbol_extensions_spec.rb
336
337
  - spec/supernova_spec.rb
337
338
  - supernova.gemspec
339
+ has_rdoc: true
338
340
  homepage: http://github.com/dynport/supernova
339
341
  licenses:
340
342
  - MIT
@@ -364,7 +366,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
364
366
  requirements: []
365
367
 
366
368
  rubyforge_project:
367
- rubygems_version: 1.7.2
369
+ rubygems_version: 1.6.2
368
370
  signing_key:
369
371
  specification_version: 3
370
372
  summary: Unified search scopes