ssickles-tire 0.4.2.7 → 0.4.3
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/tire.rb +18 -3
- data/lib/tire/alias.rb +11 -35
- data/lib/tire/index.rb +34 -76
- data/lib/tire/model/callbacks.rb +40 -0
- data/lib/tire/model/import.rb +26 -0
- data/lib/tire/model/indexing.rb +128 -0
- data/lib/tire/model/naming.rb +100 -0
- data/lib/tire/model/percolate.rb +99 -0
- data/lib/tire/model/persistence.rb +72 -0
- data/lib/tire/model/persistence/attributes.rb +143 -0
- data/lib/tire/model/persistence/finders.rb +66 -0
- data/lib/tire/model/persistence/storage.rb +71 -0
- data/lib/tire/model/search.rb +305 -0
- data/lib/tire/results/collection.rb +38 -13
- data/lib/tire/results/item.rb +19 -0
- data/lib/tire/rubyext/hash.rb +8 -0
- data/lib/tire/rubyext/ruby_1_8.rb +54 -0
- data/lib/tire/rubyext/symbol.rb +11 -0
- data/lib/tire/search.rb +7 -8
- data/lib/tire/search/scan.rb +8 -8
- data/lib/tire/search/sort.rb +1 -1
- data/lib/tire/utils.rb +17 -0
- data/lib/tire/version.rb +7 -38
- data/test/integration/active_model_indexing_test.rb +51 -0
- data/test/integration/active_model_searchable_test.rb +114 -0
- data/test/integration/active_record_searchable_test.rb +446 -0
- data/test/integration/mongoid_searchable_test.rb +309 -0
- data/test/integration/persistent_model_test.rb +117 -0
- data/test/integration/reindex_test.rb +2 -2
- data/test/integration/scan_test.rb +1 -1
- data/test/models/active_model_article.rb +31 -0
- data/test/models/active_model_article_with_callbacks.rb +49 -0
- data/test/models/active_model_article_with_custom_document_type.rb +7 -0
- data/test/models/active_model_article_with_custom_index_name.rb +7 -0
- data/test/models/active_record_models.rb +122 -0
- data/test/models/mongoid_models.rb +97 -0
- data/test/models/persistent_article.rb +11 -0
- data/test/models/persistent_article_in_namespace.rb +12 -0
- data/test/models/persistent_article_with_casting.rb +28 -0
- data/test/models/persistent_article_with_defaults.rb +11 -0
- data/test/models/persistent_articles_with_custom_index_name.rb +10 -0
- data/test/models/supermodel_article.rb +17 -0
- data/test/models/validated_model.rb +11 -0
- data/test/test_helper.rb +27 -3
- data/test/unit/active_model_lint_test.rb +17 -0
- data/test/unit/index_alias_test.rb +3 -17
- data/test/unit/index_test.rb +30 -18
- data/test/unit/model_callbacks_test.rb +116 -0
- data/test/unit/model_import_test.rb +71 -0
- data/test/unit/model_persistence_test.rb +516 -0
- data/test/unit/model_search_test.rb +899 -0
- data/test/unit/results_collection_test.rb +60 -0
- data/test/unit/results_item_test.rb +37 -0
- data/test/unit/rubyext_test.rb +3 -3
- data/test/unit/search_test.rb +1 -6
- data/test/unit/tire_test.rb +15 -0
- data/tire.gemspec +30 -13
- metadata +153 -41
- data/lib/tire/rubyext/to_json.rb +0 -21
@@ -0,0 +1,309 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require File.expand_path('../../models/mongoid_models', __FILE__)
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "mongo"
|
6
|
+
Mongo::Connection.new("localhost", 27017)
|
7
|
+
|
8
|
+
ENV["MONGODB_IS_AVAILABLE"] = 'true'
|
9
|
+
rescue Mongo::ConnectionFailure => e
|
10
|
+
ENV["MONGODB_IS_AVAILABLE"] = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
if ENV["MONGODB_IS_AVAILABLE"]
|
14
|
+
module Tire
|
15
|
+
|
16
|
+
class MongoidSearchableIntegrationTest < Test::Unit::TestCase
|
17
|
+
include Test::Integration
|
18
|
+
|
19
|
+
def setup
|
20
|
+
super
|
21
|
+
Mongoid.configure do |config|
|
22
|
+
config.master = Mongo::Connection.new.db("tire_mongoid_integration_test")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "Mongoid integration" do
|
27
|
+
|
28
|
+
setup do
|
29
|
+
MongoidArticle.destroy_all
|
30
|
+
Tire.index('mongoid_articles').delete
|
31
|
+
|
32
|
+
load File.expand_path('../../models/mongoid_models.rb', __FILE__)
|
33
|
+
end
|
34
|
+
teardown do
|
35
|
+
MongoidArticle.destroy_all
|
36
|
+
Tire.index('mongoid_articles').delete
|
37
|
+
end
|
38
|
+
|
39
|
+
should "configure mapping" do
|
40
|
+
assert_equal 'snowball', MongoidArticle.mapping[:title][:analyzer]
|
41
|
+
assert_equal 10, MongoidArticle.mapping[:title][:boost]
|
42
|
+
|
43
|
+
assert_equal 'snowball', MongoidArticle.tire.index.mapping['mongoid_article']['properties']['title']['analyzer']
|
44
|
+
end
|
45
|
+
|
46
|
+
should "save document into index on save and find it" do
|
47
|
+
a = MongoidArticle.new :title => 'Test'
|
48
|
+
a.save!
|
49
|
+
id = a.id
|
50
|
+
|
51
|
+
a.index.refresh
|
52
|
+
|
53
|
+
results = MongoidArticle.tire.search 'test'
|
54
|
+
|
55
|
+
assert results.any?
|
56
|
+
assert_equal 1, results.count
|
57
|
+
|
58
|
+
assert_instance_of Results::Item, results.first
|
59
|
+
assert_not_nil results.first.id
|
60
|
+
assert_equal id.to_s, results.first.id.to_s
|
61
|
+
assert results.first.persisted?, "Record should be persisted"
|
62
|
+
assert_not_nil results.first._score
|
63
|
+
assert_equal 'Test', results.first.title
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with eager loading" do
|
67
|
+
setup do
|
68
|
+
MongoidArticle.destroy_all
|
69
|
+
|
70
|
+
@first_article = MongoidArticle.create! :title => "Test 1"
|
71
|
+
@second_article = MongoidArticle.create! :title => "Test 2"
|
72
|
+
@third_article = MongoidArticle.create! :title => "Test 3"
|
73
|
+
@fourth_article = MongoidArticle.create! :title => "Test 4"
|
74
|
+
@fifth_article = MongoidArticle.create! :title => "Test 5"
|
75
|
+
|
76
|
+
MongoidArticle.tire.index.refresh
|
77
|
+
end
|
78
|
+
|
79
|
+
should "load records on query search" do
|
80
|
+
results = MongoidArticle.tire.search '"Test 1"', :load => true
|
81
|
+
|
82
|
+
assert results.any?
|
83
|
+
assert_equal MongoidArticle.all.first, results.first
|
84
|
+
end
|
85
|
+
|
86
|
+
should "load records on block search" do
|
87
|
+
results = MongoidArticle.tire.search :load => true do
|
88
|
+
query { string '"Test 1"' }
|
89
|
+
end
|
90
|
+
|
91
|
+
assert_equal MongoidArticle.all.first, results.first
|
92
|
+
end
|
93
|
+
|
94
|
+
should "load records with options on query search" do
|
95
|
+
assert_equal MongoidArticle.find([@first_article[:_id]], :include => 'comments').first,
|
96
|
+
MongoidArticle.tire.search('"Test 1"',
|
97
|
+
:load => { :include => 'comments' }).results.first
|
98
|
+
end
|
99
|
+
|
100
|
+
should "return empty collection for nonmatching query" do
|
101
|
+
assert_nothing_raised do
|
102
|
+
results = MongoidArticle.tire.search :load => true do
|
103
|
+
query { string '"Hic Sunt Leones"' }
|
104
|
+
end
|
105
|
+
assert_equal 0, results.size
|
106
|
+
assert !results.any?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
should "remove document from index on destroy" do
|
112
|
+
a = MongoidArticle.new :title => 'Test remove...'
|
113
|
+
a.save!
|
114
|
+
assert_equal 1, MongoidArticle.count
|
115
|
+
|
116
|
+
a.destroy
|
117
|
+
assert_equal 0, MongoidArticle.all.size
|
118
|
+
|
119
|
+
a.index.refresh
|
120
|
+
results = MongoidArticle.tire.search 'test'
|
121
|
+
assert_equal 0, results.count
|
122
|
+
end
|
123
|
+
|
124
|
+
should "return documents with scores" do
|
125
|
+
MongoidArticle.create! :title => 'foo'
|
126
|
+
MongoidArticle.create! :title => 'bar'
|
127
|
+
|
128
|
+
MongoidArticle.tire.index.refresh
|
129
|
+
results = MongoidArticle.tire.search 'foo OR bar^100'
|
130
|
+
assert_equal 2, results.count
|
131
|
+
|
132
|
+
assert_equal 'bar', results.first.title
|
133
|
+
end
|
134
|
+
|
135
|
+
context "with pagination" do
|
136
|
+
setup do
|
137
|
+
1.upto(9) { |number| MongoidArticle.create :title => "Test#{number}" }
|
138
|
+
MongoidArticle.tire.index.refresh
|
139
|
+
end
|
140
|
+
|
141
|
+
context "and parameter searches" do
|
142
|
+
|
143
|
+
should "find first page with five results" do
|
144
|
+
results = MongoidArticle.tire.search 'test*', :sort => 'title', :per_page => 5, :page => 1
|
145
|
+
assert_equal 5, results.size
|
146
|
+
|
147
|
+
assert_equal 2, results.total_pages
|
148
|
+
assert_equal 1, results.current_page
|
149
|
+
assert_equal nil, results.previous_page
|
150
|
+
assert_equal 2, results.next_page
|
151
|
+
|
152
|
+
assert_equal 'Test1', results.first.title
|
153
|
+
end
|
154
|
+
|
155
|
+
should "find next page with five results" do
|
156
|
+
results = MongoidArticle.tire.search 'test*', :sort => 'title', :per_page => 5, :page => 2
|
157
|
+
assert_equal 4, results.size
|
158
|
+
|
159
|
+
assert_equal 2, results.total_pages
|
160
|
+
assert_equal 2, results.current_page
|
161
|
+
assert_equal 1, results.previous_page
|
162
|
+
assert_equal nil, results.next_page
|
163
|
+
|
164
|
+
assert_equal 'Test6', results.first.title
|
165
|
+
end
|
166
|
+
|
167
|
+
should "find not find missing page" do
|
168
|
+
results = MongoidArticle.tire.search 'test*', :sort => 'title', :per_page => 5, :page => 3
|
169
|
+
assert_equal 0, results.size
|
170
|
+
|
171
|
+
assert_equal 2, results.total_pages
|
172
|
+
assert_equal 3, results.current_page
|
173
|
+
assert_equal 2, results.previous_page
|
174
|
+
assert_equal nil, results.next_page
|
175
|
+
|
176
|
+
assert_nil results.first
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
context "and block searches" do
|
182
|
+
setup { @q = 'test*' }
|
183
|
+
|
184
|
+
should "find first page with five results" do
|
185
|
+
results = MongoidArticle.tire.search do |search|
|
186
|
+
search.query { |query| query.string @q }
|
187
|
+
search.sort { by :title }
|
188
|
+
search.from 0
|
189
|
+
search.size 5
|
190
|
+
end
|
191
|
+
assert_equal 5, results.size
|
192
|
+
|
193
|
+
assert_equal 2, results.total_pages
|
194
|
+
assert_equal 1, results.current_page
|
195
|
+
assert_equal nil, results.previous_page
|
196
|
+
assert_equal 2, results.next_page
|
197
|
+
|
198
|
+
assert_equal 'Test1', results.first.title
|
199
|
+
end
|
200
|
+
|
201
|
+
should "find next page with five results" do
|
202
|
+
results = MongoidArticle.tire.search do |search|
|
203
|
+
search.query { |query| query.string @q }
|
204
|
+
search.sort { by :title }
|
205
|
+
search.from 5
|
206
|
+
search.size 5
|
207
|
+
end
|
208
|
+
assert_equal 4, results.size
|
209
|
+
|
210
|
+
assert_equal 2, results.total_pages
|
211
|
+
assert_equal 2, results.current_page
|
212
|
+
assert_equal 1, results.previous_page
|
213
|
+
assert_equal nil, results.next_page
|
214
|
+
|
215
|
+
assert_equal 'Test6', results.first.title
|
216
|
+
end
|
217
|
+
|
218
|
+
should "not find a missing page" do
|
219
|
+
results = MongoidArticle.tire.search do |search|
|
220
|
+
search.query { |query| query.string @q }
|
221
|
+
search.sort { by :title }
|
222
|
+
search.from 10
|
223
|
+
search.size 5
|
224
|
+
end
|
225
|
+
assert_equal 0, results.size
|
226
|
+
|
227
|
+
assert_equal 2, results.total_pages
|
228
|
+
assert_equal 3, results.current_page
|
229
|
+
assert_equal 2, results.previous_page
|
230
|
+
assert_equal nil, results.next_page
|
231
|
+
|
232
|
+
assert_nil results.first
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
|
239
|
+
context "with proxy" do
|
240
|
+
|
241
|
+
should "allow access to Tire instance methods" do
|
242
|
+
a = MongoidClassWithTireMethods.create :title => 'One'
|
243
|
+
assert_equal "THIS IS MY INDEX!", a.index
|
244
|
+
assert_instance_of Tire::Index, a.tire.index
|
245
|
+
assert a.tire.index.exists?, "Index should exist"
|
246
|
+
end
|
247
|
+
|
248
|
+
should "allow access to Tire class methods" do
|
249
|
+
class ::MongoidClassWithTireMethods
|
250
|
+
include Mongoid::Document
|
251
|
+
def self.search(*)
|
252
|
+
"THIS IS MY SEARCH!"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
MongoidClassWithTireMethods.create :title => 'One'
|
257
|
+
MongoidClassWithTireMethods.tire.index.refresh
|
258
|
+
|
259
|
+
assert_equal "THIS IS MY SEARCH!", MongoidClassWithTireMethods.search
|
260
|
+
|
261
|
+
results = MongoidClassWithTireMethods.tire.search 'one'
|
262
|
+
|
263
|
+
assert_equal 'One', results.first.title
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
context "within Rails" do
|
269
|
+
|
270
|
+
setup do
|
271
|
+
module ::Rails; end
|
272
|
+
|
273
|
+
a = MongoidArticle.new :title => 'Test'
|
274
|
+
c = a.comments.build :author => 'fool', :body => 'Works!'
|
275
|
+
s = a.stats.build :pageviews => 12, :period => '2011-08'
|
276
|
+
a.save!
|
277
|
+
c.save!
|
278
|
+
s.save!
|
279
|
+
@id = a.id.to_s
|
280
|
+
|
281
|
+
a.index.refresh
|
282
|
+
@item = MongoidArticle.tire.search('test').first
|
283
|
+
end
|
284
|
+
|
285
|
+
should "have access to indexed properties" do
|
286
|
+
assert_equal 'Test', @item.title
|
287
|
+
assert_equal 'fool', @item.comments.first.author
|
288
|
+
assert_equal 12, @item.stats.first.pageviews
|
289
|
+
end
|
290
|
+
|
291
|
+
should "load the underlying models" do
|
292
|
+
assert_instance_of Results::Item, @item
|
293
|
+
assert_instance_of MongoidArticle, @item.load
|
294
|
+
assert_equal 'Test', @item.load.title
|
295
|
+
|
296
|
+
assert_instance_of Results::Item, @item.comments.first
|
297
|
+
assert_instance_of MongoidComment, @item.comments.first.load
|
298
|
+
assert_equal 'fool', @item.comments.first.load.author
|
299
|
+
end
|
300
|
+
|
301
|
+
should "load the underlying model with options" do
|
302
|
+
assert_equal MongoidArticle.find(@id), @item.load(:include => 'comments')
|
303
|
+
end
|
304
|
+
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class PersistentModelIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
PersistentArticle.index.delete
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
super
|
15
|
+
PersistentArticle.index.delete
|
16
|
+
PersistentArticleWithDefaults.index.delete
|
17
|
+
end
|
18
|
+
|
19
|
+
context "PersistentModel" do
|
20
|
+
should "search with simple query" do
|
21
|
+
PersistentArticle.create :id => 1, :title => 'One'
|
22
|
+
PersistentArticle.index.refresh
|
23
|
+
|
24
|
+
results = PersistentArticle.search 'one'
|
25
|
+
assert_equal 'One', results.first.title
|
26
|
+
end
|
27
|
+
|
28
|
+
should "search with a block" do
|
29
|
+
PersistentArticle.create :id => 1, :title => 'One'
|
30
|
+
PersistentArticle.index.refresh
|
31
|
+
|
32
|
+
results = PersistentArticle.search(:sort => 'title') { query { string 'one' } }
|
33
|
+
assert_equal 'One', results.first.title
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return instances of model" do
|
37
|
+
PersistentArticle.create :id => 1, :title => 'One'
|
38
|
+
PersistentArticle.index.refresh
|
39
|
+
|
40
|
+
results = PersistentArticle.search 'one'
|
41
|
+
assert_instance_of PersistentArticle, results.first
|
42
|
+
end
|
43
|
+
|
44
|
+
should "save documents into index and find them by IDs" do
|
45
|
+
one = PersistentArticle.create :id => 1, :title => 'One'
|
46
|
+
two = PersistentArticle.create :id => 2, :title => 'Two'
|
47
|
+
|
48
|
+
PersistentArticle.index.refresh
|
49
|
+
|
50
|
+
results = PersistentArticle.find [1, 2]
|
51
|
+
|
52
|
+
assert_equal 2, results.size
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
should "return default values for properties without value" do
|
57
|
+
PersistentArticleWithDefaults.create :id => 1, :title => 'One'
|
58
|
+
PersistentArticleWithDefaults.index.refresh
|
59
|
+
|
60
|
+
results = PersistentArticleWithDefaults.all
|
61
|
+
|
62
|
+
assert_equal [], results.first.tags
|
63
|
+
end
|
64
|
+
|
65
|
+
context "with pagination" do
|
66
|
+
|
67
|
+
setup do
|
68
|
+
1.upto(9) { |number| PersistentArticle.create :title => "Test#{number}" }
|
69
|
+
PersistentArticle.index.refresh
|
70
|
+
end
|
71
|
+
|
72
|
+
should "find first page with five results" do
|
73
|
+
results = PersistentArticle.search( :per_page => 5, :page => 1 ) { query { all } }
|
74
|
+
assert_equal 5, results.size
|
75
|
+
|
76
|
+
# WillPaginate
|
77
|
+
#
|
78
|
+
assert_equal 2, results.total_pages
|
79
|
+
assert_equal 1, results.current_page
|
80
|
+
assert_equal nil, results.previous_page
|
81
|
+
assert_equal 2, results.next_page
|
82
|
+
|
83
|
+
# Kaminari
|
84
|
+
#
|
85
|
+
assert_equal 5, results.limit_value
|
86
|
+
assert_equal 9, results.total_count
|
87
|
+
assert_equal 2, results.num_pages
|
88
|
+
assert_equal 0, results.offset_value
|
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
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
@@ -9,7 +9,7 @@ module Tire
|
|
9
9
|
setup do
|
10
10
|
Tire.index('reindex-test-new').delete
|
11
11
|
|
12
|
-
documents = (1..100).map { |i| { :
|
12
|
+
documents = (1..100).map { |i| { id: i, type: 'test', title: "Document #{i}" } }
|
13
13
|
|
14
14
|
Tire.index 'reindex-test' do
|
15
15
|
delete
|
@@ -25,7 +25,7 @@ module Tire
|
|
25
25
|
end
|
26
26
|
|
27
27
|
should "reindex the index into a new index with different settings" do
|
28
|
-
Tire.index('reindex-test').reindex 'reindex-test-new', :
|
28
|
+
Tire.index('reindex-test').reindex 'reindex-test-new', settings: { number_of_shards: 3 }
|
29
29
|
|
30
30
|
Tire.index('reindex-test-new').refresh
|
31
31
|
assert_equal 100, Tire.search('reindex-test-new').results.total
|