tire-erez 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/.gitignore +14 -0
  2. data/.travis.yml +32 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +10 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.markdown +775 -0
  7. data/Rakefile +51 -0
  8. data/examples/rails-application-template.rb +263 -0
  9. data/examples/tire-dsl.rb +932 -0
  10. data/lib/tire.rb +59 -0
  11. data/lib/tire/alias.rb +296 -0
  12. data/lib/tire/configuration.rb +38 -0
  13. data/lib/tire/count.rb +85 -0
  14. data/lib/tire/dsl.rb +114 -0
  15. data/lib/tire/http/client.rb +62 -0
  16. data/lib/tire/http/clients/curb.rb +61 -0
  17. data/lib/tire/http/clients/faraday.rb +71 -0
  18. data/lib/tire/http/response.rb +27 -0
  19. data/lib/tire/index.rb +443 -0
  20. data/lib/tire/logger.rb +60 -0
  21. data/lib/tire/model/callbacks.rb +40 -0
  22. data/lib/tire/model/import.rb +27 -0
  23. data/lib/tire/model/indexing.rb +134 -0
  24. data/lib/tire/model/naming.rb +100 -0
  25. data/lib/tire/model/percolate.rb +99 -0
  26. data/lib/tire/model/persistence.rb +72 -0
  27. data/lib/tire/model/persistence/attributes.rb +148 -0
  28. data/lib/tire/model/persistence/finders.rb +54 -0
  29. data/lib/tire/model/persistence/storage.rb +77 -0
  30. data/lib/tire/model/search.rb +322 -0
  31. data/lib/tire/multi_search.rb +263 -0
  32. data/lib/tire/results/collection.rb +156 -0
  33. data/lib/tire/results/item.rb +94 -0
  34. data/lib/tire/results/pagination.rb +68 -0
  35. data/lib/tire/rubyext/hash.rb +8 -0
  36. data/lib/tire/rubyext/ruby_1_8.rb +1 -0
  37. data/lib/tire/rubyext/symbol.rb +11 -0
  38. data/lib/tire/rubyext/uri_escape.rb +74 -0
  39. data/lib/tire/search.rb +211 -0
  40. data/lib/tire/search/facet.rb +81 -0
  41. data/lib/tire/search/filter.rb +28 -0
  42. data/lib/tire/search/highlight.rb +37 -0
  43. data/lib/tire/search/queries/match.rb +40 -0
  44. data/lib/tire/search/query.rb +250 -0
  45. data/lib/tire/search/scan.rb +114 -0
  46. data/lib/tire/search/script_field.rb +23 -0
  47. data/lib/tire/search/sort.rb +25 -0
  48. data/lib/tire/tasks.rb +138 -0
  49. data/lib/tire/utils.rb +17 -0
  50. data/lib/tire/version.rb +18 -0
  51. data/test/fixtures/articles/1.json +1 -0
  52. data/test/fixtures/articles/2.json +1 -0
  53. data/test/fixtures/articles/3.json +1 -0
  54. data/test/fixtures/articles/4.json +1 -0
  55. data/test/fixtures/articles/5.json +1 -0
  56. data/test/integration/active_model_indexing_test.rb +51 -0
  57. data/test/integration/active_model_searchable_test.rb +114 -0
  58. data/test/integration/active_record_searchable_test.rb +620 -0
  59. data/test/integration/boolean_queries_test.rb +43 -0
  60. data/test/integration/boosting_queries_test.rb +32 -0
  61. data/test/integration/bulk_test.rb +86 -0
  62. data/test/integration/count_test.rb +64 -0
  63. data/test/integration/custom_score_queries_test.rb +89 -0
  64. data/test/integration/dis_max_queries_test.rb +68 -0
  65. data/test/integration/dsl_search_test.rb +30 -0
  66. data/test/integration/explanation_test.rb +44 -0
  67. data/test/integration/facets_test.rb +311 -0
  68. data/test/integration/filtered_queries_test.rb +66 -0
  69. data/test/integration/filters_test.rb +75 -0
  70. data/test/integration/fuzzy_queries_test.rb +20 -0
  71. data/test/integration/highlight_test.rb +64 -0
  72. data/test/integration/index_aliases_test.rb +122 -0
  73. data/test/integration/index_mapping_test.rb +43 -0
  74. data/test/integration/index_store_test.rb +112 -0
  75. data/test/integration/index_update_document_test.rb +121 -0
  76. data/test/integration/match_query_test.rb +79 -0
  77. data/test/integration/mongoid_searchable_test.rb +309 -0
  78. data/test/integration/multi_search_test.rb +114 -0
  79. data/test/integration/nested_query_test.rb +135 -0
  80. data/test/integration/percolator_test.rb +111 -0
  81. data/test/integration/persistent_model_test.rb +205 -0
  82. data/test/integration/prefix_query_test.rb +43 -0
  83. data/test/integration/query_return_version_test.rb +70 -0
  84. data/test/integration/query_string_test.rb +52 -0
  85. data/test/integration/range_queries_test.rb +36 -0
  86. data/test/integration/reindex_test.rb +56 -0
  87. data/test/integration/results_test.rb +58 -0
  88. data/test/integration/scan_test.rb +56 -0
  89. data/test/integration/script_fields_test.rb +38 -0
  90. data/test/integration/sort_test.rb +52 -0
  91. data/test/integration/text_query_test.rb +39 -0
  92. data/test/models/active_model_article.rb +31 -0
  93. data/test/models/active_model_article_with_callbacks.rb +49 -0
  94. data/test/models/active_model_article_with_custom_document_type.rb +7 -0
  95. data/test/models/active_model_article_with_custom_index_name.rb +7 -0
  96. data/test/models/active_record_models.rb +131 -0
  97. data/test/models/article.rb +15 -0
  98. data/test/models/mongoid_models.rb +85 -0
  99. data/test/models/persistent_article.rb +11 -0
  100. data/test/models/persistent_article_in_index.rb +16 -0
  101. data/test/models/persistent_article_in_namespace.rb +12 -0
  102. data/test/models/persistent_article_with_casting.rb +28 -0
  103. data/test/models/persistent_article_with_defaults.rb +12 -0
  104. data/test/models/persistent_article_with_percolation.rb +5 -0
  105. data/test/models/persistent_articles_with_custom_index_name.rb +10 -0
  106. data/test/models/supermodel_article.rb +17 -0
  107. data/test/models/validated_model.rb +11 -0
  108. data/test/test_helper.rb +118 -0
  109. data/test/unit/active_model_lint_test.rb +17 -0
  110. data/test/unit/configuration_test.rb +84 -0
  111. data/test/unit/count_test.rb +67 -0
  112. data/test/unit/http_client_test.rb +79 -0
  113. data/test/unit/http_response_test.rb +49 -0
  114. data/test/unit/index_alias_test.rb +335 -0
  115. data/test/unit/index_test.rb +1098 -0
  116. data/test/unit/logger_test.rb +125 -0
  117. data/test/unit/model_callbacks_test.rb +116 -0
  118. data/test/unit/model_import_test.rb +75 -0
  119. data/test/unit/model_initialization_test.rb +31 -0
  120. data/test/unit/model_persistence_test.rb +548 -0
  121. data/test/unit/model_search_test.rb +964 -0
  122. data/test/unit/multi_search_test.rb +304 -0
  123. data/test/unit/results_collection_test.rb +372 -0
  124. data/test/unit/results_item_test.rb +173 -0
  125. data/test/unit/rubyext_test.rb +66 -0
  126. data/test/unit/search_facet_test.rb +186 -0
  127. data/test/unit/search_filter_test.rb +42 -0
  128. data/test/unit/search_highlight_test.rb +46 -0
  129. data/test/unit/search_query_test.rb +419 -0
  130. data/test/unit/search_scan_test.rb +113 -0
  131. data/test/unit/search_script_field_test.rb +26 -0
  132. data/test/unit/search_sort_test.rb +50 -0
  133. data/test/unit/search_test.rb +556 -0
  134. data/test/unit/tire_test.rb +144 -0
  135. data/tire.gemspec +83 -0
  136. metadata +586 -0
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+
3
+ module Tire
4
+
5
+ class MatchQueryIntegrationTest < Test::Unit::TestCase
6
+ include Test::Integration
7
+
8
+ context "Match query" do
9
+ setup do
10
+ Tire.index 'match-query-test' do
11
+ delete
12
+ create settings: { index: { number_of_shards: 1, number_of_replicas: 0 } },
13
+ mappings: {
14
+ document: { properties: {
15
+ last_name: { type: 'string', analyzer: 'english' },
16
+ age: { type: 'integer' }
17
+ } }
18
+ }
19
+
20
+ store first_name: 'John', last_name: 'Smith', age: 30, gender: 'male'
21
+ store first_name: 'John', last_name: 'Smithson', age: 25, gender: 'male'
22
+ store first_name: 'Adam', last_name: 'Smith', age: 75, gender: 'male'
23
+ store first_name: 'Mary', last_name: 'John', age: 30, gender: 'female'
24
+ refresh
25
+ end
26
+ end
27
+
28
+ teardown do
29
+ Tire.index('match-query-test').delete
30
+ end
31
+
32
+ should "find documents by single field" do
33
+ s = Tire.search 'match-query-test' do
34
+ query do
35
+ match :last_name, 'Smith'
36
+ end
37
+ end
38
+
39
+ assert_equal 2, s.results.count
40
+ end
41
+
42
+ should "find document by multiple fields with multi_match" do
43
+ s = Tire.search 'match-query-test' do
44
+ query do
45
+ match [:first_name, :last_name], 'John'
46
+ end
47
+ end
48
+
49
+ assert_equal 3, s.results.count
50
+ end
51
+
52
+ should "find documents by prefix" do
53
+ s = Tire.search 'match-query-test' do
54
+ query do
55
+ match :last_name, 'Smi', type: 'phrase_prefix'
56
+ end
57
+ end
58
+
59
+ assert_equal 3, s.results.count
60
+ end
61
+
62
+ should "automatically create a boolean query when called repeatedly" do
63
+ s = Tire.search 'match-query-test' do
64
+ query do
65
+ match [:first_name, :last_name], 'John'
66
+ match :age, 30
67
+ match :gender, 'male'
68
+ end
69
+ # puts to_curl
70
+ end
71
+
72
+ assert_equal 1, s.results.count
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -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,114 @@
1
+ require 'test_helper'
2
+
3
+ module Tire
4
+
5
+ class MultiSearchIntegrationTest < Test::Unit::TestCase
6
+ include Test::Integration
7
+
8
+ context "Multi search" do
9
+ # Tire.configure { logger STDERR }
10
+ setup do
11
+ Tire.index 'multi-search-test-1' do
12
+ delete
13
+ create
14
+ store first_name: 'John', last_name: 'Smith', age: 30, gender: 'male'
15
+ store first_name: 'John', last_name: 'Smithson', age: 25, gender: 'male'
16
+ store first_name: 'Mary', last_name: 'Smith', age: 20, gender: 'female'
17
+ refresh
18
+ end
19
+ Tire.index 'multi-search-test-2' do
20
+ delete
21
+ create
22
+ store first_name: 'John', last_name: 'Milton', age: 35, gender: 'male'
23
+ store first_name: 'Mary', last_name: 'Milson', age: 44, gender: 'female'
24
+ store first_name: 'Mary', last_name: 'Reilly', age: 55, gender: 'female'
25
+ refresh
26
+ end
27
+ end
28
+
29
+ teardown do
30
+ Tire.index('multi-search-test-1').delete
31
+ Tire.index('multi-search-test-2').delete
32
+ end
33
+
34
+ should "return multiple results" do
35
+ s = Tire.multi_search 'multi-search-test-1' do
36
+ search :johns do
37
+ query { match :_all, 'john' }
38
+ end
39
+ search :males do
40
+ query { match :gender, 'male' }
41
+ end
42
+ search :facets, search_type: 'count' do
43
+ facet('age') { statistical :age }
44
+ end
45
+ end
46
+
47
+ assert_equal 3, s.results.size
48
+
49
+ assert_equal 2, s.results[:johns].size
50
+ assert_equal 2, s.results[:males].size
51
+
52
+ assert s.results[:facets].results.empty?, "Results not empty? #{s.results[:facets].results}"
53
+ assert_equal 75.0, s.results[:facets].facets['age']['total']
54
+ end
55
+
56
+ should "mix named and numbered searches" do
57
+ s = Tire.multi_search 'multi-search-test-1' do
58
+ search(:johns) { query { match :_all, 'john' } }
59
+ search { query { match :_all, 'mary' } }
60
+ end
61
+
62
+ assert_equal 2, s.results.size
63
+
64
+ assert_equal 2, s.results[:johns].size
65
+ assert_equal 1, s.results[1].size
66
+ end
67
+
68
+ should "iterate over mixed searches" do
69
+ s = Tire.multi_search 'multi-search-test-1' do
70
+ search(:johns) { query { match :_all, 'john' } }
71
+ search { query { match :_all, 'mary' } }
72
+ end
73
+
74
+ assert_equal [:johns, 1], s.searches.names
75
+ assert_equal [:johns, 1], s.results.to_hash.keys
76
+
77
+ s.results.each_with_index do |results, i|
78
+ assert_equal 2, results.size if i == 0
79
+ assert_equal 1, results.size if i == 1
80
+ end
81
+
82
+ s.results.each_pair do |name, results|
83
+ assert_equal 2, results.size if name == :johns
84
+ assert_equal 1, results.size if name == 1
85
+ end
86
+ end
87
+
88
+ should "return results from different indices" do
89
+ s = Tire.multi_search do
90
+ search( index: 'multi-search-test-1' ) { query { match :_all, 'john' } }
91
+ search( index: 'multi-search-test-2' ) { query { match :_all, 'john' } }
92
+ end
93
+
94
+ assert_equal 2, s.results[0].size
95
+ assert_equal 1, s.results[1].size
96
+ end
97
+
98
+ should "return error for failed searches" do
99
+ s = Tire.multi_search 'multi-search-test-1' do
100
+ search() { query { match :_all, 'john' } }
101
+ search() { query { string '[x' } }
102
+ end
103
+
104
+ assert_equal 2, s.results[0].size
105
+ assert s.results[0].success?
106
+
107
+ assert_equal 0, s.results[1].size
108
+ assert s.results[1].failure?
109
+ end
110
+ end
111
+
112
+ end
113
+
114
+ end