supernova 0.6.2 → 0.6.3

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/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