pduey-sunspot 1.2.1.1

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 (166) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +5 -0
  3. data/History.txt +225 -0
  4. data/LICENSE +18 -0
  5. data/Rakefile +15 -0
  6. data/TODO +13 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/sunspot-installer +19 -0
  9. data/installer/config/schema.yml +95 -0
  10. data/lib/light_config.rb +40 -0
  11. data/lib/sunspot.rb +568 -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.rb +5 -0
  17. data/lib/sunspot/dsl/adjustable.rb +47 -0
  18. data/lib/sunspot/dsl/field_query.rb +279 -0
  19. data/lib/sunspot/dsl/fields.rb +103 -0
  20. data/lib/sunspot/dsl/fulltext.rb +243 -0
  21. data/lib/sunspot/dsl/function.rb +14 -0
  22. data/lib/sunspot/dsl/functional.rb +44 -0
  23. data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
  24. data/lib/sunspot/dsl/paginatable.rb +28 -0
  25. data/lib/sunspot/dsl/query_facet.rb +36 -0
  26. data/lib/sunspot/dsl/restriction.rb +25 -0
  27. data/lib/sunspot/dsl/restriction_with_near.rb +121 -0
  28. data/lib/sunspot/dsl/scope.rb +217 -0
  29. data/lib/sunspot/dsl/search.rb +30 -0
  30. data/lib/sunspot/dsl/standard_query.rb +121 -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.rb +31 -0
  35. data/lib/sunspot/installer/library_installer.rb +45 -0
  36. data/lib/sunspot/installer/schema_builder.rb +219 -0
  37. data/lib/sunspot/installer/solrconfig_updater.rb +76 -0
  38. data/lib/sunspot/installer/task_helper.rb +18 -0
  39. data/lib/sunspot/java.rb +8 -0
  40. data/lib/sunspot/query.rb +11 -0
  41. data/lib/sunspot/query/abstract_field_facet.rb +52 -0
  42. data/lib/sunspot/query/boost_query.rb +24 -0
  43. data/lib/sunspot/query/common_query.rb +85 -0
  44. data/lib/sunspot/query/composite_fulltext.rb +36 -0
  45. data/lib/sunspot/query/connective.rb +206 -0
  46. data/lib/sunspot/query/date_field_facet.rb +14 -0
  47. data/lib/sunspot/query/dismax.rb +128 -0
  48. data/lib/sunspot/query/field_facet.rb +41 -0
  49. data/lib/sunspot/query/filter.rb +38 -0
  50. data/lib/sunspot/query/function_query.rb +52 -0
  51. data/lib/sunspot/query/geo.rb +53 -0
  52. data/lib/sunspot/query/highlighting.rb +55 -0
  53. data/lib/sunspot/query/more_like_this.rb +61 -0
  54. data/lib/sunspot/query/more_like_this_query.rb +12 -0
  55. data/lib/sunspot/query/pagination.rb +38 -0
  56. data/lib/sunspot/query/query_facet.rb +16 -0
  57. data/lib/sunspot/query/restriction.rb +262 -0
  58. data/lib/sunspot/query/scope.rb +9 -0
  59. data/lib/sunspot/query/sort.rb +95 -0
  60. data/lib/sunspot/query/sort_composite.rb +33 -0
  61. data/lib/sunspot/query/standard_query.rb +16 -0
  62. data/lib/sunspot/query/text_field_boost.rb +17 -0
  63. data/lib/sunspot/schema.rb +151 -0
  64. data/lib/sunspot/search.rb +9 -0
  65. data/lib/sunspot/search/abstract_search.rb +335 -0
  66. data/lib/sunspot/search/date_facet.rb +35 -0
  67. data/lib/sunspot/search/facet_row.rb +27 -0
  68. data/lib/sunspot/search/field_facet.rb +88 -0
  69. data/lib/sunspot/search/highlight.rb +38 -0
  70. data/lib/sunspot/search/hit.rb +150 -0
  71. data/lib/sunspot/search/more_like_this_search.rb +31 -0
  72. data/lib/sunspot/search/paginated_collection.rb +55 -0
  73. data/lib/sunspot/search/query_facet.rb +67 -0
  74. data/lib/sunspot/search/standard_search.rb +21 -0
  75. data/lib/sunspot/session.rb +260 -0
  76. data/lib/sunspot/session_proxy.rb +87 -0
  77. data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
  78. data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
  79. data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
  80. data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
  81. data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
  82. data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
  83. data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -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/pduey-sunspot.gemspec +38 -0
  90. data/script/console +10 -0
  91. data/spec/api/adapters_spec.rb +33 -0
  92. data/spec/api/binding_spec.rb +50 -0
  93. data/spec/api/indexer/attributes_spec.rb +149 -0
  94. data/spec/api/indexer/batch_spec.rb +46 -0
  95. data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
  96. data/spec/api/indexer/fixed_fields_spec.rb +57 -0
  97. data/spec/api/indexer/fulltext_spec.rb +43 -0
  98. data/spec/api/indexer/removal_spec.rb +53 -0
  99. data/spec/api/indexer/spec_helper.rb +1 -0
  100. data/spec/api/indexer_spec.rb +14 -0
  101. data/spec/api/query/advanced_manipulation_examples.rb +35 -0
  102. data/spec/api/query/connectives_examples.rb +189 -0
  103. data/spec/api/query/dsl_spec.rb +18 -0
  104. data/spec/api/query/dynamic_fields_examples.rb +165 -0
  105. data/spec/api/query/faceting_examples.rb +397 -0
  106. data/spec/api/query/fulltext_examples.rb +313 -0
  107. data/spec/api/query/function_spec.rb +70 -0
  108. data/spec/api/query/geo_examples.rb +68 -0
  109. data/spec/api/query/highlighting_examples.rb +223 -0
  110. data/spec/api/query/more_like_this_spec.rb +140 -0
  111. data/spec/api/query/ordering_pagination_examples.rb +95 -0
  112. data/spec/api/query/scope_examples.rb +275 -0
  113. data/spec/api/query/spec_helper.rb +1 -0
  114. data/spec/api/query/standard_spec.rb +28 -0
  115. data/spec/api/query/text_field_scoping_examples.rb +30 -0
  116. data/spec/api/query/types_spec.rb +20 -0
  117. data/spec/api/search/dynamic_fields_spec.rb +33 -0
  118. data/spec/api/search/faceting_spec.rb +360 -0
  119. data/spec/api/search/highlighting_spec.rb +69 -0
  120. data/spec/api/search/hits_spec.rb +131 -0
  121. data/spec/api/search/paginated_collection_spec.rb +26 -0
  122. data/spec/api/search/results_spec.rb +66 -0
  123. data/spec/api/search/search_spec.rb +23 -0
  124. data/spec/api/search/spec_helper.rb +1 -0
  125. data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
  126. data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
  127. data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
  128. data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
  129. data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
  130. data/spec/api/session_proxy/spec_helper.rb +9 -0
  131. data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
  132. data/spec/api/session_spec.rb +220 -0
  133. data/spec/api/spec_helper.rb +3 -0
  134. data/spec/api/sunspot_spec.rb +18 -0
  135. data/spec/ext.rb +11 -0
  136. data/spec/helpers/indexer_helper.rb +29 -0
  137. data/spec/helpers/query_helper.rb +38 -0
  138. data/spec/helpers/search_helper.rb +80 -0
  139. data/spec/integration/dynamic_fields_spec.rb +57 -0
  140. data/spec/integration/faceting_spec.rb +238 -0
  141. data/spec/integration/highlighting_spec.rb +24 -0
  142. data/spec/integration/indexing_spec.rb +33 -0
  143. data/spec/integration/keyword_search_spec.rb +317 -0
  144. data/spec/integration/local_search_spec.rb +64 -0
  145. data/spec/integration/more_like_this_spec.rb +43 -0
  146. data/spec/integration/scoped_search_spec.rb +354 -0
  147. data/spec/integration/spec_helper.rb +7 -0
  148. data/spec/integration/stored_fields_spec.rb +12 -0
  149. data/spec/integration/test_pagination.rb +32 -0
  150. data/spec/mocks/adapters.rb +32 -0
  151. data/spec/mocks/blog.rb +3 -0
  152. data/spec/mocks/comment.rb +21 -0
  153. data/spec/mocks/connection.rb +126 -0
  154. data/spec/mocks/mock_adapter.rb +30 -0
  155. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  156. data/spec/mocks/mock_record.rb +52 -0
  157. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  158. data/spec/mocks/photo.rb +11 -0
  159. data/spec/mocks/post.rb +85 -0
  160. data/spec/mocks/super_class.rb +2 -0
  161. data/spec/mocks/user.rb +13 -0
  162. data/spec/spec_helper.rb +28 -0
  163. data/tasks/rdoc.rake +27 -0
  164. data/tasks/schema.rake +19 -0
  165. data/tasks/todo.rake +4 -0
  166. metadata +369 -0
@@ -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,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
@@ -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,29 @@
1
+ module IndexerHelper
2
+ def config
3
+ 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
+
14
+ def post(attrs = {})
15
+ @post ||= Post.new(attrs)
16
+ end
17
+
18
+ def last_add
19
+ @connection.adds.last
20
+ end
21
+
22
+ def value_in_last_document_for(field_name)
23
+ @connection.adds.last.last.field_by_name(field_name).value
24
+ end
25
+
26
+ def values_in_last_document_for(field_name)
27
+ @connection.adds.last.last.fields_by_name(field_name).map { |field| field.value }
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ module QueryHelper
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
+
14
+ def get_filter_tag(boolean_query)
15
+ connection.searches.last[:fq].each do |fq|
16
+ if match = fq.match(/^\{!tag=(.+)\}#{Regexp.escape(boolean_query)}$/)
17
+ return match[1]
18
+ end
19
+ end
20
+ nil
21
+ end
22
+
23
+ def subqueries(param)
24
+ q = connection.searches.last[:q]
25
+ subqueries = []
26
+ subqueries = q.scan(%r(_query_:"\{!dismax (.*?)\}(.*?)"))
27
+ subqueries.map do |subquery|
28
+ params = {}
29
+ subquery[0].scan(%r((\S+?)='(.+?)')) do |key, value|
30
+ params[key.to_sym] = value
31
+ end
32
+ unless subquery[1].empty?
33
+ params[:v] = subquery[1]
34
+ end
35
+ params
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,80 @@
1
+ module SearchHelper
2
+ def stub_nil_results
3
+ connection.response = { 'response' => nil }
4
+ end
5
+
6
+ def stub_full_results(*results)
7
+ count =
8
+ if results.last.is_a?(Integer) then results.pop
9
+ else results.length
10
+ end
11
+ docs = results.map do |result|
12
+ instance = result.delete('instance')
13
+ result.merge('id' => "#{instance.class.name} #{instance.id}")
14
+ end
15
+ response = {
16
+ 'response' => {
17
+ 'docs' => docs,
18
+ 'numFound' => count
19
+ }
20
+ }
21
+ connection.response = response
22
+ response
23
+ end
24
+
25
+ def stub_results(*results)
26
+ stub_full_results(
27
+ *results.map do |result|
28
+ if result.is_a?(Integer)
29
+ result
30
+ else
31
+ { 'instance' => result }
32
+ end
33
+ end
34
+ )
35
+ end
36
+
37
+ def stub_facet(name, values)
38
+ connection.response = {
39
+ 'facet_counts' => {
40
+ 'facet_fields' => {
41
+ name.to_s => values.to_a.sort_by { |value, count| -count }.flatten
42
+ }
43
+ }
44
+ }
45
+ end
46
+
47
+ def stub_date_facet(name, gap, values)
48
+ connection.response = {
49
+ 'facet_counts' => {
50
+ 'facet_dates' => {
51
+ name.to_s => { 'gap' => "+#{gap}SECONDS" }.merge(values)
52
+ }
53
+ }
54
+ }
55
+ end
56
+
57
+ def stub_query_facet(values)
58
+ connection.response = { 'facet_counts' => { 'facet_queries' => values } }
59
+ end
60
+
61
+ def facet_values(result, field_name)
62
+ result.facet(field_name).rows.map { |row| row.value }
63
+ end
64
+
65
+ def facet_counts(result, field_name)
66
+ result.facet(field_name).rows.map { |row| row.count }
67
+ end
68
+
69
+ def config
70
+ @config ||= Sunspot::Configuration.build
71
+ end
72
+
73
+ def connection
74
+ @connection ||= Mock::Connection.new
75
+ end
76
+
77
+ def session
78
+ @session ||= Sunspot::Session.new(config, connection)
79
+ end
80
+ end