thinking-sphinx 2.0.9 → 2.0.10
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/HISTORY +8 -0
- data/README.textile +1 -0
- data/lib/thinking_sphinx/active_record.rb +1 -1
- data/lib/thinking_sphinx/configuration.rb +3 -3
- data/lib/thinking_sphinx/context.rb +3 -0
- data/lib/thinking_sphinx/index.rb +35 -35
- data/lib/thinking_sphinx/version.rb +1 -1
- data/spec/thinking_sphinx/configuration_spec.rb +1 -1
- data/spec/thinking_sphinx/context_spec.rb +2 -3
- data/spec/thinking_sphinx/index_spec.rb +39 -39
- data/spec/thinking_sphinx/search_spec.rb +250 -260
- metadata +8 -8
@@ -5,95 +5,95 @@ describe ThinkingSphinx::Search do
|
|
5
5
|
before :each do
|
6
6
|
@config = ThinkingSphinx::Configuration.instance
|
7
7
|
@client = Riddle::Client.new
|
8
|
-
|
8
|
+
|
9
9
|
@config.stub!(:client => @client)
|
10
10
|
@client.stub!(:query => {:matches => [], :total_found => 41, :total => 41})
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
it "not request results from the client if not accessing items" do
|
14
14
|
@config.should_not_receive(:client)
|
15
|
-
|
15
|
+
|
16
16
|
ThinkingSphinx::Search.new.class
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
it "should request results if access is required" do
|
20
20
|
@config.should_receive(:client)
|
21
|
-
|
21
|
+
|
22
22
|
ThinkingSphinx::Search.new.first
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
describe '#respond_to?' do
|
26
26
|
it "should respond to Array methods" do
|
27
27
|
ThinkingSphinx::Search.new.respond_to?(:each).should be_true
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
it "should respond to Search methods" do
|
31
31
|
ThinkingSphinx::Search.new.respond_to?(:per_page).should be_true
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
describe '#populated?' do
|
36
36
|
before :each do
|
37
37
|
@search = ThinkingSphinx::Search.new
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
it "should be false if the client request has not been made" do
|
41
41
|
@search.populated?.should be_false
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
it "should be true once the client request has been made" do
|
45
45
|
@search.first
|
46
46
|
@search.should be_populated
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
it "should be populated if :populate is set to true" do
|
50
50
|
search = ThinkingSphinx::Search.new(:populate => true)
|
51
51
|
search.should be_populated
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
describe '#error?' do
|
56
56
|
before :each do
|
57
57
|
@search = ThinkingSphinx::Search.new
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should be false if client requests have not resulted in an error" do
|
61
61
|
@search.should_receive(:error).and_return(nil)
|
62
62
|
@search.error?.should_not be_true
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
it "should be true when client requests result in an error" do
|
66
66
|
@search.should_receive(:error).and_return("error message")
|
67
67
|
@search.error?.should be_true
|
68
68
|
end
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
describe '#warning?' do
|
72
72
|
before :each do
|
73
73
|
@search = ThinkingSphinx::Search.new
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
it "should be false if client requests have not resulted in a warning" do
|
77
77
|
@search.should_receive(:warning).and_return(nil)
|
78
78
|
@search.warning?.should_not be_true
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
it "should be true when client requests result in an error" do
|
82
82
|
@search.should_receive(:warning).and_return("warning message")
|
83
83
|
@search.warning?.should be_true
|
84
84
|
end
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
describe '#results' do
|
88
88
|
it "should populate search results before returning" do
|
89
89
|
@search = ThinkingSphinx::Search.new
|
90
90
|
@search.populated?.should be_false
|
91
|
-
|
91
|
+
|
92
92
|
@search.results
|
93
93
|
@search.populated?.should be_true
|
94
94
|
end
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
describe '#method_missing' do
|
98
98
|
before :each do
|
99
99
|
Alpha.sphinx_scope(:by_name) { |name|
|
@@ -101,126 +101,116 @@ describe ThinkingSphinx::Search do
|
|
101
101
|
}
|
102
102
|
Alpha.sphinx_scope(:ids_only) { {:ids_only => true} }
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
after :each do
|
106
106
|
Alpha.remove_sphinx_scopes
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
it "should handle Array methods" do
|
110
110
|
ThinkingSphinx::Search.new.private_methods.should be_an(Array)
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
it "should raise a NoMethodError exception if unknown method" do
|
114
114
|
lambda {
|
115
115
|
ThinkingSphinx::Search.new.foo
|
116
116
|
}.should raise_error(NoMethodError)
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
it "should not request results from client if method does not exist" do
|
120
120
|
@client.should_not_receive(:query)
|
121
|
-
|
121
|
+
|
122
122
|
lambda {
|
123
123
|
ThinkingSphinx::Search.new.foo
|
124
124
|
}.should raise_error(NoMethodError)
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
it "should accept sphinx scopes" do
|
128
128
|
search = ThinkingSphinx::Search.new(:classes => [Alpha])
|
129
|
-
|
129
|
+
|
130
130
|
lambda {
|
131
131
|
search.by_name('Pat')
|
132
132
|
}.should_not raise_error(NoMethodError)
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
it "should return itself when using a sphinx scope" do
|
136
136
|
search = ThinkingSphinx::Search.new(:classes => [Alpha])
|
137
137
|
search.by_name('Pat').object_id.should == search.object_id
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
it "should keep the same search object when chaining multiple scopes" do
|
141
141
|
search = ThinkingSphinx::Search.new(:classes => [Alpha])
|
142
142
|
search.by_name('Pat').ids_only.object_id.should == search.object_id
|
143
143
|
end
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
describe '.search' do
|
147
147
|
it "return the output of ThinkingSphinx.search" do
|
148
148
|
@results = [] # to confirm same object
|
149
149
|
ThinkingSphinx.stub!(:search => @results)
|
150
150
|
|
151
|
-
|
152
|
-
ThinkingSphinx::Search.search.object_id.should == @results.object_id
|
153
|
-
end
|
151
|
+
ThinkingSphinx.search.object_id.should == @results.object_id
|
154
152
|
end
|
155
153
|
end
|
156
|
-
|
154
|
+
|
157
155
|
describe '.search_for_ids' do
|
158
156
|
it "return the output of ThinkingSphinx.search_for_ids" do
|
159
157
|
@results = [] # to confirm same object
|
160
158
|
ThinkingSphinx.stub!(:search_for_ids => @results)
|
161
159
|
|
162
|
-
|
163
|
-
|
164
|
-
should == @results.object_id
|
165
|
-
end
|
160
|
+
ThinkingSphinx.search_for_ids.object_id.
|
161
|
+
should == @results.object_id
|
166
162
|
end
|
167
163
|
end
|
168
|
-
|
164
|
+
|
169
165
|
describe '.search_for_id' do
|
170
166
|
it "return the output of ThinkingSphinx.search_for_ids" do
|
171
167
|
@results = [] # to confirm same object
|
172
168
|
ThinkingSphinx.stub!(:search_for_id => @results)
|
173
169
|
|
174
|
-
|
175
|
-
|
176
|
-
should == @results.object_id
|
177
|
-
end
|
170
|
+
ThinkingSphinx.search_for_id.object_id.
|
171
|
+
should == @results.object_id
|
178
172
|
end
|
179
173
|
end
|
180
|
-
|
174
|
+
|
181
175
|
describe '.count' do
|
182
176
|
it "return the output of ThinkingSphinx.search" do
|
183
177
|
@results = [] # to confirm same object
|
184
178
|
ThinkingSphinx.stub!(:count => @results)
|
185
179
|
|
186
|
-
|
187
|
-
ThinkingSphinx::Search.count.object_id.should == @results.object_id
|
188
|
-
end
|
180
|
+
ThinkingSphinx.count.object_id.should == @results.object_id
|
189
181
|
end
|
190
182
|
end
|
191
|
-
|
183
|
+
|
192
184
|
describe '.facets' do
|
193
185
|
it "return the output of ThinkingSphinx.facets" do
|
194
186
|
@results = [] # to confirm same object
|
195
187
|
ThinkingSphinx.stub!(:facets => @results)
|
196
188
|
|
197
|
-
|
198
|
-
ThinkingSphinx::Search.facets.object_id.should == @results.object_id
|
199
|
-
end
|
189
|
+
ThinkingSphinx.facets.object_id.should == @results.object_id
|
200
190
|
end
|
201
191
|
end
|
202
|
-
|
192
|
+
|
203
193
|
describe '.matching_fields' do
|
204
194
|
it "should return objects with indexes matching 1's in the bitmask" do
|
205
195
|
fields = ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta']
|
206
196
|
ThinkingSphinx::Search.matching_fields(fields, 85).
|
207
197
|
should == ['alpha', 'gamma', 'epsilon', 'eta']
|
208
|
-
|
198
|
+
|
209
199
|
ThinkingSphinx::Search.matching_fields(fields, 42).
|
210
200
|
should == ['beta', 'delta', 'zeta']
|
211
201
|
end
|
212
202
|
end
|
213
|
-
|
203
|
+
|
214
204
|
describe '#populate' do
|
215
205
|
before :each do
|
216
206
|
@alpha_a, @alpha_b = Alpha.new, Alpha.new
|
217
207
|
@beta_a, @beta_b = Beta.new, Beta.new
|
218
|
-
|
208
|
+
|
219
209
|
@alpha_a.stub! :id => 1, :read_attribute => 1
|
220
210
|
@alpha_b.stub! :id => 2, :read_attribute => 2
|
221
211
|
@beta_a.stub! :id => 1, :read_attribute => 1
|
222
212
|
@beta_b.stub! :id => 2, :read_attribute => 2
|
223
|
-
|
213
|
+
|
224
214
|
@client.stub! :query => {
|
225
215
|
:matches => minimal_result_hashes(@alpha_a, @beta_b, @alpha_b, @beta_a),
|
226
216
|
:fields => ["one", "two", "three", "four", "five"]
|
@@ -228,14 +218,14 @@ describe ThinkingSphinx::Search do
|
|
228
218
|
Alpha.stub! :find => [@alpha_a, @alpha_b]
|
229
219
|
Beta.stub! :find => [@beta_a, @beta_b]
|
230
220
|
end
|
231
|
-
|
221
|
+
|
232
222
|
it "should issue only one select per model" do
|
233
223
|
Alpha.should_receive(:find).once.and_return([@alpha_a, @alpha_b])
|
234
224
|
Beta.should_receive(:find).once.and_return([@beta_a, @beta_b])
|
235
|
-
|
225
|
+
|
236
226
|
ThinkingSphinx::Search.new.first
|
237
227
|
end
|
238
|
-
|
228
|
+
|
239
229
|
it "should mix the results from different models" do
|
240
230
|
search = ThinkingSphinx::Search.new
|
241
231
|
search[0].should be_a(Alpha)
|
@@ -243,7 +233,7 @@ describe ThinkingSphinx::Search do
|
|
243
233
|
search[2].should be_a(Alpha)
|
244
234
|
search[3].should be_a(Beta)
|
245
235
|
end
|
246
|
-
|
236
|
+
|
247
237
|
it "should maintain the Xoopit ordering for results" do
|
248
238
|
search = ThinkingSphinx::Search.new
|
249
239
|
search[0].id.should == 1
|
@@ -251,40 +241,40 @@ describe ThinkingSphinx::Search do
|
|
251
241
|
search[2].id.should == 2
|
252
242
|
search[3].id.should == 1
|
253
243
|
end
|
254
|
-
|
244
|
+
|
255
245
|
it "should use the requested classes to generate the index argument" do
|
256
246
|
@client.should_receive(:query) do |query, index, comment|
|
257
247
|
index.should == 'alpha_core,beta_core,beta_delta'
|
258
248
|
end
|
259
|
-
|
249
|
+
|
260
250
|
ThinkingSphinx::Search.new(:classes => [Alpha, Beta]).first
|
261
251
|
end
|
262
|
-
|
252
|
+
|
263
253
|
it "should restrict includes to the relevant classes" do
|
264
254
|
Alpha.should_receive(:find) do |type, options|
|
265
255
|
options[:include].should == [:betas]
|
266
256
|
[@alpha_a, @alpha_b]
|
267
257
|
end
|
268
|
-
|
258
|
+
|
269
259
|
Beta.should_receive(:find) do |type, options|
|
270
260
|
options[:include].should == [:gammas]
|
271
261
|
[@beta_a, @beta_b]
|
272
262
|
end
|
273
|
-
|
263
|
+
|
274
264
|
ThinkingSphinx::Search.new(:include => [:betas, :gammas]).first
|
275
265
|
end
|
276
|
-
|
266
|
+
|
277
267
|
it "should restrict single includes to the relevant classes" do
|
278
268
|
Alpha.should_receive(:find) do |type, options|
|
279
269
|
options[:include].should == :betas
|
280
270
|
[@alpha_a, @alpha_b]
|
281
271
|
end
|
282
|
-
|
272
|
+
|
283
273
|
Beta.should_receive(:find) do |type, options|
|
284
274
|
options[:include].should be_nil
|
285
275
|
[@beta_a, @beta_b]
|
286
276
|
end
|
287
|
-
|
277
|
+
|
288
278
|
ThinkingSphinx::Search.new(:include => :betas).first
|
289
279
|
end
|
290
280
|
|
@@ -301,71 +291,71 @@ describe ThinkingSphinx::Search do
|
|
301
291
|
|
302
292
|
ThinkingSphinx::Search.new(:include => [:thetas, {:betas => :gammas}]).first
|
303
293
|
end
|
304
|
-
|
294
|
+
|
305
295
|
it "should respect hash includes" do
|
306
296
|
Alpha.should_receive(:find) do |type, options|
|
307
297
|
options[:include].should == {:betas => :gammas}
|
308
298
|
[@alpha_a, @alpha_b]
|
309
299
|
end
|
310
|
-
|
300
|
+
|
311
301
|
Beta.should_receive(:find) do |type, options|
|
312
302
|
options[:include].should be_nil
|
313
303
|
[@beta_a, @beta_b]
|
314
304
|
end
|
315
|
-
|
305
|
+
|
316
306
|
ThinkingSphinx::Search.new(:include => {:betas => :gammas}).first
|
317
307
|
end
|
318
|
-
|
308
|
+
|
319
309
|
it "should respect includes for single class searches" do
|
320
310
|
Alpha.should_receive(:find) do |type, options|
|
321
311
|
options[:include].should == {:betas => :gammas}
|
322
312
|
[@alpha_a, @alpha_b]
|
323
313
|
end
|
324
|
-
|
314
|
+
|
325
315
|
ThinkingSphinx::Search.new(
|
326
316
|
:include => {:betas => :gammas},
|
327
317
|
:classes => [Alpha]
|
328
318
|
).first
|
329
319
|
end
|
330
|
-
|
320
|
+
|
331
321
|
describe 'query' do
|
332
322
|
it "should concatenate arguments with spaces" do
|
333
323
|
@client.should_receive(:query) do |query, index, comment|
|
334
324
|
query.should == 'two words'
|
335
325
|
end
|
336
|
-
|
326
|
+
|
337
327
|
ThinkingSphinx::Search.new('two', 'words').first
|
338
328
|
end
|
339
|
-
|
329
|
+
|
340
330
|
it "should append conditions to the query" do
|
341
331
|
@client.should_receive(:query) do |query, index, comment|
|
342
332
|
query.should == 'general @focused specific'
|
343
333
|
end
|
344
|
-
|
334
|
+
|
345
335
|
ThinkingSphinx::Search.new('general', :conditions => {
|
346
336
|
:focused => 'specific'
|
347
337
|
}).first
|
348
338
|
end
|
349
|
-
|
339
|
+
|
350
340
|
it "append multiple conditions together" do
|
351
341
|
@client.should_receive(:query) do |query, index, comment|
|
352
342
|
query.should match(/general.+@foo word/)
|
353
343
|
query.should match(/general.+@bar word/)
|
354
344
|
end
|
355
|
-
|
345
|
+
|
356
346
|
ThinkingSphinx::Search.new('general', :conditions => {
|
357
347
|
:foo => 'word', :bar => 'word'
|
358
348
|
}).first
|
359
349
|
end
|
360
|
-
|
350
|
+
|
361
351
|
it "should apply stars if requested, and handle full extended syntax" do
|
362
352
|
input = %{a b* c (d | e) 123 5&6 (f_f g) !h "i j" "k l"~10 "m n"/3 @o p -(q|r)}
|
363
353
|
expected = %{*a* b* *c* (*d* | *e*) *123* *5*&*6* (*f_f* *g*) !*h* "i j" "k l"~10 "m n"/3 @o *p* -(*q*|*r*)}
|
364
|
-
|
354
|
+
|
365
355
|
@client.should_receive(:query) do |query, index, comment|
|
366
356
|
query.should == expected
|
367
357
|
end
|
368
|
-
|
358
|
+
|
369
359
|
ThinkingSphinx::Search.new(input, :star => true).first
|
370
360
|
end
|
371
361
|
|
@@ -373,7 +363,7 @@ describe ThinkingSphinx::Search do
|
|
373
363
|
@client.should_receive(:query) do |query, index, comment|
|
374
364
|
query.should == '*foo*@*bar*.*com*'
|
375
365
|
end
|
376
|
-
|
366
|
+
|
377
367
|
ThinkingSphinx::Search.new('foo@bar.com', :star => true).first
|
378
368
|
end
|
379
369
|
|
@@ -381,77 +371,77 @@ describe ThinkingSphinx::Search do
|
|
381
371
|
@client.should_receive(:query) do |query, index, comment|
|
382
372
|
query.should == '*foo@bar.com* -*foo-bar*'
|
383
373
|
end
|
384
|
-
|
374
|
+
|
385
375
|
ThinkingSphinx::Search.new(
|
386
376
|
'foo@bar.com -foo-bar', :star => /[\w@.-]+/u
|
387
377
|
).first
|
388
378
|
end
|
389
|
-
|
379
|
+
|
390
380
|
it "should ignore multi-field limitations" do
|
391
381
|
@client.should_receive(:query) do |query, index, comment|
|
392
382
|
query.should == '@(foo,bar) *baz*'
|
393
383
|
end
|
394
|
-
|
384
|
+
|
395
385
|
ThinkingSphinx::Search.new('@(foo,bar) baz', :star => true).first
|
396
386
|
end
|
397
|
-
|
387
|
+
|
398
388
|
it "should ignore multi-field limitations with spaces" do
|
399
389
|
@client.should_receive(:query) do |query, index, comment|
|
400
390
|
query.should == '@(foo bar) *baz*'
|
401
391
|
end
|
402
|
-
|
392
|
+
|
403
393
|
ThinkingSphinx::Search.new('@(foo bar) baz', :star => true).first
|
404
394
|
end
|
405
|
-
|
395
|
+
|
406
396
|
it "should ignore multi-field limitations in the middle of queries" do
|
407
397
|
@client.should_receive(:query) do |query, index, comment|
|
408
398
|
query.should == '*baz* @foo *bar* @(foo,bar) *baz*'
|
409
399
|
end
|
410
|
-
|
400
|
+
|
411
401
|
ThinkingSphinx::Search.new(
|
412
402
|
'baz @foo bar @(foo,bar) baz', :star => true
|
413
403
|
).first
|
414
404
|
end
|
415
405
|
end
|
416
|
-
|
406
|
+
|
417
407
|
describe 'comment' do
|
418
408
|
it "should add comment if explicitly provided" do
|
419
409
|
@client.should_receive(:query) do |query, index, comment|
|
420
410
|
comment.should == 'custom log'
|
421
411
|
end
|
422
|
-
|
412
|
+
|
423
413
|
ThinkingSphinx::Search.new(:comment => 'custom log').first
|
424
414
|
end
|
425
|
-
|
415
|
+
|
426
416
|
it "should default to a blank comment" do
|
427
417
|
@client.should_receive(:query) do |query, index, comment|
|
428
418
|
comment.should == ''
|
429
419
|
end
|
430
|
-
|
420
|
+
|
431
421
|
ThinkingSphinx::Search.new.first
|
432
422
|
end
|
433
423
|
end
|
434
|
-
|
424
|
+
|
435
425
|
describe 'match mode' do
|
436
426
|
it "should default to :all" do
|
437
427
|
ThinkingSphinx::Search.new.first
|
438
|
-
|
428
|
+
|
439
429
|
@client.match_mode.should == :all
|
440
430
|
end
|
441
|
-
|
431
|
+
|
442
432
|
it "should default to :extended if conditions are supplied" do
|
443
433
|
ThinkingSphinx::Search.new('general', :conditions => {
|
444
434
|
:foo => 'word', :bar => 'word'
|
445
435
|
}).first
|
446
|
-
|
436
|
+
|
447
437
|
@client.match_mode.should == :extended
|
448
438
|
end
|
449
|
-
|
439
|
+
|
450
440
|
it "should use explicit match modes" do
|
451
441
|
ThinkingSphinx::Search.new('general', :conditions => {
|
452
442
|
:foo => 'word', :bar => 'word'
|
453
443
|
}, :match_mode => :extended2).first
|
454
|
-
|
444
|
+
|
455
445
|
@client.match_mode.should == :extended2
|
456
446
|
end
|
457
447
|
end
|
@@ -459,59 +449,59 @@ describe ThinkingSphinx::Search do
|
|
459
449
|
describe 'sphinx_select' do
|
460
450
|
it "should default to *" do
|
461
451
|
ThinkingSphinx::Search.new.first
|
462
|
-
|
452
|
+
|
463
453
|
@client.select.should == "*"
|
464
454
|
end
|
465
|
-
|
455
|
+
|
466
456
|
it "should get set on the client if specified" do
|
467
457
|
ThinkingSphinx::Search.new('general',
|
468
458
|
:sphinx_select => "*, foo as bar"
|
469
459
|
).first
|
470
|
-
|
460
|
+
|
471
461
|
@client.select.should == "*, foo as bar"
|
472
462
|
end
|
473
463
|
|
474
464
|
end
|
475
|
-
|
465
|
+
|
476
466
|
describe 'pagination' do
|
477
467
|
it "should set the limit using per_page" do
|
478
468
|
ThinkingSphinx::Search.new(:per_page => 30).first
|
479
469
|
@client.limit.should == 30
|
480
470
|
end
|
481
|
-
|
471
|
+
|
482
472
|
it "should set the offset if pagination is requested" do
|
483
473
|
ThinkingSphinx::Search.new(:page => 3).first
|
484
474
|
@client.offset.should == 40
|
485
475
|
end
|
486
|
-
|
476
|
+
|
487
477
|
it "should set the offset by the per_page value" do
|
488
478
|
ThinkingSphinx::Search.new(:page => 3, :per_page => 30).first
|
489
479
|
@client.offset.should == 60
|
490
480
|
end
|
491
481
|
end
|
492
|
-
|
482
|
+
|
493
483
|
describe 'filters' do
|
494
484
|
it "should filter out deleted values by default" do
|
495
485
|
ThinkingSphinx::Search.new.first
|
496
|
-
|
486
|
+
|
497
487
|
filter = @client.filters.last
|
498
488
|
filter.values.should == [0]
|
499
489
|
filter.attribute.should == 'sphinx_deleted'
|
500
490
|
filter.exclude?.should be_false
|
501
491
|
end
|
502
|
-
|
492
|
+
|
503
493
|
it "should add class filters for explicit classes" do
|
504
494
|
ThinkingSphinx::Search.new(:classes => [Alpha, Beta]).first
|
505
|
-
|
495
|
+
|
506
496
|
filter = @client.filters.last
|
507
497
|
filter.values.should == [Alpha.to_crc32, Beta.to_crc32]
|
508
498
|
filter.attribute.should == 'class_crc'
|
509
499
|
filter.exclude?.should be_false
|
510
500
|
end
|
511
|
-
|
501
|
+
|
512
502
|
it "should add class filters for subclasses of requested classes" do
|
513
503
|
ThinkingSphinx::Search.new(:classes => [Person]).first
|
514
|
-
|
504
|
+
|
515
505
|
filter = @client.filters.last
|
516
506
|
filter.values.should == [
|
517
507
|
Parent.to_crc32, Admin::Person.to_crc32,
|
@@ -520,127 +510,127 @@ describe ThinkingSphinx::Search do
|
|
520
510
|
filter.attribute.should == 'class_crc'
|
521
511
|
filter.exclude?.should be_false
|
522
512
|
end
|
523
|
-
|
513
|
+
|
524
514
|
it "should append inclusive filters of integers" do
|
525
515
|
ThinkingSphinx::Search.new(:with => {:int => 1}).first
|
526
|
-
|
516
|
+
|
527
517
|
filter = @client.filters.last
|
528
518
|
filter.values.should == [1]
|
529
519
|
filter.attribute.should == 'int'
|
530
520
|
filter.exclude?.should be_false
|
531
521
|
end
|
532
|
-
|
522
|
+
|
533
523
|
it "should append inclusive filters of floats" do
|
534
524
|
ThinkingSphinx::Search.new(:with => {:float => 1.5}).first
|
535
|
-
|
525
|
+
|
536
526
|
filter = @client.filters.last
|
537
527
|
filter.values.should == [1.5]
|
538
528
|
filter.attribute.should == 'float'
|
539
529
|
filter.exclude?.should be_false
|
540
530
|
end
|
541
|
-
|
531
|
+
|
542
532
|
it "should append inclusive filters of booleans" do
|
543
533
|
ThinkingSphinx::Search.new(:with => {:boolean => true}).first
|
544
|
-
|
534
|
+
|
545
535
|
filter = @client.filters.last
|
546
536
|
filter.values.should == [true]
|
547
537
|
filter.attribute.should == 'boolean'
|
548
538
|
filter.exclude?.should be_false
|
549
539
|
end
|
550
|
-
|
540
|
+
|
551
541
|
it "should append inclusive filters of arrays" do
|
552
542
|
ThinkingSphinx::Search.new(:with => {:ints => [1, 2, 3]}).first
|
553
|
-
|
543
|
+
|
554
544
|
filter = @client.filters.last
|
555
545
|
filter.values.should == [1, 2, 3]
|
556
546
|
filter.attribute.should == 'ints'
|
557
547
|
filter.exclude?.should be_false
|
558
548
|
end
|
559
|
-
|
549
|
+
|
560
550
|
it "should treat nils in arrays as 0" do
|
561
551
|
ThinkingSphinx::Search.new(:with => {:ints => [nil, 1, 2, 3]}).first
|
562
|
-
|
552
|
+
|
563
553
|
filter = @client.filters.last
|
564
554
|
filter.values.should == [0, 1, 2, 3]
|
565
555
|
end
|
566
|
-
|
556
|
+
|
567
557
|
it "should append inclusive filters of time ranges" do
|
568
558
|
first, last = 1.week.ago, Time.now
|
569
559
|
ThinkingSphinx::Search.new(:with => {
|
570
560
|
:time => first..last
|
571
561
|
}).first
|
572
|
-
|
562
|
+
|
573
563
|
filter = @client.filters.last
|
574
564
|
filter.values.should == (first.to_i..last.to_i)
|
575
565
|
filter.attribute.should == 'time'
|
576
566
|
filter.exclude?.should be_false
|
577
567
|
end
|
578
|
-
|
568
|
+
|
579
569
|
it "should append exclusive filters of integers" do
|
580
570
|
ThinkingSphinx::Search.new(:without => {:int => 1}).first
|
581
|
-
|
571
|
+
|
582
572
|
filter = @client.filters.last
|
583
573
|
filter.values.should == [1]
|
584
574
|
filter.attribute.should == 'int'
|
585
575
|
filter.exclude?.should be_true
|
586
576
|
end
|
587
|
-
|
577
|
+
|
588
578
|
it "should append exclusive filters of floats" do
|
589
579
|
ThinkingSphinx::Search.new(:without => {:float => 1.5}).first
|
590
|
-
|
580
|
+
|
591
581
|
filter = @client.filters.last
|
592
582
|
filter.values.should == [1.5]
|
593
583
|
filter.attribute.should == 'float'
|
594
584
|
filter.exclude?.should be_true
|
595
585
|
end
|
596
|
-
|
586
|
+
|
597
587
|
it "should append exclusive filters of booleans" do
|
598
588
|
ThinkingSphinx::Search.new(:without => {:boolean => true}).first
|
599
|
-
|
589
|
+
|
600
590
|
filter = @client.filters.last
|
601
591
|
filter.values.should == [true]
|
602
592
|
filter.attribute.should == 'boolean'
|
603
593
|
filter.exclude?.should be_true
|
604
594
|
end
|
605
|
-
|
595
|
+
|
606
596
|
it "should append exclusive filters of arrays" do
|
607
597
|
ThinkingSphinx::Search.new(:without => {:ints => [1, 2, 3]}).first
|
608
|
-
|
598
|
+
|
609
599
|
filter = @client.filters.last
|
610
600
|
filter.values.should == [1, 2, 3]
|
611
601
|
filter.attribute.should == 'ints'
|
612
602
|
filter.exclude?.should be_true
|
613
603
|
end
|
614
|
-
|
604
|
+
|
615
605
|
it "should append exclusive filters of time ranges" do
|
616
606
|
first, last = 1.week.ago, Time.now
|
617
607
|
ThinkingSphinx::Search.new(:without => {
|
618
608
|
:time => first..last
|
619
609
|
}).first
|
620
|
-
|
610
|
+
|
621
611
|
filter = @client.filters.last
|
622
612
|
filter.values.should == (first.to_i..last.to_i)
|
623
613
|
filter.attribute.should == 'time'
|
624
614
|
filter.exclude?.should be_true
|
625
615
|
end
|
626
|
-
|
616
|
+
|
627
617
|
it "should add separate filters for each item in a with_all value" do
|
628
618
|
ThinkingSphinx::Search.new(:with_all => {:ints => [1, 2, 3]}).first
|
629
|
-
|
619
|
+
|
630
620
|
filters = @client.filters[-3, 3]
|
631
621
|
filters.each do |filter|
|
632
622
|
filter.attribute.should == 'ints'
|
633
623
|
filter.exclude?.should be_false
|
634
624
|
end
|
635
|
-
|
625
|
+
|
636
626
|
filters[0].values.should == [1]
|
637
627
|
filters[1].values.should == [2]
|
638
628
|
filters[2].values.should == [3]
|
639
629
|
end
|
640
|
-
|
630
|
+
|
641
631
|
it "should filter out specific ids using :without_ids" do
|
642
632
|
ThinkingSphinx::Search.new(:without_ids => [4, 5, 6]).first
|
643
|
-
|
633
|
+
|
644
634
|
filter = @client.filters.last
|
645
635
|
filter.values.should == [4, 5, 6]
|
646
636
|
filter.attribute.should == 'sphinx_internal_id'
|
@@ -654,7 +644,7 @@ describe ThinkingSphinx::Search do
|
|
654
644
|
filter.attribute.should_not == 'sphinx_internal_id'
|
655
645
|
end
|
656
646
|
end
|
657
|
-
|
647
|
+
|
658
648
|
describe 'sort mode' do
|
659
649
|
it "should use :relevance as a default" do
|
660
650
|
ThinkingSphinx::Search.new.first
|
@@ -692,18 +682,18 @@ describe ThinkingSphinx::Search do
|
|
692
682
|
@client.sort_mode.should == :attr_desc
|
693
683
|
end
|
694
684
|
end
|
695
|
-
|
685
|
+
|
696
686
|
describe 'sort by' do
|
697
687
|
it "should presume order symbols are attributes" do
|
698
688
|
ThinkingSphinx::Search.new(:order => :created_at).first
|
699
689
|
@client.sort_by.should == 'created_at'
|
700
690
|
end
|
701
|
-
|
691
|
+
|
702
692
|
it "replace field names with their sortable attributes" do
|
703
693
|
ThinkingSphinx::Search.new(:order => :name, :classes => [Alpha]).first
|
704
694
|
@client.sort_by.should == 'name_sort'
|
705
695
|
end
|
706
|
-
|
696
|
+
|
707
697
|
it "should replace field names in strings" do
|
708
698
|
ThinkingSphinx::Search.new(
|
709
699
|
:order => "created_at ASC, name DESC", :classes => [Alpha]
|
@@ -711,43 +701,43 @@ describe ThinkingSphinx::Search do
|
|
711
701
|
@client.sort_by.should == 'created_at ASC, name_sort DESC'
|
712
702
|
end
|
713
703
|
end
|
714
|
-
|
704
|
+
|
715
705
|
describe 'max matches' do
|
716
706
|
it "should use the global setting by default" do
|
717
707
|
ThinkingSphinx::Search.new.first
|
718
708
|
@client.max_matches.should == 1000
|
719
709
|
end
|
720
|
-
|
710
|
+
|
721
711
|
it "should use explicit setting" do
|
722
712
|
ThinkingSphinx::Search.new(:max_matches => 2000).first
|
723
713
|
@client.max_matches.should == 2000
|
724
714
|
end
|
725
715
|
end
|
726
|
-
|
716
|
+
|
727
717
|
describe 'field weights' do
|
728
718
|
it "should set field weights as provided" do
|
729
719
|
ThinkingSphinx::Search.new(
|
730
720
|
:field_weights => {'foo' => 10, 'bar' => 5}
|
731
721
|
).first
|
732
|
-
|
722
|
+
|
733
723
|
@client.field_weights.should == {
|
734
724
|
'foo' => 10, 'bar' => 5
|
735
725
|
}
|
736
726
|
end
|
737
|
-
|
727
|
+
|
738
728
|
it "should use field weights set in the index" do
|
739
729
|
ThinkingSphinx::Search.new(:classes => [Alpha]).first
|
740
|
-
|
730
|
+
|
741
731
|
@client.field_weights.should == {'name' => 10}
|
742
732
|
end
|
743
733
|
end
|
744
|
-
|
734
|
+
|
745
735
|
describe 'index weights' do
|
746
736
|
it "should send index weights through to the client" do
|
747
737
|
ThinkingSphinx::Search.new(:index_weights => {'foo' => 100}).first
|
748
738
|
@client.index_weights.should == {'foo' => 100}
|
749
739
|
end
|
750
|
-
|
740
|
+
|
751
741
|
it "should convert classes to their core and delta index names" do
|
752
742
|
ThinkingSphinx::Search.new(:index_weights => {Alpha => 100}).first
|
753
743
|
@client.index_weights.should == {
|
@@ -756,15 +746,15 @@ describe ThinkingSphinx::Search do
|
|
756
746
|
}
|
757
747
|
end
|
758
748
|
end
|
759
|
-
|
749
|
+
|
760
750
|
describe 'grouping' do
|
761
751
|
it "should convert group into group_by and group_function" do
|
762
752
|
ThinkingSphinx::Search.new(:group => :edition).first
|
763
|
-
|
753
|
+
|
764
754
|
@client.group_function.should == :attr
|
765
755
|
@client.group_by.should == "edition"
|
766
756
|
end
|
767
|
-
|
757
|
+
|
768
758
|
it "should pass on explicit grouping arguments" do
|
769
759
|
ThinkingSphinx::Search.new(
|
770
760
|
:group_by => 'created_at',
|
@@ -772,45 +762,45 @@ describe ThinkingSphinx::Search do
|
|
772
762
|
:group_clause => 'clause',
|
773
763
|
:group_distinct => 'distinct'
|
774
764
|
).first
|
775
|
-
|
765
|
+
|
776
766
|
@client.group_by.should == 'created_at'
|
777
767
|
@client.group_function.should == :attr
|
778
768
|
@client.group_clause.should == 'clause'
|
779
769
|
@client.group_distinct.should == 'distinct'
|
780
770
|
end
|
781
771
|
end
|
782
|
-
|
772
|
+
|
783
773
|
describe 'anchor' do
|
784
774
|
it "should detect lat and lng attributes on the given model" do
|
785
775
|
ThinkingSphinx::Search.new(
|
786
776
|
:geo => [1.0, -1.0],
|
787
777
|
:classes => [Alpha]
|
788
778
|
).first
|
789
|
-
|
779
|
+
|
790
780
|
@client.anchor[:latitude_attribute].should == 'lat'
|
791
781
|
@client.anchor[:longitude_attribute].should == 'lng'
|
792
782
|
end
|
793
|
-
|
783
|
+
|
794
784
|
it "should detect lat and lon attributes on the given model" do
|
795
785
|
ThinkingSphinx::Search.new(
|
796
786
|
:geo => [1.0, -1.0],
|
797
787
|
:classes => [Beta]
|
798
788
|
).first
|
799
|
-
|
789
|
+
|
800
790
|
@client.anchor[:latitude_attribute].should == 'lat'
|
801
791
|
@client.anchor[:longitude_attribute].should == 'lon'
|
802
792
|
end
|
803
|
-
|
793
|
+
|
804
794
|
it "should detect latitude and longitude attributes on the given model" do
|
805
795
|
ThinkingSphinx::Search.new(
|
806
796
|
:geo => [1.0, -1.0],
|
807
797
|
:classes => [Person]
|
808
798
|
).first
|
809
|
-
|
799
|
+
|
810
800
|
@client.anchor[:latitude_attribute].should == 'latitude'
|
811
801
|
@client.anchor[:longitude_attribute].should == 'longitude'
|
812
802
|
end
|
813
|
-
|
803
|
+
|
814
804
|
it "should accept manually defined latitude and longitude attributes" do
|
815
805
|
ThinkingSphinx::Search.new(
|
816
806
|
:geo => [1.0, -1.0],
|
@@ -818,43 +808,43 @@ describe ThinkingSphinx::Search do
|
|
818
808
|
:latitude_attr => :updown,
|
819
809
|
:longitude_attr => :leftright
|
820
810
|
).first
|
821
|
-
|
811
|
+
|
822
812
|
@client.anchor[:latitude_attribute].should == 'updown'
|
823
813
|
@client.anchor[:longitude_attribute].should == 'leftright'
|
824
814
|
end
|
825
|
-
|
815
|
+
|
826
816
|
it "should accept manually defined latitude and longitude attributes in the given model" do
|
827
817
|
ThinkingSphinx::Search.new(
|
828
818
|
:geo => [1.0, -1.0],
|
829
819
|
:classes => [Friendship]
|
830
820
|
).first
|
831
|
-
|
821
|
+
|
832
822
|
@client.anchor[:latitude_attribute].should == 'person_id'
|
833
823
|
@client.anchor[:longitude_attribute].should == 'person_id'
|
834
824
|
end
|
835
|
-
|
825
|
+
|
836
826
|
it "should accept geo array for geo-position values" do
|
837
827
|
ThinkingSphinx::Search.new(
|
838
828
|
:geo => [1.0, -1.0],
|
839
829
|
:classes => [Alpha]
|
840
830
|
).first
|
841
|
-
|
831
|
+
|
842
832
|
@client.anchor[:latitude].should == 1.0
|
843
833
|
@client.anchor[:longitude].should == -1.0
|
844
834
|
end
|
845
|
-
|
835
|
+
|
846
836
|
it "should accept lat and lng options for geo-position values" do
|
847
837
|
ThinkingSphinx::Search.new(
|
848
838
|
:lat => 1.0,
|
849
839
|
:lng => -1.0,
|
850
840
|
:classes => [Alpha]
|
851
841
|
).first
|
852
|
-
|
842
|
+
|
853
843
|
@client.anchor[:latitude].should == 1.0
|
854
844
|
@client.anchor[:longitude].should == -1.0
|
855
845
|
end
|
856
846
|
end
|
857
|
-
|
847
|
+
|
858
848
|
describe 'sql ordering' do
|
859
849
|
before :each do
|
860
850
|
@client.stub! :query => {
|
@@ -862,7 +852,7 @@ describe ThinkingSphinx::Search do
|
|
862
852
|
}
|
863
853
|
Alpha.stub! :find => [@alpha_a, @alpha_b]
|
864
854
|
end
|
865
|
-
|
855
|
+
|
866
856
|
it "shouldn't re-sort SQL results based on Sphinx information" do
|
867
857
|
search = ThinkingSphinx::Search.new(
|
868
858
|
:classes => [Alpha],
|
@@ -871,25 +861,25 @@ describe ThinkingSphinx::Search do
|
|
871
861
|
search.first.should == @alpha_a
|
872
862
|
search.last.should == @alpha_b
|
873
863
|
end
|
874
|
-
|
864
|
+
|
875
865
|
it "should use the option for the ActiveRecord::Base#find calls" do
|
876
866
|
Alpha.should_receive(:find) do |mode, options|
|
877
867
|
options[:order].should == 'id'
|
878
868
|
end
|
879
|
-
|
869
|
+
|
880
870
|
ThinkingSphinx::Search.new(
|
881
871
|
:classes => [Alpha],
|
882
872
|
:sql_order => 'id'
|
883
873
|
).first
|
884
874
|
end
|
885
875
|
end
|
886
|
-
|
876
|
+
|
887
877
|
describe ':only option' do
|
888
878
|
it "returns the requested attribute as an array" do
|
889
879
|
ThinkingSphinx::Search.new(:only => :class_crc).first.
|
890
880
|
should == Alpha.to_crc32
|
891
881
|
end
|
892
|
-
|
882
|
+
|
893
883
|
it "returns multiple attributes as hashes with values" do
|
894
884
|
ThinkingSphinx::Search.new(
|
895
885
|
:only => [:class_crc, :sphinx_internal_id]
|
@@ -898,12 +888,12 @@ describe ThinkingSphinx::Search do
|
|
898
888
|
:sphinx_internal_id => @alpha_a.id
|
899
889
|
}
|
900
890
|
end
|
901
|
-
|
891
|
+
|
902
892
|
it "handles strings for a single attribute name" do
|
903
893
|
ThinkingSphinx::Search.new(:only => 'class_crc').first.
|
904
894
|
should == Alpha.to_crc32
|
905
895
|
end
|
906
|
-
|
896
|
+
|
907
897
|
it "handles strings for multiple attribute names" do
|
908
898
|
ThinkingSphinx::Search.new(
|
909
899
|
:only => ['class_crc', 'sphinx_internal_id']
|
@@ -913,82 +903,82 @@ describe ThinkingSphinx::Search do
|
|
913
903
|
}
|
914
904
|
end
|
915
905
|
end
|
916
|
-
|
906
|
+
|
917
907
|
context 'result objects' do
|
918
908
|
describe '#excerpts' do
|
919
909
|
before :each do
|
920
910
|
@search = ThinkingSphinx::Search.new
|
921
911
|
end
|
922
|
-
|
912
|
+
|
923
913
|
it "should add excerpts method if objects don't already have one" do
|
924
914
|
@search.first.should respond_to(:excerpts)
|
925
915
|
end
|
926
|
-
|
916
|
+
|
927
917
|
it "should return an instance of ThinkingSphinx::Excerpter" do
|
928
918
|
@search.first.excerpts.should be_a(ThinkingSphinx::Excerpter)
|
929
919
|
end
|
930
|
-
|
920
|
+
|
931
921
|
it "should not add excerpts method if objects already have one" do
|
932
922
|
@search.last.excerpts.should_not be_a(ThinkingSphinx::Excerpter)
|
933
923
|
end
|
934
|
-
|
924
|
+
|
935
925
|
# Fails in Ruby 1.9 (or maybe it's an RSpec update). Not sure why.
|
936
926
|
it "should set up the excerpter with the instances and search" do
|
937
927
|
[@alpha_a, @beta_b, @alpha_b, @beta_a].each do |object|
|
938
928
|
ThinkingSphinx::Excerpter.should_receive(:new).with(@search, object)
|
939
929
|
end
|
940
|
-
|
930
|
+
|
941
931
|
@search.first
|
942
932
|
end
|
943
933
|
end
|
944
|
-
|
934
|
+
|
945
935
|
describe '#sphinx_attributes' do
|
946
936
|
before :each do
|
947
937
|
@search = ThinkingSphinx::Search.new
|
948
938
|
end
|
949
|
-
|
939
|
+
|
950
940
|
it "should add sphinx_attributes method if objects don't already have one" do
|
951
941
|
@search.last.should respond_to(:sphinx_attributes)
|
952
942
|
end
|
953
|
-
|
943
|
+
|
954
944
|
it "should return a hash" do
|
955
945
|
@search.last.sphinx_attributes.should be_a(Hash)
|
956
946
|
end
|
957
|
-
|
947
|
+
|
958
948
|
it "should not add sphinx_attributes if objects have a method of that name already" do
|
959
949
|
@search.first.sphinx_attributes.should_not be_a(Hash)
|
960
950
|
end
|
961
|
-
|
951
|
+
|
962
952
|
it "should pair sphinx_attributes with the correct hash" do
|
963
953
|
hash = @search.last.sphinx_attributes
|
964
954
|
hash['sphinx_internal_id'].should == @search.last.id
|
965
955
|
hash['class_crc'].should == @search.last.class.to_crc32
|
966
956
|
end
|
967
957
|
end
|
968
|
-
|
958
|
+
|
969
959
|
describe '#matching_fields' do
|
970
960
|
it "should add matching_fields method if using fieldmask ranking mode" do
|
971
961
|
search = ThinkingSphinx::Search.new :rank_mode => :fieldmask
|
972
962
|
search.first.should respond_to(:matching_fields)
|
973
963
|
end
|
974
|
-
|
964
|
+
|
975
965
|
it "should not add matching_fields method if object already have one" do
|
976
966
|
search = ThinkingSphinx::Search.new :rank_mode => :fieldmask
|
977
967
|
search.last.matching_fields.should_not be_an(Array)
|
978
968
|
end
|
979
|
-
|
969
|
+
|
980
970
|
it "should return an array" do
|
981
971
|
search = ThinkingSphinx::Search.new :rank_mode => :fieldmask
|
982
972
|
search.first.matching_fields.should be_an(Array)
|
983
973
|
end
|
984
|
-
|
974
|
+
|
985
975
|
it "should return the fields that the bitmask match" do
|
986
976
|
search = ThinkingSphinx::Search.new :rank_mode => :fieldmask
|
987
977
|
search.first.matching_fields.should == ['one', 'three', 'five']
|
988
978
|
end
|
989
979
|
end
|
990
980
|
end
|
991
|
-
|
981
|
+
|
992
982
|
context 'Sphinx errors' do
|
993
983
|
describe '#error?' do
|
994
984
|
before :each do
|
@@ -1010,110 +1000,110 @@ describe ThinkingSphinx::Search do
|
|
1010
1000
|
end
|
1011
1001
|
end
|
1012
1002
|
end
|
1013
|
-
|
1003
|
+
|
1014
1004
|
describe '#current_page' do
|
1015
1005
|
it "should return 1 by default" do
|
1016
1006
|
ThinkingSphinx::Search.new.current_page.should == 1
|
1017
1007
|
end
|
1018
|
-
|
1008
|
+
|
1019
1009
|
it "should handle string page values" do
|
1020
1010
|
ThinkingSphinx::Search.new(:page => '2').current_page.should == 2
|
1021
1011
|
end
|
1022
|
-
|
1012
|
+
|
1023
1013
|
it "should handle empty string page values" do
|
1024
1014
|
ThinkingSphinx::Search.new(:page => '').current_page.should == 1
|
1025
1015
|
end
|
1026
|
-
|
1016
|
+
|
1027
1017
|
it "should return the requested page" do
|
1028
1018
|
ThinkingSphinx::Search.new(:page => 10).current_page.should == 10
|
1029
1019
|
end
|
1030
1020
|
end
|
1031
|
-
|
1021
|
+
|
1032
1022
|
describe '#per_page' do
|
1033
1023
|
it "should return 20 by default" do
|
1034
1024
|
ThinkingSphinx::Search.new.per_page.should == 20
|
1035
1025
|
end
|
1036
|
-
|
1026
|
+
|
1037
1027
|
it "should allow for custom values" do
|
1038
1028
|
ThinkingSphinx::Search.new(:per_page => 30).per_page.should == 30
|
1039
1029
|
end
|
1040
|
-
|
1030
|
+
|
1041
1031
|
it "should prioritise :limit over :per_page if given" do
|
1042
1032
|
ThinkingSphinx::Search.new(
|
1043
1033
|
:per_page => 30, :limit => 40
|
1044
1034
|
).per_page.should == 40
|
1045
1035
|
end
|
1046
|
-
|
1036
|
+
|
1047
1037
|
it "should allow for string arguments" do
|
1048
1038
|
ThinkingSphinx::Search.new(:per_page => '10').per_page.should == 10
|
1049
1039
|
end
|
1050
1040
|
end
|
1051
|
-
|
1041
|
+
|
1052
1042
|
describe '#total_pages' do
|
1053
1043
|
it "should calculate the total pages depending on per_page and total_entries" do
|
1054
1044
|
ThinkingSphinx::Search.new.total_pages.should == 3
|
1055
1045
|
end
|
1056
|
-
|
1046
|
+
|
1057
1047
|
it "should allow for custom per_page values" do
|
1058
1048
|
ThinkingSphinx::Search.new(:per_page => 30).total_pages.should == 2
|
1059
1049
|
end
|
1060
|
-
|
1050
|
+
|
1061
1051
|
it "should not overstep the max_matches implied limit" do
|
1062
1052
|
@client.stub!(:query => {
|
1063
1053
|
:matches => [], :total_found => 41, :total => 40
|
1064
1054
|
})
|
1065
|
-
|
1055
|
+
|
1066
1056
|
ThinkingSphinx::Search.new.total_pages.should == 2
|
1067
1057
|
end
|
1068
|
-
|
1058
|
+
|
1069
1059
|
it "should return 0 if there is no index and therefore no results" do
|
1070
1060
|
@client.stub!(:query => {
|
1071
1061
|
:matches => [], :total_found => nil, :total => nil
|
1072
1062
|
})
|
1073
|
-
|
1063
|
+
|
1074
1064
|
ThinkingSphinx::Search.new.total_pages.should == 0
|
1075
1065
|
end
|
1076
1066
|
end
|
1077
|
-
|
1067
|
+
|
1078
1068
|
describe '#next_page' do
|
1079
1069
|
it "should return one more than the current page" do
|
1080
1070
|
ThinkingSphinx::Search.new.next_page.should == 2
|
1081
1071
|
end
|
1082
|
-
|
1072
|
+
|
1083
1073
|
it "should return nil if on the last page" do
|
1084
1074
|
ThinkingSphinx::Search.new(:page => 3).next_page.should be_nil
|
1085
1075
|
end
|
1086
1076
|
end
|
1087
|
-
|
1077
|
+
|
1088
1078
|
describe '#previous_page' do
|
1089
1079
|
it "should return one less than the current page" do
|
1090
1080
|
ThinkingSphinx::Search.new(:page => 2).previous_page.should == 1
|
1091
1081
|
end
|
1092
|
-
|
1082
|
+
|
1093
1083
|
it "should return nil if on the first page" do
|
1094
1084
|
ThinkingSphinx::Search.new.previous_page.should be_nil
|
1095
1085
|
end
|
1096
1086
|
end
|
1097
|
-
|
1087
|
+
|
1098
1088
|
describe '#total_entries' do
|
1099
1089
|
it "should return the total number of results, not just the amount on the page" do
|
1100
1090
|
ThinkingSphinx::Search.new.total_entries.should == 41
|
1101
1091
|
end
|
1102
|
-
|
1092
|
+
|
1103
1093
|
it "should return 0 if there is no index and therefore no results" do
|
1104
1094
|
@client.stub!(:query => {
|
1105
1095
|
:matches => [], :total_found => nil
|
1106
1096
|
})
|
1107
|
-
|
1097
|
+
|
1108
1098
|
ThinkingSphinx::Search.new.total_entries.should == 0
|
1109
1099
|
end
|
1110
1100
|
end
|
1111
|
-
|
1101
|
+
|
1112
1102
|
describe '#offset' do
|
1113
1103
|
it "should default to 0" do
|
1114
1104
|
ThinkingSphinx::Search.new.offset.should == 0
|
1115
1105
|
end
|
1116
|
-
|
1106
|
+
|
1117
1107
|
it "should increase by the per_page value for each page in" do
|
1118
1108
|
ThinkingSphinx::Search.new(:per_page => 25, :page => 2).offset.should == 25
|
1119
1109
|
end
|
@@ -1122,33 +1112,33 @@ describe ThinkingSphinx::Search do
|
|
1122
1112
|
ThinkingSphinx::Search.new(:offset => 5).offset.should == 5
|
1123
1113
|
end
|
1124
1114
|
end
|
1125
|
-
|
1115
|
+
|
1126
1116
|
describe '#indexes' do
|
1127
1117
|
it "should default to '*'" do
|
1128
1118
|
ThinkingSphinx::Search.new.indexes.should == '*'
|
1129
1119
|
end
|
1130
|
-
|
1120
|
+
|
1131
1121
|
it "should use given class to determine index name" do
|
1132
1122
|
ThinkingSphinx::Search.new(:classes => [Alpha]).indexes.
|
1133
1123
|
should == 'alpha_core'
|
1134
1124
|
end
|
1135
|
-
|
1125
|
+
|
1136
1126
|
it "should add both core and delta indexes for given classes" do
|
1137
1127
|
ThinkingSphinx::Search.new(:classes => [Alpha, Beta]).indexes.
|
1138
1128
|
should == 'alpha_core,beta_core,beta_delta'
|
1139
1129
|
end
|
1140
|
-
|
1130
|
+
|
1141
1131
|
it "should respect the :index option" do
|
1142
1132
|
ThinkingSphinx::Search.new(:classes => [Alpha], :index => '*').indexes.
|
1143
1133
|
should == '*'
|
1144
1134
|
end
|
1145
1135
|
end
|
1146
|
-
|
1136
|
+
|
1147
1137
|
describe '.each_with_groupby_and_count' do
|
1148
1138
|
before :each do
|
1149
1139
|
@alpha = Alpha.new
|
1150
1140
|
@alpha.stub!(:id => 1, :read_attribute => 1)
|
1151
|
-
|
1141
|
+
|
1152
1142
|
@client.stub! :query => {
|
1153
1143
|
:matches => [{
|
1154
1144
|
:attributes => {
|
@@ -1162,7 +1152,7 @@ describe ThinkingSphinx::Search do
|
|
1162
1152
|
}
|
1163
1153
|
Alpha.stub!(:find => [@alpha])
|
1164
1154
|
end
|
1165
|
-
|
1155
|
+
|
1166
1156
|
it "should yield the match, group and count" do
|
1167
1157
|
search = ThinkingSphinx::Search.new
|
1168
1158
|
search.each_with_groupby_and_count do |obj, group, count|
|
@@ -1171,7 +1161,7 @@ describe ThinkingSphinx::Search do
|
|
1171
1161
|
count.should == 5
|
1172
1162
|
end
|
1173
1163
|
end
|
1174
|
-
|
1164
|
+
|
1175
1165
|
it "should be aliased to each_with_group_and_count" do
|
1176
1166
|
search = ThinkingSphinx::Search.new
|
1177
1167
|
search.each_with_group_and_count do |obj, group, count|
|
@@ -1181,12 +1171,12 @@ describe ThinkingSphinx::Search do
|
|
1181
1171
|
end
|
1182
1172
|
end
|
1183
1173
|
end
|
1184
|
-
|
1174
|
+
|
1185
1175
|
describe '.each_with_weighting' do
|
1186
1176
|
before :each do
|
1187
1177
|
@alpha = Alpha.new
|
1188
1178
|
@alpha.stub!(:id => 1, :read_attribute => 1)
|
1189
|
-
|
1179
|
+
|
1190
1180
|
@client.stub! :query => {
|
1191
1181
|
:matches => [{
|
1192
1182
|
:attributes => {
|
@@ -1198,7 +1188,7 @@ describe ThinkingSphinx::Search do
|
|
1198
1188
|
}
|
1199
1189
|
Alpha.stub!(:find => [@alpha])
|
1200
1190
|
end
|
1201
|
-
|
1191
|
+
|
1202
1192
|
it "should yield the match and weight" do
|
1203
1193
|
search = ThinkingSphinx::Search.new
|
1204
1194
|
search.each_with_weighting do |obj, weight|
|
@@ -1207,12 +1197,12 @@ describe ThinkingSphinx::Search do
|
|
1207
1197
|
end
|
1208
1198
|
end
|
1209
1199
|
end
|
1210
|
-
|
1200
|
+
|
1211
1201
|
describe '.each_with_*' do
|
1212
1202
|
before :each do
|
1213
1203
|
@alpha = Alpha.new
|
1214
1204
|
@alpha.stub!(:id => 1, :read_attribute => 1)
|
1215
|
-
|
1205
|
+
|
1216
1206
|
@client.stub! :query => {
|
1217
1207
|
:matches => [{
|
1218
1208
|
:attributes => {
|
@@ -1226,31 +1216,31 @@ describe ThinkingSphinx::Search do
|
|
1226
1216
|
}]
|
1227
1217
|
}
|
1228
1218
|
Alpha.stub!(:find => [@alpha])
|
1229
|
-
|
1219
|
+
|
1230
1220
|
@search = ThinkingSphinx::Search.new
|
1231
1221
|
end
|
1232
|
-
|
1222
|
+
|
1233
1223
|
it "should yield geodist if requested" do
|
1234
1224
|
@search.each_with_geodist do |obj, distance|
|
1235
1225
|
obj.should == @alpha
|
1236
1226
|
distance.should == 101
|
1237
1227
|
end
|
1238
1228
|
end
|
1239
|
-
|
1229
|
+
|
1240
1230
|
it "should yield count if requested" do
|
1241
1231
|
@search.each_with_count do |obj, count|
|
1242
1232
|
obj.should == @alpha
|
1243
1233
|
count.should == 103
|
1244
1234
|
end
|
1245
1235
|
end
|
1246
|
-
|
1236
|
+
|
1247
1237
|
it "should yield groupby if requested" do
|
1248
1238
|
@search.each_with_groupby do |obj, group|
|
1249
1239
|
obj.should == @alpha
|
1250
1240
|
group.should == 102
|
1251
1241
|
end
|
1252
1242
|
end
|
1253
|
-
|
1243
|
+
|
1254
1244
|
it "should still use the array's each_with_index" do
|
1255
1245
|
@search.each_with_index do |obj, index|
|
1256
1246
|
obj.should == @alpha
|
@@ -1258,7 +1248,7 @@ describe ThinkingSphinx::Search do
|
|
1258
1248
|
end
|
1259
1249
|
end
|
1260
1250
|
end
|
1261
|
-
|
1251
|
+
|
1262
1252
|
describe '#excerpt_for' do
|
1263
1253
|
before :each do
|
1264
1254
|
@client.stub!(:excerpts => ['excerpted string'])
|
@@ -1268,53 +1258,53 @@ describe ThinkingSphinx::Search do
|
|
1268
1258
|
})
|
1269
1259
|
@search = ThinkingSphinx::Search.new(:classes => [Alpha])
|
1270
1260
|
end
|
1271
|
-
|
1261
|
+
|
1272
1262
|
it "should return the Sphinx excerpt value" do
|
1273
1263
|
@search.excerpt_for('string').should == 'excerpted string'
|
1274
1264
|
end
|
1275
|
-
|
1265
|
+
|
1276
1266
|
it "should use the given model's core index" do
|
1277
1267
|
@client.should_receive(:excerpts) do |options|
|
1278
1268
|
options[:index].should == 'alpha_core'
|
1279
1269
|
end
|
1280
|
-
|
1270
|
+
|
1281
1271
|
@search.excerpt_for('string')
|
1282
1272
|
end
|
1283
|
-
|
1273
|
+
|
1284
1274
|
it "should respect the provided index option" do
|
1285
1275
|
@search = ThinkingSphinx::Search.new(:classes => [Alpha], :index => 'foo')
|
1286
1276
|
@client.should_receive(:excerpts) do |options|
|
1287
1277
|
options[:index].should == 'foo'
|
1288
1278
|
end
|
1289
|
-
|
1279
|
+
|
1290
1280
|
@search.excerpt_for('string')
|
1291
1281
|
end
|
1292
|
-
|
1282
|
+
|
1293
1283
|
it "should optionally take a second argument to allow for multi-model searches" do
|
1294
1284
|
@client.should_receive(:excerpts) do |options|
|
1295
1285
|
options[:index].should == 'beta_core'
|
1296
1286
|
end
|
1297
|
-
|
1287
|
+
|
1298
1288
|
@search.excerpt_for('string', Beta)
|
1299
1289
|
end
|
1300
|
-
|
1290
|
+
|
1301
1291
|
it "should join the words together" do
|
1302
1292
|
@client.should_receive(:excerpts) do |options|
|
1303
1293
|
options[:words].should == @search.results[:words].keys.join(' ')
|
1304
1294
|
end
|
1305
|
-
|
1295
|
+
|
1306
1296
|
@search.excerpt_for('string', Beta)
|
1307
1297
|
end
|
1308
|
-
|
1298
|
+
|
1309
1299
|
it "should use the correct index in STI situations" do
|
1310
1300
|
@client.should_receive(:excerpts) do |options|
|
1311
1301
|
options[:index].should == 'person_core'
|
1312
1302
|
end
|
1313
|
-
|
1303
|
+
|
1314
1304
|
@search.excerpt_for('string', Parent)
|
1315
1305
|
end
|
1316
1306
|
end
|
1317
|
-
|
1307
|
+
|
1318
1308
|
describe '#search' do
|
1319
1309
|
before :each do
|
1320
1310
|
@search = ThinkingSphinx::Search.new('word',
|
@@ -1322,31 +1312,31 @@ describe ThinkingSphinx::Search do
|
|
1322
1312
|
:with => {:int => 5}
|
1323
1313
|
)
|
1324
1314
|
end
|
1325
|
-
|
1315
|
+
|
1326
1316
|
it "should return itself" do
|
1327
1317
|
@search.search.object_id.should == @search.object_id
|
1328
1318
|
end
|
1329
|
-
|
1319
|
+
|
1330
1320
|
it "should merge in arguments" do
|
1331
1321
|
@client.should_receive(:query) do |query, index, comments|
|
1332
1322
|
query.should == 'word more @field field'
|
1333
1323
|
end
|
1334
|
-
|
1324
|
+
|
1335
1325
|
@search.search('more').first
|
1336
1326
|
end
|
1337
|
-
|
1327
|
+
|
1338
1328
|
it "should merge conditions" do
|
1339
1329
|
@client.should_receive(:query) do |query, index, comments|
|
1340
1330
|
query.should match(/@name plato/)
|
1341
1331
|
query.should match(/@field field/)
|
1342
1332
|
end
|
1343
|
-
|
1333
|
+
|
1344
1334
|
@search.search(:conditions => {:name => 'plato'}).first
|
1345
1335
|
end
|
1346
|
-
|
1336
|
+
|
1347
1337
|
it "should merge filters" do
|
1348
1338
|
@search.search(:with => {:float => 1.5}).first
|
1349
|
-
|
1339
|
+
|
1350
1340
|
@client.filters.detect { |filter|
|
1351
1341
|
filter.attribute == 'float'
|
1352
1342
|
}.should_not be_nil
|
@@ -1355,34 +1345,34 @@ describe ThinkingSphinx::Search do
|
|
1355
1345
|
}.should_not be_nil
|
1356
1346
|
end
|
1357
1347
|
end
|
1358
|
-
|
1348
|
+
|
1359
1349
|
describe '#freeze' do
|
1360
1350
|
before :each do
|
1361
1351
|
@search = ThinkingSphinx::Search.new
|
1362
1352
|
end
|
1363
|
-
|
1353
|
+
|
1364
1354
|
it "should populate the result set" do
|
1365
1355
|
@search.freeze
|
1366
1356
|
@search.should be_populated
|
1367
1357
|
end
|
1368
|
-
|
1358
|
+
|
1369
1359
|
it "should freeze the underlying array" do
|
1370
1360
|
@search.freeze
|
1371
1361
|
@search.to_a.should be_frozen
|
1372
1362
|
end
|
1373
|
-
|
1363
|
+
|
1374
1364
|
it "should return the Search object" do
|
1375
1365
|
@search.freeze.should be_a(ThinkingSphinx::Search)
|
1376
1366
|
end
|
1377
1367
|
end
|
1378
|
-
|
1368
|
+
|
1379
1369
|
describe '#client' do
|
1380
1370
|
let(:client) { Riddle::Client.new }
|
1381
1371
|
it "should respect the client in options" do
|
1382
1372
|
search = ThinkingSphinx::Search.new :client => client
|
1383
1373
|
search.client.should == client
|
1384
1374
|
end
|
1385
|
-
|
1375
|
+
|
1386
1376
|
it "should get a new client from the configuration singleton by default" do
|
1387
1377
|
ThinkingSphinx::Configuration.instance.stub!(:client => client)
|
1388
1378
|
ThinkingSphinx::Search.new.client.should == client
|