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.
Files changed (222) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +4 -0
  3. data/History.txt +222 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +17 -0
  6. data/TODO +13 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/sunspot-installer +19 -0
  9. data/bin/sunspot-solr +74 -0
  10. data/installer/config/schema.yml +95 -0
  11. data/lib/light_config.rb +40 -0
  12. data/lib/sunspot/adapters.rb +265 -0
  13. data/lib/sunspot/composite_setup.rb +202 -0
  14. data/lib/sunspot/configuration.rb +46 -0
  15. data/lib/sunspot/data_extractor.rb +50 -0
  16. data/lib/sunspot/dsl/adjustable.rb +47 -0
  17. data/lib/sunspot/dsl/field_query.rb +279 -0
  18. data/lib/sunspot/dsl/fields.rb +103 -0
  19. data/lib/sunspot/dsl/fulltext.rb +243 -0
  20. data/lib/sunspot/dsl/function.rb +14 -0
  21. data/lib/sunspot/dsl/functional.rb +44 -0
  22. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  23. data/lib/sunspot/dsl/paginatable.rb +28 -0
  24. data/lib/sunspot/dsl/query_facet.rb +36 -0
  25. data/lib/sunspot/dsl/restriction.rb +25 -0
  26. data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
  27. data/lib/sunspot/dsl/scope.rb +217 -0
  28. data/lib/sunspot/dsl/search.rb +30 -0
  29. data/lib/sunspot/dsl/standard_query.rb +121 -0
  30. data/lib/sunspot/dsl.rb +5 -0
  31. data/lib/sunspot/field.rb +193 -0
  32. data/lib/sunspot/field_factory.rb +129 -0
  33. data/lib/sunspot/indexer.rb +131 -0
  34. data/lib/sunspot/installer/library_installer.rb +45 -0
  35. data/lib/sunspot/installer/schema_builder.rb +219 -0
  36. data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
  37. data/lib/sunspot/installer/task_helper.rb +18 -0
  38. data/lib/sunspot/installer.rb +31 -0
  39. data/lib/sunspot/query/abstract_field_facet.rb +52 -0
  40. data/lib/sunspot/query/boost_query.rb +24 -0
  41. data/lib/sunspot/query/common_query.rb +85 -0
  42. data/lib/sunspot/query/composite_fulltext.rb +36 -0
  43. data/lib/sunspot/query/connective.rb +206 -0
  44. data/lib/sunspot/query/date_field_facet.rb +14 -0
  45. data/lib/sunspot/query/dismax.rb +128 -0
  46. data/lib/sunspot/query/field_facet.rb +41 -0
  47. data/lib/sunspot/query/filter.rb +38 -0
  48. data/lib/sunspot/query/function_query.rb +52 -0
  49. data/lib/sunspot/query/geo.rb +53 -0
  50. data/lib/sunspot/query/highlighting.rb +55 -0
  51. data/lib/sunspot/query/more_like_this.rb +61 -0
  52. data/lib/sunspot/query/more_like_this_query.rb +12 -0
  53. data/lib/sunspot/query/pagination.rb +38 -0
  54. data/lib/sunspot/query/query_facet.rb +16 -0
  55. data/lib/sunspot/query/restriction.rb +262 -0
  56. data/lib/sunspot/query/scope.rb +9 -0
  57. data/lib/sunspot/query/sort.rb +95 -0
  58. data/lib/sunspot/query/sort_composite.rb +33 -0
  59. data/lib/sunspot/query/standard_query.rb +16 -0
  60. data/lib/sunspot/query/text_field_boost.rb +17 -0
  61. data/lib/sunspot/query.rb +11 -0
  62. data/lib/sunspot/schema.rb +151 -0
  63. data/lib/sunspot/search/abstract_search.rb +293 -0
  64. data/lib/sunspot/search/date_facet.rb +35 -0
  65. data/lib/sunspot/search/facet_row.rb +27 -0
  66. data/lib/sunspot/search/field_facet.rb +88 -0
  67. data/lib/sunspot/search/highlight.rb +38 -0
  68. data/lib/sunspot/search/hit.rb +136 -0
  69. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  70. data/lib/sunspot/search/paginated_collection.rb +55 -0
  71. data/lib/sunspot/search/query_facet.rb +67 -0
  72. data/lib/sunspot/search/standard_search.rb +21 -0
  73. data/lib/sunspot/search.rb +9 -0
  74. data/lib/sunspot/server.rb +152 -0
  75. data/lib/sunspot/session.rb +260 -0
  76. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  77. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  78. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  79. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  80. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
  81. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  82. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
  83. data/lib/sunspot/session_proxy.rb +87 -0
  84. data/lib/sunspot/setup.rb +350 -0
  85. data/lib/sunspot/text_field_setup.rb +29 -0
  86. data/lib/sunspot/type.rb +372 -0
  87. data/lib/sunspot/util.rb +243 -0
  88. data/lib/sunspot/version.rb +3 -0
  89. data/lib/sunspot.rb +569 -0
  90. data/lib/sunspot_rbg.rb +7 -0
  91. data/log/.gitignore +1 -0
  92. data/pkg/.gitignore +1 -0
  93. data/script/console +10 -0
  94. data/solr/README.txt +42 -0
  95. data/solr/etc/jetty.xml +218 -0
  96. data/solr/etc/webdefault.xml +379 -0
  97. data/solr/lib/jetty-6.1.3.jar +0 -0
  98. data/solr/lib/jetty-util-6.1.3.jar +0 -0
  99. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  100. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  101. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  102. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  103. data/solr/lib/servlet-api-2.5-6.1.3.jar +0 -0
  104. data/solr/logs/.gitignore +1 -0
  105. data/solr/solr/.gitignore +1 -0
  106. data/solr/solr/README.txt +54 -0
  107. data/solr/solr/conf/admin-extra.html +31 -0
  108. data/solr/solr/conf/elevate.xml +36 -0
  109. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  110. data/solr/solr/conf/protwords.txt +21 -0
  111. data/solr/solr/conf/schema.xml +238 -0
  112. data/solr/solr/conf/scripts.conf +24 -0
  113. data/solr/solr/conf/solrconfig.xml +934 -0
  114. data/solr/solr/conf/spellings.txt +2 -0
  115. data/solr/solr/conf/stopwords.txt +58 -0
  116. data/solr/solr/conf/synonyms.txt +31 -0
  117. data/solr/solr/conf/xslt/example.xsl +132 -0
  118. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  119. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  120. data/solr/solr/conf/xslt/luke.xsl +337 -0
  121. data/solr/start.jar +0 -0
  122. data/solr/webapps/solr.war +0 -0
  123. data/solr-1.3/etc/jetty.xml +212 -0
  124. data/solr-1.3/etc/webdefault.xml +379 -0
  125. data/solr-1.3/lib/jetty-6.1.3.jar +0 -0
  126. data/solr-1.3/lib/jetty-util-6.1.3.jar +0 -0
  127. data/solr-1.3/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  128. data/solr-1.3/lib/jsp-2.1/core-3.1.1.jar +0 -0
  129. data/solr-1.3/lib/jsp-2.1/jsp-2.1.jar +0 -0
  130. data/solr-1.3/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  131. data/solr-1.3/lib/servlet-api-2.5-6.1.3.jar +0 -0
  132. data/solr-1.3/solr/conf/elevate.xml +36 -0
  133. data/solr-1.3/solr/conf/protwords.txt +21 -0
  134. data/solr-1.3/solr/conf/schema.xml +64 -0
  135. data/solr-1.3/solr/conf/solrconfig.xml +725 -0
  136. data/solr-1.3/solr/conf/stopwords.txt +57 -0
  137. data/solr-1.3/solr/conf/synonyms.txt +31 -0
  138. data/solr-1.3/solr/lib/geoapi-nogenerics-2.1-M2.jar +0 -0
  139. data/solr-1.3/solr/lib/gt2-referencing-2.3.1.jar +0 -0
  140. data/solr-1.3/solr/lib/jsr108-0.01.jar +0 -0
  141. data/solr-1.3/solr/lib/locallucene.jar +0 -0
  142. data/solr-1.3/solr/lib/localsolr.jar +0 -0
  143. data/solr-1.3/start.jar +0 -0
  144. data/solr-1.3/webapps/solr.war +0 -0
  145. data/spec/api/adapters_spec.rb +33 -0
  146. data/spec/api/binding_spec.rb +50 -0
  147. data/spec/api/indexer/attributes_spec.rb +149 -0
  148. data/spec/api/indexer/batch_spec.rb +46 -0
  149. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  150. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  151. data/spec/api/indexer/fulltext_spec.rb +43 -0
  152. data/spec/api/indexer/removal_spec.rb +53 -0
  153. data/spec/api/indexer/spec_helper.rb +1 -0
  154. data/spec/api/indexer_spec.rb +14 -0
  155. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  156. data/spec/api/query/connectives_examples.rb +189 -0
  157. data/spec/api/query/dsl_spec.rb +18 -0
  158. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  159. data/spec/api/query/faceting_examples.rb +397 -0
  160. data/spec/api/query/fulltext_examples.rb +313 -0
  161. data/spec/api/query/function_spec.rb +70 -0
  162. data/spec/api/query/geo_examples.rb +68 -0
  163. data/spec/api/query/highlighting_examples.rb +223 -0
  164. data/spec/api/query/more_like_this_spec.rb +140 -0
  165. data/spec/api/query/ordering_pagination_examples.rb +95 -0
  166. data/spec/api/query/scope_examples.rb +275 -0
  167. data/spec/api/query/spec_helper.rb +1 -0
  168. data/spec/api/query/standard_spec.rb +28 -0
  169. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  170. data/spec/api/query/types_spec.rb +20 -0
  171. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  172. data/spec/api/search/faceting_spec.rb +360 -0
  173. data/spec/api/search/highlighting_spec.rb +69 -0
  174. data/spec/api/search/hits_spec.rb +120 -0
  175. data/spec/api/search/paginated_collection_spec.rb +26 -0
  176. data/spec/api/search/results_spec.rb +66 -0
  177. data/spec/api/search/search_spec.rb +23 -0
  178. data/spec/api/search/spec_helper.rb +1 -0
  179. data/spec/api/server_spec.rb +91 -0
  180. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  181. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  182. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  183. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  184. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  185. data/spec/api/session_proxy/spec_helper.rb +9 -0
  186. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +50 -0
  187. data/spec/api/session_spec.rb +220 -0
  188. data/spec/api/spec_helper.rb +3 -0
  189. data/spec/api/sunspot_spec.rb +18 -0
  190. data/spec/ext.rb +11 -0
  191. data/spec/helpers/indexer_helper.rb +29 -0
  192. data/spec/helpers/query_helper.rb +38 -0
  193. data/spec/helpers/search_helper.rb +80 -0
  194. data/spec/integration/dynamic_fields_spec.rb +55 -0
  195. data/spec/integration/faceting_spec.rb +238 -0
  196. data/spec/integration/highlighting_spec.rb +22 -0
  197. data/spec/integration/indexing_spec.rb +33 -0
  198. data/spec/integration/keyword_search_spec.rb +317 -0
  199. data/spec/integration/local_search_spec.rb +64 -0
  200. data/spec/integration/more_like_this_spec.rb +43 -0
  201. data/spec/integration/scoped_search_spec.rb +354 -0
  202. data/spec/integration/spec_helper.rb +7 -0
  203. data/spec/integration/stored_fields_spec.rb +10 -0
  204. data/spec/integration/test_pagination.rb +32 -0
  205. data/spec/mocks/adapters.rb +32 -0
  206. data/spec/mocks/blog.rb +3 -0
  207. data/spec/mocks/comment.rb +21 -0
  208. data/spec/mocks/connection.rb +126 -0
  209. data/spec/mocks/mock_adapter.rb +30 -0
  210. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  211. data/spec/mocks/mock_record.rb +52 -0
  212. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  213. data/spec/mocks/photo.rb +11 -0
  214. data/spec/mocks/post.rb +85 -0
  215. data/spec/mocks/super_class.rb +2 -0
  216. data/spec/mocks/user.rb +13 -0
  217. data/spec/spec_helper.rb +30 -0
  218. data/sunspot.gemspec +40 -0
  219. data/tasks/rdoc.rake +27 -0
  220. data/tasks/schema.rake +19 -0
  221. data/tasks/todo.rake +4 -0
  222. 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,3 @@
1
+ require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '..'))
2
+
3
+ Dir.glob(File.join(File.dirname(__FILE__), '**', '*_examples.rb')).each { |shared| require(shared) }
@@ -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
@@ -0,0 +1,11 @@
1
+ module Solr
2
+ class Document
3
+ def field_by_name(field_name)
4
+ @fields.find { |field| field.name.to_s == field_name.to_s }
5
+ end
6
+
7
+ def fields_by_name(field_name)
8
+ @fields.select { |field| field.name.to_s == field_name.to_s }
9
+ end
10
+ end
11
+ end