sunspot_rbg 1.3.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/.gitignore +12 -0
- data/Gemfile +4 -0
- data/History.txt +222 -0
- data/LICENSE +18 -0
- data/Rakefile +17 -0
- data/TODO +13 -0
- data/VERSION.yml +4 -0
- data/bin/sunspot-installer +19 -0
- data/bin/sunspot-solr +74 -0
- data/installer/config/schema.yml +95 -0
- data/lib/light_config.rb +40 -0
- data/lib/sunspot/adapters.rb +265 -0
- data/lib/sunspot/composite_setup.rb +202 -0
- data/lib/sunspot/configuration.rb +46 -0
- data/lib/sunspot/data_extractor.rb +50 -0
- data/lib/sunspot/dsl/adjustable.rb +47 -0
- data/lib/sunspot/dsl/field_query.rb +279 -0
- data/lib/sunspot/dsl/fields.rb +103 -0
- data/lib/sunspot/dsl/fulltext.rb +243 -0
- data/lib/sunspot/dsl/function.rb +14 -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 +28 -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 +121 -0
- data/lib/sunspot/dsl/scope.rb +217 -0
- data/lib/sunspot/dsl/search.rb +30 -0
- data/lib/sunspot/dsl/standard_query.rb +121 -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 +131 -0
- data/lib/sunspot/installer/library_installer.rb +45 -0
- data/lib/sunspot/installer/schema_builder.rb +219 -0
- data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
- data/lib/sunspot/installer/task_helper.rb +18 -0
- data/lib/sunspot/installer.rb +31 -0
- data/lib/sunspot/query/abstract_field_facet.rb +52 -0
- data/lib/sunspot/query/boost_query.rb +24 -0
- data/lib/sunspot/query/common_query.rb +85 -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 +128 -0
- data/lib/sunspot/query/field_facet.rb +41 -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/highlighting.rb +55 -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 +38 -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 +95 -0
- data/lib/sunspot/query/sort_composite.rb +33 -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 +293 -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/highlight.rb +38 -0
- data/lib/sunspot/search/hit.rb +136 -0
- data/lib/sunspot/search/more_like_this_search.rb +31 -0
- data/lib/sunspot/search/paginated_collection.rb +55 -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/server.rb +152 -0
- data/lib/sunspot/session.rb +260 -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/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 +87 -0
- data/lib/sunspot/setup.rb +350 -0
- data/lib/sunspot/text_field_setup.rb +29 -0
- data/lib/sunspot/type.rb +372 -0
- data/lib/sunspot/util.rb +243 -0
- data/lib/sunspot/version.rb +3 -0
- data/lib/sunspot.rb +569 -0
- data/lib/sunspot_rbg.rb +7 -0
- data/log/.gitignore +1 -0
- data/pkg/.gitignore +1 -0
- data/script/console +10 -0
- data/solr/README.txt +42 -0
- data/solr/etc/jetty.xml +218 -0
- data/solr/etc/webdefault.xml +379 -0
- data/solr/lib/jetty-6.1.3.jar +0 -0
- data/solr/lib/jetty-util-6.1.3.jar +0 -0
- data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
- data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
- data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
- data/solr/logs/.gitignore +1 -0
- data/solr/solr/.gitignore +1 -0
- data/solr/solr/README.txt +54 -0
- data/solr/solr/conf/admin-extra.html +31 -0
- data/solr/solr/conf/elevate.xml +36 -0
- data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
- data/solr/solr/conf/protwords.txt +21 -0
- data/solr/solr/conf/schema.xml +238 -0
- data/solr/solr/conf/scripts.conf +24 -0
- data/solr/solr/conf/solrconfig.xml +934 -0
- data/solr/solr/conf/spellings.txt +2 -0
- data/solr/solr/conf/stopwords.txt +58 -0
- data/solr/solr/conf/synonyms.txt +31 -0
- data/solr/solr/conf/xslt/example.xsl +132 -0
- data/solr/solr/conf/xslt/example_atom.xsl +67 -0
- data/solr/solr/conf/xslt/example_rss.xsl +66 -0
- data/solr/solr/conf/xslt/luke.xsl +337 -0
- data/solr/start.jar +0 -0
- data/solr/webapps/solr.war +0 -0
- data/solr-1.3/etc/jetty.xml +212 -0
- data/solr-1.3/etc/webdefault.xml +379 -0
- data/solr-1.3/lib/jetty-6.1.3.jar +0 -0
- data/solr-1.3/lib/jetty-util-6.1.3.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/ant-1.6.5.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/core-3.1.1.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/jsp-2.1.jar +0 -0
- data/solr-1.3/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
- data/solr-1.3/lib/servlet-api-2.5-6.1.3.jar +0 -0
- data/solr-1.3/solr/conf/elevate.xml +36 -0
- data/solr-1.3/solr/conf/protwords.txt +21 -0
- data/solr-1.3/solr/conf/schema.xml +64 -0
- data/solr-1.3/solr/conf/solrconfig.xml +725 -0
- data/solr-1.3/solr/conf/stopwords.txt +57 -0
- data/solr-1.3/solr/conf/synonyms.txt +31 -0
- data/solr-1.3/solr/lib/geoapi-nogenerics-2.1-M2.jar +0 -0
- data/solr-1.3/solr/lib/gt2-referencing-2.3.1.jar +0 -0
- data/solr-1.3/solr/lib/jsr108-0.01.jar +0 -0
- data/solr-1.3/solr/lib/locallucene.jar +0 -0
- data/solr-1.3/solr/lib/localsolr.jar +0 -0
- data/solr-1.3/start.jar +0 -0
- data/solr-1.3/webapps/solr.war +0 -0
- data/spec/api/adapters_spec.rb +33 -0
- data/spec/api/binding_spec.rb +50 -0
- data/spec/api/indexer/attributes_spec.rb +149 -0
- data/spec/api/indexer/batch_spec.rb +46 -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 +70 -0
- data/spec/api/query/geo_examples.rb +68 -0
- data/spec/api/query/highlighting_examples.rb +223 -0
- data/spec/api/query/more_like_this_spec.rb +140 -0
- data/spec/api/query/ordering_pagination_examples.rb +95 -0
- data/spec/api/query/scope_examples.rb +275 -0
- data/spec/api/query/spec_helper.rb +1 -0
- data/spec/api/query/standard_spec.rb +28 -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 +120 -0
- data/spec/api/search/paginated_collection_spec.rb +26 -0
- data/spec/api/search/results_spec.rb +66 -0
- data/spec/api/search/search_spec.rb +23 -0
- data/spec/api/search/spec_helper.rb +1 -0
- data/spec/api/server_spec.rb +91 -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 +50 -0
- data/spec/api/session_spec.rb +220 -0
- data/spec/api/spec_helper.rb +3 -0
- data/spec/api/sunspot_spec.rb +18 -0
- data/spec/ext.rb +11 -0
- data/spec/helpers/indexer_helper.rb +29 -0
- data/spec/helpers/query_helper.rb +38 -0
- data/spec/helpers/search_helper.rb +80 -0
- data/spec/integration/dynamic_fields_spec.rb +55 -0
- data/spec/integration/faceting_spec.rb +238 -0
- data/spec/integration/highlighting_spec.rb +22 -0
- data/spec/integration/indexing_spec.rb +33 -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/spec_helper.rb +7 -0
- data/spec/integration/stored_fields_spec.rb +10 -0
- data/spec/integration/test_pagination.rb +32 -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 +85 -0
- data/spec/mocks/super_class.rb +2 -0
- data/spec/mocks/user.rb +13 -0
- data/spec/spec_helper.rb +30 -0
- data/sunspot.gemspec +40 -0
- data/tasks/rdoc.rake +27 -0
- data/tasks/schema.rake +19 -0
- data/tasks/todo.rake +4 -0
- metadata +457 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
|
|
4
|
+
describe Sunspot::Server do
|
|
5
|
+
SUNSPOT_START_JAR = File.expand_path(
|
|
6
|
+
File.join(File.dirname(__FILE__), '..', '..', 'solr', 'start.jar')
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
before :each do
|
|
10
|
+
@server = Sunspot::Server.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'runs server in current process' do
|
|
14
|
+
@server.should_not_receive(:fork)
|
|
15
|
+
@server.should_receive(:exec).with(/java .*-jar start.jar/)
|
|
16
|
+
@server.run
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'runs Java with min memory' do
|
|
20
|
+
@server.min_memory = 1024
|
|
21
|
+
@server.should_receive(:exec).with(/-Xms1024/)
|
|
22
|
+
@server.run
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'runs Java with max memory' do
|
|
26
|
+
@server.max_memory = 2048
|
|
27
|
+
@server.should_receive(:exec).with(/-Xmx2048/)
|
|
28
|
+
@server.run
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'runs Jetty with specified port' do
|
|
32
|
+
@server.port = 8981
|
|
33
|
+
@server.should_receive(:exec).with(/-Djetty\.port=8981/)
|
|
34
|
+
@server.run
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'runs Solr with specified data dir' do
|
|
38
|
+
@server.solr_data_dir = '/var/solr/data'
|
|
39
|
+
@server.should_receive(:exec).with(%r(-Dsolr\.data\.dir=/var/solr/data))
|
|
40
|
+
@server.run
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'runs Solr with specified Solr home' do
|
|
44
|
+
@server.solr_home = '/var/solr'
|
|
45
|
+
@server.should_receive(:exec).with(%r(-Dsolr\.solr\.home=/var/solr))
|
|
46
|
+
@server.run
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'runs Solr with specified Solr jar' do
|
|
50
|
+
@server.solr_jar = SUNSPOT_START_JAR
|
|
51
|
+
FileUtils.should_receive(:cd).with(File.dirname(SUNSPOT_START_JAR))
|
|
52
|
+
@server.run
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe 'with logging' do
|
|
56
|
+
before :each do
|
|
57
|
+
@server.log_level = 'info'
|
|
58
|
+
@server.log_file = 'log/sunspot-development.log'
|
|
59
|
+
Tempfile.should_receive(:new).with('logging.properties').and_return(@tempfile = StringIO.new)
|
|
60
|
+
@tempfile.should_receive(:flush)
|
|
61
|
+
@tempfile.should_receive(:close)
|
|
62
|
+
@tempfile.stub!(:path).and_return('/tmp/logging.properties.12345')
|
|
63
|
+
@server.stub!(:exec)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'runs Solr with logging properties file' do
|
|
67
|
+
@server.should_receive(:exec).with(%r(-Djava\.util\.logging\.config\.file=/tmp/logging\.properties\.12345))
|
|
68
|
+
@server.run
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'sets logging level' do
|
|
72
|
+
@server.run
|
|
73
|
+
@tempfile.string.should =~ /^java\.util\.logging\.FileHandler\.level *= *INFO$/
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'sets handler' do
|
|
77
|
+
@server.run
|
|
78
|
+
@tempfile.string.should =~ /^handlers *= *java.util.logging.FileHandler$/
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'sets formatter' do
|
|
82
|
+
@server.run
|
|
83
|
+
@tempfile.string.should =~ /^java\.util\.logging\.FileHandler\.formatter *= *java\.util\.logging\.SimpleFormatter$/
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'sets log file' do
|
|
87
|
+
@server.run
|
|
88
|
+
@tempfile.string.should =~ /^java\.util\.logging\.FileHandler\.pattern *= *log\/sunspot-development\.log$/
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -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,50 @@
|
|
|
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
|
+
it 'should garbage collect session instance when proxy dereferenced' do
|
|
29
|
+
ref = WeakRef.new(@proxy.session)
|
|
30
|
+
@proxy = nil
|
|
31
|
+
GC.start
|
|
32
|
+
# need to do this a second time since the reference to the session is
|
|
33
|
+
# destroyed in the finalizer during the first GC run, and thus isn't picked
|
|
34
|
+
# up by that run.
|
|
35
|
+
GC.start
|
|
36
|
+
lambda { ref.inspect }.should raise_error(WeakRef::RefError)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
(Sunspot::Session.public_instance_methods(false) - ['config', :config]).each do |method|
|
|
40
|
+
it "should delegate #{method.inspect} to its session" do
|
|
41
|
+
args = Array.new(Sunspot::Session.instance_method(method).arity.abs) do
|
|
42
|
+
stub('arg')
|
|
43
|
+
end
|
|
44
|
+
@proxy.session.should_receive(method).with(*args)
|
|
45
|
+
@proxy.send(method, *args)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it_should_behave_like 'session proxy'
|
|
50
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
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
|
+
end
|
|
89
|
+
|
|
90
|
+
context 'custom session' do
|
|
91
|
+
before :each do
|
|
92
|
+
@session = Sunspot::Session.new
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it_should_behave_like 'all sessions'
|
|
96
|
+
|
|
97
|
+
it 'should open a connection with custom host' do
|
|
98
|
+
session = Sunspot::Session.new do |config|
|
|
99
|
+
config.solr.url = 'http://127.0.0.1:8982/solr'
|
|
100
|
+
end
|
|
101
|
+
session.commit
|
|
102
|
+
connection.opts[:url].should == 'http://127.0.0.1:8982/solr'
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context 'dirty sessions' do
|
|
107
|
+
before :each do
|
|
108
|
+
@session = Sunspot::Session.new
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'should start out not dirty' do
|
|
112
|
+
@session.dirty?.should be_false
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should start out not delete_dirty' do
|
|
116
|
+
@session.delete_dirty?.should be_false
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'should be dirty after adding an item' do
|
|
120
|
+
@session.index(Post.new)
|
|
121
|
+
@session.dirty?.should be_true
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'should be not be delete_dirty after adding an item' do
|
|
125
|
+
@session.index(Post.new)
|
|
126
|
+
@session.delete_dirty?.should be_false
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'should be dirty after deleting an item' do
|
|
130
|
+
@session.remove(Post.new)
|
|
131
|
+
@session.dirty?.should be_true
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should be delete_dirty after deleting an item' do
|
|
135
|
+
@session.remove(Post.new)
|
|
136
|
+
@session.delete_dirty?.should be_true
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'should be dirty after a remove_all for a class' do
|
|
140
|
+
@session.remove_all(Post)
|
|
141
|
+
@session.dirty?.should be_true
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'should be delete_dirty after a remove_all for a class' do
|
|
145
|
+
@session.remove_all(Post)
|
|
146
|
+
@session.delete_dirty?.should be_true
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it 'should be dirty after a global remove_all' do
|
|
150
|
+
@session.remove_all
|
|
151
|
+
@session.dirty?.should be_true
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'should be delete_dirty after a global remove_all' do
|
|
155
|
+
@session.remove_all
|
|
156
|
+
@session.delete_dirty?.should be_true
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it 'should not be dirty after a commit' do
|
|
160
|
+
@session.index(Post.new)
|
|
161
|
+
@session.commit
|
|
162
|
+
@session.dirty?.should be_false
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'should not be dirty after an optimize' do
|
|
166
|
+
@session.index(Post.new)
|
|
167
|
+
@session.optimize
|
|
168
|
+
@session.dirty?.should be_false
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'should not be delete_dirty after a commit' do
|
|
172
|
+
@session.remove(Post.new)
|
|
173
|
+
@session.commit
|
|
174
|
+
@session.delete_dirty?.should be_false
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it 'should not be delete_dirty after an optimize' do
|
|
178
|
+
@session.remove(Post.new)
|
|
179
|
+
@session.optimize
|
|
180
|
+
@session.delete_dirty?.should be_false
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'should not commit when commit_if_dirty called on clean session' do
|
|
184
|
+
@session.commit_if_dirty
|
|
185
|
+
connection.should have(0).commits
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'should not commit when commit_if_delete_dirty called on clean session' do
|
|
189
|
+
@session.commit_if_delete_dirty
|
|
190
|
+
connection.should have(0).commits
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it 'should commit when commit_if_dirty called on dirty session' do
|
|
194
|
+
@session.index(Post.new)
|
|
195
|
+
@session.commit_if_dirty
|
|
196
|
+
connection.should have(1).commits
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it 'should commit when commit_if_delete_dirty called on delete_dirty session' do
|
|
200
|
+
@session.remove(Post.new)
|
|
201
|
+
@session.commit_if_delete_dirty
|
|
202
|
+
connection.should have(1).commits
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
context 'session proxy' do
|
|
207
|
+
it 'should send messages to manually assigned session proxy' do
|
|
208
|
+
stub_session = stub!('session')
|
|
209
|
+
Sunspot.session = stub_session
|
|
210
|
+
post = Post.new
|
|
211
|
+
stub_session.should_receive(:index).with(post)
|
|
212
|
+
Sunspot.index(post)
|
|
213
|
+
Sunspot.reset!
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def connection
|
|
218
|
+
@connection_factory.instance
|
|
219
|
+
end
|
|
220
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
describe Sunspot do
|
|
4
|
+
describe "reset!" do
|
|
5
|
+
it "should reset current session" do
|
|
6
|
+
old_session = Sunspot.send(:session)
|
|
7
|
+
Sunspot.reset!(true)
|
|
8
|
+
Sunspot.send(:session).should_not == old_session
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should keep keep configuration if specified" do
|
|
12
|
+
Sunspot.config.solr.url = "http://localhost:9999/path/solr"
|
|
13
|
+
config_before_reset = Sunspot.config
|
|
14
|
+
Sunspot.reset!(true)
|
|
15
|
+
Sunspot.config.should == config_before_reset
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/spec/ext.rb
ADDED