tire 0.4.0.pre → 0.4.0.rc
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/README.markdown +6 -10
- data/examples/rails-application-template.rb +6 -6
- data/examples/tire-dsl.rb +10 -9
- data/lib/tire.rb +8 -0
- data/lib/tire/dsl.rb +7 -6
- data/lib/tire/index.rb +22 -12
- data/lib/tire/model/import.rb +3 -2
- data/lib/tire/model/indexing.rb +21 -13
- data/lib/tire/model/naming.rb +2 -1
- data/lib/tire/model/persistence.rb +1 -1
- data/lib/tire/results/collection.rb +20 -17
- data/lib/tire/results/item.rb +1 -1
- data/lib/tire/rubyext/ruby_1_8.rb +7 -0
- data/lib/tire/search.rb +33 -19
- data/lib/tire/search/facet.rb +5 -0
- data/lib/tire/search/query.rb +8 -3
- data/lib/tire/tasks.rb +47 -14
- data/lib/tire/utils.rb +17 -0
- data/lib/tire/version.rb +13 -2
- data/test/integration/active_model_indexing_test.rb +1 -0
- data/test/integration/active_model_searchable_test.rb +7 -5
- data/test/integration/active_record_searchable_test.rb +159 -72
- data/test/integration/count_test.rb +34 -0
- data/test/integration/dsl_search_test.rb +22 -0
- data/test/integration/explanation_test.rb +44 -0
- data/test/integration/facets_test.rb +15 -0
- data/test/integration/fuzzy_queries_test.rb +20 -0
- data/test/integration/mongoid_searchable_test.rb +1 -0
- data/test/integration/persistent_model_test.rb +22 -1
- data/test/integration/text_query_test.rb +17 -3
- data/test/models/active_record_models.rb +43 -1
- data/test/models/mongoid_models.rb +0 -1
- data/test/models/persistent_article_in_namespace.rb +12 -0
- data/test/models/supermodel_article.rb +5 -10
- data/test/test_helper.rb +16 -2
- data/test/unit/index_test.rb +90 -16
- data/test/unit/model_import_test.rb +4 -4
- data/test/unit/model_search_test.rb +13 -10
- data/test/unit/results_collection_test.rb +6 -0
- data/test/unit/results_item_test.rb +8 -0
- data/test/unit/search_facet_test.rb +9 -0
- data/test/unit/search_query_test.rb +36 -7
- data/test/unit/search_test.rb +70 -1
- data/test/unit/tire_test.rb +23 -12
- data/tire.gemspec +11 -8
- metadata +90 -48
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class CountIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Count" do
|
9
|
+
|
10
|
+
should "return total number of hits for the query, but no hits" do
|
11
|
+
s = Tire.search 'articles-test', :search_type => 'count' do
|
12
|
+
query { term :tags, 'ruby' }
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_equal 2, s.results.total
|
16
|
+
assert_equal 0, s.results.count
|
17
|
+
assert s.results.empty?
|
18
|
+
end
|
19
|
+
|
20
|
+
should "return facets in results" do
|
21
|
+
s = Tire.search 'articles-test', :search_type => 'count' do
|
22
|
+
query { term :tags, 'ruby' }
|
23
|
+
facet('tags') { terms :tags }
|
24
|
+
end
|
25
|
+
|
26
|
+
assert ! s.results.facets['tags'].empty?
|
27
|
+
assert_equal 2, s.results.facets['tags']['terms'].select { |t| t['term'] == 'ruby' }. first['count']
|
28
|
+
assert_equal 1, s.results.facets['tags']['terms'].select { |t| t['term'] == 'python' }.first['count']
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class DSLSearchIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "DSL" do
|
9
|
+
|
10
|
+
should "allow passing search payload as a Hash" do
|
11
|
+
s = Tire.search 'articles-test', :query => { :query_string => { :query => 'ruby' } },
|
12
|
+
:facets => { 'tags' => { :filter => { :term => {:tags => 'ruby' } } } }
|
13
|
+
# p s.results
|
14
|
+
assert_equal 2, s.results.count
|
15
|
+
assert_equal 2, s.results.facets['tags']['count']
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class ExplanationIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Explanation" do
|
9
|
+
teardown { Tire.index('explanation-test').delete }
|
10
|
+
|
11
|
+
setup do
|
12
|
+
content = "A Fox one day fell into a deep well and could find no means of escape."
|
13
|
+
|
14
|
+
Tire.index 'explanation-test' do
|
15
|
+
delete
|
16
|
+
create
|
17
|
+
store :id => 1, :content => content
|
18
|
+
refresh
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
should "add '_explanation' field to the result item" do
|
23
|
+
# Tire::Configuration.logger STDERR, :level => 'debug'
|
24
|
+
s = Tire.search 'explanation-test', :explain => true do
|
25
|
+
query do
|
26
|
+
boolean do
|
27
|
+
should { string 'content:Fox' }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
doc = s.results.first
|
33
|
+
|
34
|
+
explanation = doc._explanation
|
35
|
+
|
36
|
+
assert explanation.description.include?("product of:")
|
37
|
+
assert explanation.value < 0.6
|
38
|
+
assert_not_nil explanation.details
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -210,6 +210,21 @@ module Tire
|
|
210
210
|
|
211
211
|
end
|
212
212
|
|
213
|
+
context "filter" do
|
214
|
+
should "return a filtered facet" do
|
215
|
+
s = Tire.search('articles-test') do
|
216
|
+
query { all }
|
217
|
+
facet 'filtered' do
|
218
|
+
filter :tags, 'ruby'
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
assert_equal 5, s.results.size, s.results.inspect
|
223
|
+
facets = s.results.facets["filtered"]
|
224
|
+
assert_equal 2, facets["count"], facets.inspect
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
213
228
|
end
|
214
229
|
|
215
230
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class FuzzyQueryIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Fuzzy query" do
|
9
|
+
should "fuzzily find article by tag" do
|
10
|
+
results = Tire.search('articles-test') { query { fuzzy :tags, 'irlang' } }.results
|
11
|
+
|
12
|
+
assert_equal 1, results.count
|
13
|
+
assert_equal ["erlang"], results.first[:tags]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -17,7 +17,6 @@ module Tire
|
|
17
17
|
end
|
18
18
|
|
19
19
|
context "PersistentModel" do
|
20
|
-
|
21
20
|
should "search with simple query" do
|
22
21
|
PersistentArticle.create :id => 1, :title => 'One'
|
23
22
|
PersistentArticle.index.refresh
|
@@ -88,6 +87,28 @@ module Tire
|
|
88
87
|
assert_equal 2, results.num_pages
|
89
88
|
assert_equal 0, results.offset_value
|
90
89
|
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
context "with namespaced models" do
|
94
|
+
setup do
|
95
|
+
MyNamespace::PersistentArticleInNamespace.create :title => 'Test'
|
96
|
+
MyNamespace::PersistentArticleInNamespace.index.refresh
|
97
|
+
end
|
98
|
+
|
99
|
+
teardown do
|
100
|
+
MyNamespace::PersistentArticleInNamespace.index.delete
|
101
|
+
end
|
102
|
+
|
103
|
+
should "find the document in the index" do
|
104
|
+
results = MyNamespace::PersistentArticleInNamespace.search 'test'
|
105
|
+
|
106
|
+
assert results.any?, "No results returned: #{results.inspect}"
|
107
|
+
assert_equal 1, results.count
|
108
|
+
|
109
|
+
assert_instance_of MyNamespace::PersistentArticleInNamespace, results.first
|
110
|
+
end
|
111
|
+
|
91
112
|
end
|
92
113
|
|
93
114
|
end
|
@@ -7,17 +7,31 @@ module Tire
|
|
7
7
|
|
8
8
|
context "Text query" do
|
9
9
|
setup do
|
10
|
-
|
11
|
-
|
10
|
+
Tire.index('articles-test') do
|
11
|
+
store :type => 'article', :title => '+1 !!!'
|
12
|
+
store :type => 'article', :title => 'Furry Kitten'
|
13
|
+
refresh
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
should "find article by title" do
|
15
|
-
results = Tire.search('articles-test')
|
18
|
+
results = Tire.search('articles-test') do
|
19
|
+
query { text :title, '+1' }
|
20
|
+
end.results
|
16
21
|
|
17
22
|
assert_equal 1, results.count
|
18
23
|
assert_equal "+1 !!!", results.first[:title]
|
19
24
|
end
|
20
25
|
|
26
|
+
should "allow to pass options (fuzziness)" do
|
27
|
+
results = Tire.search('articles-test') do
|
28
|
+
query { text :title, 'fuzzy mitten', :fuzziness => 0.5, :operator => 'and' }
|
29
|
+
end.results
|
30
|
+
|
31
|
+
assert_equal 1, results.count
|
32
|
+
assert_equal "Furry Kitten", results.first[:title]
|
33
|
+
end
|
34
|
+
|
21
35
|
end
|
22
36
|
|
23
37
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'active_record'
|
3
2
|
|
4
3
|
class ActiveRecordArticle < ActiveRecord::Base
|
@@ -78,3 +77,46 @@ class ActiveRecordClassWithDynamicIndexName < ActiveRecord::Base
|
|
78
77
|
"dynamic" + '_' + "index"
|
79
78
|
end
|
80
79
|
end
|
80
|
+
|
81
|
+
# Used in test for multiple class instances in one index,
|
82
|
+
# and single table inheritance (STI) support.
|
83
|
+
|
84
|
+
class ActiveRecordModelOne < ActiveRecord::Base
|
85
|
+
include Tire::Model::Search
|
86
|
+
include Tire::Model::Callbacks
|
87
|
+
self.table_name = 'active_record_model_one'
|
88
|
+
index_name 'active_record_model_one'
|
89
|
+
end
|
90
|
+
|
91
|
+
class ActiveRecordModelTwo < ActiveRecord::Base
|
92
|
+
include Tire::Model::Search
|
93
|
+
include Tire::Model::Callbacks
|
94
|
+
self.table_name = 'active_record_model_two'
|
95
|
+
index_name 'active_record_model_two'
|
96
|
+
end
|
97
|
+
|
98
|
+
class ActiveRecordAsset < ActiveRecord::Base
|
99
|
+
include Tire::Model::Search
|
100
|
+
include Tire::Model::Callbacks
|
101
|
+
end
|
102
|
+
|
103
|
+
class ActiveRecordVideo < ActiveRecordAsset
|
104
|
+
index_name 'active_record_assets'
|
105
|
+
end
|
106
|
+
|
107
|
+
class ActiveRecordPhoto < ActiveRecordAsset
|
108
|
+
index_name 'active_record_assets'
|
109
|
+
end
|
110
|
+
|
111
|
+
# Namespaced ActiveRecord models
|
112
|
+
|
113
|
+
module ActiveRecordNamespace
|
114
|
+
def self.table_name_prefix
|
115
|
+
'active_record_namespace_'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class ActiveRecordNamespace::MyModel < ActiveRecord::Base
|
120
|
+
include Tire::Model::Search
|
121
|
+
include Tire::Model::Callbacks
|
122
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# Example namespaced class with ElasticSearch persistence
|
2
|
+
#
|
3
|
+
# The `document_type` is `my_namespace/persistent_article_in_namespace`
|
4
|
+
#
|
5
|
+
|
6
|
+
module MyNamespace
|
7
|
+
class PersistentArticleInNamespace
|
8
|
+
include Tire::Model::Persistence
|
9
|
+
|
10
|
+
property :title
|
11
|
+
end
|
12
|
+
end
|
@@ -1,22 +1,17 @@
|
|
1
1
|
# Example ActiveModel class for testing :searchable mode
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require '
|
4
|
+
require 'redis/persistence'
|
5
5
|
|
6
|
-
class SupermodelArticle
|
7
|
-
include
|
6
|
+
class SupermodelArticle
|
7
|
+
include Redis::Persistence
|
8
8
|
|
9
9
|
include Tire::Model::Search
|
10
10
|
include Tire::Model::Callbacks
|
11
11
|
|
12
|
+
property :title
|
13
|
+
|
12
14
|
mapping do
|
13
15
|
indexes :title, :type => 'string', :boost => 15, :analyzer => 'czech'
|
14
16
|
end
|
15
|
-
|
16
|
-
alias :persisted? :exists?
|
17
|
-
|
18
|
-
def destroyed?
|
19
|
-
!self.class.find(self.id) rescue true
|
20
|
-
end
|
21
|
-
|
22
17
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
2
3
|
|
3
4
|
require 'pathname'
|
4
5
|
require 'test/unit'
|
@@ -7,14 +8,27 @@ require 'yajl/json_gem'
|
|
7
8
|
require 'sqlite3'
|
8
9
|
|
9
10
|
require 'shoulda'
|
10
|
-
require 'turn/autorun' unless ENV["TM_FILEPATH"] || ENV["CI"]
|
11
|
+
require 'turn/autorun' unless ENV["TM_FILEPATH"] || ENV["CI"] || defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
|
11
12
|
require 'mocha'
|
12
13
|
|
13
14
|
require 'active_support/core_ext/hash/indifferent_access'
|
14
15
|
|
15
16
|
require 'tire'
|
16
17
|
|
17
|
-
|
18
|
+
# Require basic model files
|
19
|
+
#
|
20
|
+
require File.dirname(__FILE__) + '/models/active_model_article'
|
21
|
+
require File.dirname(__FILE__) + '/models/active_model_article_with_callbacks'
|
22
|
+
require File.dirname(__FILE__) + '/models/active_model_article_with_custom_document_type'
|
23
|
+
require File.dirname(__FILE__) + '/models/active_model_article_with_custom_index_name'
|
24
|
+
require File.dirname(__FILE__) + '/models/active_record_models'
|
25
|
+
require File.dirname(__FILE__) + '/models/article'
|
26
|
+
require File.dirname(__FILE__) + '/models/persistent_article'
|
27
|
+
require File.dirname(__FILE__) + '/models/persistent_article_in_namespace'
|
28
|
+
require File.dirname(__FILE__) + '/models/persistent_article_with_casting'
|
29
|
+
require File.dirname(__FILE__) + '/models/persistent_article_with_defaults'
|
30
|
+
require File.dirname(__FILE__) + '/models/persistent_articles_with_custom_index_name'
|
31
|
+
require File.dirname(__FILE__) + '/models/validated_model'
|
18
32
|
|
19
33
|
class Test::Unit::TestCase
|
20
34
|
|
data/test/unit/index_test.rb
CHANGED
@@ -14,6 +14,14 @@ module Tire
|
|
14
14
|
assert_equal 'dummy', @index.name
|
15
15
|
end
|
16
16
|
|
17
|
+
should "return HTTP response" do
|
18
|
+
assert_respond_to @index, :response
|
19
|
+
|
20
|
+
Configuration.client.expects(:head).returns(mock_response('OK'))
|
21
|
+
@index.exists?
|
22
|
+
assert_equal 'OK', @index.response.body
|
23
|
+
end
|
24
|
+
|
17
25
|
should "return true when exists" do
|
18
26
|
Configuration.client.expects(:head).returns(mock_response(''))
|
19
27
|
assert @index.exists?
|
@@ -173,6 +181,21 @@ module Tire
|
|
173
181
|
@index.store article
|
174
182
|
end
|
175
183
|
|
184
|
+
should "properly encode namespaced document types" do
|
185
|
+
Configuration.client.expects(:post).with do |url,document|
|
186
|
+
url == "#{Configuration.url}/dummy/my_namespace%2Fmy_model/"
|
187
|
+
end.returns(mock_response('{"ok":true,"_id":"123"}'))
|
188
|
+
|
189
|
+
module MyNamespace
|
190
|
+
class MyModel
|
191
|
+
def document_type; "my_namespace/my_model"; end
|
192
|
+
def to_indexed_json; "{}"; end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
@index.store MyNamespace::MyModel.new
|
197
|
+
end
|
198
|
+
|
176
199
|
should "set default type" do
|
177
200
|
Configuration.client.expects(:post).with("#{Configuration.url}/dummy/document/", '{"title":"Test"}').returns(mock_response('{"ok":true,"_id":"test"}'))
|
178
201
|
@index.store :title => 'Test'
|
@@ -190,6 +213,11 @@ module Tire
|
|
190
213
|
assert_raise(ArgumentError) { @index.store document }
|
191
214
|
end
|
192
215
|
|
216
|
+
should "raise deprecation warning when trying to store a JSON string" do
|
217
|
+
Configuration.client.expects(:post).returns(mock_response('{"ok":true,"_id":"test"}'))
|
218
|
+
@index.store '{"foo" : "bar"}'
|
219
|
+
end
|
220
|
+
|
193
221
|
context "document with ID" do
|
194
222
|
|
195
223
|
should "store Hash it under its ID property" do
|
@@ -264,6 +292,12 @@ module Tire
|
|
264
292
|
end
|
265
293
|
end
|
266
294
|
|
295
|
+
should "properly encode document type" do
|
296
|
+
Configuration.client.expects(:get).with("#{Configuration.url}/dummy/my_namespace%2Fmy_model/id-1").
|
297
|
+
returns(mock_response('{"_id":"id-1","_version":1, "_source" : {"title":"Test"}}'))
|
298
|
+
article = @index.retrieve 'my_namespace/my_model', 'id-1'
|
299
|
+
end
|
300
|
+
|
267
301
|
end
|
268
302
|
|
269
303
|
context "when removing" do
|
@@ -275,6 +309,13 @@ module Tire
|
|
275
309
|
@index.remove :id => 1, :type => 'article', :title => 'Test'
|
276
310
|
end
|
277
311
|
|
312
|
+
should "get namespaced type from document" do
|
313
|
+
Configuration.client.expects(:delete).with("#{Configuration.url}/dummy/articles%2Farticle/1").
|
314
|
+
returns(mock_response('{"ok":true,"_id":"1"}')).twice
|
315
|
+
@index.remove :id => 1, :type => 'articles/article', :title => 'Test'
|
316
|
+
@index.remove :id => 1, :type => 'articles/article', :title => 'Test'
|
317
|
+
end
|
318
|
+
|
278
319
|
should "set default type" do
|
279
320
|
Configuration.client.expects(:delete).with("#{Configuration.url}/dummy/document/1").
|
280
321
|
returns(mock_response('{"ok":true,"_id":"1"}'))
|
@@ -306,6 +347,12 @@ module Tire
|
|
306
347
|
end
|
307
348
|
end
|
308
349
|
|
350
|
+
should "properly encode document type" do
|
351
|
+
Configuration.client.expects(:delete).with("#{Configuration.url}/dummy/my_namespace%2Fmy_model/id-1").
|
352
|
+
returns(mock_response('{"_id":"id-1","_version":1, "_source" : {"title":"Test"}}'))
|
353
|
+
article = @index.remove 'my_namespace/my_model', 'id-1'
|
354
|
+
end
|
355
|
+
|
309
356
|
end
|
310
357
|
|
311
358
|
context "when storing in bulk" do
|
@@ -353,12 +400,40 @@ module Tire
|
|
353
400
|
|
354
401
|
end
|
355
402
|
|
356
|
-
|
403
|
+
context "namespaced models" do
|
404
|
+
should "not URL-escape the document_type" do
|
405
|
+
Configuration.client.expects(:post).with do |url, json|
|
406
|
+
puts url, json
|
407
|
+
url == "#{Configuration.url}/_bulk" &&
|
408
|
+
json =~ %r|"_index":"my_namespace_my_models"| &&
|
409
|
+
json =~ %r|"_type":"my_namespace/my_model"|
|
410
|
+
end.returns(mock_response('{}', 200))
|
411
|
+
|
412
|
+
module MyNamespace
|
413
|
+
class MyModel
|
414
|
+
def document_type; "my_namespace/my_model"; end
|
415
|
+
def to_indexed_json; "{}"; end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
Tire.index('my_namespace_my_models').bulk_store [ MyNamespace::MyModel.new ]
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
should "try again when an exception occurs" do
|
357
424
|
Configuration.client.expects(:post).returns(mock_response('Server error', 503)).at_least(2)
|
358
425
|
|
359
426
|
assert !@index.bulk_store([ {:id => '1', :title => 'One'}, {:id => '2', :title => 'Two'} ])
|
360
427
|
end
|
361
428
|
|
429
|
+
should "try again and the raise when an exception occurs" do
|
430
|
+
Configuration.client.expects(:post).returns(mock_response('Server error', 503)).at_least(2)
|
431
|
+
|
432
|
+
assert_raise(RuntimeError) do
|
433
|
+
@index.bulk_store([ {:id => '1', :title => 'One'}, {:id => '2', :title => 'Two'} ], {:raise => true})
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
362
437
|
should "try again when a connection error occurs" do
|
363
438
|
Configuration.client.expects(:post).raises(Errno::ECONNREFUSED, "Connection refused - connect(2)").at_least(2)
|
364
439
|
|
@@ -417,7 +492,7 @@ module Tire
|
|
417
492
|
|
418
493
|
should "just store it in bulk" do
|
419
494
|
collection = [{ :id => 1, :title => 'Article' }]
|
420
|
-
@index.expects(:bulk_store).with(
|
495
|
+
@index.expects(:bulk_store).with(collection, {} ).returns(true)
|
421
496
|
|
422
497
|
@index.import collection
|
423
498
|
end
|
@@ -427,20 +502,20 @@ module Tire
|
|
427
502
|
context "class" do
|
428
503
|
|
429
504
|
should "call the passed method and bulk store the results" do
|
430
|
-
@index.expects(:bulk_store).with
|
505
|
+
@index.expects(:bulk_store).with { |c, o| c == [1, 2, 3, 4] }.returns(true)
|
431
506
|
|
432
|
-
@index.import ImportData, :paginate
|
507
|
+
@index.import ImportData, :method => 'paginate'
|
433
508
|
end
|
434
509
|
|
435
510
|
should "pass the params to the passed method and bulk store the results" do
|
436
|
-
@index.expects(:bulk_store).with
|
437
|
-
@index.expects(:bulk_store).with
|
511
|
+
@index.expects(:bulk_store).with { |c,o| c == [1, 2] }.returns(true)
|
512
|
+
@index.expects(:bulk_store).with { |c,o| c == [3, 4] }.returns(true)
|
438
513
|
|
439
|
-
@index.import ImportData, :paginate, :page => 1, :per_page => 2
|
514
|
+
@index.import ImportData, :method => 'paginate', :page => 1, :per_page => 2
|
440
515
|
end
|
441
516
|
|
442
517
|
should "pass the class when method not passed" do
|
443
|
-
@index.expects(:bulk_store).with
|
518
|
+
@index.expects(:bulk_store).with { |c,o| c == ImportData }.returns(true)
|
444
519
|
|
445
520
|
@index.import ImportData
|
446
521
|
end
|
@@ -452,7 +527,7 @@ module Tire
|
|
452
527
|
context "and plain collection" do
|
453
528
|
|
454
529
|
should "allow to manipulate the collection in the block" do
|
455
|
-
Tire::Index.any_instance.expects(:bulk_store).with([{ :id => 1, :title => 'ARTICLE' }])
|
530
|
+
Tire::Index.any_instance.expects(:bulk_store).with([{ :id => 1, :title => 'ARTICLE' }], {})
|
456
531
|
|
457
532
|
|
458
533
|
@index.import [{ :id => 1, :title => 'Article' }] do |articles|
|
@@ -465,11 +540,11 @@ module Tire
|
|
465
540
|
context "and object" do
|
466
541
|
|
467
542
|
should "call the passed block on every batch" do
|
468
|
-
Tire::Index.any_instance.expects(:bulk_store).with
|
469
|
-
Tire::Index.any_instance.expects(:bulk_store).with
|
543
|
+
Tire::Index.any_instance.expects(:bulk_store).with { |collection, options| collection == [1, 2] }
|
544
|
+
Tire::Index.any_instance.expects(:bulk_store).with { |collection, options| collection == [3, 4] }
|
470
545
|
|
471
546
|
runs = 0
|
472
|
-
@index.import ImportData, :paginate, :per_page => 2 do |documents|
|
547
|
+
@index.import ImportData, :method => 'paginate', :per_page => 2 do |documents|
|
473
548
|
runs += 1
|
474
549
|
# Don't forget to return the documents at the end of the block
|
475
550
|
documents
|
@@ -479,11 +554,10 @@ module Tire
|
|
479
554
|
end
|
480
555
|
|
481
556
|
should "allow to manipulate the documents in passed block" do
|
482
|
-
Tire::Index.any_instance.expects(:bulk_store).with
|
483
|
-
Tire::Index.any_instance.expects(:bulk_store).with
|
484
|
-
|
557
|
+
Tire::Index.any_instance.expects(:bulk_store).with { |c,o| c == [2, 3] }
|
558
|
+
Tire::Index.any_instance.expects(:bulk_store).with { |c,o| c == [4, 5] }
|
485
559
|
|
486
|
-
@index.import ImportData, :paginate, :per_page => 2 do |documents|
|
560
|
+
@index.import ImportData, :method => :paginate, :per_page => 2 do |documents|
|
487
561
|
# Add 1 to every "document" and return them
|
488
562
|
documents.map { |d| d + 1 }
|
489
563
|
end
|