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.
Files changed (178) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +5 -0
  3. data/History.txt +252 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +13 -0
  6. data/TODO +13 -0
  7. data/lib/light_config.rb +40 -0
  8. data/lib/sunspot/adapters.rb +265 -0
  9. data/lib/sunspot/batcher.rb +62 -0
  10. data/lib/sunspot/class_set.rb +23 -0
  11. data/lib/sunspot/composite_setup.rb +202 -0
  12. data/lib/sunspot/configuration.rb +53 -0
  13. data/lib/sunspot/data_extractor.rb +50 -0
  14. data/lib/sunspot/dsl/adjustable.rb +47 -0
  15. data/lib/sunspot/dsl/field_group.rb +57 -0
  16. data/lib/sunspot/dsl/field_query.rb +327 -0
  17. data/lib/sunspot/dsl/fields.rb +103 -0
  18. data/lib/sunspot/dsl/fulltext.rb +243 -0
  19. data/lib/sunspot/dsl/function.rb +27 -0
  20. data/lib/sunspot/dsl/functional.rb +44 -0
  21. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  22. data/lib/sunspot/dsl/paginatable.rb +32 -0
  23. data/lib/sunspot/dsl/query_facet.rb +36 -0
  24. data/lib/sunspot/dsl/restriction.rb +25 -0
  25. data/lib/sunspot/dsl/restriction_with_near.rb +160 -0
  26. data/lib/sunspot/dsl/scope.rb +217 -0
  27. data/lib/sunspot/dsl/search.rb +30 -0
  28. data/lib/sunspot/dsl/standard_query.rb +123 -0
  29. data/lib/sunspot/dsl.rb +5 -0
  30. data/lib/sunspot/field.rb +193 -0
  31. data/lib/sunspot/field_factory.rb +129 -0
  32. data/lib/sunspot/indexer.rb +136 -0
  33. data/lib/sunspot/query/abstract_field_facet.rb +52 -0
  34. data/lib/sunspot/query/bbox.rb +15 -0
  35. data/lib/sunspot/query/boost_query.rb +24 -0
  36. data/lib/sunspot/query/common_query.rb +96 -0
  37. data/lib/sunspot/query/composite_fulltext.rb +36 -0
  38. data/lib/sunspot/query/connective.rb +206 -0
  39. data/lib/sunspot/query/date_field_facet.rb +14 -0
  40. data/lib/sunspot/query/dismax.rb +132 -0
  41. data/lib/sunspot/query/field_facet.rb +41 -0
  42. data/lib/sunspot/query/field_group.rb +36 -0
  43. data/lib/sunspot/query/filter.rb +38 -0
  44. data/lib/sunspot/query/function_query.rb +52 -0
  45. data/lib/sunspot/query/geo.rb +53 -0
  46. data/lib/sunspot/query/geofilt.rb +16 -0
  47. data/lib/sunspot/query/highlighting.rb +62 -0
  48. data/lib/sunspot/query/more_like_this.rb +61 -0
  49. data/lib/sunspot/query/more_like_this_query.rb +12 -0
  50. data/lib/sunspot/query/pagination.rb +42 -0
  51. data/lib/sunspot/query/query_facet.rb +16 -0
  52. data/lib/sunspot/query/restriction.rb +262 -0
  53. data/lib/sunspot/query/scope.rb +9 -0
  54. data/lib/sunspot/query/sort.rb +109 -0
  55. data/lib/sunspot/query/sort_composite.rb +34 -0
  56. data/lib/sunspot/query/standard_query.rb +16 -0
  57. data/lib/sunspot/query/text_field_boost.rb +17 -0
  58. data/lib/sunspot/query.rb +11 -0
  59. data/lib/sunspot/schema.rb +151 -0
  60. data/lib/sunspot/search/abstract_search.rb +281 -0
  61. data/lib/sunspot/search/date_facet.rb +35 -0
  62. data/lib/sunspot/search/facet_row.rb +27 -0
  63. data/lib/sunspot/search/field_facet.rb +88 -0
  64. data/lib/sunspot/search/field_group.rb +32 -0
  65. data/lib/sunspot/search/group.rb +50 -0
  66. data/lib/sunspot/search/highlight.rb +38 -0
  67. data/lib/sunspot/search/hit.rb +150 -0
  68. data/lib/sunspot/search/hit_enumerable.rb +72 -0
  69. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  70. data/lib/sunspot/search/paginated_collection.rb +57 -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/session.rb +262 -0
  75. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  76. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  77. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  78. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  79. data/lib/sunspot/session_proxy/multicore_session_proxy.rb +67 -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 +95 -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 +393 -0
  87. data/lib/sunspot/util.rb +252 -0
  88. data/lib/sunspot/version.rb +3 -0
  89. data/lib/sunspot.rb +579 -0
  90. data/log/.gitignore +1 -0
  91. data/pkg/.gitignore +1 -0
  92. data/script/console +10 -0
  93. data/spec/api/adapters_spec.rb +33 -0
  94. data/spec/api/batcher_spec.rb +112 -0
  95. data/spec/api/binding_spec.rb +50 -0
  96. data/spec/api/class_set_spec.rb +24 -0
  97. data/spec/api/hit_enumerable_spec.rb +47 -0
  98. data/spec/api/indexer/attributes_spec.rb +149 -0
  99. data/spec/api/indexer/batch_spec.rb +72 -0
  100. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  101. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  102. data/spec/api/indexer/fulltext_spec.rb +43 -0
  103. data/spec/api/indexer/removal_spec.rb +53 -0
  104. data/spec/api/indexer/spec_helper.rb +1 -0
  105. data/spec/api/indexer_spec.rb +14 -0
  106. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  107. data/spec/api/query/connectives_examples.rb +189 -0
  108. data/spec/api/query/dsl_spec.rb +18 -0
  109. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  110. data/spec/api/query/faceting_examples.rb +397 -0
  111. data/spec/api/query/fulltext_examples.rb +313 -0
  112. data/spec/api/query/function_spec.rb +79 -0
  113. data/spec/api/query/geo_examples.rb +68 -0
  114. data/spec/api/query/group_spec.rb +32 -0
  115. data/spec/api/query/highlighting_examples.rb +245 -0
  116. data/spec/api/query/more_like_this_spec.rb +140 -0
  117. data/spec/api/query/ordering_pagination_examples.rb +116 -0
  118. data/spec/api/query/scope_examples.rb +275 -0
  119. data/spec/api/query/spatial_examples.rb +27 -0
  120. data/spec/api/query/spec_helper.rb +1 -0
  121. data/spec/api/query/standard_spec.rb +29 -0
  122. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  123. data/spec/api/query/types_spec.rb +20 -0
  124. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  125. data/spec/api/search/faceting_spec.rb +360 -0
  126. data/spec/api/search/highlighting_spec.rb +69 -0
  127. data/spec/api/search/hits_spec.rb +131 -0
  128. data/spec/api/search/paginated_collection_spec.rb +36 -0
  129. data/spec/api/search/results_spec.rb +72 -0
  130. data/spec/api/search/search_spec.rb +23 -0
  131. data/spec/api/search/spec_helper.rb +1 -0
  132. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  133. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  134. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  135. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  136. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  137. data/spec/api/session_proxy/spec_helper.rb +9 -0
  138. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
  139. data/spec/api/session_spec.rb +232 -0
  140. data/spec/api/spec_helper.rb +3 -0
  141. data/spec/api/sunspot_spec.rb +29 -0
  142. data/spec/ext.rb +11 -0
  143. data/spec/helpers/indexer_helper.rb +17 -0
  144. data/spec/helpers/integration_helper.rb +8 -0
  145. data/spec/helpers/mock_session_helper.rb +13 -0
  146. data/spec/helpers/query_helper.rb +26 -0
  147. data/spec/helpers/search_helper.rb +68 -0
  148. data/spec/integration/dynamic_fields_spec.rb +57 -0
  149. data/spec/integration/faceting_spec.rb +251 -0
  150. data/spec/integration/field_grouping_spec.rb +66 -0
  151. data/spec/integration/geospatial_spec.rb +85 -0
  152. data/spec/integration/highlighting_spec.rb +44 -0
  153. data/spec/integration/indexing_spec.rb +55 -0
  154. data/spec/integration/keyword_search_spec.rb +317 -0
  155. data/spec/integration/local_search_spec.rb +64 -0
  156. data/spec/integration/more_like_this_spec.rb +43 -0
  157. data/spec/integration/scoped_search_spec.rb +354 -0
  158. data/spec/integration/stored_fields_spec.rb +12 -0
  159. data/spec/integration/test_pagination.rb +43 -0
  160. data/spec/integration/unicode_spec.rb +15 -0
  161. data/spec/mocks/adapters.rb +32 -0
  162. data/spec/mocks/blog.rb +3 -0
  163. data/spec/mocks/comment.rb +21 -0
  164. data/spec/mocks/connection.rb +126 -0
  165. data/spec/mocks/mock_adapter.rb +30 -0
  166. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  167. data/spec/mocks/mock_record.rb +52 -0
  168. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  169. data/spec/mocks/photo.rb +11 -0
  170. data/spec/mocks/post.rb +86 -0
  171. data/spec/mocks/super_class.rb +2 -0
  172. data/spec/mocks/user.rb +13 -0
  173. data/spec/spec_helper.rb +40 -0
  174. data/sunspot.gemspec +42 -0
  175. data/tasks/rdoc.rake +27 -0
  176. data/tasks/schema.rake +19 -0
  177. data/tasks/todo.rake +4 -0
  178. 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,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,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,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
@@ -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,8 @@
1
+ module IntegrationHelper
2
+ def self.included(base)
3
+ base.before(:all) do
4
+ Sunspot.config.solr.url = ENV['SOLR_URL'] || 'http://localhost:8983/solr'
5
+ Sunspot.reset!(true)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module MockSessionHelper
2
+ def config
3
+ @config ||= Sunspot::Configuration.build
4
+ end
5
+
6
+ def connection
7
+ @connection ||= Mock::Connection.new
8
+ end
9
+
10
+ def session
11
+ @session ||= Sunspot::Session.new(config, connection)
12
+ end
13
+ 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