gojee-sunspot 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +12 -0
- data/Gemfile +5 -0
- data/History.txt +252 -0
- data/LICENSE +18 -0
- data/Rakefile +13 -0
- data/TODO +13 -0
- data/lib/light_config.rb +40 -0
- data/lib/sunspot/adapters.rb +265 -0
- data/lib/sunspot/batcher.rb +62 -0
- data/lib/sunspot/class_set.rb +23 -0
- data/lib/sunspot/composite_setup.rb +202 -0
- data/lib/sunspot/configuration.rb +53 -0
- data/lib/sunspot/data_extractor.rb +50 -0
- data/lib/sunspot/dsl/adjustable.rb +47 -0
- data/lib/sunspot/dsl/field_group.rb +57 -0
- data/lib/sunspot/dsl/field_query.rb +327 -0
- data/lib/sunspot/dsl/fields.rb +103 -0
- data/lib/sunspot/dsl/fulltext.rb +243 -0
- data/lib/sunspot/dsl/function.rb +27 -0
- data/lib/sunspot/dsl/functional.rb +44 -0
- data/lib/sunspot/dsl/more_like_this_query.rb +56 -0
- data/lib/sunspot/dsl/paginatable.rb +32 -0
- data/lib/sunspot/dsl/query_facet.rb +36 -0
- data/lib/sunspot/dsl/restriction.rb +25 -0
- data/lib/sunspot/dsl/restriction_with_near.rb +160 -0
- data/lib/sunspot/dsl/scope.rb +217 -0
- data/lib/sunspot/dsl/search.rb +30 -0
- data/lib/sunspot/dsl/standard_query.rb +123 -0
- data/lib/sunspot/dsl.rb +5 -0
- data/lib/sunspot/field.rb +193 -0
- data/lib/sunspot/field_factory.rb +129 -0
- data/lib/sunspot/indexer.rb +136 -0
- data/lib/sunspot/query/abstract_field_facet.rb +52 -0
- data/lib/sunspot/query/bbox.rb +15 -0
- data/lib/sunspot/query/boost_query.rb +24 -0
- data/lib/sunspot/query/common_query.rb +96 -0
- data/lib/sunspot/query/composite_fulltext.rb +36 -0
- data/lib/sunspot/query/connective.rb +206 -0
- data/lib/sunspot/query/date_field_facet.rb +14 -0
- data/lib/sunspot/query/dismax.rb +132 -0
- data/lib/sunspot/query/field_facet.rb +41 -0
- data/lib/sunspot/query/field_group.rb +36 -0
- data/lib/sunspot/query/filter.rb +38 -0
- data/lib/sunspot/query/function_query.rb +52 -0
- data/lib/sunspot/query/geo.rb +53 -0
- data/lib/sunspot/query/geofilt.rb +16 -0
- data/lib/sunspot/query/highlighting.rb +62 -0
- data/lib/sunspot/query/more_like_this.rb +61 -0
- data/lib/sunspot/query/more_like_this_query.rb +12 -0
- data/lib/sunspot/query/pagination.rb +42 -0
- data/lib/sunspot/query/query_facet.rb +16 -0
- data/lib/sunspot/query/restriction.rb +262 -0
- data/lib/sunspot/query/scope.rb +9 -0
- data/lib/sunspot/query/sort.rb +109 -0
- data/lib/sunspot/query/sort_composite.rb +34 -0
- data/lib/sunspot/query/standard_query.rb +16 -0
- data/lib/sunspot/query/text_field_boost.rb +17 -0
- data/lib/sunspot/query.rb +11 -0
- data/lib/sunspot/schema.rb +151 -0
- data/lib/sunspot/search/abstract_search.rb +281 -0
- data/lib/sunspot/search/date_facet.rb +35 -0
- data/lib/sunspot/search/facet_row.rb +27 -0
- data/lib/sunspot/search/field_facet.rb +88 -0
- data/lib/sunspot/search/field_group.rb +32 -0
- data/lib/sunspot/search/group.rb +50 -0
- data/lib/sunspot/search/highlight.rb +38 -0
- data/lib/sunspot/search/hit.rb +150 -0
- data/lib/sunspot/search/hit_enumerable.rb +72 -0
- data/lib/sunspot/search/more_like_this_search.rb +31 -0
- data/lib/sunspot/search/paginated_collection.rb +57 -0
- data/lib/sunspot/search/query_facet.rb +67 -0
- data/lib/sunspot/search/standard_search.rb +21 -0
- data/lib/sunspot/search.rb +9 -0
- data/lib/sunspot/session.rb +262 -0
- data/lib/sunspot/session_proxy/abstract_session_proxy.rb +29 -0
- data/lib/sunspot/session_proxy/class_sharding_session_proxy.rb +66 -0
- data/lib/sunspot/session_proxy/id_sharding_session_proxy.rb +89 -0
- data/lib/sunspot/session_proxy/master_slave_session_proxy.rb +43 -0
- data/lib/sunspot/session_proxy/multicore_session_proxy.rb +67 -0
- data/lib/sunspot/session_proxy/sharding_session_proxy.rb +222 -0
- data/lib/sunspot/session_proxy/silent_fail_session_proxy.rb +42 -0
- data/lib/sunspot/session_proxy/thread_local_session_proxy.rb +37 -0
- data/lib/sunspot/session_proxy.rb +95 -0
- data/lib/sunspot/setup.rb +350 -0
- data/lib/sunspot/text_field_setup.rb +29 -0
- data/lib/sunspot/type.rb +393 -0
- data/lib/sunspot/util.rb +252 -0
- data/lib/sunspot/version.rb +3 -0
- data/lib/sunspot.rb +579 -0
- data/log/.gitignore +1 -0
- data/pkg/.gitignore +1 -0
- data/script/console +10 -0
- data/spec/api/adapters_spec.rb +33 -0
- data/spec/api/batcher_spec.rb +112 -0
- data/spec/api/binding_spec.rb +50 -0
- data/spec/api/class_set_spec.rb +24 -0
- data/spec/api/hit_enumerable_spec.rb +47 -0
- data/spec/api/indexer/attributes_spec.rb +149 -0
- data/spec/api/indexer/batch_spec.rb +72 -0
- data/spec/api/indexer/dynamic_fields_spec.rb +42 -0
- data/spec/api/indexer/fixed_fields_spec.rb +57 -0
- data/spec/api/indexer/fulltext_spec.rb +43 -0
- data/spec/api/indexer/removal_spec.rb +53 -0
- data/spec/api/indexer/spec_helper.rb +1 -0
- data/spec/api/indexer_spec.rb +14 -0
- data/spec/api/query/advanced_manipulation_examples.rb +35 -0
- data/spec/api/query/connectives_examples.rb +189 -0
- data/spec/api/query/dsl_spec.rb +18 -0
- data/spec/api/query/dynamic_fields_examples.rb +165 -0
- data/spec/api/query/faceting_examples.rb +397 -0
- data/spec/api/query/fulltext_examples.rb +313 -0
- data/spec/api/query/function_spec.rb +79 -0
- data/spec/api/query/geo_examples.rb +68 -0
- data/spec/api/query/group_spec.rb +32 -0
- data/spec/api/query/highlighting_examples.rb +245 -0
- data/spec/api/query/more_like_this_spec.rb +140 -0
- data/spec/api/query/ordering_pagination_examples.rb +116 -0
- data/spec/api/query/scope_examples.rb +275 -0
- data/spec/api/query/spatial_examples.rb +27 -0
- data/spec/api/query/spec_helper.rb +1 -0
- data/spec/api/query/standard_spec.rb +29 -0
- data/spec/api/query/text_field_scoping_examples.rb +30 -0
- data/spec/api/query/types_spec.rb +20 -0
- data/spec/api/search/dynamic_fields_spec.rb +33 -0
- data/spec/api/search/faceting_spec.rb +360 -0
- data/spec/api/search/highlighting_spec.rb +69 -0
- data/spec/api/search/hits_spec.rb +131 -0
- data/spec/api/search/paginated_collection_spec.rb +36 -0
- data/spec/api/search/results_spec.rb +72 -0
- data/spec/api/search/search_spec.rb +23 -0
- data/spec/api/search/spec_helper.rb +1 -0
- data/spec/api/session_proxy/class_sharding_session_proxy_spec.rb +85 -0
- data/spec/api/session_proxy/id_sharding_session_proxy_spec.rb +30 -0
- data/spec/api/session_proxy/master_slave_session_proxy_spec.rb +41 -0
- data/spec/api/session_proxy/sharding_session_proxy_spec.rb +77 -0
- data/spec/api/session_proxy/silent_fail_session_proxy_spec.rb +24 -0
- data/spec/api/session_proxy/spec_helper.rb +9 -0
- data/spec/api/session_proxy/thread_local_session_proxy_spec.rb +39 -0
- data/spec/api/session_spec.rb +232 -0
- data/spec/api/spec_helper.rb +3 -0
- data/spec/api/sunspot_spec.rb +29 -0
- data/spec/ext.rb +11 -0
- data/spec/helpers/indexer_helper.rb +17 -0
- data/spec/helpers/integration_helper.rb +8 -0
- data/spec/helpers/mock_session_helper.rb +13 -0
- data/spec/helpers/query_helper.rb +26 -0
- data/spec/helpers/search_helper.rb +68 -0
- data/spec/integration/dynamic_fields_spec.rb +57 -0
- data/spec/integration/faceting_spec.rb +251 -0
- data/spec/integration/field_grouping_spec.rb +66 -0
- data/spec/integration/geospatial_spec.rb +85 -0
- data/spec/integration/highlighting_spec.rb +44 -0
- data/spec/integration/indexing_spec.rb +55 -0
- data/spec/integration/keyword_search_spec.rb +317 -0
- data/spec/integration/local_search_spec.rb +64 -0
- data/spec/integration/more_like_this_spec.rb +43 -0
- data/spec/integration/scoped_search_spec.rb +354 -0
- data/spec/integration/stored_fields_spec.rb +12 -0
- data/spec/integration/test_pagination.rb +43 -0
- data/spec/integration/unicode_spec.rb +15 -0
- data/spec/mocks/adapters.rb +32 -0
- data/spec/mocks/blog.rb +3 -0
- data/spec/mocks/comment.rb +21 -0
- data/spec/mocks/connection.rb +126 -0
- data/spec/mocks/mock_adapter.rb +30 -0
- data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
- data/spec/mocks/mock_record.rb +52 -0
- data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
- data/spec/mocks/photo.rb +11 -0
- data/spec/mocks/post.rb +86 -0
- data/spec/mocks/super_class.rb +2 -0
- data/spec/mocks/user.rb +13 -0
- data/spec/spec_helper.rb +40 -0
- data/sunspot.gemspec +42 -0
- data/tasks/rdoc.rake +27 -0
- data/tasks/schema.rake +19 -0
- data/tasks/todo.rake +4 -0
- metadata +261 -3
@@ -0,0 +1,275 @@
|
|
1
|
+
shared_examples_for "scoped query" do
|
2
|
+
it 'scopes by exact match with a string' do
|
3
|
+
search do
|
4
|
+
with :title, 'My Pet Post'
|
5
|
+
end
|
6
|
+
connection.should have_last_search_including(:fq, 'title_ss:My\ Pet\ Post')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'scopes by exact match with a special string' do
|
10
|
+
search do
|
11
|
+
with :title, 'OR'
|
12
|
+
end
|
13
|
+
connection.should have_last_search_including(:fq, 'title_ss:"OR"')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'scopes by exact match with time' do
|
17
|
+
time = Time.parse('1983-07-08 05:00:00 -0400')
|
18
|
+
search do
|
19
|
+
with :published_at, time
|
20
|
+
end
|
21
|
+
connection.should have_last_search_including(
|
22
|
+
:fq,
|
23
|
+
'published_at_dt:1983\-07\-08T09\:00\:00Z'
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'scopes by exact match with date' do
|
28
|
+
date = Date.new(1983, 7, 8)
|
29
|
+
search do
|
30
|
+
with :expire_date, date
|
31
|
+
end
|
32
|
+
connection.should have_last_search_including(
|
33
|
+
:fq,
|
34
|
+
'expire_date_d:1983\-07\-08T00\:00\:00Z'
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'scopes by exact match with boolean' do
|
39
|
+
search do
|
40
|
+
with :featured, false
|
41
|
+
end
|
42
|
+
connection.should have_last_search_including(:fq, 'featured_bs:false')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'scopes by less than match with float' do
|
46
|
+
search do
|
47
|
+
with(:average_rating).less_than 3.0
|
48
|
+
end
|
49
|
+
connection.should have_last_search_including(:fq, 'average_rating_ft:[* TO 3\.0]')
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should quote string with space in a less than match' do
|
53
|
+
search do
|
54
|
+
with(:title).less_than('test value')
|
55
|
+
end
|
56
|
+
connection.should have_last_search_including(:fq, 'title_ss:[* TO "test\ value"]')
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'scopes by greater than match with float' do
|
60
|
+
search do
|
61
|
+
with(:average_rating).greater_than 3.0
|
62
|
+
end
|
63
|
+
connection.should have_last_search_including(:fq, 'average_rating_ft:[3\.0 TO *]')
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'scopes by short-form between match with integers' do
|
67
|
+
search do
|
68
|
+
with :blog_id, 2..4
|
69
|
+
end
|
70
|
+
connection.should have_last_search_including(:fq, 'blog_id_i:[2 TO 4]')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'scopes by between match with float' do
|
74
|
+
search do
|
75
|
+
with(:average_rating).between 2.0..4.0
|
76
|
+
end
|
77
|
+
connection.should have_last_search_including(:fq, 'average_rating_ft:[2\.0 TO 4\.0]')
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'scopes by any match with integer' do
|
81
|
+
search do
|
82
|
+
with(:category_ids).any_of [2, 7, 12]
|
83
|
+
end
|
84
|
+
connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'scopes by short-form any-of match with integers' do
|
88
|
+
search do
|
89
|
+
with :category_ids, [2, 7, 12]
|
90
|
+
end
|
91
|
+
connection.should have_last_search_including(:fq, 'category_ids_im:(2 OR 7 OR 12)')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'scopes by all match with integer' do
|
95
|
+
search do
|
96
|
+
with(:category_ids).all_of [2, 7, 12]
|
97
|
+
end
|
98
|
+
connection.should have_last_search_including(:fq, 'category_ids_im:(2 AND 7 AND 12)')
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'scopes by prefix match with string' do
|
102
|
+
search do
|
103
|
+
with(:title).starting_with('tes')
|
104
|
+
end
|
105
|
+
connection.should have_last_search_including(:fq, 'title_ss:tes*')
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'scopes by not equal match with string' do
|
109
|
+
search do
|
110
|
+
without :title, 'Bad Post'
|
111
|
+
end
|
112
|
+
connection.should have_last_search_including(:fq, '-title_ss:Bad\ Post')
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'scopes by not less than match with float' do
|
116
|
+
search do
|
117
|
+
without(:average_rating).less_than 3.0
|
118
|
+
end
|
119
|
+
connection.should have_last_search_including(:fq, '-average_rating_ft:[* TO 3\.0]')
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'scopes by not greater than match with float' do
|
123
|
+
search do
|
124
|
+
without(:average_rating).greater_than 3.0
|
125
|
+
end
|
126
|
+
connection.should have_last_search_including(:fq, '-average_rating_ft:[3\.0 TO *]')
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'scopes by not between match with shorthand' do
|
130
|
+
search do
|
131
|
+
without(:blog_id, 2..4)
|
132
|
+
end
|
133
|
+
connection.should have_last_search_including(:fq, '-blog_id_i:[2 TO 4]')
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'scopes by not between match with float' do
|
137
|
+
search do
|
138
|
+
without(:average_rating).between 2.0..4.0
|
139
|
+
end
|
140
|
+
connection.should have_last_search_including(:fq, '-average_rating_ft:[2\.0 TO 4\.0]')
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'scopes by not any match with integer' do
|
144
|
+
search do
|
145
|
+
without(:category_ids).any_of [2, 7, 12]
|
146
|
+
end
|
147
|
+
connection.should have_last_search_including(:fq, '-category_ids_im:(2 OR 7 OR 12)')
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'scopes by not all match with integer' do
|
151
|
+
search do
|
152
|
+
without(:category_ids).all_of [2, 7, 12]
|
153
|
+
end
|
154
|
+
connection.should have_last_search_including(:fq, '-category_ids_im:(2 AND 7 AND 12)')
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'scopes by empty field' do
|
158
|
+
search do
|
159
|
+
with :average_rating, nil
|
160
|
+
end
|
161
|
+
connection.should have_last_search_including(:fq, '-average_rating_ft:[* TO *]')
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'scopes by non-empty field' do
|
165
|
+
search do
|
166
|
+
without :average_rating, nil
|
167
|
+
end
|
168
|
+
connection.should have_last_search_including(:fq, 'average_rating_ft:[* TO *]')
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'includes by object identity' do
|
172
|
+
post = Post.new
|
173
|
+
search do
|
174
|
+
with post
|
175
|
+
end
|
176
|
+
connection.should have_last_search_including(:fq, "id:(Post\\ #{post.id})")
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'includes multiple objects passed as varargs by object identity' do
|
180
|
+
post1, post2 = Post.new, Post.new
|
181
|
+
search do
|
182
|
+
with post1, post2
|
183
|
+
end
|
184
|
+
connection.should have_last_search_including(
|
185
|
+
:fq, "id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
|
186
|
+
)
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'includes multiple objects passed as array by object identity' do
|
190
|
+
posts = [Post.new, Post.new]
|
191
|
+
search do
|
192
|
+
with posts
|
193
|
+
end
|
194
|
+
connection.should have_last_search_including(
|
195
|
+
:fq, "id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
|
196
|
+
)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'excludes by object identity' do
|
200
|
+
post = Post.new
|
201
|
+
search do
|
202
|
+
without post
|
203
|
+
end
|
204
|
+
connection.should have_last_search_including(:fq, "-id:(Post\\ #{post.id})")
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'excludes multiple objects passed as varargs by object identity' do
|
208
|
+
post1, post2 = Post.new, Post.new
|
209
|
+
search do
|
210
|
+
without post1, post2
|
211
|
+
end
|
212
|
+
connection.should have_last_search_including(
|
213
|
+
:fq,
|
214
|
+
"-id:(Post\\ #{post1.id} OR Post\\ #{post2.id})"
|
215
|
+
)
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'excludes multiple objects passed as array by object identity' do
|
219
|
+
posts = [Post.new, Post.new]
|
220
|
+
search do
|
221
|
+
without posts
|
222
|
+
end
|
223
|
+
connection.should have_last_search_including(
|
224
|
+
:fq,
|
225
|
+
"-id:(Post\\ #{posts.first.id} OR Post\\ #{posts.last.id})"
|
226
|
+
)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'allows scoping on fields common to all types' do
|
230
|
+
time = Time.parse('1983-07-08 05:00:00 -0400')
|
231
|
+
search Post, Namespaced::Comment do
|
232
|
+
with :published_at, time
|
233
|
+
end
|
234
|
+
connection.should have_last_search_including(:fq, 'published_at_dt:1983\-07\-08T09\:00\:00Z')
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'allows scoping on field not common to all types' do
|
238
|
+
search Post, Namespaced::Comment do
|
239
|
+
with :blog_id, 1
|
240
|
+
end
|
241
|
+
connection.should have_last_search_including(:fq, 'blog_id_i:1')
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'raises Sunspot::UnrecognizedFieldError if search scoped to field configured differently between types' do
|
245
|
+
lambda do
|
246
|
+
search Post, Namespaced::Comment do
|
247
|
+
with :average_rating, 2.2 # this is a float in Post but an integer in Comment
|
248
|
+
end
|
249
|
+
end.should raise_error(Sunspot::UnrecognizedFieldError)
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'raises Sunspot::UnrecognizedFieldError for nonexistant fields in block scope' do
|
253
|
+
lambda do
|
254
|
+
search do
|
255
|
+
with :bogus, 'Field'
|
256
|
+
end
|
257
|
+
end.should raise_error(Sunspot::UnrecognizedFieldError)
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'raises NoMethodError if bogus operator referenced' do
|
261
|
+
lambda do
|
262
|
+
search do
|
263
|
+
with(:category_ids).resembling :bogus_condition
|
264
|
+
end
|
265
|
+
end.should raise_error(NoMethodError)
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should raise ArgumentError if more than two arguments passed to scope method' do
|
269
|
+
lambda do
|
270
|
+
search do
|
271
|
+
with(:category_ids, 4, 5)
|
272
|
+
end
|
273
|
+
end.should raise_error(ArgumentError)
|
274
|
+
end
|
275
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
3
|
+
shared_examples_for "spatial query" do
|
4
|
+
it 'filters by radius' do
|
5
|
+
search do
|
6
|
+
with(:coordinates_new).in_radius(23, -46, 100)
|
7
|
+
end
|
8
|
+
|
9
|
+
connection.should have_last_search_including(:fq, "{!geofilt sfield=coordinates_new_ll pt=23,-46 d=100}")
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'filters by radius via bbox (inexact)' do
|
13
|
+
search do
|
14
|
+
with(:coordinates_new).in_radius(23, -46, 100, :bbox => true)
|
15
|
+
end
|
16
|
+
|
17
|
+
connection.should have_last_search_including(:fq, "{!bbox sfield=coordinates_new_ll pt=23,-46 d=100}")
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'filters by bounding box' do
|
21
|
+
search do
|
22
|
+
with(:coordinates_new).in_bounding_box([45, -94], [46, -93])
|
23
|
+
end
|
24
|
+
|
25
|
+
connection.should have_last_search_including(:fq, "coordinates_new_ll:[45,-94 TO 46,-93]")
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.join(File.dirname(__FILE__), '..'))
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe 'standard query', :type => :query do
|
4
|
+
it_should_behave_like "scoped query"
|
5
|
+
it_should_behave_like "query with advanced manipulation"
|
6
|
+
it_should_behave_like "query with connective scope"
|
7
|
+
it_should_behave_like "query with dynamic field support"
|
8
|
+
it_should_behave_like "facetable query"
|
9
|
+
it_should_behave_like "fulltext query"
|
10
|
+
it_should_behave_like "query with highlighting support"
|
11
|
+
it_should_behave_like "sortable query"
|
12
|
+
it_should_behave_like "query with text field scoping"
|
13
|
+
it_should_behave_like "geohash query"
|
14
|
+
it_should_behave_like "spatial query"
|
15
|
+
|
16
|
+
it 'adds a no-op query to :q parameter when no :q provided' do
|
17
|
+
session.search Post do
|
18
|
+
with :title, 'My Pet Post'
|
19
|
+
end
|
20
|
+
connection.should have_last_search_with(:q => '*:*')
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def search(*classes, &block)
|
26
|
+
classes[0] ||= Post
|
27
|
+
session.search(*classes, &block)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
shared_examples_for 'query with text field scoping' do
|
2
|
+
it 'should scope with a text field' do
|
3
|
+
search do
|
4
|
+
text_fields do
|
5
|
+
with(:body, 'test')
|
6
|
+
end
|
7
|
+
end
|
8
|
+
connection.should have_last_search_including(:fq, 'body_textsv:test')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should raise an UnrecognizedFieldError if differently configured text field is used' do
|
12
|
+
lambda do
|
13
|
+
search(Post, Namespaced::Comment) do
|
14
|
+
text_fields do
|
15
|
+
with(:body, 'test')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end.should raise_error(Sunspot::UnrecognizedFieldError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should raise an UnrecognizedFieldError if no field exists' do
|
22
|
+
lambda do
|
23
|
+
search do
|
24
|
+
text_fields do
|
25
|
+
with(:bogus, 'test')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end.should raise_error(Sunspot::UnrecognizedFieldError)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe 'typed query' do
|
2
|
+
it 'properly escapes namespaced type names' do
|
3
|
+
session.search(Namespaced::Comment)
|
4
|
+
connection.should have_last_search_with(:fq => ['type:Namespaced\:\:Comment'])
|
5
|
+
end
|
6
|
+
|
7
|
+
it 'builds search for multiple types' do
|
8
|
+
session.search(Post, Namespaced::Comment)
|
9
|
+
connection.should have_last_search_with(:fq => ['type:(Post OR Namespaced\:\:Comment)'])
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'searches type of subclass when superclass is configured' do
|
13
|
+
session.search PhotoPost
|
14
|
+
connection.should have_last_search_with(:fq => ['type:PhotoPost'])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'raises an ArgumentError if no types given to search' do
|
18
|
+
lambda { session.search }.should raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe 'search with dynamic fields' do
|
4
|
+
it 'returns dynamic string facet' do
|
5
|
+
stub_facet(:"custom_string:test_ss", 'two' => 2, 'one' => 1)
|
6
|
+
result = session.search(Post) { dynamic(:custom_string) { facet(:test) }}
|
7
|
+
result.facet(:custom_string, :test).rows.map { |row| row.value }.should == ['two', 'one']
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'returns dynamic field facet with custom label' do
|
11
|
+
stub_facet(:"bogus", 'two' => 2, 'one' => 1)
|
12
|
+
result = session.search(Post) { dynamic(:custom_string) { facet(:test, :name => :bogus) }}
|
13
|
+
result.facet(:bogus).rows.map { |row| row.value }.should == ['two', 'one']
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns query facet specified in dynamic call' do
|
17
|
+
stub_query_facet(
|
18
|
+
'custom_string\:test_ss:(foo OR bar)' => 3
|
19
|
+
)
|
20
|
+
search = session.search(Post) do
|
21
|
+
dynamic :custom_string do
|
22
|
+
facet :test do
|
23
|
+
row :foo_bar do
|
24
|
+
with :test, %w(foo bar)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
facet = search.facet(:test)
|
30
|
+
facet.rows.first.value.should == :foo_bar
|
31
|
+
facet.rows.first.count.should == 3
|
32
|
+
end
|
33
|
+
end
|