supernova 0.4.14 → 0.4.15
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 +1 -1
- data/lib/supernova/solr_criteria.rb +15 -1
- data/lib/supernova/solr_indexer.rb +39 -10
- data/spec/supernova/solr_criteria_spec.rb +25 -0
- data/spec/supernova/solr_indexer_spec.rb +56 -1
- data/supernova.gemspec +2 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.15
|
@@ -73,7 +73,21 @@ class Supernova::SolrCriteria < Supernova::Criteria
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def fq_filter_for_key_and_value(key, value)
|
76
|
-
|
76
|
+
if value.nil?
|
77
|
+
"!#{key}:[* TO *]"
|
78
|
+
elsif value.is_a?(Range)
|
79
|
+
"#{key}:[#{value_for_fq_filter(value.first)} TO #{value_for_fq_filter(value.last)}]"
|
80
|
+
else
|
81
|
+
"#{key}:#{value_for_fq_filter(value)}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def value_for_fq_filter(value)
|
86
|
+
if value.is_a?(Date)
|
87
|
+
Time.utc(value.year, value.month, value.day).iso8601
|
88
|
+
else
|
89
|
+
value
|
90
|
+
end
|
77
91
|
end
|
78
92
|
|
79
93
|
def build_docs(docs)
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require "json"
|
2
2
|
require "fileutils"
|
3
|
+
require "time"
|
3
4
|
|
4
5
|
class Supernova::SolrIndexer
|
5
6
|
attr_accessor :options, :db, :ids, :max_rows_to_direct_index, :local_solr
|
6
|
-
attr_writer :index_file_path
|
7
|
+
attr_writer :index_file_path, :debug
|
7
8
|
|
8
9
|
MAX_ROWS_TO_DIRECT_INDEX = 100
|
9
10
|
|
@@ -70,6 +71,17 @@ class Supernova::SolrIndexer
|
|
70
71
|
self.ids ||= :all
|
71
72
|
end
|
72
73
|
|
74
|
+
def debug(message)
|
75
|
+
response = true
|
76
|
+
time = Benchmark.realtime do
|
77
|
+
response = yield if block_given?
|
78
|
+
end
|
79
|
+
if @debug == true
|
80
|
+
puts "%s: %s" % [Time.now.iso8601(3), message.gsub("%TIME%", "%.3f" % time)]
|
81
|
+
end
|
82
|
+
response
|
83
|
+
end
|
84
|
+
|
73
85
|
def index!
|
74
86
|
index_query(query_to_index)
|
75
87
|
end
|
@@ -99,7 +111,7 @@ class Supernova::SolrIndexer
|
|
99
111
|
value = hash.delete(field.to_s)
|
100
112
|
if options[:type] == :date
|
101
113
|
value = Time.utc(value.year, value.month, value.day) if value.is_a?(Date)
|
102
|
-
value = value.utc.iso8601
|
114
|
+
value = value.utc.iso8601 if value
|
103
115
|
end
|
104
116
|
hash["#{field}_#{self.class.suffix_from_type(options[:type])}"] = value
|
105
117
|
end
|
@@ -171,7 +183,15 @@ class Supernova::SolrIndexer
|
|
171
183
|
end
|
172
184
|
|
173
185
|
def query_db(query)
|
174
|
-
db.
|
186
|
+
if db.respond_to?(:query)
|
187
|
+
db.query(query, :as => :hash)
|
188
|
+
else
|
189
|
+
db.select_all(query)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def rows(query = nil)
|
194
|
+
query_db(query || query_to_index)
|
175
195
|
end
|
176
196
|
|
177
197
|
def solr_rows_to_index_for_query(query)
|
@@ -181,24 +201,33 @@ class Supernova::SolrIndexer
|
|
181
201
|
end
|
182
202
|
|
183
203
|
def index_query(query)
|
184
|
-
rows
|
204
|
+
debug "getting rows for #{query[0,100]}"
|
205
|
+
rows = debug "got all rows in %TIME%" do
|
206
|
+
solr_rows_to_index_for_query(query)
|
207
|
+
end
|
185
208
|
if self.max_rows_to_direct_index < rows.count
|
186
|
-
|
209
|
+
debug "indexed #{rows.length} rows with json in %TIME%" do
|
210
|
+
index_with_json_file(rows)
|
211
|
+
end
|
187
212
|
else
|
188
|
-
|
213
|
+
debug "indexed #{rows.length} rows directly in %TIME%" do
|
214
|
+
index_directly(rows)
|
215
|
+
end
|
189
216
|
end
|
190
217
|
end
|
191
218
|
|
192
|
-
def index_directly(rows
|
219
|
+
def index_directly(rows)
|
193
220
|
rows.each do |row|
|
194
221
|
row = Supernova::Solr.connection.add(row)
|
195
222
|
end
|
196
223
|
Supernova::Solr.connection.commit if rows.any?
|
197
224
|
end
|
198
225
|
|
199
|
-
def index_with_json_file(rows
|
200
|
-
rows.
|
201
|
-
|
226
|
+
def index_with_json_file(rows)
|
227
|
+
debug "wrote #{rows.count} rows to the json file in %TIME%" do
|
228
|
+
rows.each do |row|
|
229
|
+
write_to_file(row)
|
230
|
+
end
|
202
231
|
end
|
203
232
|
finish
|
204
233
|
end
|
@@ -30,6 +30,31 @@ describe Supernova::SolrCriteria do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
describe "#fq_filter_for_key_and_value" do
|
34
|
+
it "returns the correct statment for nil" do
|
35
|
+
criteria.fq_filter_for_key_and_value(:user_id, nil).should == "!user_id:[* TO *]"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns the correct conditon for single values" do
|
39
|
+
criteria.fq_filter_for_key_and_value(:user_id, 1).should == "user_id:1"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns the correct condition for ranges" do
|
43
|
+
criteria.fq_filter_for_key_and_value(:user_id, 1..10).should == "user_id:[1 TO 10]"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns the correct conditon for single dates" do
|
47
|
+
criteria.fq_filter_for_key_and_value(:released_on, Date.new(1999, 1, 2)).should == "released_on:1999-01-02T00:00:00Z"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns the correct condition for date ranges" do
|
51
|
+
date1 = Date.new(1999, 1, 2)
|
52
|
+
date2 = Date.new(1999, 2, 5)
|
53
|
+
range = Range.new(date1, date2)
|
54
|
+
criteria.fq_filter_for_key_and_value(:open_at, range).should == "open_at:[1999-01-02T00:00:00Z TO 1999-02-05T00:00:00Z]"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
33
58
|
describe "#to_params" do
|
34
59
|
it "returns a Hash" do
|
35
60
|
criteria.to_params.should be_an_instance_of(Hash)
|
@@ -183,7 +183,7 @@ describe Supernova::SolrIndexer do
|
|
183
183
|
|
184
184
|
describe "#query_db" do
|
185
185
|
it "executes the query" do
|
186
|
-
db.should_receive(:query).with("query").and_return [to_index]
|
186
|
+
db.should_receive(:query).with("query", :as => :hash).and_return [to_index]
|
187
187
|
indexer.query_db("query")
|
188
188
|
end
|
189
189
|
|
@@ -195,6 +195,38 @@ describe Supernova::SolrIndexer do
|
|
195
195
|
end
|
196
196
|
end
|
197
197
|
|
198
|
+
describe "#debug" do
|
199
|
+
it "prints a line when debug is enabled" do
|
200
|
+
index = CustomSolrIndex.new(:debug => true)
|
201
|
+
index.should_receive(:puts).with(/hello world/)
|
202
|
+
index.debug "hello world"
|
203
|
+
end
|
204
|
+
|
205
|
+
it "does not print print a line when debug is not enabled" do
|
206
|
+
index = CustomSolrIndex.new(:debug => false)
|
207
|
+
index.should_not_receive(:puts)
|
208
|
+
index.debug "hello world"
|
209
|
+
end
|
210
|
+
|
211
|
+
it "can be called with block and still returns the response" do
|
212
|
+
index = CustomSolrIndex.new(:debug => true)
|
213
|
+
index.should_receive(:puts).with(/some message/)
|
214
|
+
res = index.debug "some message" do
|
215
|
+
112
|
216
|
+
end
|
217
|
+
res.should == 112
|
218
|
+
end
|
219
|
+
|
220
|
+
it "includes the time in the debug output when placeholder found" do
|
221
|
+
index = CustomSolrIndex.new(:debug => true)
|
222
|
+
Benchmark.stub(:realtime).and_return 0.12345
|
223
|
+
index.should_receive(:puts).with(/indexed in 0.123/)
|
224
|
+
index.debug "indexed in %TIME%" do
|
225
|
+
112
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
198
230
|
describe "#map_hash_keys_to_solr" do
|
199
231
|
class CustomSolrIndex < Supernova::SolrIndexer
|
200
232
|
has :offer_id, :type => :integer
|
@@ -205,6 +237,10 @@ describe Supernova::SolrIndexer do
|
|
205
237
|
has :indexed, :type => :boolean, :virtual => true
|
206
238
|
end
|
207
239
|
|
240
|
+
it "sets empty dates to nil" do
|
241
|
+
CustomSolrIndex.new.map_hash_keys_to_solr("checkin_date" => nil)["checkin_date_dt"].should == nil
|
242
|
+
end
|
243
|
+
|
208
244
|
it "maps virtual fields" do
|
209
245
|
CustomSolrIndex.new.map_hash_keys_to_solr("indexed" => true)["indexed_b"].should == true
|
210
246
|
end
|
@@ -254,6 +290,25 @@ describe Supernova::SolrIndexer do
|
|
254
290
|
end
|
255
291
|
end
|
256
292
|
|
293
|
+
describe "#rows" do
|
294
|
+
let(:res) { double("result") }
|
295
|
+
|
296
|
+
before(:each) do
|
297
|
+
custom_indexer.stub(:query_db).and_return([])
|
298
|
+
end
|
299
|
+
|
300
|
+
it "calls query_db with correct query" do
|
301
|
+
custom_indexer.should_receive(:query_db).with("some query").and_return res
|
302
|
+
custom_indexer.rows("some query").should == res
|
303
|
+
end
|
304
|
+
|
305
|
+
it "uses the query_to_index when query is blank" do
|
306
|
+
custom_indexer.should_receive(:query_to_index).and_return "some other query"
|
307
|
+
custom_indexer.should_receive(:query_db).with("some other query").and_return res
|
308
|
+
custom_indexer.rows.should == res
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
257
312
|
describe "#solr_rows_to_index_for_query" do
|
258
313
|
let(:result) {
|
259
314
|
[
|
data/supernova.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{supernova}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.15"
|
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-07-
|
12
|
+
s.date = %q{2011-07-28}
|
13
13
|
s.description = %q{Unified search scopes}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
15
|
s.executables = ["start_solr"]
|
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:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 15
|
10
|
+
version: 0.4.15
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tobias Schwab
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-28 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|