picky 1.2.4 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/picky/adapters/rack/base.rb +23 -0
- data/lib/picky/adapters/rack/live_parameters.rb +33 -0
- data/lib/picky/adapters/rack/query.rb +59 -0
- data/lib/picky/adapters/rack.rb +28 -0
- data/lib/picky/alias_instances.rb +2 -0
- data/lib/picky/application.rb +9 -8
- data/lib/picky/cli.rb +25 -3
- data/lib/picky/frontend_adapters/rack.rb +150 -0
- data/lib/picky/helpers/measuring.rb +0 -2
- data/lib/picky/index_api.rb +1 -1
- data/lib/picky/indexed/categories.rb +51 -14
- data/lib/picky/indexers/solr.rb +1 -5
- data/lib/picky/indexing/indexes.rb +6 -0
- data/lib/picky/interfaces/live_parameters.rb +165 -0
- data/lib/picky/loader.rb +13 -2
- data/lib/picky/query/base.rb +15 -18
- data/lib/picky/query/combination.rb +2 -2
- data/lib/picky/query/solr.rb +0 -17
- data/lib/picky/query/token.rb +14 -27
- data/lib/picky/query/weights.rb +13 -1
- data/lib/picky/results/base.rb +9 -2
- data/spec/lib/adapters/rack/base_spec.rb +24 -0
- data/spec/lib/adapters/rack/live_parameters_spec.rb +21 -0
- data/spec/lib/adapters/rack/query_spec.rb +33 -0
- data/spec/lib/application_spec.rb +27 -8
- data/spec/lib/cli_spec.rb +9 -0
- data/spec/lib/extensions/symbol_spec.rb +1 -3
- data/spec/lib/{routing_spec.rb → frontend_adapters/rack_spec.rb} +69 -66
- data/spec/lib/indexed/categories_spec.rb +24 -0
- data/spec/lib/interfaces/live_parameters_spec.rb +138 -0
- data/spec/lib/query/base_spec.rb +10 -14
- data/spec/lib/query/live_spec.rb +1 -30
- data/spec/lib/query/token_spec.rb +72 -5
- data/spec/lib/query/weights_spec.rb +59 -36
- data/spec/lib/results/base_spec.rb +13 -1
- metadata +20 -7
- data/lib/picky/routing.rb +0 -171
@@ -2,10 +2,11 @@
|
|
2
2
|
#
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe
|
5
|
+
describe FrontendAdapters::Rack do
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@
|
8
|
+
@rack_adapter = FrontendAdapters::Rack.new
|
9
|
+
@rack_adapter.stub! :exclaim
|
9
10
|
end
|
10
11
|
|
11
12
|
def rack_defaults_for url
|
@@ -38,64 +39,64 @@ describe Routing do
|
|
38
39
|
context 'empty?' do
|
39
40
|
context 'no routes' do
|
40
41
|
before(:each) do
|
41
|
-
@
|
42
|
+
@rack_adapter.reset_routes
|
42
43
|
end
|
43
44
|
it 'returns the right answer' do
|
44
|
-
@
|
45
|
+
@rack_adapter.empty?.should == true
|
45
46
|
end
|
46
47
|
end
|
47
48
|
context 'with routes' do
|
48
49
|
before(:each) do
|
49
|
-
@
|
50
|
+
@rack_adapter.route %r{something} => Query::Full.new
|
50
51
|
end
|
51
52
|
it 'returns the right answer' do
|
52
|
-
@
|
53
|
+
@rack_adapter.empty?.should == false
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
58
|
context 'real routes' do
|
58
59
|
before(:each) do
|
59
|
-
@
|
60
|
+
@rack_adapter.reset_routes
|
60
61
|
PickyLog.stub! :log
|
61
62
|
end
|
62
63
|
it 'should route correctly' do
|
63
64
|
env = {}
|
64
65
|
|
65
|
-
@
|
66
|
-
@
|
66
|
+
@rack_adapter.routes.freeze
|
67
|
+
@rack_adapter.call(env).should == [404, {"Content-Type" => "text/html", "X-Cascade" => "pass"}, ["Not Found"]]
|
67
68
|
end
|
68
69
|
it 'should route correctly' do
|
69
70
|
env = rack_defaults_for '/'
|
70
71
|
|
71
|
-
@
|
72
|
+
@rack_adapter.root 200
|
72
73
|
|
73
|
-
@
|
74
|
-
@
|
74
|
+
@rack_adapter.routes.freeze
|
75
|
+
@rack_adapter.call(env).should == [200, {"Content-Type"=>"text/html", "Content-Length"=>"0"}, ['']]
|
75
76
|
end
|
76
77
|
it 'should route correctly' do
|
77
78
|
env = rack_defaults_for '/blarf'
|
78
79
|
|
79
|
-
@
|
80
|
+
@rack_adapter.default 200
|
80
81
|
|
81
|
-
@
|
82
|
-
@
|
82
|
+
@rack_adapter.routes.freeze
|
83
|
+
@rack_adapter.call(env).should == [200, {"Content-Type"=>"text/html", "Content-Length"=>"0"}, ['']]
|
83
84
|
end
|
84
85
|
it 'should route correctly' do
|
85
86
|
env = rack_defaults_for '/gurk'
|
86
87
|
|
87
|
-
@
|
88
|
+
@rack_adapter.answer %r{/gurk}, lambda { |env| [333, {}, ['this is gurk']] }
|
88
89
|
|
89
|
-
@
|
90
|
-
@
|
90
|
+
@rack_adapter.routes.freeze
|
91
|
+
@rack_adapter.call(env).should == [333, {}, ['this is gurk']]
|
91
92
|
end
|
92
93
|
it 'should route correctly' do
|
93
94
|
env = rack_defaults_for '/gurk'
|
94
95
|
|
95
|
-
@
|
96
|
+
@rack_adapter.answer '/gurk', lambda { |env| [333, {}, ['this is gurk']] }
|
96
97
|
|
97
|
-
@
|
98
|
-
@
|
98
|
+
@rack_adapter.routes.freeze
|
99
|
+
@rack_adapter.call(env).should == [333, {}, ['this is gurk']]
|
99
100
|
end
|
100
101
|
it 'should route correctly' do
|
101
102
|
env = rack_defaults_for '/searches/some_route?query=some_query'
|
@@ -104,10 +105,10 @@ describe Routing do
|
|
104
105
|
full.should_receive(:search_with_text).once.with(anything, 0).and_return(Results::Full.new)
|
105
106
|
Query::Full.stub! :new => full
|
106
107
|
|
107
|
-
@
|
108
|
+
@rack_adapter.route '/searches/some_route' => Query::Full.new(:some_index, :some_other_index)
|
108
109
|
|
109
|
-
@
|
110
|
-
@
|
110
|
+
@rack_adapter.routes.freeze
|
111
|
+
@rack_adapter.call(env).should == [200, {"Content-Type"=>"application/json", "Content-Length"=>"52"}, ["{\"allocations\":[],\"offset\":0,\"duration\":0,\"total\":0}"]]
|
111
112
|
end
|
112
113
|
it 'should route correctly' do
|
113
114
|
env = rack_defaults_for '/searches/some_route?query=some_query&type=some_type'
|
@@ -116,10 +117,10 @@ describe Routing do
|
|
116
117
|
full.should_receive(:search_with_text).once.with(anything, 0).and_return(Results::Full.new)
|
117
118
|
Query::Full.stub! :new => full
|
118
119
|
|
119
|
-
@
|
120
|
+
@rack_adapter.route '/searches/some_route' => Query::Full.new(:some_index, :some_other_index), :query => { :type => :some_type }
|
120
121
|
|
121
|
-
@
|
122
|
-
@
|
122
|
+
@rack_adapter.routes.freeze
|
123
|
+
@rack_adapter.call(env).should == [200, {"Content-Type"=>"application/json", "Content-Length"=>"52"}, ["{\"allocations\":[],\"offset\":0,\"duration\":0,\"total\":0}"]]
|
123
124
|
end
|
124
125
|
it 'should route correctly' do
|
125
126
|
env = rack_defaults_for '/searches/some_wrong_route?query=some_query'
|
@@ -128,36 +129,31 @@ describe Routing do
|
|
128
129
|
full.should_receive(:search_with_text).never
|
129
130
|
Query::Full.stub! :new => full
|
130
131
|
|
131
|
-
@
|
132
|
+
@rack_adapter.route '/searches/some_route' => Query::Full.new(:some_index, :some_other_index)
|
132
133
|
|
133
|
-
@
|
134
|
-
@
|
134
|
+
@rack_adapter.routes.freeze
|
135
|
+
@rack_adapter.call(env).should == [404, {"Content-Type"=>"text/html", "X-Cascade"=>"pass"}, ["Not Found"]]
|
135
136
|
end
|
136
137
|
end
|
137
138
|
|
138
139
|
context 'stubbed routes' do
|
139
140
|
before(:each) do
|
140
141
|
@routes = stub :routes
|
141
|
-
@
|
142
|
-
end
|
143
|
-
describe 'call' do
|
144
|
-
it 'should description' do
|
145
|
-
|
146
|
-
end
|
142
|
+
@rack_adapter.stub! :routes => @routes
|
147
143
|
end
|
148
144
|
|
149
145
|
describe 'generate_query_string' do
|
150
146
|
it 'should not allow an empty query condition' do
|
151
147
|
lambda {
|
152
|
-
@
|
148
|
+
@rack_adapter.generate_query_string({}).should == 'this=must_be'
|
153
149
|
}.should raise_error "At least one query string condition is needed."
|
154
150
|
end
|
155
151
|
it 'should handle a single condition' do
|
156
|
-
@
|
152
|
+
@rack_adapter.generate_query_string(:this => :must_be).should == 'this=must_be'
|
157
153
|
end
|
158
154
|
it 'should not allow multiple query strings' do
|
159
155
|
lambda {
|
160
|
-
@
|
156
|
+
@rack_adapter.generate_query_string(:this => :must_be, :that => :should_be).should == 'this=must_be|that=should_be'
|
161
157
|
}.should raise_error "Too many query param conditions (only 1 allowed): {:this=>:must_be, :that=>:should_be}"
|
162
158
|
end
|
163
159
|
it 'should be sanity checked' do
|
@@ -167,62 +163,69 @@ describe Routing do
|
|
167
163
|
|
168
164
|
describe "route" do
|
169
165
|
it "should delegate correctly" do
|
170
|
-
@
|
171
|
-
@
|
166
|
+
@rack_adapter.should_receive(:route_one).once.with %r{regexp1}, :query1, {}
|
167
|
+
@rack_adapter.should_receive(:route_one).once.with %r{regexp2}, :query2, {}
|
172
168
|
|
173
|
-
@
|
169
|
+
@rack_adapter.route %r{regexp1} => :query1, %r{regexp2} => :query2
|
174
170
|
end
|
175
171
|
it "should split options correctly" do
|
176
|
-
@
|
177
|
-
@
|
172
|
+
@rack_adapter.should_receive(:route_one).once.with %r{regexp1}, :query1, :some => :option
|
173
|
+
@rack_adapter.should_receive(:route_one).once.with %r{regexp2}, :query2, :some => :option
|
178
174
|
|
179
|
-
@
|
175
|
+
@rack_adapter.route %r{regexp1} => :query1, %r{regexp2} => :query2, :some => :option
|
180
176
|
end
|
181
177
|
it 'does not accept nil queries' do
|
182
|
-
lambda { @
|
178
|
+
lambda { @rack_adapter.route %r{some/regexp} => nil }.should raise_error(FrontendAdapters::Rack::RouteTargetNilError, /Routing for \/some\\\/regexp\/ was defined with a nil target object, i.e. \/some\\\/regexp\/ => nil./)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe 'finalize' do
|
183
|
+
before(:each) do
|
184
|
+
@rack_adapter.routes.should_receive(:freeze).once.with
|
185
|
+
|
186
|
+
@rack_adapter.finalize
|
183
187
|
end
|
184
188
|
end
|
185
189
|
|
186
190
|
describe 'route_one' do
|
187
191
|
before(:each) do
|
188
|
-
|
189
|
-
@routing.stub! :generate_app => @some_query_app
|
192
|
+
Adapters::Rack.stub! :app_for => :some_query_app
|
190
193
|
end
|
191
194
|
it 'should add the right route' do
|
192
|
-
@routes.should_receive(:add_route).once.with
|
195
|
+
@routes.should_receive(:add_route).once.with :some_query_app, { :request_method => "GET", :path_info => /some_url/ }
|
193
196
|
|
194
|
-
@
|
197
|
+
@rack_adapter.route_one %r{some_url}, :some_query, {}
|
195
198
|
end
|
196
199
|
it 'should add the right route' do
|
197
|
-
@routes.should_receive(:add_route).once.with
|
200
|
+
@routes.should_receive(:add_route).once.with :some_query_app, { :request_method => "GET", :path_info => /some_url/ }
|
198
201
|
|
199
|
-
@
|
202
|
+
@rack_adapter.route_one 'some_url', :some_query, {}
|
200
203
|
end
|
201
204
|
it 'should add the right route' do
|
202
|
-
@routes.should_receive(:add_route).once.with
|
205
|
+
@routes.should_receive(:add_route).once.with :some_query_app, { :request_method => "GET", :glarf => :blarf, :path_info => /some_url/ }
|
203
206
|
|
204
|
-
@
|
207
|
+
@rack_adapter.route_one 'some_url', :some_query, { :glarf => :blarf }
|
205
208
|
end
|
206
209
|
end
|
207
210
|
|
208
211
|
describe 'default' do
|
209
212
|
it 'should call answer' do
|
210
|
-
@
|
213
|
+
@rack_adapter.should_receive(:answer).once.with nil, FrontendAdapters::Rack::STATUSES[200]
|
211
214
|
|
212
|
-
@
|
215
|
+
@rack_adapter.default 200
|
213
216
|
end
|
214
217
|
end
|
215
218
|
|
216
219
|
describe 'root' do
|
217
220
|
it 'should call answer' do
|
218
|
-
@
|
221
|
+
@rack_adapter.should_receive(:answer).once.with %r{^/$}, FrontendAdapters::Rack::STATUSES[200]
|
219
222
|
|
220
|
-
@
|
223
|
+
@rack_adapter.root 200
|
221
224
|
end
|
222
225
|
it 'should call answer' do
|
223
|
-
@
|
226
|
+
@rack_adapter.should_receive(:answer).once.with %r{^/$}, FrontendAdapters::Rack::STATUSES[404]
|
224
227
|
|
225
|
-
@
|
228
|
+
@rack_adapter.root 404
|
226
229
|
end
|
227
230
|
end
|
228
231
|
|
@@ -235,30 +238,30 @@ describe Routing do
|
|
235
238
|
it 'should use the app with default_options from the url' do
|
236
239
|
@routes.should_receive(:add_route).once.with @app, { :request_method => "GET", :path_info => /some_url/ }
|
237
240
|
|
238
|
-
@
|
241
|
+
@rack_adapter.answer 'some_url', @app
|
239
242
|
end
|
240
243
|
end
|
241
244
|
context 'without url' do
|
242
245
|
it 'should use the app with default_options' do
|
243
246
|
@routes.should_receive(:add_route).once.with @app, { :request_method => "GET" }
|
244
247
|
|
245
|
-
@
|
248
|
+
@rack_adapter.answer nil, @app
|
246
249
|
end
|
247
250
|
end
|
248
251
|
end
|
249
252
|
context 'without app' do
|
250
253
|
context 'with url' do
|
251
254
|
it 'should use the 404 with default_options from the url' do
|
252
|
-
@routes.should_receive(:add_route).once.with
|
255
|
+
@routes.should_receive(:add_route).once.with FrontendAdapters::Rack::STATUSES[200], { :request_method => "GET", :path_info => /some_url/ }
|
253
256
|
|
254
|
-
@
|
257
|
+
@rack_adapter.answer 'some_url'
|
255
258
|
end
|
256
259
|
end
|
257
260
|
context 'without url' do
|
258
261
|
it 'should use the 404 with default_options' do
|
259
|
-
@routes.should_receive(:add_route).once.with
|
262
|
+
@routes.should_receive(:add_route).once.with FrontendAdapters::Rack::STATUSES[200], { :request_method => "GET" }
|
260
263
|
|
261
|
-
@
|
264
|
+
@rack_adapter.answer
|
262
265
|
end
|
263
266
|
end
|
264
267
|
end
|
@@ -39,6 +39,30 @@ describe Indexed::Categories do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
describe 'clear' do
|
43
|
+
before(:each) do
|
44
|
+
@categories = Indexed::Categories.new
|
45
|
+
end
|
46
|
+
it 'is clear right at the beginning' do
|
47
|
+
@categories.categories.should be_empty
|
48
|
+
@categories.category_hash.should be_empty
|
49
|
+
end
|
50
|
+
it "isn't clear anymore after adding" do
|
51
|
+
@categories << stub(:category, :name => :some_name)
|
52
|
+
|
53
|
+
@categories.categories.should_not be_empty
|
54
|
+
@categories.category_hash.should_not be_empty
|
55
|
+
end
|
56
|
+
it "is clear again after clearing" do
|
57
|
+
@categories << stub(:category, :name => :some_name)
|
58
|
+
|
59
|
+
@categories.clear
|
60
|
+
|
61
|
+
@categories.categories.should be_empty
|
62
|
+
@categories.category_hash.should be_empty
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
42
66
|
context 'without options' do
|
43
67
|
before(:each) do
|
44
68
|
@index1 = stub :index1, :name => :some_index
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe LiveParameters do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@parent = stub :parent
|
9
|
+
@child = stub :child
|
10
|
+
IO.stub! :pipe => [@child, @parent]
|
11
|
+
@parameters = LiveParameters.new
|
12
|
+
@parameters.stub! :exclaim
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Interfaces::LiveParameters::CouldNotUpdateConfigurationError do
|
16
|
+
before(:each) do
|
17
|
+
@error = Interfaces::LiveParameters::CouldNotUpdateConfigurationError.new :some_key, 'some message'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'parameters' do
|
22
|
+
context 'all goes well' do
|
23
|
+
it 'does a few things in order' do
|
24
|
+
@parameters.should_receive(:close_child).once.with().ordered
|
25
|
+
@parameters.should_receive(:try_updating_configuration_with).once.with(:a => :b).ordered
|
26
|
+
@parameters.should_receive(:write_parent).once.with(:a => :b).ordered
|
27
|
+
@parameters.should_receive(:extract_configuration).once.with().ordered
|
28
|
+
|
29
|
+
@parameters.parameters :a => :b
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context 'updating failed' do
|
33
|
+
before(:each) do
|
34
|
+
@parameters.should_receive(:try_updating_configuration_with).and_raise Interfaces::LiveParameters::CouldNotUpdateConfigurationError.new(:a, 'hello')
|
35
|
+
end
|
36
|
+
it 'kills itself and returns' do
|
37
|
+
@parameters.should_receive(:close_child).once.ordered
|
38
|
+
@parameters.should_receive(:harakiri).once.ordered
|
39
|
+
|
40
|
+
@parameters.parameters( :a => :b ).should == { :a => :ERROR }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'harakiri' do
|
46
|
+
before(:each) do
|
47
|
+
Process.stub! :pid => :some_pid
|
48
|
+
end
|
49
|
+
it 'kills itself' do
|
50
|
+
Process.should_receive(:kill).once.with :QUIT, :some_pid
|
51
|
+
|
52
|
+
@parameters.harakiri
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'write_parent' do
|
57
|
+
before(:each) do
|
58
|
+
Process.stub! :pid => :some_pid
|
59
|
+
end
|
60
|
+
it 'calls the parent' do
|
61
|
+
@parent.should_receive(:write).once.with "[:some_pid, {:a=>:b}];;;"
|
62
|
+
|
63
|
+
@parameters.write_parent :a => :b
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'close_child' do
|
68
|
+
context 'child is closed' do
|
69
|
+
before(:each) do
|
70
|
+
@child.stub! :closed? => true
|
71
|
+
end
|
72
|
+
it 'does not receive close' do
|
73
|
+
@child.should_receive(:close).never
|
74
|
+
|
75
|
+
@parameters.close_child
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context 'child not yet closed' do
|
79
|
+
before(:each) do
|
80
|
+
@child.stub! :closed? => false
|
81
|
+
end
|
82
|
+
it 'does receives close' do
|
83
|
+
@child.should_receive(:close).once.with()
|
84
|
+
|
85
|
+
@parameters.close_child
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'kill_worker' do
|
91
|
+
context 'all goes well' do
|
92
|
+
it 'uses Process.kill' do
|
93
|
+
Process.should_receive(:kill).once.with :some_signal, :some_pid
|
94
|
+
|
95
|
+
@parameters.kill_worker :some_signal, :some_pid
|
96
|
+
end
|
97
|
+
end
|
98
|
+
context 'there is no such process' do
|
99
|
+
it 'uses Process.kill' do
|
100
|
+
Process.should_receive(:kill).and_raise Errno::ESRCH.new
|
101
|
+
|
102
|
+
@parameters.should_receive(:remove_worker).once.with :some_pid
|
103
|
+
|
104
|
+
@parameters.kill_worker :some_signal, :some_pid
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'kill_each_worker_except' do
|
110
|
+
context 'worker pid in the worker pids' do
|
111
|
+
before(:each) do
|
112
|
+
@parameters.stub! :worker_pids => [1,2,3,4]
|
113
|
+
end
|
114
|
+
it 'kills each except the one' do
|
115
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 1)
|
116
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 2)
|
117
|
+
|
118
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 4)
|
119
|
+
|
120
|
+
@parameters.kill_each_worker_except 3
|
121
|
+
end
|
122
|
+
end
|
123
|
+
context 'worker pid not in the worker pids (unrealistic, but...)' do
|
124
|
+
before(:each) do
|
125
|
+
@parameters.stub! :worker_pids => [1,2,3,4]
|
126
|
+
end
|
127
|
+
it 'kills each except the one' do
|
128
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 1)
|
129
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 2)
|
130
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 3)
|
131
|
+
@parameters.should_receive(:kill_worker).once.with(:KILL, 4)
|
132
|
+
|
133
|
+
@parameters.kill_each_worker_except 5
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
data/spec/lib/query/base_spec.rb
CHANGED
@@ -123,26 +123,22 @@ describe 'Query::Base' do
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
126
|
-
|
127
|
-
describe
|
128
|
-
|
126
|
+
|
127
|
+
describe 'to_s' do
|
128
|
+
context 'with weights' do
|
129
129
|
before(:each) do
|
130
|
-
@query = Query::Full.new @index
|
130
|
+
@query = Query::Full.new @index, weights: :some_weights
|
131
131
|
end
|
132
|
-
it
|
133
|
-
|
134
|
-
|
135
|
-
@query.results_from allocations
|
132
|
+
it 'works correctly' do
|
133
|
+
@query.to_s.should == 'Query::Full, weights: some_weights'
|
136
134
|
end
|
137
135
|
end
|
138
|
-
|
136
|
+
context 'without weights' do
|
139
137
|
before(:each) do
|
140
|
-
@query = Query::
|
138
|
+
@query = Query::Full.new @index
|
141
139
|
end
|
142
|
-
it
|
143
|
-
|
144
|
-
|
145
|
-
@query.results_from allocations
|
140
|
+
it 'works correctly' do
|
141
|
+
@query.to_s.should == 'Query::Full'
|
146
142
|
end
|
147
143
|
end
|
148
144
|
end
|
data/spec/lib/query/live_spec.rb
CHANGED
@@ -21,40 +21,11 @@ describe Query::Live do
|
|
21
21
|
@query = Query::Live.new @index
|
22
22
|
end
|
23
23
|
it "should get allocations" do
|
24
|
-
@query.should_receive
|
24
|
+
@query.result_type.should_receive :from
|
25
25
|
@query.should_receive(:sorted_allocations).once
|
26
26
|
|
27
27
|
@query.execute 'some_query', 0
|
28
28
|
end
|
29
|
-
it "should generate a max amount of results from allocations" do
|
30
|
-
allocations = stub :allocations
|
31
|
-
@query.should_receive(:sorted_allocations).and_return allocations
|
32
|
-
|
33
|
-
@query.should_receive(:results_from).once.with(0, allocations).and_return stub(:results, :prepare! => true)
|
34
|
-
|
35
|
-
@query.execute 'some query', 0
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "results_from" do
|
40
|
-
describe "with empty ids" do
|
41
|
-
before(:each) do
|
42
|
-
@query = Query::Live.new @index
|
43
|
-
@allocations = stub :allocations, :total => 0, :ids => [], :to_result => :some_results, :process! => nil
|
44
|
-
end
|
45
|
-
it "should generate a result" do
|
46
|
-
@query.results_from(@allocations).should be_kind_of Results::Live
|
47
|
-
end
|
48
|
-
it "should generate a result with 0 result count" do
|
49
|
-
@query.results_from(@allocations).total.should == 0
|
50
|
-
end
|
51
|
-
it "should generate a result with 0 duration" do
|
52
|
-
@query.results_from(@allocations).duration.should == 0
|
53
|
-
end
|
54
|
-
it "should generate a result with the allocations" do
|
55
|
-
@query.results_from(0, @allocations).allocations.should == @allocations
|
56
|
-
end
|
57
|
-
end
|
58
29
|
end
|
59
30
|
|
60
31
|
end
|
@@ -8,6 +8,73 @@ describe Query::Token do
|
|
8
8
|
Query::Qualifiers.instance.prepare
|
9
9
|
end
|
10
10
|
|
11
|
+
describe 'next_similar_token' do
|
12
|
+
before(:each) do
|
13
|
+
@bundle = stub :bundle, :similar => [:array, :of, :similar]
|
14
|
+
@category = stub :category, :bundle_for => @bundle
|
15
|
+
|
16
|
+
@token = Query::Token.processed 'similar~'
|
17
|
+
end
|
18
|
+
it 'returns the right next tokens' do
|
19
|
+
next_token = @token.next_similar_token @category
|
20
|
+
next_token.text.should == :array
|
21
|
+
next_token = next_token.next_similar_token @category
|
22
|
+
next_token.text.should == :of
|
23
|
+
next_token = next_token.next_similar_token @category
|
24
|
+
next_token.text.should == :similar
|
25
|
+
next_token = next_token.next_similar_token @category
|
26
|
+
next_token.should == nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'next_similar' do
|
31
|
+
before(:each) do
|
32
|
+
@bundle = stub :bundle
|
33
|
+
end
|
34
|
+
context 'similar' do
|
35
|
+
context 'with stub' do
|
36
|
+
before(:each) do
|
37
|
+
@bundle.stub! :similar => [:array, :of, :similar]
|
38
|
+
|
39
|
+
@token = Query::Token.processed 'similar~'
|
40
|
+
end
|
41
|
+
it 'generates all similar' do
|
42
|
+
@token.next_similar(@bundle).should == :array
|
43
|
+
@token.next_similar(@bundle).should == :of
|
44
|
+
@token.next_similar(@bundle).should == :similar
|
45
|
+
@token.next_similar(@bundle).should == nil
|
46
|
+
end
|
47
|
+
it 'should have a certain text' do
|
48
|
+
@token.next_similar @bundle
|
49
|
+
@token.next_similar @bundle
|
50
|
+
@token.next_similar @bundle
|
51
|
+
@token.next_similar @bundle
|
52
|
+
|
53
|
+
@token.text.should == :similar
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
context 'non-similar' do
|
58
|
+
context 'with stub' do
|
59
|
+
before(:each) do
|
60
|
+
@bundle.stub! :similar => [:array, :of, :similar]
|
61
|
+
|
62
|
+
@token = Query::Token.processed 'nonsimilar'
|
63
|
+
end
|
64
|
+
it 'generates all similar' do
|
65
|
+
@token.next_similar(@bundle).should == nil
|
66
|
+
end
|
67
|
+
# TODO
|
68
|
+
#
|
69
|
+
# it 'should have a certain text' do
|
70
|
+
# @token.next_similar @bundle
|
71
|
+
#
|
72
|
+
# @token.text.should == :nonsimilar
|
73
|
+
# end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
11
78
|
describe "generate_similarity_for" do
|
12
79
|
before(:each) do
|
13
80
|
@bundle = stub :bundle
|
@@ -18,16 +85,16 @@ describe Query::Token do
|
|
18
85
|
before(:each) do
|
19
86
|
@bundle.stub! :similar => [:array, :of, :similar]
|
20
87
|
end
|
21
|
-
it "returns an
|
22
|
-
@token.generate_similarity_for(@bundle).
|
88
|
+
it "returns an array of the right size" do
|
89
|
+
@token.generate_similarity_for(@bundle).size.should == 3
|
23
90
|
end
|
24
91
|
end
|
25
92
|
context "without similar" do
|
26
93
|
before(:each) do
|
27
|
-
@bundle.stub! :similar =>
|
94
|
+
@bundle.stub! :similar => []
|
28
95
|
end
|
29
|
-
it "returns an
|
30
|
-
@token.generate_similarity_for(@bundle).
|
96
|
+
it "returns an array of the right size" do
|
97
|
+
@token.generate_similarity_for(@bundle).size.should == 0
|
31
98
|
end
|
32
99
|
end
|
33
100
|
end
|