gojee-sunspot 2.0.3 → 2.0.4
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/.gitignore +12 -0
- data/Gemfile +5 -0
- data/History.txt +252 -0
- data/LICENSE +18 -0
- data/Rakefile +13 -0
- data/TODO +13 -0
- data/lib/light_config.rb +40 -0
- data/lib/sunspot/adapters.rb +265 -0
- data/lib/sunspot/batcher.rb +62 -0
- data/lib/sunspot/class_set.rb +23 -0
- data/lib/sunspot/composite_setup.rb +202 -0
- data/lib/sunspot/configuration.rb +53 -0
- data/lib/sunspot/data_extractor.rb +50 -0
- data/lib/sunspot/dsl/adjustable.rb +47 -0
- data/lib/sunspot/dsl/field_group.rb +57 -0
- data/lib/sunspot/dsl/field_query.rb +327 -0
- data/lib/sunspot/dsl/fields.rb +103 -0
- data/lib/sunspot/dsl/fulltext.rb +243 -0
- data/lib/sunspot/dsl/function.rb +27 -0
- data/lib/sunspot/dsl/functional.rb +44 -0
- data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
- data/lib/sunspot/dsl/paginatable.rb +32 -0
- data/lib/sunspot/dsl/query_facet.rb +36 -0
- data/lib/sunspot/dsl/restriction.rb +25 -0
- data/lib/sunspot/dsl/restriction_with_near.rb +160 -0
- data/lib/sunspot/dsl/scope.rb +217 -0
- data/lib/sunspot/dsl/search.rb +30 -0
- data/lib/sunspot/dsl/standard_query.rb +123 -0
- data/lib/sunspot/dsl.rb +5 -0
- data/lib/sunspot/field.rb +193 -0
- data/lib/sunspot/field_factory.rb +129 -0
- data/lib/sunspot/indexer.rb +136 -0
- data/lib/sunspot/query/abstract_field_facet.rb +52 -0
- data/lib/sunspot/query/bbox.rb +15 -0
- data/lib/sunspot/query/boost_query.rb +24 -0
- data/lib/sunspot/query/common_query.rb +96 -0
- data/lib/sunspot/query/composite_fulltext.rb +36 -0
- data/lib/sunspot/query/connective.rb +206 -0
- data/lib/sunspot/query/date_field_facet.rb +14 -0
- data/lib/sunspot/query/dismax.rb +132 -0
- data/lib/sunspot/query/field_facet.rb +41 -0
- data/lib/sunspot/query/field_group.rb +36 -0
- data/lib/sunspot/query/filter.rb +38 -0
- data/lib/sunspot/query/function_query.rb +52 -0
- data/lib/sunspot/query/geo.rb +53 -0
- data/lib/sunspot/query/geofilt.rb +16 -0
- data/lib/sunspot/query/highlighting.rb +62 -0
- data/lib/sunspot/query/more_like_this.rb +61 -0
- data/lib/sunspot/query/more_like_this_query.rb +12 -0
- data/lib/sunspot/query/pagination.rb +42 -0
- data/lib/sunspot/query/query_facet.rb +16 -0
- data/lib/sunspot/query/restriction.rb +262 -0
- data/lib/sunspot/query/scope.rb +9 -0
- data/lib/sunspot/query/sort.rb +109 -0
- data/lib/sunspot/query/sort_composite.rb +34 -0
- data/lib/sunspot/query/standard_query.rb +16 -0
- data/lib/sunspot/query/text_field_boost.rb +17 -0
- data/lib/sunspot/query.rb +11 -0
- data/lib/sunspot/schema.rb +151 -0
- data/lib/sunspot/search/abstract_search.rb +281 -0
- data/lib/sunspot/search/date_facet.rb +35 -0
- data/lib/sunspot/search/facet_row.rb +27 -0
- data/lib/sunspot/search/field_facet.rb +88 -0
- data/lib/sunspot/search/field_group.rb +32 -0
- data/lib/sunspot/search/group.rb +50 -0
- data/lib/sunspot/search/highlight.rb +38 -0
- data/lib/sunspot/search/hit.rb +150 -0
- data/lib/sunspot/search/hit_enumerable.rb +72 -0
- data/lib/sunspot/search/more_like_this_search.rb +31 -0
- data/lib/sunspot/search/paginated_collection.rb +57 -0
- data/lib/sunspot/search/query_facet.rb +67 -0
- data/lib/sunspot/search/standard_search.rb +21 -0
- data/lib/sunspot/search.rb +9 -0
- data/lib/sunspot/session.rb +262 -0
- data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
- data/lib/sunspot/session_proxy/multicore_session_proxy.rb +67 -0
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
- data/lib/sunspot/session_proxy.rb +95 -0
- data/lib/sunspot/setup.rb +350 -0
- data/lib/sunspot/text_field_setup.rb +29 -0
- data/lib/sunspot/type.rb +393 -0
- data/lib/sunspot/util.rb +252 -0
- data/lib/sunspot/version.rb +3 -0
- data/lib/sunspot.rb +579 -0
- data/log/.gitignore +1 -0
- data/pkg/.gitignore +1 -0
- data/script/console +10 -0
- data/spec/api/adapters_spec.rb +33 -0
- data/spec/api/batcher_spec.rb +112 -0
- data/spec/api/binding_spec.rb +50 -0
- data/spec/api/class_set_spec.rb +24 -0
- data/spec/api/hit_enumerable_spec.rb +47 -0
- data/spec/api/indexer/attributes_spec.rb +149 -0
- data/spec/api/indexer/batch_spec.rb +72 -0
- data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
- data/spec/api/indexer/fixed_fields_spec.rb +57 -0
- data/spec/api/indexer/fulltext_spec.rb +43 -0
- data/spec/api/indexer/removal_spec.rb +53 -0
- data/spec/api/indexer/spec_helper.rb +1 -0
- data/spec/api/indexer_spec.rb +14 -0
- data/spec/api/query/advanced_manipulation_examples.rb +35 -0
- data/spec/api/query/connectives_examples.rb +189 -0
- data/spec/api/query/dsl_spec.rb +18 -0
- data/spec/api/query/dynamic_fields_examples.rb +165 -0
- data/spec/api/query/faceting_examples.rb +397 -0
- data/spec/api/query/fulltext_examples.rb +313 -0
- data/spec/api/query/function_spec.rb +79 -0
- data/spec/api/query/geo_examples.rb +68 -0
- data/spec/api/query/group_spec.rb +32 -0
- data/spec/api/query/highlighting_examples.rb +245 -0
- data/spec/api/query/more_like_this_spec.rb +140 -0
- data/spec/api/query/ordering_pagination_examples.rb +116 -0
- data/spec/api/query/scope_examples.rb +275 -0
- data/spec/api/query/spatial_examples.rb +27 -0
- data/spec/api/query/spec_helper.rb +1 -0
- data/spec/api/query/standard_spec.rb +29 -0
- data/spec/api/query/text_field_scoping_examples.rb +30 -0
- data/spec/api/query/types_spec.rb +20 -0
- data/spec/api/search/dynamic_fields_spec.rb +33 -0
- data/spec/api/search/faceting_spec.rb +360 -0
- data/spec/api/search/highlighting_spec.rb +69 -0
- data/spec/api/search/hits_spec.rb +131 -0
- data/spec/api/search/paginated_collection_spec.rb +36 -0
- data/spec/api/search/results_spec.rb +72 -0
- data/spec/api/search/search_spec.rb +23 -0
- data/spec/api/search/spec_helper.rb +1 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
- data/spec/api/session_proxy/spec_helper.rb +9 -0
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
- data/spec/api/session_spec.rb +232 -0
- data/spec/api/spec_helper.rb +3 -0
- data/spec/api/sunspot_spec.rb +29 -0
- data/spec/ext.rb +11 -0
- data/spec/helpers/indexer_helper.rb +17 -0
- data/spec/helpers/integration_helper.rb +8 -0
- data/spec/helpers/mock_session_helper.rb +13 -0
- data/spec/helpers/query_helper.rb +26 -0
- data/spec/helpers/search_helper.rb +68 -0
- data/spec/integration/dynamic_fields_spec.rb +57 -0
- data/spec/integration/faceting_spec.rb +251 -0
- data/spec/integration/field_grouping_spec.rb +66 -0
- data/spec/integration/geospatial_spec.rb +85 -0
- data/spec/integration/highlighting_spec.rb +44 -0
- data/spec/integration/indexing_spec.rb +55 -0
- data/spec/integration/keyword_search_spec.rb +317 -0
- data/spec/integration/local_search_spec.rb +64 -0
- data/spec/integration/more_like_this_spec.rb +43 -0
- data/spec/integration/scoped_search_spec.rb +354 -0
- data/spec/integration/stored_fields_spec.rb +12 -0
- data/spec/integration/test_pagination.rb +43 -0
- data/spec/integration/unicode_spec.rb +15 -0
- data/spec/mocks/adapters.rb +32 -0
- data/spec/mocks/blog.rb +3 -0
- data/spec/mocks/comment.rb +21 -0
- data/spec/mocks/connection.rb +126 -0
- data/spec/mocks/mock_adapter.rb +30 -0
- data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
- data/spec/mocks/mock_record.rb +52 -0
- data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
- data/spec/mocks/photo.rb +11 -0
- data/spec/mocks/post.rb +86 -0
- data/spec/mocks/super_class.rb +2 -0
- data/spec/mocks/user.rb +13 -0
- data/spec/spec_helper.rb +40 -0
- data/sunspot.gemspec +42 -0
- data/tasks/rdoc.rake +27 -0
- data/tasks/schema.rake +19 -0
- data/tasks/todo.rake +4 -0
- metadata +261 -3
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::SessionProxy::ClassShardingSessionProxy do
|
4
|
+
before do
|
5
|
+
@proxy = MockClassShardingSessionProxy.new(session)
|
6
|
+
end
|
7
|
+
|
8
|
+
[:index, :index!, :remove, :remove!].each do |method|
|
9
|
+
it "should delegate #{method} to appropriate shard" do
|
10
|
+
post = Post.new
|
11
|
+
photo = Photo.new
|
12
|
+
@proxy.post_session.should_receive(method).with([post])
|
13
|
+
@proxy.photo_session.should_receive(method).with([photo])
|
14
|
+
@proxy.send(method, post)
|
15
|
+
@proxy.send(method, photo)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
[:remove_by_id, :remove_by_id!].each do |method|
|
20
|
+
it "should delegate #{method} to appropriate shard" do
|
21
|
+
@proxy.post_session.should_receive(method).with(Post, 1)
|
22
|
+
@proxy.photo_session.should_receive(method).with(Photo, 1)
|
23
|
+
@proxy.send(method, Post, 1)
|
24
|
+
@proxy.send(method, Photo, 1)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
[:remove_all, :remove_all!].each do |method|
|
29
|
+
it "should delegate #{method} with argument to appropriate shard" do
|
30
|
+
@proxy.post_session.should_receive(method).with(Post)
|
31
|
+
@proxy.photo_session.should_receive(method).with(Photo)
|
32
|
+
@proxy.send(method, Post)
|
33
|
+
@proxy.send(method, Photo)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should delegate #{method} without argument to all shards" do
|
37
|
+
@proxy.post_session.should_receive(method)
|
38
|
+
@proxy.photo_session.should_receive(method)
|
39
|
+
@proxy.send(method)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
[:commit, :commit_if_dirty, :commit_if_delete_dirty, :optimize].each do |method|
|
44
|
+
it "should delegate #{method} to all sessions" do
|
45
|
+
[@proxy.post_session, @proxy.photo_session].each do |session|
|
46
|
+
session.should_receive(method)
|
47
|
+
end
|
48
|
+
@proxy.send(method)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not support the :batch method" do
|
53
|
+
lambda { @proxy.batch }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should delegate new_search to search session, adding in shards parameter" do
|
57
|
+
search = @proxy.new_search(Post)
|
58
|
+
search.query[:shards].should ==
|
59
|
+
'http://photos.solr.local/solr,http://posts.solr.local/solr'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should delegate search to search session, adding in shards parameter" do
|
63
|
+
@proxy.search(Post)
|
64
|
+
connection.should have_last_search_with(
|
65
|
+
:shards => 'http://photos.solr.local/solr,http://posts.solr.local/solr'
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
[:dirty, :delete_dirty].each do |method|
|
70
|
+
it "should be dirty if any of the sessions are dirty" do
|
71
|
+
@proxy.post_session.stub!(:"#{method}?").and_return(true)
|
72
|
+
@proxy.should send("be_#{method}")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should not be dirty if none of the sessions are dirty" do
|
76
|
+
@proxy.should_not send("be_#{method}")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should raise a NotSupportedError when :config is called" do
|
81
|
+
lambda { @proxy.config }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
82
|
+
end
|
83
|
+
|
84
|
+
it_should_behave_like 'session proxy'
|
85
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::SessionProxy::ShardingSessionProxy do
|
4
|
+
before do
|
5
|
+
search_session = Sunspot::Session.new
|
6
|
+
@sessions = Array.new(2) { Sunspot::Session.new }
|
7
|
+
@proxy = Sunspot::SessionProxy::IdShardingSessionProxy.new(search_session, @sessions)
|
8
|
+
end
|
9
|
+
|
10
|
+
[:index, :index!, :remove, :remove!].each do |method|
|
11
|
+
it "should delegate #{method} to appropriate shard" do
|
12
|
+
posts = [Post.new(:id => 2), Post.new(:id => 1)]
|
13
|
+
@proxy.sessions[0].should_receive(method).with([posts[0]])
|
14
|
+
@proxy.sessions[1].should_receive(method).with([posts[1]])
|
15
|
+
@proxy.send(method, posts[0])
|
16
|
+
@proxy.send(method, posts[1])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
[:remove_by_id, :remove_by_id!].each do |method|
|
21
|
+
it "should delegate #{method} to appropriate session" do
|
22
|
+
@proxy.sessions[0].should_receive(method).with(Post, 2)
|
23
|
+
@proxy.sessions[1].should_receive(method).with(Post, 1)
|
24
|
+
@proxy.send(method, Post, 1)
|
25
|
+
@proxy.send(method, Post, 2)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it_should_behave_like 'session proxy'
|
30
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::SessionProxy::MasterSlaveSessionProxy do
|
4
|
+
before :each do
|
5
|
+
@master_session, @slave_session = Sunspot::Session.new, Sunspot::Session.new
|
6
|
+
@proxy = Sunspot::SessionProxy::MasterSlaveSessionProxy.new(@master_session, @slave_session)
|
7
|
+
end
|
8
|
+
|
9
|
+
{
|
10
|
+
:master_session => Sunspot::Session.public_instance_methods(false) - [:search, 'search', :new_search, 'new_search', :more_like_this, 'more_like_this', :new_more_like_this, 'new_more_like_this', :config, 'config'],
|
11
|
+
:slave_session => [:search, :new_search, :more_like_this, :new_more_like_this]
|
12
|
+
}.each_pair do |delegate, methods|
|
13
|
+
methods.each do |method|
|
14
|
+
it "should delegate #{method} to #{delegate}" do
|
15
|
+
args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
|
16
|
+
stub('arg')
|
17
|
+
end
|
18
|
+
instance_variable_get(:"@#{delegate}").should_receive(method).with(*args)
|
19
|
+
@proxy.send(method, *args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return master session config by default' do
|
25
|
+
@proxy.config.should eql(@master_session.config)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should return master session config when specified' do
|
29
|
+
@proxy.config(:master).should eql(@master_session.config)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return slave session config when specified' do
|
33
|
+
@proxy.config(:slave).should eql(@slave_session.config)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should raise ArgumentError when bogus config specified' do
|
37
|
+
lambda { @proxy.config(:bogus) }.should raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it_should_behave_like 'session proxy'
|
41
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::SessionProxy::ShardingSessionProxy do
|
4
|
+
before do
|
5
|
+
@proxy = MockShardingSessionProxy.new(session)
|
6
|
+
end
|
7
|
+
|
8
|
+
[:index, :index!, :remove, :remove!].each do |method|
|
9
|
+
it "should delegate #{method} to appropriate shard" do
|
10
|
+
posts = [Post.new(:blog_id => 2), Post.new(:blog_id => 3)]
|
11
|
+
@proxy.sessions[0].should_receive(method).with([posts[0]])
|
12
|
+
@proxy.sessions[1].should_receive(method).with([posts[1]])
|
13
|
+
@proxy.send(method, posts[0])
|
14
|
+
@proxy.send(method, posts[1])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
[:remove_by_id, :remove_by_id!].each do |method|
|
19
|
+
it "should raise NotSupportedError when #{method} called" do
|
20
|
+
lambda { @proxy.send(method, Post, 1) }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
[:remove_all, :remove_all!].each do |method|
|
25
|
+
it "should raise NotSupportedError when #{method} called with argument" do
|
26
|
+
lambda { @proxy.send(method, Post) }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should delegate #{method} without argument to all shards" do
|
30
|
+
@proxy.sessions.each { |session| session.should_receive(method) }
|
31
|
+
@proxy.send(method)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
[:commit, :commit_if_dirty, :commit_if_delete_dirty, :optimize].each do |method|
|
36
|
+
it "should delegate #{method} to all sessions" do
|
37
|
+
@proxy.sessions.each do |session|
|
38
|
+
session.should_receive(method)
|
39
|
+
end
|
40
|
+
@proxy.send(method)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not support the :batch method" do
|
45
|
+
lambda { @proxy.batch }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should delegate new_search to search session, adding in shards parameter" do
|
49
|
+
search = @proxy.new_search(Post)
|
50
|
+
search.query[:shards].should ==
|
51
|
+
'http://localhost:8980/solr,http://localhost:8981/solr'
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should delegate search to search session, adding in shards parameter" do
|
55
|
+
@proxy.search(Post)
|
56
|
+
connection.should have_last_search_with(
|
57
|
+
:shards => 'http://localhost:8980/solr,http://localhost:8981/solr'
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
[:dirty, :delete_dirty].each do |method|
|
62
|
+
it "should be dirty if any of the sessions are dirty" do
|
63
|
+
@proxy.sessions[0].stub!(:"#{method}?").and_return(true)
|
64
|
+
@proxy.should send("be_#{method}")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should not be dirty if none of the sessions are dirty" do
|
68
|
+
@proxy.should_not send("be_#{method}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should raise a NotSupportedError when :config is called" do
|
73
|
+
lambda { @proxy.config }.should raise_error(Sunspot::SessionProxy::NotSupportedError)
|
74
|
+
end
|
75
|
+
|
76
|
+
it_should_behave_like 'session proxy'
|
77
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::SessionProxy::ShardingSessionProxy do
|
4
|
+
|
5
|
+
FakeException = Class.new(StandardError)
|
6
|
+
SUPPORTED_METHODS = Sunspot::SessionProxy::SilentFailSessionProxy::SUPPORTED_METHODS
|
7
|
+
|
8
|
+
before do
|
9
|
+
@search_session = mock(Sunspot::Session.new)
|
10
|
+
@proxy = Sunspot::SessionProxy::SilentFailSessionProxy.new(@search_session)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should call rescued_exception when an exception is caught" do
|
14
|
+
SUPPORTED_METHODS.each do |method|
|
15
|
+
e = FakeException.new(method)
|
16
|
+
@search_session.stub!(method).and_raise(e)
|
17
|
+
@proxy.should_receive(:rescued_exception).with(method, e)
|
18
|
+
@proxy.send(method)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it_should_behave_like 'session proxy'
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '..'))
|
2
|
+
|
3
|
+
shared_examples_for 'session proxy' do
|
4
|
+
Sunspot::Session.public_instance_methods(false).each do |method|
|
5
|
+
it "should respond to #{method.inspect}" do
|
6
|
+
@proxy.should respond_to(method)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
require 'weakref'
|
3
|
+
|
4
|
+
describe Sunspot::SessionProxy::ThreadLocalSessionProxy do
|
5
|
+
before :each do
|
6
|
+
@config = Sunspot::Configuration.build
|
7
|
+
@proxy = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should have the same session for the same thread' do
|
11
|
+
@proxy.session.should eql(@proxy.session)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should not have the same session for different threads' do
|
15
|
+
session1 = @proxy.session
|
16
|
+
session2 = nil
|
17
|
+
Thread.new do
|
18
|
+
session2 = @proxy.session
|
19
|
+
end.join
|
20
|
+
session1.should_not eql(session2)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should not have the same session for the same thread in different proxy instances' do
|
24
|
+
proxy2 = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(@config)
|
25
|
+
@proxy.session.should_not eql(proxy2.session)
|
26
|
+
end
|
27
|
+
|
28
|
+
(Sunspot::Session.public_instance_methods(false) - ['config', :config]).each do |method|
|
29
|
+
it "should delegate #{method.inspect} to its session" do
|
30
|
+
args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
|
31
|
+
stub('arg')
|
32
|
+
end
|
33
|
+
@proxy.session.should_receive(method).with(*args)
|
34
|
+
@proxy.send(method, *args)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it_should_behave_like 'session proxy'
|
39
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
shared_examples_for 'all sessions' do
|
4
|
+
context '#index()' do
|
5
|
+
before :each do
|
6
|
+
@session.index(Post.new)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should add document to connection' do
|
10
|
+
connection.should have(1).adds
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#index!()' do
|
15
|
+
before :each do
|
16
|
+
@session.index!(Post.new)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should add document to connection' do
|
20
|
+
connection.should have(1).adds
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should commit' do
|
24
|
+
connection.should have(1).commits
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context '#commit()' do
|
29
|
+
before :each do
|
30
|
+
@session.commit
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should commit' do
|
34
|
+
connection.should have(1).commits
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context '#optimize()' do
|
39
|
+
before :each do
|
40
|
+
@session.optimize
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should optimize' do
|
44
|
+
connection.should have(1).optims
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context '#search()' do
|
49
|
+
before :each do
|
50
|
+
@session.search(Post)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should search' do
|
54
|
+
connection.should have(1).searches
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'Session' do
|
60
|
+
before :each do
|
61
|
+
@connection_factory = Mock::ConnectionFactory.new
|
62
|
+
Sunspot::Session.connection_class = @connection_factory
|
63
|
+
end
|
64
|
+
|
65
|
+
after :each do
|
66
|
+
Sunspot::Session.connection_class = nil
|
67
|
+
Sunspot.reset!
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'singleton session' do
|
71
|
+
before :each do
|
72
|
+
Sunspot.reset!
|
73
|
+
@session = Sunspot
|
74
|
+
end
|
75
|
+
|
76
|
+
it_should_behave_like 'all sessions'
|
77
|
+
|
78
|
+
it 'should open connection with defaults if nothing specified' do
|
79
|
+
Sunspot.commit
|
80
|
+
connection.opts[:url].should == 'http://127.0.0.1:8983/solr'
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should open a connection with custom host' do
|
84
|
+
Sunspot.config.solr.url = 'http://127.0.0.1:8981/solr'
|
85
|
+
Sunspot.commit
|
86
|
+
connection.opts[:url].should == 'http://127.0.0.1:8981/solr'
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should open a connection with custom read timeout' do
|
90
|
+
Sunspot.config.solr.read_timeout = 0.5
|
91
|
+
Sunspot.commit
|
92
|
+
connection.opts[:read_timeout].should == 0.5
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should open a connection with custom open timeout' do
|
96
|
+
Sunspot.config.solr.open_timeout = 0.5
|
97
|
+
Sunspot.commit
|
98
|
+
connection.opts[:open_timeout].should == 0.5
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'custom session' do
|
103
|
+
before :each do
|
104
|
+
@session = Sunspot::Session.new
|
105
|
+
end
|
106
|
+
|
107
|
+
it_should_behave_like 'all sessions'
|
108
|
+
|
109
|
+
it 'should open a connection with custom host' do
|
110
|
+
session = Sunspot::Session.new do |config|
|
111
|
+
config.solr.url = 'http://127.0.0.1:8982/solr'
|
112
|
+
end
|
113
|
+
session.commit
|
114
|
+
connection.opts[:url].should == 'http://127.0.0.1:8982/solr'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'dirty sessions' do
|
119
|
+
before :each do
|
120
|
+
@session = Sunspot::Session.new
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should start out not dirty' do
|
124
|
+
@session.dirty?.should be_false
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should start out not delete_dirty' do
|
128
|
+
@session.delete_dirty?.should be_false
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should be dirty after adding an item' do
|
132
|
+
@session.index(Post.new)
|
133
|
+
@session.dirty?.should be_true
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should be not be delete_dirty after adding an item' do
|
137
|
+
@session.index(Post.new)
|
138
|
+
@session.delete_dirty?.should be_false
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should be dirty after deleting an item' do
|
142
|
+
@session.remove(Post.new)
|
143
|
+
@session.dirty?.should be_true
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should be delete_dirty after deleting an item' do
|
147
|
+
@session.remove(Post.new)
|
148
|
+
@session.delete_dirty?.should be_true
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should be dirty after a remove_all for a class' do
|
152
|
+
@session.remove_all(Post)
|
153
|
+
@session.dirty?.should be_true
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should be delete_dirty after a remove_all for a class' do
|
157
|
+
@session.remove_all(Post)
|
158
|
+
@session.delete_dirty?.should be_true
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should be dirty after a global remove_all' do
|
162
|
+
@session.remove_all
|
163
|
+
@session.dirty?.should be_true
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should be delete_dirty after a global remove_all' do
|
167
|
+
@session.remove_all
|
168
|
+
@session.delete_dirty?.should be_true
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should not be dirty after a commit' do
|
172
|
+
@session.index(Post.new)
|
173
|
+
@session.commit
|
174
|
+
@session.dirty?.should be_false
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should not be dirty after an optimize' do
|
178
|
+
@session.index(Post.new)
|
179
|
+
@session.optimize
|
180
|
+
@session.dirty?.should be_false
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should not be delete_dirty after a commit' do
|
184
|
+
@session.remove(Post.new)
|
185
|
+
@session.commit
|
186
|
+
@session.delete_dirty?.should be_false
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should not be delete_dirty after an optimize' do
|
190
|
+
@session.remove(Post.new)
|
191
|
+
@session.optimize
|
192
|
+
@session.delete_dirty?.should be_false
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'should not commit when commit_if_dirty called on clean session' do
|
196
|
+
@session.commit_if_dirty
|
197
|
+
connection.should have(0).commits
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should not commit when commit_if_delete_dirty called on clean session' do
|
201
|
+
@session.commit_if_delete_dirty
|
202
|
+
connection.should have(0).commits
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should commit when commit_if_dirty called on dirty session' do
|
206
|
+
@session.index(Post.new)
|
207
|
+
@session.commit_if_dirty
|
208
|
+
connection.should have(1).commits
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'should commit when commit_if_delete_dirty called on delete_dirty session' do
|
212
|
+
@session.remove(Post.new)
|
213
|
+
@session.commit_if_delete_dirty
|
214
|
+
connection.should have(1).commits
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'session proxy' do
|
219
|
+
it 'should send messages to manually assigned session proxy' do
|
220
|
+
stub_session = stub!('session')
|
221
|
+
Sunspot.session = stub_session
|
222
|
+
post = Post.new
|
223
|
+
stub_session.should_receive(:index).with(post)
|
224
|
+
Sunspot.index(post)
|
225
|
+
Sunspot.reset!
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def connection
|
230
|
+
@connection_factory.instance
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot do
|
4
|
+
|
5
|
+
describe "setup" do
|
6
|
+
it "should register the class in Sunspot.searchable" do
|
7
|
+
Sunspot.setup(Blog) do
|
8
|
+
text :name
|
9
|
+
end
|
10
|
+
Sunspot.searchable.should_not be_empty
|
11
|
+
Sunspot.searchable.should include(Blog)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "reset!" do
|
16
|
+
it "should reset current session" do
|
17
|
+
old_session = Sunspot.send(:session)
|
18
|
+
Sunspot.reset!(true)
|
19
|
+
Sunspot.send(:session).should_not == old_session
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should keep keep configuration if specified" do
|
23
|
+
Sunspot.config.solr.url = "http://localhost:9999/path/solr"
|
24
|
+
config_before_reset = Sunspot.config
|
25
|
+
Sunspot.reset!(true)
|
26
|
+
Sunspot.config.should == config_before_reset
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/spec/ext.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module IndexerHelper
|
2
|
+
def post(attrs = {})
|
3
|
+
@post ||= Post.new(attrs)
|
4
|
+
end
|
5
|
+
|
6
|
+
def last_add
|
7
|
+
@connection.adds.last
|
8
|
+
end
|
9
|
+
|
10
|
+
def value_in_last_document_for(field_name)
|
11
|
+
@connection.adds.last.last.field_by_name(field_name).value
|
12
|
+
end
|
13
|
+
|
14
|
+
def values_in_last_document_for(field_name)
|
15
|
+
@connection.adds.last.last.fields_by_name(field_name).map { |field| field.value }
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module QueryHelper
|
2
|
+
def get_filter_tag(boolean_query)
|
3
|
+
connection.searches.last[:fq].each do |fq|
|
4
|
+
if match = fq.match(/^\{!tag=(.+)\}#{Regexp.escape(boolean_query)}$/)
|
5
|
+
return match[1]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def subqueries(param)
|
12
|
+
q = connection.searches.last[:q]
|
13
|
+
subqueries = []
|
14
|
+
subqueries = q.scan(%r(_query_:"\{!dismax (.*?)\}(.*?)"))
|
15
|
+
subqueries.map do |subquery|
|
16
|
+
params = {}
|
17
|
+
subquery[0].scan(%r((\S+?)='(.+?)')) do |key, value|
|
18
|
+
params[key.to_sym] = value
|
19
|
+
end
|
20
|
+
unless subquery[1].empty?
|
21
|
+
params[:v] = subquery[1]
|
22
|
+
end
|
23
|
+
params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|