supernova 0.1.1 → 0.2.0
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/.autotest +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +5 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/supernova.rb +10 -1
- data/lib/supernova/collection.rb +4 -0
- data/lib/supernova/criteria.rb +15 -0
- data/lib/supernova/numeric_extensions.rb +4 -9
- data/lib/supernova/solr.rb +20 -0
- data/lib/supernova/solr_criteria.rb +51 -0
- data/spec/integration/solr_spec.rb +92 -0
- data/spec/integration/{search_spec.rb → thinking_sphinx_spec.rb} +1 -2
- data/spec/spec_helper.rb +2 -0
- data/spec/supernova/solr_criteria_spec.rb +245 -0
- data/spec/supernova/solr_spec.rb +45 -0
- data/supernova.gemspec +16 -3
- metadata +57 -23
data/.autotest
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -31,6 +31,8 @@ GEM
|
|
31
31
|
rake (0.9.2)
|
32
32
|
rcov (0.9.9)
|
33
33
|
riddle (1.3.3)
|
34
|
+
rsolr (1.0.2)
|
35
|
+
builder (>= 2.1.2)
|
34
36
|
rspec (2.3.0)
|
35
37
|
rspec-core (~> 2.3.0)
|
36
38
|
rspec-expectations (~> 2.3.0)
|
@@ -48,6 +50,7 @@ GEM
|
|
48
50
|
activerecord (>= 3.0.3)
|
49
51
|
riddle (>= 1.2.2)
|
50
52
|
tzinfo (0.3.27)
|
53
|
+
will_paginate (2.3.15)
|
51
54
|
|
52
55
|
PLATFORMS
|
53
56
|
ruby
|
@@ -60,6 +63,8 @@ DEPENDENCIES
|
|
60
63
|
jeweler (~> 1.6.0)
|
61
64
|
mysql2 (~> 0.2.7)
|
62
65
|
rcov
|
66
|
+
rsolr
|
63
67
|
rspec (~> 2.3.0)
|
64
68
|
ruby-debug
|
65
69
|
thinking-sphinx (= 2.0.3)
|
70
|
+
will_paginate
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ require 'jeweler'
|
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
17
|
gem.name = "supernova"
|
18
|
-
|
18
|
+
gem.homepage = "http://github.com/dynport/supernova"
|
19
19
|
gem.license = "MIT"
|
20
20
|
gem.summary = %Q{Unified search scopes}
|
21
21
|
gem.description = %Q{Unified search scopes}
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/supernova.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
+
require "rsolr"
|
2
|
+
|
1
3
|
module Supernova
|
4
|
+
KM_TO_METER = 1000.0
|
5
|
+
MILE_TO_METER = 1609.3472
|
6
|
+
DEG_TO_RADIAN = Math::PI / 180.0
|
7
|
+
RADIAN_TO_REG = 1 / DEG_TO_RADIAN
|
8
|
+
|
2
9
|
module ClassMethods
|
3
10
|
attr_accessor :criteria_class, :defined_named_search_scopes
|
4
11
|
|
@@ -17,5 +24,7 @@ module Supernova
|
|
17
24
|
end
|
18
25
|
|
19
26
|
require "supernova/numeric_extensions"
|
27
|
+
require "supernova/collection"
|
20
28
|
require "supernova/criteria"
|
21
|
-
require "supernova/thinking_sphinx"
|
29
|
+
require "supernova/thinking_sphinx"
|
30
|
+
require "supernova/solr"
|
data/lib/supernova/criteria.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
class Supernova::Criteria
|
2
|
+
DEFAULT_PER_PAGE = 25
|
3
|
+
FIRST_PAGE = 1
|
4
|
+
|
2
5
|
attr_accessor :filters, :search_options, :clazz
|
3
6
|
|
4
7
|
class << self
|
@@ -111,6 +114,18 @@ class Supernova::Criteria
|
|
111
114
|
def to_a
|
112
115
|
implement_in_subclass
|
113
116
|
end
|
117
|
+
|
118
|
+
def current_page
|
119
|
+
pagination_attribute_when_greater_zero(:page) || 1
|
120
|
+
end
|
121
|
+
|
122
|
+
def per_page
|
123
|
+
pagination_attribute_when_greater_zero(:per_page) || DEFAULT_PER_PAGE
|
124
|
+
end
|
125
|
+
|
126
|
+
def pagination_attribute_when_greater_zero(attribute)
|
127
|
+
self.search_options[:pagination][attribute] if self.search_options[:pagination] && self.search_options[:pagination][attribute].to_i > 0
|
128
|
+
end
|
114
129
|
|
115
130
|
def implement_in_subclass
|
116
131
|
raise "implement in subclass"
|
@@ -1,11 +1,6 @@
|
|
1
1
|
Numeric.class_eval do
|
2
|
-
KM_TO_METER = 1000.0
|
3
|
-
MILE_TO_METER = 1609.3472
|
4
|
-
DEG_TO_RADIAN = Math::PI / 180.0
|
5
|
-
RADIAN_TO_REG = 1 / DEG_TO_RADIAN
|
6
|
-
|
7
2
|
def km
|
8
|
-
self * KM_TO_METER
|
3
|
+
self * Supernova::KM_TO_METER
|
9
4
|
end
|
10
5
|
|
11
6
|
def meter
|
@@ -13,15 +8,15 @@ Numeric.class_eval do
|
|
13
8
|
end
|
14
9
|
|
15
10
|
def mile
|
16
|
-
self * MILE_TO_METER
|
11
|
+
self * Supernova::MILE_TO_METER
|
17
12
|
end
|
18
13
|
|
19
14
|
def to_radians
|
20
|
-
self * DEG_TO_RADIAN
|
15
|
+
self * Supernova::DEG_TO_RADIAN
|
21
16
|
end
|
22
17
|
|
23
18
|
def to_deg
|
24
|
-
self * RADIAN_TO_REG
|
19
|
+
self * Supernova::RADIAN_TO_REG
|
25
20
|
end
|
26
21
|
|
27
22
|
alias_method :miles, :mile
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "supernova/solr_criteria"
|
2
|
+
|
3
|
+
module Supernova::Solr
|
4
|
+
class << self
|
5
|
+
attr_accessor :url
|
6
|
+
|
7
|
+
def connection
|
8
|
+
@connection ||= RSolr.connect(:url => self.url)
|
9
|
+
end
|
10
|
+
|
11
|
+
def truncate!
|
12
|
+
connection.delete_by_query("*:*")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(base)
|
17
|
+
base.extend(Supernova::ClassMethods)
|
18
|
+
base.criteria_class = Supernova::SolrCriteria
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "rsolr"
|
2
|
+
|
3
|
+
class Supernova::SolrCriteria < Supernova::Criteria
|
4
|
+
def to_params
|
5
|
+
solr_options = { :fq => [], :q => "*:*" }
|
6
|
+
solr_options[:fq] += self.filters[:with].map { |key, value| "#{key}:#{value}" } if self.filters[:with]
|
7
|
+
solr_options[:sort] = self.search_options[:order] if self.search_options[:order]
|
8
|
+
solr_options[:q] = self.filters[:search] if self.filters[:search]
|
9
|
+
|
10
|
+
if self.search_options[:geo_center] && self.search_options[:geo_distance]
|
11
|
+
solr_options[:pt] = "#{self.search_options[:geo_center][:lat]},#{self.search_options[:geo_center][:lng]}"
|
12
|
+
solr_options[:d] = self.search_options[:geo_distance].to_f / Supernova::KM_TO_METER
|
13
|
+
solr_options[:sfield] = :location
|
14
|
+
solr_options[:fq] << "{!geofilt}"
|
15
|
+
end
|
16
|
+
solr_options[:fq] << "type:#{self.clazz}" if self.clazz
|
17
|
+
|
18
|
+
if self.search_options[:pagination]
|
19
|
+
solr_options[:rows] = per_page
|
20
|
+
solr_options[:start] = (current_page - 1) * solr_options[:rows]
|
21
|
+
end
|
22
|
+
solr_options
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_docs(docs)
|
26
|
+
docs.map do |hash|
|
27
|
+
build_doc(hash)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_doc(hash)
|
32
|
+
doc = hash["type"].constantize.new
|
33
|
+
hash.each do |key, value|
|
34
|
+
if key == "id"
|
35
|
+
doc.id = value.to_s.split("/").last if doc.respond_to?(:id=)
|
36
|
+
else
|
37
|
+
doc.send(:"#{key}=", value) if doc.respond_to?(:"#{key}=")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
doc.instance_variable_set("@readonly", true)
|
41
|
+
doc.instance_variable_set("@new_record", false)
|
42
|
+
doc
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_a
|
46
|
+
response = Supernova::Solr.connection.get("select", :params => to_params)
|
47
|
+
collection = Supernova::Collection.new(current_page, per_page, response["response"]["numFound"])
|
48
|
+
collection.replace(build_docs(response["response"]["docs"]))
|
49
|
+
collection
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Solr" do
|
4
|
+
before(:each) do
|
5
|
+
Supernova::Solr.instance_variable_set("@connection", nil)
|
6
|
+
Supernova::Solr.url = "http://localhost:8983/solr/"
|
7
|
+
Supernova::Solr.truncate!
|
8
|
+
Offer.criteria_class = Supernova::SolrCriteria
|
9
|
+
root = Geokit::LatLng.new(47, 11)
|
10
|
+
endpoint = root.endpoint(90, 50, :units => :kms)
|
11
|
+
Supernova::Solr.connection.add(:id => "offers/1", :type => "Offer", :user_id => 1, :enabled => false, :text => "Hans Meyer", :popularity => 10,
|
12
|
+
:location => "#{root.lat},#{root.lng}", :type => "Offer"
|
13
|
+
)
|
14
|
+
Supernova::Solr.connection.add(:id => "offers/2", :user_id => 2, :enabled => true, :text => "Marek Mintal", :popularity => 1,
|
15
|
+
:location => "#{endpoint.lat},#{endpoint.lng}", :type => "Offer"
|
16
|
+
)
|
17
|
+
Supernova::Solr.connection.commit
|
18
|
+
end
|
19
|
+
|
20
|
+
after(:each) do
|
21
|
+
Supernova::Solr.url = nil
|
22
|
+
Supernova::Solr.instance_variable_set("@connection", nil)
|
23
|
+
Offer.criteria_class = Supernova::ThinkingSphinxCriteria
|
24
|
+
end
|
25
|
+
|
26
|
+
def new_criteria
|
27
|
+
Offer.search_scope
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "searching" do
|
31
|
+
it "returns the correct current_page when nil" do
|
32
|
+
new_criteria.to_a.current_page.should == 1
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns the correct page when set" do
|
36
|
+
new_criteria.paginate(:page => 10).to_a.current_page.should == 10
|
37
|
+
end
|
38
|
+
|
39
|
+
it "the correct per_page when set" do
|
40
|
+
new_criteria.paginate(:per_page => 10).to_a.per_page.should == 10
|
41
|
+
end
|
42
|
+
|
43
|
+
it "the correct per_page when not set" do
|
44
|
+
new_criteria.to_a.per_page.should == 25
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "nearby search" do
|
48
|
+
{ 49.kms => 1, 51.kms => 2 }.each do |distance, total_entries|
|
49
|
+
it "returns #{total_entries} for distance #{distance}" do
|
50
|
+
new_criteria.near(47, 11).within(distance).to_a.total_entries.should == total_entries
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns the correct objects" do
|
56
|
+
new_criteria.with(:user_id => 1).to_a.first.should be_an_instance_of(Offer)
|
57
|
+
end
|
58
|
+
|
59
|
+
{ :id => 1, :user_id => 1, :enabled => false, :text => "Hans Meyer", :popularity => 10 }.each do |key, value|
|
60
|
+
it "sets #{key} to #{value}" do
|
61
|
+
doc = new_criteria.with(:id => "offers/1").to_a.first
|
62
|
+
doc.send(key).should == value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "combines filters" do
|
67
|
+
new_criteria.with(:user_id => 1, :enabled => false).to_a.total_entries.should == 1
|
68
|
+
new_criteria.with(:user_id => 1, :enabled => true).to_a.total_entries.should == 0
|
69
|
+
end
|
70
|
+
|
71
|
+
it "uses the correct orders" do
|
72
|
+
new_criteria.order("id desc").to_a.map(&:id).should == [2, 1]
|
73
|
+
new_criteria.order("id asc").to_a.map(&:id).should == [1, 2]
|
74
|
+
end
|
75
|
+
|
76
|
+
it "uses the correct pagination attributes" do
|
77
|
+
new_criteria.with(:user_id => 1, :enabled => false).to_a.total_entries.should == 1
|
78
|
+
new_criteria.with(:user_id => 1, :enabled => false).length.should == 1
|
79
|
+
new_criteria.with(:user_id => 1, :enabled => false).paginate(:page => 10).to_a.total_entries.should == 1
|
80
|
+
new_criteria.with(:user_id => 1, :enabled => false).paginate(:page => 10).length.should == 0
|
81
|
+
|
82
|
+
new_criteria.paginate(:per_page => 1, :page => 1).to_a.map(&:id).should == [1]
|
83
|
+
new_criteria.paginate(:per_page => 1, :page => 2).to_a.map(&:id).should == [2]
|
84
|
+
end
|
85
|
+
|
86
|
+
it "handels empty results correctly" do
|
87
|
+
results = new_criteria.with(:user_id => 1, :enabled => true).to_a
|
88
|
+
results.total_entries.should == 0
|
89
|
+
results.current_page.should == 1
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,7 @@ require "mysql2"
|
|
6
6
|
require "logger"
|
7
7
|
require "fileutils"
|
8
8
|
require "ruby-debug"
|
9
|
+
require "geokit"
|
9
10
|
|
10
11
|
if defined?(Debugger) && Debugger.respond_to?(:settings)
|
11
12
|
Debugger.settings[:autolist] = 1
|
@@ -62,4 +63,5 @@ class Offer < ActiveRecord::Base
|
|
62
63
|
end
|
63
64
|
|
64
65
|
class Host
|
66
|
+
attr_accessor :id
|
65
67
|
end
|
@@ -0,0 +1,245 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Supernova::SolrCriteria do
|
4
|
+
let(:criteria) { Supernova::SolrCriteria.new }
|
5
|
+
let(:rsolr) { double("rsolr").as_null_object }
|
6
|
+
let(:docs) do
|
7
|
+
[
|
8
|
+
{"popularity"=>10, "location"=>"47,11", "text"=>"Hans Meyer", "id"=>"offers/1", "enabled"=>false, "user_id"=>1, "type"=>"Offer"},
|
9
|
+
{"popularity"=>1, "location"=>"46.9981112912042,11.6587158814378", "text"=>"Marek Mintal", "id"=>"offers/2", "enabled"=>true, "user_id"=>2, "type"=>"Offer"}
|
10
|
+
]
|
11
|
+
end
|
12
|
+
let(:solr_response) do
|
13
|
+
{
|
14
|
+
"response"=>{"start"=>0, "docs"=>docs, "numFound"=>2}, "responseHeader"=>{"QTime"=>4, "params"=>{"fq"=>"type:Offer", "q"=>"*:*", "wt"=>"ruby"}, "status"=>0}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
before(:each) do
|
19
|
+
Supernova::Solr.stub!(:connection).and_return rsolr
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#to_params" do
|
23
|
+
it "returns a Hash" do
|
24
|
+
criteria.to_params.should be_an_instance_of(Hash)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "sets the correct filters" do
|
28
|
+
criteria.with(:title => "Hans Maulwurf", :playings => 10).to_params[:fq].sort.should == ["playings:10", "title:Hans Maulwurf"]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "allways includes some query" do
|
32
|
+
criteria.with(:a => 1).to_params[:q].should == "*:*"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "sets the order field" do
|
36
|
+
criteria.order("title").to_params[:sort].should == "title"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets search correct search query" do
|
40
|
+
criteria.search("some query").to_params[:q].should == "some query"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "adds a filter on type when clazz set" do
|
44
|
+
Supernova::SolrCriteria.new(Offer).to_params[:fq].should == ["type:#{Offer}"]
|
45
|
+
end
|
46
|
+
|
47
|
+
it "does not add a filter on type when clazz is nil" do
|
48
|
+
criteria.to_params[:fq].should == []
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "with a nearby search" do
|
52
|
+
let(:nearby_criteria) { Supernova::SolrCriteria.new.near(47, 11).within(10.kms) }
|
53
|
+
|
54
|
+
it "sets the correct center" do
|
55
|
+
nearby_criteria.to_params[:pt].should == "47.0,11.0"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "sets the correct distance" do
|
59
|
+
nearby_criteria.to_params[:d].should == 10.0
|
60
|
+
end
|
61
|
+
|
62
|
+
it "sets the sfield to location" do
|
63
|
+
nearby_criteria.to_params[:sfield].should == :location
|
64
|
+
end
|
65
|
+
|
66
|
+
it "sets the fq field to {!geofilt}" do
|
67
|
+
nearby_criteria.to_params[:fq].should == ["{!geofilt}"]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "pagination" do
|
72
|
+
it "sets the correct rows" do
|
73
|
+
criteria.paginate(:page => 1, :per_page => 10).to_params[:rows].should == 10
|
74
|
+
end
|
75
|
+
|
76
|
+
it "sets the correct start when page is nil" do
|
77
|
+
criteria.paginate(:per_page => 10).to_params[:start].should == 0
|
78
|
+
end
|
79
|
+
|
80
|
+
it "sets the correct start when page is 1" do
|
81
|
+
criteria.paginate(:per_page => 10, :page => 1).to_params[:start].should == 0
|
82
|
+
end
|
83
|
+
|
84
|
+
it "sets the correct start when page is 1" do
|
85
|
+
criteria.paginate(:per_page => 10, :page => 2).to_params[:start].should == 10
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#to_a" do
|
91
|
+
let(:params) { double("params") }
|
92
|
+
|
93
|
+
before(:each) do
|
94
|
+
criteria.stub(:to_params).and_return params
|
95
|
+
rsolr.stub!(:get).and_return solr_response
|
96
|
+
end
|
97
|
+
|
98
|
+
it "calls to_params" do
|
99
|
+
criteria.should_receive(:to_params).and_return params
|
100
|
+
criteria.to_a
|
101
|
+
end
|
102
|
+
|
103
|
+
it "calls get with select and params" do
|
104
|
+
rsolr.should_receive(:get).with("select", :params => params).and_return solr_response
|
105
|
+
criteria.to_a
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns a Supernova::Collection" do
|
109
|
+
criteria.to_a.should be_an_instance_of(Supernova::Collection)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "sets the correct page when page is nil" do
|
113
|
+
criteria.to_a.current_page.should == 1
|
114
|
+
end
|
115
|
+
|
116
|
+
it "sets the correct page when page is 1" do
|
117
|
+
criteria.paginate(:page => 1).to_a.current_page.should == 1
|
118
|
+
end
|
119
|
+
|
120
|
+
it "sets the correct page when page is 2" do
|
121
|
+
criteria.paginate(:page => 2).to_a.current_page.should == 2
|
122
|
+
end
|
123
|
+
|
124
|
+
it "sets the correct per_page when zero" do
|
125
|
+
criteria.paginate(:page => 2, :per_page => nil).to_a.per_page.should == 25
|
126
|
+
end
|
127
|
+
|
128
|
+
it "sets the custom per_page when given" do
|
129
|
+
criteria.paginate(:page => 2, :per_page => 10).to_a.per_page.should == 10
|
130
|
+
end
|
131
|
+
|
132
|
+
it "sets the correct total_entries" do
|
133
|
+
criteria.paginate(:page => 2, :per_page => 10).to_a.total_entries.should == 2
|
134
|
+
end
|
135
|
+
|
136
|
+
it "calls build_docs with returned docs" do
|
137
|
+
criteria.should_receive(:build_docs).with(docs).and_return []
|
138
|
+
criteria.to_a
|
139
|
+
end
|
140
|
+
|
141
|
+
it "calls replace on collection wit returned docs" do
|
142
|
+
col = double("collection")
|
143
|
+
Supernova::Collection.stub!(:new).and_return col
|
144
|
+
built_docs = double("built docs")
|
145
|
+
criteria.stub!(:build_docs).and_return built_docs
|
146
|
+
col.should_receive(:replace).with(built_docs)
|
147
|
+
criteria.to_a
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "#build_docs" do
|
152
|
+
it "returns an array" do
|
153
|
+
criteria.build_docs([]).should == []
|
154
|
+
end
|
155
|
+
|
156
|
+
it "returns the correct amount of docs" do
|
157
|
+
criteria.build_docs(docs).length.should == 2
|
158
|
+
end
|
159
|
+
|
160
|
+
it "returns the correct classes" do
|
161
|
+
docs = [ { "id" => "hosts/7", "type" => "Host" }, { "id" => "offers/1", "type" => "Offer" }]
|
162
|
+
criteria.build_docs(docs).map(&:class).should == [Host, Offer]
|
163
|
+
end
|
164
|
+
|
165
|
+
it "calls build_doc on all returnd docs" do
|
166
|
+
doc1 = double("doc1")
|
167
|
+
doc2 = double("doc2")
|
168
|
+
docs = [doc1, doc2]
|
169
|
+
criteria.should_receive(:build_doc).with(doc1)
|
170
|
+
criteria.should_receive(:build_doc).with(doc2)
|
171
|
+
criteria.build_docs(docs)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "#build_doc" do
|
176
|
+
{ "Offer" => Offer, "Host" => Host }.each do |type, clazz|
|
177
|
+
it "returns the #{clazz} for #{type.inspect}" do
|
178
|
+
criteria.build_doc("type" => type).should be_an_instance_of(clazz)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
{ :popularity => 10, :enabled => false, :id => 1 }.each do |key, value|
|
183
|
+
it "sets #{key} to #{value}" do
|
184
|
+
doc = criteria.build_doc("type" => "Offer", "some_other" => "Test", "id" => "offers/1", "enabled" => false, "popularity" => 10)
|
185
|
+
doc.send(key).should == value
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should be readonly" do
|
190
|
+
criteria.build_doc(docs.first).should be_readonly
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should not be a new record" do
|
194
|
+
criteria.build_doc(docs.first).should_not be_a_new_record
|
195
|
+
end
|
196
|
+
|
197
|
+
class MongoOffer
|
198
|
+
attr_accessor :id
|
199
|
+
end
|
200
|
+
|
201
|
+
it "would also work with mongoid ids" do
|
202
|
+
criteria.build_doc("type" => "MongoOffer", "id" => "offers/4df08c30f3b0a72e7c227a55").id.should == "4df08c30f3b0a72e7c227a55"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe "#current_page" do
|
207
|
+
it "returns 1 when pagiantion is not set" do
|
208
|
+
criteria.current_page.should == 1
|
209
|
+
end
|
210
|
+
|
211
|
+
it "returns 1 when page is set to nil" do
|
212
|
+
criteria.paginate(:page => nil).current_page.should == 1
|
213
|
+
end
|
214
|
+
|
215
|
+
it "returns 1 when page is set to nil" do
|
216
|
+
criteria.paginate(:page => 1).current_page.should == 1
|
217
|
+
end
|
218
|
+
|
219
|
+
it "returns 1 when page is set to nil" do
|
220
|
+
criteria.paginate(:page => 0).current_page.should == 1
|
221
|
+
end
|
222
|
+
|
223
|
+
it "returns 2 when page is set to 2" do
|
224
|
+
criteria.paginate(:page => 2).current_page.should == 2
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "#per_page" do
|
229
|
+
it "returns 25 when nothing set" do
|
230
|
+
criteria.per_page.should == 25
|
231
|
+
end
|
232
|
+
|
233
|
+
it "returns 25 when set to nil" do
|
234
|
+
criteria.paginate(:page => 3, :per_page => nil).per_page.should == 25
|
235
|
+
end
|
236
|
+
|
237
|
+
it "returns 25 when set to 0" do
|
238
|
+
criteria.paginate(:page => 3, :per_page => 0).per_page.should == 25
|
239
|
+
end
|
240
|
+
|
241
|
+
it "returns the custom value when set" do
|
242
|
+
criteria.paginate(:page => 3, :per_page => 10).per_page.should == 10
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Supernova::Solr do
|
4
|
+
let(:rsolr) { double("rsolr") }
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
RSolr.stub!(:connect).and_return rsolr
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#url=" do
|
11
|
+
it "allows setting a solr url" do
|
12
|
+
Supernova::Solr.url = "some url"
|
13
|
+
Supernova::Solr.url.should == "some url"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#solr_connection" do
|
18
|
+
after(:each) do
|
19
|
+
Supernova::Solr.url = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
Supernova::Solr.url = "/some/url"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "connects creates and stores a new RSolr connection" do
|
27
|
+
RSolr.should_receive(:connect).with(:url => "/some/url").and_return rsolr
|
28
|
+
Supernova::Solr.connection.should == rsolr
|
29
|
+
Supernova::Solr.instance_variable_get("@connection").should == rsolr
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns a stored connection" do
|
33
|
+
con = double("con")
|
34
|
+
Supernova::Solr.instance_variable_set("@connection", con)
|
35
|
+
Supernova::Solr.connection.should == con
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "truncate!" do
|
40
|
+
it "calls delete_by_query on connection" do
|
41
|
+
Supernova::Solr.connection.should_receive(:delete_by_query).with("*:*")
|
42
|
+
Supernova::Solr.truncate!
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
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.
|
8
|
+
s.version = "0.2.0"
|
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-09}
|
13
13
|
s.description = %q{Unified search scopes}
|
14
14
|
s.email = %q{tobias.schwab@dynport.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,19 +28,26 @@ Gem::Specification.new do |s|
|
|
28
28
|
"VERSION",
|
29
29
|
"autotest/discover.rb",
|
30
30
|
"lib/supernova.rb",
|
31
|
+
"lib/supernova/collection.rb",
|
31
32
|
"lib/supernova/criteria.rb",
|
32
33
|
"lib/supernova/numeric_extensions.rb",
|
34
|
+
"lib/supernova/solr.rb",
|
35
|
+
"lib/supernova/solr_criteria.rb",
|
33
36
|
"lib/supernova/thinking_sphinx.rb",
|
34
37
|
"lib/supernova/thinking_sphinx_criteria.rb",
|
35
38
|
"spec/database.sql",
|
36
|
-
"spec/integration/
|
39
|
+
"spec/integration/solr_spec.rb",
|
40
|
+
"spec/integration/thinking_sphinx_spec.rb",
|
37
41
|
"spec/spec_helper.rb",
|
38
42
|
"spec/supernova/criteria_spec.rb",
|
39
43
|
"spec/supernova/numeric_extensions_spec.rb",
|
44
|
+
"spec/supernova/solr_criteria_spec.rb",
|
45
|
+
"spec/supernova/solr_spec.rb",
|
40
46
|
"spec/supernova/thinking_sphinx_criteria_spec.rb",
|
41
47
|
"spec/supernova_spec.rb",
|
42
48
|
"supernova.gemspec"
|
43
49
|
]
|
50
|
+
s.homepage = %q{http://github.com/dynport/supernova}
|
44
51
|
s.licenses = ["MIT"]
|
45
52
|
s.require_paths = ["lib"]
|
46
53
|
s.rubygems_version = %q{1.7.2}
|
@@ -51,6 +58,8 @@ Gem::Specification.new do |s|
|
|
51
58
|
|
52
59
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
60
|
s.add_runtime_dependency(%q<thinking-sphinx>, ["= 2.0.3"])
|
61
|
+
s.add_runtime_dependency(%q<rsolr>, [">= 0"])
|
62
|
+
s.add_runtime_dependency(%q<will_paginate>, [">= 0"])
|
54
63
|
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
55
64
|
s.add_development_dependency(%q<mysql2>, ["~> 0.2.7"])
|
56
65
|
s.add_development_dependency(%q<geokit>, [">= 0"])
|
@@ -62,6 +71,8 @@ Gem::Specification.new do |s|
|
|
62
71
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
63
72
|
else
|
64
73
|
s.add_dependency(%q<thinking-sphinx>, ["= 2.0.3"])
|
74
|
+
s.add_dependency(%q<rsolr>, [">= 0"])
|
75
|
+
s.add_dependency(%q<will_paginate>, [">= 0"])
|
65
76
|
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
66
77
|
s.add_dependency(%q<mysql2>, ["~> 0.2.7"])
|
67
78
|
s.add_dependency(%q<geokit>, [">= 0"])
|
@@ -74,6 +85,8 @@ Gem::Specification.new do |s|
|
|
74
85
|
end
|
75
86
|
else
|
76
87
|
s.add_dependency(%q<thinking-sphinx>, ["= 2.0.3"])
|
88
|
+
s.add_dependency(%q<rsolr>, [">= 0"])
|
89
|
+
s.add_dependency(%q<will_paginate>, [">= 0"])
|
77
90
|
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
78
91
|
s.add_dependency(%q<mysql2>, ["~> 0.2.7"])
|
79
92
|
s.add_dependency(%q<geokit>, [">= 0"])
|
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: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
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-09 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -44,11 +44,39 @@ dependencies:
|
|
44
44
|
- 0
|
45
45
|
version: "0"
|
46
46
|
version_requirements: *id002
|
47
|
+
name: rsolr
|
48
|
+
prerelease: false
|
49
|
+
type: :runtime
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
version_requirements: *id003
|
61
|
+
name: will_paginate
|
62
|
+
prerelease: false
|
63
|
+
type: :runtime
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
version_requirements: *id004
|
47
75
|
name: ruby-debug
|
48
76
|
prerelease: false
|
49
77
|
type: :development
|
50
78
|
- !ruby/object:Gem::Dependency
|
51
|
-
requirement: &
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
52
80
|
none: false
|
53
81
|
requirements:
|
54
82
|
- - ~>
|
@@ -59,12 +87,12 @@ dependencies:
|
|
59
87
|
- 2
|
60
88
|
- 7
|
61
89
|
version: 0.2.7
|
62
|
-
version_requirements: *
|
90
|
+
version_requirements: *id005
|
63
91
|
name: mysql2
|
64
92
|
prerelease: false
|
65
93
|
type: :development
|
66
94
|
- !ruby/object:Gem::Dependency
|
67
|
-
requirement: &
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
68
96
|
none: false
|
69
97
|
requirements:
|
70
98
|
- - ">="
|
@@ -73,12 +101,12 @@ dependencies:
|
|
73
101
|
segments:
|
74
102
|
- 0
|
75
103
|
version: "0"
|
76
|
-
version_requirements: *
|
104
|
+
version_requirements: *id006
|
77
105
|
name: geokit
|
78
106
|
prerelease: false
|
79
107
|
type: :development
|
80
108
|
- !ruby/object:Gem::Dependency
|
81
|
-
requirement: &
|
109
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
82
110
|
none: false
|
83
111
|
requirements:
|
84
112
|
- - ">="
|
@@ -87,12 +115,12 @@ dependencies:
|
|
87
115
|
segments:
|
88
116
|
- 0
|
89
117
|
version: "0"
|
90
|
-
version_requirements: *
|
118
|
+
version_requirements: *id007
|
91
119
|
name: autotest
|
92
120
|
prerelease: false
|
93
121
|
type: :development
|
94
122
|
- !ruby/object:Gem::Dependency
|
95
|
-
requirement: &
|
123
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
96
124
|
none: false
|
97
125
|
requirements:
|
98
126
|
- - ">="
|
@@ -101,12 +129,12 @@ dependencies:
|
|
101
129
|
segments:
|
102
130
|
- 0
|
103
131
|
version: "0"
|
104
|
-
version_requirements: *
|
132
|
+
version_requirements: *id008
|
105
133
|
name: autotest-growl
|
106
134
|
prerelease: false
|
107
135
|
type: :development
|
108
136
|
- !ruby/object:Gem::Dependency
|
109
|
-
requirement: &
|
137
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
110
138
|
none: false
|
111
139
|
requirements:
|
112
140
|
- - ~>
|
@@ -117,12 +145,12 @@ dependencies:
|
|
117
145
|
- 3
|
118
146
|
- 0
|
119
147
|
version: 2.3.0
|
120
|
-
version_requirements: *
|
148
|
+
version_requirements: *id009
|
121
149
|
name: rspec
|
122
150
|
prerelease: false
|
123
151
|
type: :development
|
124
152
|
- !ruby/object:Gem::Dependency
|
125
|
-
requirement: &
|
153
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
126
154
|
none: false
|
127
155
|
requirements:
|
128
156
|
- - ~>
|
@@ -133,12 +161,12 @@ dependencies:
|
|
133
161
|
- 0
|
134
162
|
- 0
|
135
163
|
version: 1.0.0
|
136
|
-
version_requirements: *
|
164
|
+
version_requirements: *id010
|
137
165
|
name: bundler
|
138
166
|
prerelease: false
|
139
167
|
type: :development
|
140
168
|
- !ruby/object:Gem::Dependency
|
141
|
-
requirement: &
|
169
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
142
170
|
none: false
|
143
171
|
requirements:
|
144
172
|
- - ~>
|
@@ -149,12 +177,12 @@ dependencies:
|
|
149
177
|
- 6
|
150
178
|
- 0
|
151
179
|
version: 1.6.0
|
152
|
-
version_requirements: *
|
180
|
+
version_requirements: *id011
|
153
181
|
name: jeweler
|
154
182
|
prerelease: false
|
155
183
|
type: :development
|
156
184
|
- !ruby/object:Gem::Dependency
|
157
|
-
requirement: &
|
185
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
158
186
|
none: false
|
159
187
|
requirements:
|
160
188
|
- - ">="
|
@@ -163,7 +191,7 @@ dependencies:
|
|
163
191
|
segments:
|
164
192
|
- 0
|
165
193
|
version: "0"
|
166
|
-
version_requirements: *
|
194
|
+
version_requirements: *id012
|
167
195
|
name: rcov
|
168
196
|
prerelease: false
|
169
197
|
type: :development
|
@@ -188,19 +216,25 @@ files:
|
|
188
216
|
- VERSION
|
189
217
|
- autotest/discover.rb
|
190
218
|
- lib/supernova.rb
|
219
|
+
- lib/supernova/collection.rb
|
191
220
|
- lib/supernova/criteria.rb
|
192
221
|
- lib/supernova/numeric_extensions.rb
|
222
|
+
- lib/supernova/solr.rb
|
223
|
+
- lib/supernova/solr_criteria.rb
|
193
224
|
- lib/supernova/thinking_sphinx.rb
|
194
225
|
- lib/supernova/thinking_sphinx_criteria.rb
|
195
226
|
- spec/database.sql
|
196
|
-
- spec/integration/
|
227
|
+
- spec/integration/solr_spec.rb
|
228
|
+
- spec/integration/thinking_sphinx_spec.rb
|
197
229
|
- spec/spec_helper.rb
|
198
230
|
- spec/supernova/criteria_spec.rb
|
199
231
|
- spec/supernova/numeric_extensions_spec.rb
|
232
|
+
- spec/supernova/solr_criteria_spec.rb
|
233
|
+
- spec/supernova/solr_spec.rb
|
200
234
|
- spec/supernova/thinking_sphinx_criteria_spec.rb
|
201
235
|
- spec/supernova_spec.rb
|
202
236
|
- supernova.gemspec
|
203
|
-
homepage:
|
237
|
+
homepage: http://github.com/dynport/supernova
|
204
238
|
licenses:
|
205
239
|
- MIT
|
206
240
|
post_install_message:
|