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.
Files changed (59) hide show
  1. data/lib/tire.rb +18 -3
  2. data/lib/tire/alias.rb +11 -35
  3. data/lib/tire/index.rb +34 -76
  4. data/lib/tire/model/callbacks.rb +40 -0
  5. data/lib/tire/model/import.rb +26 -0
  6. data/lib/tire/model/indexing.rb +128 -0
  7. data/lib/tire/model/naming.rb +100 -0
  8. data/lib/tire/model/percolate.rb +99 -0
  9. data/lib/tire/model/persistence.rb +72 -0
  10. data/lib/tire/model/persistence/attributes.rb +143 -0
  11. data/lib/tire/model/persistence/finders.rb +66 -0
  12. data/lib/tire/model/persistence/storage.rb +71 -0
  13. data/lib/tire/model/search.rb +305 -0
  14. data/lib/tire/results/collection.rb +38 -13
  15. data/lib/tire/results/item.rb +19 -0
  16. data/lib/tire/rubyext/hash.rb +8 -0
  17. data/lib/tire/rubyext/ruby_1_8.rb +54 -0
  18. data/lib/tire/rubyext/symbol.rb +11 -0
  19. data/lib/tire/search.rb +7 -8
  20. data/lib/tire/search/scan.rb +8 -8
  21. data/lib/tire/search/sort.rb +1 -1
  22. data/lib/tire/utils.rb +17 -0
  23. data/lib/tire/version.rb +7 -38
  24. data/test/integration/active_model_indexing_test.rb +51 -0
  25. data/test/integration/active_model_searchable_test.rb +114 -0
  26. data/test/integration/active_record_searchable_test.rb +446 -0
  27. data/test/integration/mongoid_searchable_test.rb +309 -0
  28. data/test/integration/persistent_model_test.rb +117 -0
  29. data/test/integration/reindex_test.rb +2 -2
  30. data/test/integration/scan_test.rb +1 -1
  31. data/test/models/active_model_article.rb +31 -0
  32. data/test/models/active_model_article_with_callbacks.rb +49 -0
  33. data/test/models/active_model_article_with_custom_document_type.rb +7 -0
  34. data/test/models/active_model_article_with_custom_index_name.rb +7 -0
  35. data/test/models/active_record_models.rb +122 -0
  36. data/test/models/mongoid_models.rb +97 -0
  37. data/test/models/persistent_article.rb +11 -0
  38. data/test/models/persistent_article_in_namespace.rb +12 -0
  39. data/test/models/persistent_article_with_casting.rb +28 -0
  40. data/test/models/persistent_article_with_defaults.rb +11 -0
  41. data/test/models/persistent_articles_with_custom_index_name.rb +10 -0
  42. data/test/models/supermodel_article.rb +17 -0
  43. data/test/models/validated_model.rb +11 -0
  44. data/test/test_helper.rb +27 -3
  45. data/test/unit/active_model_lint_test.rb +17 -0
  46. data/test/unit/index_alias_test.rb +3 -17
  47. data/test/unit/index_test.rb +30 -18
  48. data/test/unit/model_callbacks_test.rb +116 -0
  49. data/test/unit/model_import_test.rb +71 -0
  50. data/test/unit/model_persistence_test.rb +516 -0
  51. data/test/unit/model_search_test.rb +899 -0
  52. data/test/unit/results_collection_test.rb +60 -0
  53. data/test/unit/results_item_test.rb +37 -0
  54. data/test/unit/rubyext_test.rb +3 -3
  55. data/test/unit/search_test.rb +1 -6
  56. data/test/unit/tire_test.rb +15 -0
  57. data/tire.gemspec +30 -13
  58. metadata +153 -41
  59. 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| { :id => i, :type => 'test', :title => "Document #{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', :settings => { :number_of_shards => 3 }
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
@@ -7,7 +7,7 @@ module Tire
7
7
 
8
8
  context "Scan" do
9
9
  setup do
10
- documents = (1..100).map { |i| { :id => i, :type => 'test', :title => "Document #{i}" } }
10
+ documents = (1..100).map { |i| { id: i, type: 'test', title: "Document #{i}" } }
11
11
 
12
12
  Tire.index 'scantest' do
13
13
  delete