supernova 0.3.6 → 0.3.8
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 +14 -1
- data/lib/supernova/solr_indexer.rb +6 -0
- data/spec/supernova/solr_criteria_spec.rb +78 -21
- data/spec/supernova/solr_indexer_spec.rb +16 -0
- data/supernova.gemspec +2 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.8
|
@@ -103,8 +103,9 @@ class Supernova::SolrCriteria < Supernova::Criteria
|
|
103
103
|
doc
|
104
104
|
end
|
105
105
|
|
106
|
+
# called in build doc, all hashes have strings as keys!!!
|
106
107
|
def convert_doc_attributes(hash)
|
107
|
-
hash.inject({}) do |ret, (key, value)|
|
108
|
+
converted_hash = hash.inject({}) do |ret, (key, value)|
|
108
109
|
if key == "id"
|
109
110
|
ret["id"] = value.to_s.split("/").last
|
110
111
|
else
|
@@ -112,6 +113,18 @@ class Supernova::SolrCriteria < Supernova::Criteria
|
|
112
113
|
end
|
113
114
|
ret
|
114
115
|
end
|
116
|
+
self.select_fields.each do |select_field|
|
117
|
+
converted_hash[select_field.to_s] = nil if !converted_hash.has_key?(select_field.to_s)
|
118
|
+
end
|
119
|
+
converted_hash
|
120
|
+
end
|
121
|
+
|
122
|
+
def select_fields
|
123
|
+
if self.search_options[:select].present?
|
124
|
+
self.search_options[:select]
|
125
|
+
else
|
126
|
+
self.search_options[:named_scope_class].respond_to?(:select_fields) ? self.search_options[:named_scope_class].select_fields : []
|
127
|
+
end
|
115
128
|
end
|
116
129
|
|
117
130
|
def set_first_responding_attribute(doc, solr_key, value)
|
@@ -11,6 +11,12 @@ class Supernova::SolrIndexer
|
|
11
11
|
@field_definitions ||= {}
|
12
12
|
end
|
13
13
|
|
14
|
+
def select_fields
|
15
|
+
field_definitions.map do |key, attributes|
|
16
|
+
attributes[:virtual] != true ? key : nil
|
17
|
+
end.compact
|
18
|
+
end
|
19
|
+
|
14
20
|
def has(key, attributes)
|
15
21
|
field_definitions[key] = attributes.is_a?(Hash) ? attributes : { :type => attributes }
|
16
22
|
end
|
@@ -255,29 +255,42 @@ describe Supernova::SolrCriteria do
|
|
255
255
|
end
|
256
256
|
|
257
257
|
describe "#build_doc" do
|
258
|
+
class OfferIndex < Supernova::SolrIndexer
|
259
|
+
has :enabled, :type => :boolean
|
260
|
+
has :popularity, :type => :integer
|
261
|
+
has :is_deleted, :type => :boolean, :virtual => true
|
262
|
+
clazz Offer
|
263
|
+
end
|
264
|
+
|
265
|
+
|
258
266
|
{ "Offer" => Offer, "Host" => Host }.each do |type, clazz|
|
259
267
|
it "returns the #{clazz} for #{type.inspect}" do
|
260
268
|
criteria.build_doc("type" => type).should be_an_instance_of(clazz)
|
261
269
|
end
|
262
270
|
end
|
263
271
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
end
|
272
|
+
it "calls convert_doc_attributes" do
|
273
|
+
row = { "type" => "Offer", "id" => "offers/1" }
|
274
|
+
criteria.should_receive(:convert_doc_attributes).with(row).and_return row
|
275
|
+
criteria.build_doc(row)
|
269
276
|
end
|
270
277
|
|
271
|
-
it "
|
272
|
-
atts = { "type" => "Offer", "some_other" => "Test", "id" => "offers/1", "enabled" => false, "popularity" => 10 }
|
273
|
-
doc = criteria.build_doc(atts)
|
274
|
-
doc.instance_variable_get("@attributes").should == { "popularity" => 10, "enabled" => false, "id" => "1", "some_other" => "Test"}
|
275
|
-
end
|
276
|
-
|
277
|
-
it "returns a Hash when type does not response to " do
|
278
|
+
it "returns the original hash when no type given" do
|
278
279
|
type = double("type")
|
280
|
+
row = { "id" => "offers/1", "type" => type }
|
279
281
|
type.should_receive(:respond_to?).with(:constantize).and_return false
|
280
|
-
criteria.
|
282
|
+
criteria.should_not_receive(:convert_doc_attributes)
|
283
|
+
criteria.build_doc(row).should == row
|
284
|
+
end
|
285
|
+
|
286
|
+
it "assigns the attributes returned from convert_doc_attributes to attributes when instance variable exists" do
|
287
|
+
str = String.new
|
288
|
+
str.instance_variable_set("@attributes", {})
|
289
|
+
atts = { :title => "Hello" }
|
290
|
+
row = { "type" => "Offer" }
|
291
|
+
criteria.should_receive(:convert_doc_attributes).with(row).and_return atts
|
292
|
+
doc = criteria.build_doc(row)
|
293
|
+
doc.instance_variable_get("@attributes").should == atts
|
281
294
|
end
|
282
295
|
|
283
296
|
it "sets the original solr_doc" do
|
@@ -293,25 +306,69 @@ describe Supernova::SolrCriteria do
|
|
293
306
|
criteria.build_doc(docs.first).should_not be_a_new_record
|
294
307
|
end
|
295
308
|
|
296
|
-
it "
|
309
|
+
it "returns an offer and sets all given parameters" do
|
297
310
|
criteria.attribute_mapping(:enabled => { :type => :boolean }, :popularity => { :type => :integer })
|
298
311
|
doc = criteria.build_doc("type" => "Offer", "id" => "offers/1", "enabled_b" => true, "popularity_i" => 10)
|
299
312
|
doc.should be_an_instance_of(Offer)
|
300
313
|
doc.popularity.should == 10
|
301
314
|
end
|
302
315
|
|
316
|
+
it "sets selected parameters even when nil" do
|
317
|
+
doc = criteria.select(:enabled, :popularity).build_doc("type" => "Offer", "id" => "offers/1")
|
318
|
+
doc.enabled.should be_nil
|
319
|
+
doc.popularity.should be_nil
|
320
|
+
end
|
321
|
+
|
322
|
+
it "it sets parameters to nil when no select given and not present" do
|
323
|
+
doc = OfferIndex.search_scope.build_doc("type" => "Offer", "id" => "offers/1")
|
324
|
+
doc.should be_an_instance_of(Offer)
|
325
|
+
doc.popularity.should be_nil
|
326
|
+
end
|
327
|
+
|
328
|
+
it "does not set virtual parameters to nil" do
|
329
|
+
OfferIndex.search_scope.build_doc("type" => "Offer", "id" => "offers/1").attributes.should_not have_key(:is_deleted)
|
330
|
+
OfferIndex.search_scope.build_doc("type" => "Offer", "id" => "offers/1").attributes.should_not have_key("is_deleted")
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
describe "#select_fields" do
|
335
|
+
it "returns the fields from search_options when defined" do
|
336
|
+
criteria.select(:enabled).select_fields.should == [:enabled]
|
337
|
+
end
|
338
|
+
|
339
|
+
it "returns the select_fields from named_search_scope when assigned and responding to" do
|
340
|
+
fields = double("fields")
|
341
|
+
nsc = double("scope", :select_fields => fields)
|
342
|
+
criteria.named_scope_class(nsc)
|
343
|
+
criteria.select_fields.should == fields
|
344
|
+
end
|
345
|
+
|
346
|
+
it "returns an empty array by default" do
|
347
|
+
criteria.select_fields.should be_empty
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
describe "#convert_doc_attributes" do
|
352
|
+
{ "popularity" => 10, "enabled" => false, "id" => "1" }.each do |key, value|
|
353
|
+
it "sets #{key} to #{value}" do
|
354
|
+
criteria.convert_doc_attributes("type" => "Offer", "some_other" => "Test", "id" => "offers/1", "enabled" => false, "popularity" => 10)[key].should == value
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
{ "popularity" => 10, "enabled" => true, "id" => "1" }.each do |field, value|
|
359
|
+
it "uses sets #{field} to #{value}" do
|
360
|
+
criteria.attribute_mapping(:enabled => { :type => :boolean }, :popularity => { :type => :integer })
|
361
|
+
criteria.convert_doc_attributes("type" => "Offer", "id" => "offers/1", "enabled_b" => true, "popularity_i" => 10)[field].should == value
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
|
303
366
|
class MongoOffer
|
304
367
|
attr_accessor :id
|
305
368
|
end
|
306
369
|
|
307
370
|
it "would also work with mongoid ids" do
|
308
|
-
criteria.
|
309
|
-
end
|
310
|
-
|
311
|
-
it "uses OpenStruct when type is not given" do
|
312
|
-
doc = criteria.build_doc("id" => "offers/4df08c30f3b0a72e7c227a55")
|
313
|
-
doc.should be_an_instance_of(Hash)
|
314
|
-
doc["id"].should == "offers/4df08c30f3b0a72e7c227a55"
|
371
|
+
criteria.convert_doc_attributes("type" => "MongoOffer", "id" => "offers/4df08c30f3b0a72e7c227a55")["id"].should == "4df08c30f3b0a72e7c227a55"
|
315
372
|
end
|
316
373
|
end
|
317
374
|
|
@@ -406,6 +406,22 @@ describe Supernova::SolrIndexer do
|
|
406
406
|
end
|
407
407
|
end
|
408
408
|
|
409
|
+
describe "SolrIndexer.select_fields" do
|
410
|
+
it "returns the keys of the field definitions" do
|
411
|
+
Supernova::SolrIndexer.should_receive(:field_definitions).and_return(
|
412
|
+
{ :title => { :type => :string }, :popularity => { :type => :integer } }
|
413
|
+
)
|
414
|
+
Supernova::SolrIndexer.select_fields.map(&:to_s).sort.should == %w(popularity title)
|
415
|
+
end
|
416
|
+
|
417
|
+
it "does not include virtual attributes" do
|
418
|
+
Supernova::SolrIndexer.should_receive(:field_definitions).and_return(
|
419
|
+
{ :title => { :type => :string }, :popularity => { :type => :integer }, :is_deleted => { :virtual => true, :type => :integer } }
|
420
|
+
)
|
421
|
+
Supernova::SolrIndexer.select_fields.map(&:to_s).sort.should == %w(popularity title)
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
409
425
|
describe "#method_missing" do
|
410
426
|
it "returns a new supernova criteria" do
|
411
427
|
indexer_clazz.where(:a => 1).should be_an_instance_of(Supernova::SolrCriteria)
|
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.3.
|
8
|
+
s.version = "0.3.8"
|
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-06-
|
12
|
+
s.date = %q{2011-06-15}
|
13
13
|
s.description = %q{Unified search scopes}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
15
|
s.extra_rdoc_files = [
|
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: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 8
|
10
|
+
version: 0.3.8
|
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-06-
|
18
|
+
date: 2011-06-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|