load_balanced_tire 0.1
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/.gitignore +14 -0
- data/.travis.yml +29 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +760 -0
- data/Rakefile +78 -0
- data/examples/rails-application-template.rb +249 -0
- data/examples/tire-dsl.rb +876 -0
- data/lib/tire.rb +55 -0
- data/lib/tire/alias.rb +296 -0
- data/lib/tire/configuration.rb +30 -0
- data/lib/tire/dsl.rb +43 -0
- data/lib/tire/http/client.rb +62 -0
- data/lib/tire/http/clients/curb.rb +61 -0
- data/lib/tire/http/clients/faraday.rb +71 -0
- data/lib/tire/http/response.rb +27 -0
- data/lib/tire/index.rb +361 -0
- data/lib/tire/logger.rb +60 -0
- 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 +71 -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 +69 -0
- data/lib/tire/model/search.rb +307 -0
- data/lib/tire/results/collection.rb +114 -0
- data/lib/tire/results/item.rb +86 -0
- data/lib/tire/results/pagination.rb +54 -0
- data/lib/tire/rubyext/hash.rb +8 -0
- data/lib/tire/rubyext/ruby_1_8.rb +7 -0
- data/lib/tire/rubyext/symbol.rb +11 -0
- data/lib/tire/search.rb +188 -0
- data/lib/tire/search/facet.rb +74 -0
- data/lib/tire/search/filter.rb +28 -0
- data/lib/tire/search/highlight.rb +37 -0
- data/lib/tire/search/query.rb +186 -0
- data/lib/tire/search/scan.rb +114 -0
- data/lib/tire/search/script_field.rb +23 -0
- data/lib/tire/search/sort.rb +25 -0
- data/lib/tire/tasks.rb +135 -0
- data/lib/tire/utils.rb +17 -0
- data/lib/tire/version.rb +22 -0
- data/test/fixtures/articles/1.json +1 -0
- data/test/fixtures/articles/2.json +1 -0
- data/test/fixtures/articles/3.json +1 -0
- data/test/fixtures/articles/4.json +1 -0
- data/test/fixtures/articles/5.json +1 -0
- 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/boolean_queries_test.rb +43 -0
- data/test/integration/count_test.rb +34 -0
- data/test/integration/custom_score_queries_test.rb +88 -0
- data/test/integration/dis_max_queries_test.rb +68 -0
- data/test/integration/dsl_search_test.rb +22 -0
- data/test/integration/explanation_test.rb +44 -0
- data/test/integration/facets_test.rb +259 -0
- data/test/integration/filtered_queries_test.rb +66 -0
- data/test/integration/filters_test.rb +63 -0
- data/test/integration/fuzzy_queries_test.rb +20 -0
- data/test/integration/highlight_test.rb +64 -0
- data/test/integration/index_aliases_test.rb +122 -0
- data/test/integration/index_mapping_test.rb +43 -0
- data/test/integration/index_store_test.rb +96 -0
- data/test/integration/index_update_document_test.rb +111 -0
- data/test/integration/mongoid_searchable_test.rb +309 -0
- data/test/integration/percolator_test.rb +111 -0
- data/test/integration/persistent_model_test.rb +130 -0
- data/test/integration/prefix_query_test.rb +43 -0
- data/test/integration/query_return_version_test.rb +70 -0
- data/test/integration/query_string_test.rb +52 -0
- data/test/integration/range_queries_test.rb +36 -0
- data/test/integration/reindex_test.rb +46 -0
- data/test/integration/results_test.rb +39 -0
- data/test/integration/scan_test.rb +56 -0
- data/test/integration/script_fields_test.rb +38 -0
- data/test/integration/sort_test.rb +36 -0
- data/test/integration/text_query_test.rb +39 -0
- 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/article.rb +15 -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 +93 -0
- data/test/unit/active_model_lint_test.rb +17 -0
- data/test/unit/configuration_test.rb +74 -0
- data/test/unit/http_client_test.rb +76 -0
- data/test/unit/http_response_test.rb +49 -0
- data/test/unit/index_alias_test.rb +275 -0
- data/test/unit/index_test.rb +894 -0
- data/test/unit/logger_test.rb +125 -0
- 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 +528 -0
- data/test/unit/model_search_test.rb +913 -0
- data/test/unit/results_collection_test.rb +281 -0
- data/test/unit/results_item_test.rb +162 -0
- data/test/unit/rubyext_test.rb +66 -0
- data/test/unit/search_facet_test.rb +153 -0
- data/test/unit/search_filter_test.rb +42 -0
- data/test/unit/search_highlight_test.rb +46 -0
- data/test/unit/search_query_test.rb +301 -0
- data/test/unit/search_scan_test.rb +113 -0
- data/test/unit/search_script_field_test.rb +26 -0
- data/test/unit/search_sort_test.rb +50 -0
- data/test/unit/search_test.rb +499 -0
- data/test/unit/tire_test.rb +126 -0
- data/tire.gemspec +90 -0
- metadata +549 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class IndexUpdateDocumentIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Updating a document" do
|
9
|
+
|
10
|
+
setup do
|
11
|
+
Tire.index 'articles-with-tags' do
|
12
|
+
delete
|
13
|
+
create
|
14
|
+
|
15
|
+
store :type => 'article', :id => 1, :title => 'One', :tags => ['foo'], :views => 0
|
16
|
+
store :type => 'article', :id => 2, :title => 'Two', :tags => ['foo', 'bar'], :views => 10
|
17
|
+
store :type => 'article', :id => 3, :title => 'Three', :tags => ['foobar']
|
18
|
+
|
19
|
+
refresh
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
teardown { Tire.index('articles-with-tags').delete }
|
24
|
+
|
25
|
+
should "increment a counter" do
|
26
|
+
Tire.index('articles-with-tags') { update( 'article', '1', :script => "ctx._source.views += 1" ) and refresh }
|
27
|
+
|
28
|
+
document = Tire.search('articles-with-tags') { query { string 'title:one' } }.results.first
|
29
|
+
assert_equal 1, document.views, document.inspect
|
30
|
+
|
31
|
+
Tire.index('articles-with-tags') { update( 'article', '2', :script => "ctx._source.views += 1" ) and refresh }
|
32
|
+
|
33
|
+
document = Tire.search('articles-with-tags') { query { string 'title:two' } }.results.first
|
34
|
+
assert_equal 11, document.views, document.inspect
|
35
|
+
end
|
36
|
+
|
37
|
+
should "add a tag to document" do
|
38
|
+
Tire.index('articles-with-tags') do
|
39
|
+
update 'article', '1', :script => "ctx._source.tags += tag",
|
40
|
+
:params => { :tag => 'new' }
|
41
|
+
refresh
|
42
|
+
end
|
43
|
+
|
44
|
+
document = Tire.search('articles-with-tags') { query { string 'title:one' } }.results.first
|
45
|
+
assert_equal ['foo', 'new'], document.tags, document.inspect
|
46
|
+
end
|
47
|
+
|
48
|
+
should "remove a tag from document" do
|
49
|
+
Tire.index('articles-with-tags') do
|
50
|
+
update 'article', '1', :script => "ctx._source.tags = tags",
|
51
|
+
:params => { :tags => [] }
|
52
|
+
refresh
|
53
|
+
end
|
54
|
+
|
55
|
+
document = Tire.index('articles-with-tags').retrieve 'article', '1'
|
56
|
+
assert_equal [], document.tags, document.inspect
|
57
|
+
end
|
58
|
+
|
59
|
+
should "remove the entire document if specific condition is met" do
|
60
|
+
Tire.index('articles-with-tags') do
|
61
|
+
# Remove document when it contains tag 'foobar'
|
62
|
+
update 'article', '3', :script => "ctx._source.tags.contains(tag) ? ctx.op = 'delete' : 'none'",
|
63
|
+
:params => { :tag => 'foobar' }
|
64
|
+
refresh
|
65
|
+
end
|
66
|
+
|
67
|
+
assert_nil Tire.index('articles-with-tags').retrieve 'article', '3'
|
68
|
+
end
|
69
|
+
|
70
|
+
should "pass the operation parameters to the API" do
|
71
|
+
Tire.index('articles-with-tags').update 'article', '2', { :script => "ctx._source.tags += tag",
|
72
|
+
:params => { :tag => 'new' }
|
73
|
+
},
|
74
|
+
{
|
75
|
+
:refresh => true
|
76
|
+
}
|
77
|
+
|
78
|
+
document = Tire.search('articles-with-tags') { query { string 'title:two' } }.results.first
|
79
|
+
assert_equal 3, document.tags.size, document.inspect
|
80
|
+
end
|
81
|
+
|
82
|
+
should "access variables from the outer scope" do
|
83
|
+
$t = self
|
84
|
+
|
85
|
+
class Updater
|
86
|
+
@tags = ['foo', 'bar', 'baz']
|
87
|
+
|
88
|
+
def self.perform_update!
|
89
|
+
$t.assert_not_nil @tags
|
90
|
+
|
91
|
+
Tire.index('articles-with-tags') do |index|
|
92
|
+
$t.assert_not_nil @tags
|
93
|
+
|
94
|
+
index.update 'article', '3', :script => "ctx._source.tags = tags",
|
95
|
+
:params => { :tags => @tags }
|
96
|
+
index.refresh
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
Updater.perform_update!
|
102
|
+
|
103
|
+
document = Tire.search('articles-with-tags') { query { string 'title:three' } }.results.first
|
104
|
+
assert_equal 3, document.tags.size, document.inspect
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
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,111 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Tire
|
4
|
+
|
5
|
+
class PercolatorIntegrationTest < Test::Unit::TestCase
|
6
|
+
include Test::Integration
|
7
|
+
|
8
|
+
context "Percolator" do
|
9
|
+
setup do
|
10
|
+
delete_registered_queries
|
11
|
+
@index = Tire.index('percolator-test')
|
12
|
+
@index.create
|
13
|
+
end
|
14
|
+
teardown do
|
15
|
+
delete_registered_queries
|
16
|
+
@index.delete
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when registering a query" do
|
20
|
+
should "register query as a Hash" do
|
21
|
+
query = { :query => { :query_string => { :query => 'warning' } } }
|
22
|
+
assert @index.register_percolator_query('alert', query)
|
23
|
+
Tire.index('_percolator').refresh
|
24
|
+
|
25
|
+
percolator = Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/alert")
|
26
|
+
assert percolator
|
27
|
+
end
|
28
|
+
|
29
|
+
should "register query as block" do
|
30
|
+
assert @index.register_percolator_query('alert') { string 'warning' }
|
31
|
+
Tire.index('_percolator').refresh
|
32
|
+
|
33
|
+
percolator = Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/alert")
|
34
|
+
assert percolator
|
35
|
+
end
|
36
|
+
|
37
|
+
should "unregister a query" do
|
38
|
+
query = { :query => { :query_string => { :query => 'warning' } } }
|
39
|
+
assert @index.register_percolator_query('alert', query)
|
40
|
+
Tire.index('_percolator').refresh
|
41
|
+
assert Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/alert")
|
42
|
+
|
43
|
+
assert @index.unregister_percolator_query('alert')
|
44
|
+
Tire.index('_percolator').refresh
|
45
|
+
|
46
|
+
assert Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/alert").failure?
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when percolating a document" do
|
52
|
+
setup do
|
53
|
+
@index.register_percolator_query('alert') { string 'warning' }
|
54
|
+
@index.register_percolator_query('gantz') { string '"y u no match"' }
|
55
|
+
@index.register_percolator_query('weather', :tags => ['weather']) { string 'severe' }
|
56
|
+
Tire.index('_percolator').refresh
|
57
|
+
end
|
58
|
+
|
59
|
+
should "return an empty array when no query matches" do
|
60
|
+
matches = @index.percolate :message => 'Situation normal'
|
61
|
+
assert_equal [], matches
|
62
|
+
end
|
63
|
+
|
64
|
+
should "return an array of matching query names" do
|
65
|
+
matches = @index.percolate :message => 'Severe weather warning'
|
66
|
+
assert_equal ['alert','weather'], matches.sort
|
67
|
+
end
|
68
|
+
|
69
|
+
should "return an array of matching query names for specific percolated queries" do
|
70
|
+
matches = @index.percolate(:message => 'Severe weather warning') { term :tags, 'weather' }
|
71
|
+
assert_equal ['weather'], matches
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when storing document and percolating it" do
|
76
|
+
setup do
|
77
|
+
@index.register_percolator_query('alert') { string 'warning' }
|
78
|
+
@index.register_percolator_query('gantz') { string '"y u no match"' }
|
79
|
+
@index.register_percolator_query('weather', :tags => ['weather']) { string 'severe' }
|
80
|
+
Tire.index('_percolator').refresh
|
81
|
+
end
|
82
|
+
|
83
|
+
should "return an empty array when no query matches" do
|
84
|
+
response = @index.store( {:message => 'Situation normal'}, {:percolate => true} )
|
85
|
+
assert_equal [], response['matches']
|
86
|
+
end
|
87
|
+
|
88
|
+
should "return an array of matching query names" do
|
89
|
+
response = @index.store( {:message => 'Severe weather warning'}, {:percolate => true} )
|
90
|
+
assert_equal ['alert','weather'], response['matches'].sort
|
91
|
+
end
|
92
|
+
|
93
|
+
should "return an array of matching query names for specific percolated queries" do
|
94
|
+
response = @index.store( {:message => 'Severe weather warning'}, {:percolate => 'tags:weather'} )
|
95
|
+
assert_equal ['weather'], response['matches']
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def delete_registered_queries
|
104
|
+
Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/alert") rescue nil
|
105
|
+
Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/gantz") rescue nil
|
106
|
+
Configuration.client.get("#{Configuration.url}/_percolator/percolator-test/weather") rescue nil
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|