elasticsearch-model 7.2.0 → 8.0.0
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +22 -22
- data/Rakefile +7 -6
- data/elasticsearch-model.gemspec +5 -5
- data/examples/activerecord_associations.rb +1 -1
- data/examples/activerecord_custom_analyzer.rb +2 -2
- data/gemfiles/{6.0.gemfile → 6.1.gemfile} +6 -6
- data/gemfiles/{5.0.gemfile → 7.0.gemfile} +8 -7
- data/gemfiles/{3.0.gemfile → 7.1.gemfile} +9 -8
- data/lib/elasticsearch/model/adapter.rb +0 -2
- data/lib/elasticsearch/model/adapters/active_record.rb +0 -4
- data/lib/elasticsearch/model/adapters/default.rb +0 -4
- data/lib/elasticsearch/model/adapters/mongoid.rb +9 -11
- data/lib/elasticsearch/model/adapters/multiple.rb +0 -1
- data/lib/elasticsearch/model/importing.rb +1 -12
- data/lib/elasticsearch/model/indexing.rb +6 -19
- data/lib/elasticsearch/model/multimodel.rb +1 -10
- data/lib/elasticsearch/model/naming.rb +7 -58
- data/lib/elasticsearch/model/proxy.rb +6 -7
- data/lib/elasticsearch/model/response/result.rb +0 -6
- data/lib/elasticsearch/model/searching.rb +2 -3
- data/lib/elasticsearch/model/version.rb +1 -1
- data/lib/elasticsearch/model.rb +6 -3
- data/spec/elasticsearch/model/adapter_spec.rb +0 -11
- data/spec/elasticsearch/model/adapters/active_record/associations_spec.rb +48 -76
- data/spec/elasticsearch/model/adapters/active_record/basic_spec.rb +6 -78
- data/spec/elasticsearch/model/adapters/active_record/import_spec.rb +6 -2
- data/spec/elasticsearch/model/adapters/active_record/namespaced_model_spec.rb +1 -5
- data/spec/elasticsearch/model/adapters/active_record/pagination_spec.rb +0 -8
- data/spec/elasticsearch/model/adapters/active_record/parent_child_spec.rb +1 -4
- data/spec/elasticsearch/model/adapters/active_record/serialization_spec.rb +9 -11
- data/spec/elasticsearch/model/adapters/mongoid_spec.rb +1 -1
- data/spec/elasticsearch/model/adapters/multiple_spec.rb +1 -11
- data/spec/elasticsearch/model/importing_spec.rb +6 -35
- data/spec/elasticsearch/model/indexing_spec.rb +45 -170
- data/spec/elasticsearch/model/module_spec.rb +0 -1
- data/spec/elasticsearch/model/multimodel_spec.rb +2 -8
- data/spec/elasticsearch/model/naming_spec.rb +0 -68
- data/spec/elasticsearch/model/proxy_spec.rb +8 -2
- data/spec/elasticsearch/model/response/aggregations_spec.rb +4 -4
- data/spec/elasticsearch/model/response/base_spec.rb +0 -1
- data/spec/elasticsearch/model/response/pagination/kaminari_spec.rb +3 -4
- data/spec/elasticsearch/model/response/pagination/will_paginate_spec.rb +0 -1
- data/spec/elasticsearch/model/response/records_spec.rb +0 -1
- data/spec/elasticsearch/model/response/response_spec.rb +0 -1
- data/spec/elasticsearch/model/response/result_spec.rb +0 -17
- data/spec/elasticsearch/model/response/results_spec.rb +0 -1
- data/spec/elasticsearch/model/searching_search_request_spec.rb +5 -6
- data/spec/spec_helper.rb +9 -11
- data/spec/support/app/answer.rb +0 -1
- data/spec/support/app/article.rb +0 -2
- data/spec/support/app/article_no_type.rb +1 -1
- data/spec/support/app/namespaced_book.rb +0 -2
- data/spec/support/app/parent_and_child_searchable.rb +6 -4
- data/spec/support/app/question.rb +0 -1
- metadata +15 -16
- data/gemfiles/4.0.gemfile +0 -36
@@ -18,44 +18,7 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
describe Elasticsearch::Model::Adapter::ActiveRecord do
|
21
|
-
|
22
|
-
context 'when a document_type is not defined for the Model' do
|
23
|
-
|
24
|
-
before do
|
25
|
-
ActiveRecord::Schema.define(:version => 1) do
|
26
|
-
create_table :article_no_types do |t|
|
27
|
-
t.string :title
|
28
|
-
t.string :body
|
29
|
-
t.integer :clicks, :default => 0
|
30
|
-
t.datetime :created_at, :default => 'NOW()'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
ArticleNoType.delete_all
|
35
|
-
ArticleNoType.__elasticsearch__.create_index!(force: true)
|
36
|
-
|
37
|
-
ArticleNoType.create!(title: 'Test', body: '', clicks: 1)
|
38
|
-
ArticleNoType.create!(title: 'Testing Coding', body: '', clicks: 2)
|
39
|
-
ArticleNoType.create!(title: 'Coding', body: '', clicks: 3)
|
40
|
-
|
41
|
-
ArticleNoType.__elasticsearch__.refresh_index!
|
42
|
-
end
|
43
|
-
|
44
|
-
describe 'indexing a document' do
|
45
|
-
|
46
|
-
let(:search_result) do
|
47
|
-
ArticleNoType.search('title:test')
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'allows searching for documents' do
|
51
|
-
expect(search_result.results.size).to be(2)
|
52
|
-
expect(search_result.records.size).to be(2)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when a document_type is defined for the Model' do
|
58
|
-
|
21
|
+
context 'for the Model' do
|
59
22
|
before(:all) do
|
60
23
|
ActiveRecord::Schema.define(:version => 1) do
|
61
24
|
create_table :articles do |t|
|
@@ -67,7 +30,7 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
67
30
|
end
|
68
31
|
|
69
32
|
Article.delete_all
|
70
|
-
Article.__elasticsearch__.create_index!(force: true
|
33
|
+
Article.__elasticsearch__.create_index!(force: true)
|
71
34
|
|
72
35
|
Article.create!(title: 'Test', body: '', clicks: 1)
|
73
36
|
Article.create!(title: 'Testing Coding', body: '', clicks: 2)
|
@@ -77,7 +40,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
77
40
|
end
|
78
41
|
|
79
42
|
describe 'indexing a document' do
|
80
|
-
|
81
43
|
let(:search_result) do
|
82
44
|
Article.search('title:test')
|
83
45
|
end
|
@@ -89,7 +51,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
89
51
|
end
|
90
52
|
|
91
53
|
describe '#results' do
|
92
|
-
|
93
54
|
let(:search_result) do
|
94
55
|
Article.search('title:test')
|
95
56
|
end
|
@@ -98,12 +59,11 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
98
59
|
expect(search_result.results.first).to be_a(Elasticsearch::Model::Response::Result)
|
99
60
|
end
|
100
61
|
|
101
|
-
it '
|
62
|
+
it 'properly loads the document' do
|
102
63
|
expect(search_result.results.first.title).to eq('Test')
|
103
64
|
end
|
104
65
|
|
105
66
|
context 'when the result contains other data' do
|
106
|
-
|
107
67
|
let(:search_result) do
|
108
68
|
Article.search(query: { match: { title: 'test' } }, highlight: { fields: { title: {} } })
|
109
69
|
end
|
@@ -120,7 +80,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
120
80
|
end
|
121
81
|
|
122
82
|
describe '#records' do
|
123
|
-
|
124
83
|
let(:search_result) do
|
125
84
|
Article.search('title:test')
|
126
85
|
end
|
@@ -135,7 +94,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
135
94
|
end
|
136
95
|
|
137
96
|
describe 'Enumerable' do
|
138
|
-
|
139
97
|
let(:search_result) do
|
140
98
|
Article.search('title:test')
|
141
99
|
end
|
@@ -150,7 +108,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
150
108
|
end
|
151
109
|
|
152
110
|
describe '#id' do
|
153
|
-
|
154
111
|
let(:search_result) do
|
155
112
|
Article.search('title:test')
|
156
113
|
end
|
@@ -160,19 +117,7 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
160
117
|
end
|
161
118
|
end
|
162
119
|
|
163
|
-
describe '#id' do
|
164
|
-
|
165
|
-
let(:search_result) do
|
166
|
-
Article.search('title:test')
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'returns the type' do
|
170
|
-
expect(search_result.results.first.type).to eq('article')
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
120
|
describe '#each_with_hit' do
|
175
|
-
|
176
121
|
let(:search_result) do
|
177
122
|
Article.search('title:test')
|
178
123
|
end
|
@@ -186,7 +131,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
186
131
|
end
|
187
132
|
|
188
133
|
describe 'search results order' do
|
189
|
-
|
190
134
|
let(:search_result) do
|
191
135
|
Article.search(query: { match: { title: 'code' }}, sort: { clicks: :desc })
|
192
136
|
end
|
@@ -209,7 +153,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
209
153
|
end
|
210
154
|
|
211
155
|
describe 'a paged collection' do
|
212
|
-
|
213
156
|
let(:search_result) do
|
214
157
|
Article.search(query: { match: { title: { query: 'test' } } },
|
215
158
|
size: 2,
|
@@ -225,7 +168,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
225
168
|
end
|
226
169
|
|
227
170
|
describe '#destroy' do
|
228
|
-
|
229
171
|
before do
|
230
172
|
Article.create!(title: 'destroy', body: '', clicks: 1)
|
231
173
|
Article.__elasticsearch__.refresh_index!
|
@@ -246,7 +188,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
246
188
|
end
|
247
189
|
|
248
190
|
describe 'full document updates' do
|
249
|
-
|
250
191
|
before do
|
251
192
|
article = Article.create!(title: 'update', body: '', clicks: 1)
|
252
193
|
Article.__elasticsearch__.refresh_index!
|
@@ -267,7 +208,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
267
208
|
end
|
268
209
|
|
269
210
|
describe 'attribute updates' do
|
270
|
-
|
271
211
|
before do
|
272
212
|
article = Article.create!(title: 'update', body: '', clicks: 1)
|
273
213
|
Article.__elasticsearch__.refresh_index!
|
@@ -288,7 +228,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
288
228
|
end
|
289
229
|
|
290
230
|
describe '#save' do
|
291
|
-
|
292
231
|
before do
|
293
232
|
article = Article.create!(title: 'save', body: '', clicks: 1)
|
294
233
|
|
@@ -315,7 +254,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
315
254
|
end
|
316
255
|
|
317
256
|
describe 'a DSL search' do
|
318
|
-
|
319
257
|
let(:search_result) do
|
320
258
|
Article.search(query: { match: { title: { query: 'test' } } })
|
321
259
|
end
|
@@ -327,7 +265,6 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
327
265
|
end
|
328
266
|
|
329
267
|
describe 'chaining SQL queries on response.records' do
|
330
|
-
|
331
268
|
let(:search_result) do
|
332
269
|
Article.search(query: { match: { title: { query: 'test' } } })
|
333
270
|
end
|
@@ -340,31 +277,23 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
340
277
|
end
|
341
278
|
|
342
279
|
describe 'ordering of SQL queries' do
|
343
|
-
|
344
280
|
context 'when order is called on the ActiveRecord query' do
|
345
|
-
|
346
281
|
let(:search_result) do
|
347
282
|
Article.search query: { match: { title: { query: 'test' } } }
|
348
283
|
end
|
349
284
|
|
350
|
-
it 'allows the SQL query to be ordered independent of the Elasticsearch results order'
|
351
|
-
expect(search_result.records.order('title DESC').first.title).to eq('Testing Coding')
|
352
|
-
expect(search_result.records.order('title DESC')[0].title).to eq('Testing Coding')
|
353
|
-
end
|
354
|
-
|
355
|
-
it 'allows the SQL query to be ordered independent of the Elasticsearch results order', if: active_record_at_least_4? do
|
285
|
+
it 'allows the SQL query to be ordered independent of the Elasticsearch results order' do
|
356
286
|
expect(search_result.records.order(title: :desc).first.title).to eq('Testing Coding')
|
357
287
|
expect(search_result.records.order(title: :desc)[0].title).to eq('Testing Coding')
|
358
288
|
end
|
359
289
|
end
|
360
290
|
|
361
291
|
context 'when more methods are chained on the ActiveRecord query' do
|
362
|
-
|
363
292
|
let(:search_result) do
|
364
293
|
Article.search query: {match: {title: {query: 'test'}}}
|
365
294
|
end
|
366
295
|
|
367
|
-
it 'allows the SQL query to be ordered independent of the Elasticsearch results order'
|
296
|
+
it 'allows the SQL query to be ordered independent of the Elasticsearch results order' do
|
368
297
|
expect(search_result.records.distinct.order(title: :desc).first.title).to eq('Testing Coding')
|
369
298
|
expect(search_result.records.distinct.order(title: :desc)[0].title).to eq('Testing Coding')
|
370
299
|
end
|
@@ -372,11 +301,10 @@ describe Elasticsearch::Model::Adapter::ActiveRecord do
|
|
372
301
|
end
|
373
302
|
|
374
303
|
describe 'access to the response via methods' do
|
375
|
-
|
376
304
|
let(:search_result) do
|
377
305
|
Article.search(query: { match: { title: { query: 'test' } } },
|
378
306
|
aggregations: {
|
379
|
-
dates: { date_histogram: { field: 'created_at',
|
307
|
+
dates: { date_histogram: { field: 'created_at', calendar_interval: 'hour' } },
|
380
308
|
clicks: { global: {}, aggregations: { min: { min: { field: 'clicks' } } } }
|
381
309
|
},
|
382
310
|
suggest: { text: 'tezt', title: { term: { field: 'title', suggest_mode: 'always' } } })
|
@@ -19,12 +19,12 @@ require 'spec_helper'
|
|
19
19
|
|
20
20
|
describe 'Elasticsearch::Model::Adapter::ActiveRecord Importing' do
|
21
21
|
before(:all) do
|
22
|
-
ActiveRecord::Schema.define(:
|
22
|
+
ActiveRecord::Schema.define(version: 1) do
|
23
23
|
create_table :import_articles do |t|
|
24
24
|
t.string :title
|
25
25
|
t.integer :views
|
26
26
|
t.string :numeric # For the sake of invalid data sent to Elasticsearch
|
27
|
-
t.datetime :created_at, :
|
27
|
+
t.datetime :created_at, default: 'NOW()'
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -52,6 +52,10 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Importing' do
|
|
52
52
|
it 'imports all documents' do
|
53
53
|
expect(ImportArticle.search('*').results.total).to eq(10)
|
54
54
|
end
|
55
|
+
|
56
|
+
it "does not pollute the model's namespace" do
|
57
|
+
expect(ImportArticle.methods).not_to include(:__transform)
|
58
|
+
end
|
55
59
|
end
|
56
60
|
|
57
61
|
context 'when batch size is specified' do
|
@@ -27,7 +27,7 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Namespaced Model' do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
MyNamespace::Book.delete_all
|
30
|
-
MyNamespace::Book.__elasticsearch__.create_index!(force: true
|
30
|
+
MyNamespace::Book.__elasticsearch__.create_index!(force: true)
|
31
31
|
MyNamespace::Book.create!(title: 'Test')
|
32
32
|
MyNamespace::Book.__elasticsearch__.refresh_index!
|
33
33
|
end
|
@@ -43,10 +43,6 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Namespaced Model' do
|
|
43
43
|
expect(MyNamespace::Book.index_name).to eq('my_namespace-books')
|
44
44
|
end
|
45
45
|
|
46
|
-
it 'has the proper document type' do
|
47
|
-
expect(MyNamespace::Book.document_type).to eq('book')
|
48
|
-
end
|
49
|
-
|
50
46
|
it 'saves the document into the index' do
|
51
47
|
expect(MyNamespace::Book.search('title:test').results.size).to eq(1)
|
52
48
|
expect(MyNamespace::Book.search('title:test').results.first.title).to eq('Test')
|
@@ -18,7 +18,6 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
describe 'Elasticsearch::Model::Adapter::ActiveRecord Pagination' do
|
21
|
-
|
22
21
|
before(:all) do
|
23
22
|
ActiveRecord::Schema.define(:version => 1) do
|
24
23
|
create_table ArticleForPagination.table_name do |t|
|
@@ -41,48 +40,41 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Pagination' do
|
|
41
40
|
end
|
42
41
|
|
43
42
|
context 'when no other page is specified' do
|
44
|
-
|
45
43
|
let(:records) do
|
46
44
|
ArticleForPagination.search('title:test').page(1).records
|
47
45
|
end
|
48
46
|
|
49
47
|
describe '#size' do
|
50
|
-
|
51
48
|
it 'returns the correct size' do
|
52
49
|
expect(records.size).to eq(25)
|
53
50
|
end
|
54
51
|
end
|
55
52
|
|
56
53
|
describe '#current_page' do
|
57
|
-
|
58
54
|
it 'returns the correct current page' do
|
59
55
|
expect(records.current_page).to eq(1)
|
60
56
|
end
|
61
57
|
end
|
62
58
|
|
63
59
|
describe '#prev_page' do
|
64
|
-
|
65
60
|
it 'returns the correct previous page' do
|
66
61
|
expect(records.prev_page).to be_nil
|
67
62
|
end
|
68
63
|
end
|
69
64
|
|
70
65
|
describe '#next_page' do
|
71
|
-
|
72
66
|
it 'returns the correct next page' do
|
73
67
|
expect(records.next_page).to eq(2)
|
74
68
|
end
|
75
69
|
end
|
76
70
|
|
77
71
|
describe '#total_pages' do
|
78
|
-
|
79
72
|
it 'returns the correct total pages' do
|
80
73
|
expect(records.total_pages).to eq(3)
|
81
74
|
end
|
82
75
|
end
|
83
76
|
|
84
77
|
describe '#first_page?' do
|
85
|
-
|
86
78
|
it 'returns the correct first page' do
|
87
79
|
expect(records.first_page?).to be(true)
|
88
80
|
end
|
@@ -38,7 +38,7 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Parent-Child' do
|
|
38
38
|
add_index(:answers, :question_id) unless index_exists?(:answers, :question_id)
|
39
39
|
|
40
40
|
clear_tables(Question)
|
41
|
-
ParentChildSearchable.create_index!(force: true
|
41
|
+
ParentChildSearchable.create_index!(force: true)
|
42
42
|
|
43
43
|
q_1 = Question.create!(title: 'First Question', author: 'John')
|
44
44
|
q_2 = Question.create!(title: 'Second Question', author: 'Jody')
|
@@ -53,7 +53,6 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Parent-Child' do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
describe 'has_child search' do
|
56
|
-
|
57
56
|
let(:search_result) do
|
58
57
|
Question.search(query: { has_child: { type: 'answer', query: { match: { author: 'john' } } } })
|
59
58
|
end
|
@@ -64,7 +63,6 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Parent-Child' do
|
|
64
63
|
end
|
65
64
|
|
66
65
|
describe 'hash_parent search' do
|
67
|
-
|
68
66
|
let(:search_result) do
|
69
67
|
Answer.search(query: { has_parent: { parent_type: 'question', query: { match: { author: 'john' } } } })
|
70
68
|
end
|
@@ -75,7 +73,6 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Parent-Child' do
|
|
75
73
|
end
|
76
74
|
|
77
75
|
context 'when a parent is deleted' do
|
78
|
-
|
79
76
|
before do
|
80
77
|
Question.where(title: 'First Question').each(&:destroy)
|
81
78
|
Question.__elasticsearch__.refresh_index!
|
@@ -18,7 +18,6 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
describe 'Elasticsearch::Model::Adapter::ActiveRecord Serialization' do
|
21
|
-
|
22
21
|
before(:all) do
|
23
22
|
ActiveRecord::Schema.define(:version => 1) do
|
24
23
|
create_table ArticleWithCustomSerialization.table_name do |t|
|
@@ -32,18 +31,17 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Serialization' do
|
|
32
31
|
end
|
33
32
|
|
34
33
|
context 'when the model has a custom serialization defined' do
|
35
|
-
|
36
34
|
before do
|
37
35
|
ArticleWithCustomSerialization.create!(title: 'Test', status: 'green')
|
38
36
|
ArticleWithCustomSerialization.__elasticsearch__.refresh_index!
|
39
37
|
end
|
40
38
|
|
41
39
|
context 'when a document is indexed' do
|
42
|
-
|
43
40
|
let(:search_result) do
|
44
|
-
ArticleWithCustomSerialization.__elasticsearch__.client.get(
|
45
|
-
|
46
|
-
|
41
|
+
ArticleWithCustomSerialization.__elasticsearch__.client.get(
|
42
|
+
index: 'article_with_custom_serializations',
|
43
|
+
id: '1'
|
44
|
+
)
|
47
45
|
end
|
48
46
|
|
49
47
|
it 'applies the serialization when indexing' do
|
@@ -52,9 +50,8 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Serialization' do
|
|
52
50
|
end
|
53
51
|
|
54
52
|
context 'when a document is updated' do
|
55
|
-
|
56
53
|
before do
|
57
|
-
article.
|
54
|
+
article.update(title: 'UPDATED', status: 'yellow')
|
58
55
|
ArticleWithCustomSerialization.__elasticsearch__.refresh_index!
|
59
56
|
end
|
60
57
|
|
@@ -65,9 +62,10 @@ describe 'Elasticsearch::Model::Adapter::ActiveRecord Serialization' do
|
|
65
62
|
end
|
66
63
|
|
67
64
|
let(:search_result) do
|
68
|
-
ArticleWithCustomSerialization.__elasticsearch__.client.get(
|
69
|
-
|
70
|
-
|
65
|
+
ArticleWithCustomSerialization.__elasticsearch__.client.get(
|
66
|
+
index: 'article_with_custom_serializations',
|
67
|
+
id: article.id
|
68
|
+
)
|
71
69
|
end
|
72
70
|
|
73
71
|
it 'applies the serialization when updating' do
|
@@ -174,7 +174,7 @@ describe Elasticsearch::Model::Adapter::Mongoid do
|
|
174
174
|
context 'query criteria specified as a hash' do
|
175
175
|
|
176
176
|
before do
|
177
|
-
expect(relation).to receive(:where).with(color: 'red').and_return(relation)
|
177
|
+
expect(relation).to receive(:where).with({ color: 'red' }).and_return(relation)
|
178
178
|
end
|
179
179
|
|
180
180
|
let(:query) do
|
@@ -18,13 +18,11 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
describe Elasticsearch::Model::Adapter::Multiple do
|
21
|
-
|
22
21
|
before(:all) do
|
23
22
|
class DummyOne
|
24
23
|
include Elasticsearch::Model
|
25
24
|
|
26
25
|
index_name 'dummy'
|
27
|
-
document_type 'dummy_one'
|
28
26
|
|
29
27
|
def self.find(ids)
|
30
28
|
ids.map { |id| new(id) }
|
@@ -42,7 +40,6 @@ describe Elasticsearch::Model::Adapter::Multiple do
|
|
42
40
|
include Elasticsearch::Model
|
43
41
|
|
44
42
|
index_name 'dummy'
|
45
|
-
document_type 'dummy_two'
|
46
43
|
|
47
44
|
def self.find(ids)
|
48
45
|
ids.map { |id| new(id) }
|
@@ -60,7 +57,6 @@ describe Elasticsearch::Model::Adapter::Multiple do
|
|
60
57
|
include Elasticsearch::Model
|
61
58
|
|
62
59
|
index_name 'other_index'
|
63
|
-
document_type 'dummy_two'
|
64
60
|
|
65
61
|
def self.find(ids)
|
66
62
|
ids.map { |id| new(id) }
|
@@ -86,27 +82,22 @@ describe Elasticsearch::Model::Adapter::Multiple do
|
|
86
82
|
[
|
87
83
|
{
|
88
84
|
_index: 'dummy',
|
89
|
-
_type: 'dummy_two',
|
90
85
|
_id: '2'
|
91
86
|
},
|
92
87
|
{
|
93
88
|
_index: 'dummy',
|
94
|
-
_type: 'dummy_one',
|
95
89
|
_id: '2'
|
96
90
|
},
|
97
91
|
{
|
98
92
|
_index: 'other_index',
|
99
|
-
_type: 'dummy_two',
|
100
93
|
_id: '1'
|
101
94
|
},
|
102
95
|
{
|
103
96
|
_index: 'dummy',
|
104
|
-
_type: 'dummy_two',
|
105
97
|
_id: '1'
|
106
98
|
},
|
107
99
|
{
|
108
100
|
_index: 'dummy',
|
109
|
-
_type: 'dummy_one',
|
110
101
|
_id: '3'
|
111
102
|
}
|
112
103
|
]
|
@@ -121,13 +112,12 @@ describe Elasticsearch::Model::Adapter::Multiple do
|
|
121
112
|
end
|
122
113
|
|
123
114
|
describe '#records' do
|
124
|
-
|
125
115
|
before do
|
126
116
|
multimodel.class.send :include, Elasticsearch::Model::Adapter::Multiple::Records
|
127
117
|
expect(multimodel).to receive(:response).at_least(:once).and_return(response)
|
128
118
|
end
|
129
119
|
|
130
|
-
|
120
|
+
xit 'instantiates the correct types of instances' do
|
131
121
|
expect(multimodel.records[0]).to be_a(Namespace::DummyTwo)
|
132
122
|
expect(multimodel.records[1]).to be_a(DummyOne)
|
133
123
|
expect(multimodel.records[2]).to be_a(DummyTwo)
|
@@ -18,18 +18,17 @@
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
20
|
describe Elasticsearch::Model::Importing do
|
21
|
-
|
22
21
|
before(:all) do
|
23
22
|
class DummyImportingModel
|
24
23
|
end
|
25
24
|
|
26
25
|
module DummyImportingAdapter
|
27
26
|
module ImportingMixin
|
28
|
-
def __find_in_batches(options={}, &block)
|
27
|
+
def __find_in_batches(options = {}, &block)
|
29
28
|
yield if block_given?
|
30
29
|
end
|
31
30
|
def __transform
|
32
|
-
lambda {|a|}
|
31
|
+
lambda { |a| }
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
@@ -49,7 +48,6 @@ describe Elasticsearch::Model::Importing do
|
|
49
48
|
end
|
50
49
|
|
51
50
|
context 'when a model includes the Importing module' do
|
52
|
-
|
53
51
|
it 'provides importing methods' do
|
54
52
|
expect(DummyImportingModel.respond_to?(:import)).to be(true)
|
55
53
|
expect(DummyImportingModel.respond_to?(:__find_in_batches)).to be(true)
|
@@ -57,10 +55,8 @@ describe Elasticsearch::Model::Importing do
|
|
57
55
|
end
|
58
56
|
|
59
57
|
describe '#import' do
|
60
|
-
|
61
58
|
before do
|
62
59
|
allow(DummyImportingModel).to receive(:index_name).and_return('foo')
|
63
|
-
allow(DummyImportingModel).to receive(:document_type).and_return('foo')
|
64
60
|
allow(DummyImportingModel).to receive(:index_exists?).and_return(true)
|
65
61
|
allow(DummyImportingModel).to receive(:__batch_to_bulk)
|
66
62
|
allow(client).to receive(:bulk).and_return(response)
|
@@ -75,7 +71,6 @@ describe Elasticsearch::Model::Importing do
|
|
75
71
|
end
|
76
72
|
|
77
73
|
context 'when no options are provided' do
|
78
|
-
|
79
74
|
before do
|
80
75
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
81
76
|
allow(DummyImportingModel).to receive(:index_exists?).and_return(true)
|
@@ -87,7 +82,6 @@ describe Elasticsearch::Model::Importing do
|
|
87
82
|
end
|
88
83
|
|
89
84
|
context 'when there is an error' do
|
90
|
-
|
91
85
|
before do
|
92
86
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
93
87
|
allow(DummyImportingModel).to receive(:index_exists?).and_return(true)
|
@@ -102,14 +96,12 @@ describe Elasticsearch::Model::Importing do
|
|
102
96
|
end
|
103
97
|
|
104
98
|
context 'when the method is called with the option to return the errors' do
|
105
|
-
|
106
99
|
it 'returns the errors' do
|
107
100
|
expect(DummyImportingModel.import(return: 'errors')).to eq([{ 'index' => { 'error' => 'FAILED' } }])
|
108
101
|
end
|
109
102
|
end
|
110
103
|
|
111
104
|
context 'when the method is called with a block' do
|
112
|
-
|
113
105
|
it 'yields the response to the block' do
|
114
106
|
DummyImportingModel.import do |response|
|
115
107
|
expect(response['items'].size).to eq(2)
|
@@ -119,7 +111,6 @@ describe Elasticsearch::Model::Importing do
|
|
119
111
|
end
|
120
112
|
|
121
113
|
context 'when the index does not exist' do
|
122
|
-
|
123
114
|
before do
|
124
115
|
allow(DummyImportingModel).to receive(:index_exists?).and_return(false)
|
125
116
|
end
|
@@ -132,10 +123,9 @@ describe Elasticsearch::Model::Importing do
|
|
132
123
|
end
|
133
124
|
|
134
125
|
context 'when the method is called with the force option' do
|
135
|
-
|
136
126
|
before do
|
137
127
|
expect(DummyImportingModel).to receive(:create_index!).with(force: true, index: 'foo').and_return(true)
|
138
|
-
expect(DummyImportingModel).to receive(:__find_in_batches).with(foo: 'bar').and_return(true)
|
128
|
+
expect(DummyImportingModel).to receive(:__find_in_batches).with({ foo: 'bar' }).and_return(true)
|
139
129
|
end
|
140
130
|
|
141
131
|
it 'deletes and creates the index' do
|
@@ -144,10 +134,9 @@ describe Elasticsearch::Model::Importing do
|
|
144
134
|
end
|
145
135
|
|
146
136
|
context 'when the method is called with the refresh option' do
|
147
|
-
|
148
137
|
before do
|
149
138
|
expect(DummyImportingModel).to receive(:refresh_index!).with(index: 'foo').and_return(true)
|
150
|
-
expect(DummyImportingModel).to receive(:__find_in_batches).with(foo: 'bar').and_return(true)
|
139
|
+
expect(DummyImportingModel).to receive(:__find_in_batches).with({ foo: 'bar' }).and_return(true)
|
151
140
|
end
|
152
141
|
|
153
142
|
it 'refreshes the index' do
|
@@ -156,10 +145,9 @@ describe Elasticsearch::Model::Importing do
|
|
156
145
|
end
|
157
146
|
|
158
147
|
context 'when a different index name is provided' do
|
159
|
-
|
160
148
|
before do
|
161
149
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
162
|
-
expect(client).to receive(:bulk).with(body: nil, index: 'my-new-index'
|
150
|
+
expect(client).to receive(:bulk).with({ body: nil, index: 'my-new-index' }).and_return(response)
|
163
151
|
end
|
164
152
|
|
165
153
|
it 'uses the alternate index name' do
|
@@ -167,20 +155,7 @@ describe Elasticsearch::Model::Importing do
|
|
167
155
|
end
|
168
156
|
end
|
169
157
|
|
170
|
-
context 'when a different document type is provided' do
|
171
|
-
|
172
|
-
before do
|
173
|
-
expect(DummyImportingModel).to receive(:client).and_return(client)
|
174
|
-
expect(client).to receive(:bulk).with(body: nil, index: 'foo', type: 'my-new-type').and_return(response)
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'uses the alternate index name' do
|
178
|
-
expect(DummyImportingModel.import(type: 'my-new-type')).to eq(0)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
158
|
context 'the transform method' do
|
183
|
-
|
184
159
|
before do
|
185
160
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
186
161
|
expect(DummyImportingModel).to receive(:__transform).and_return(transform)
|
@@ -197,9 +172,7 @@ describe Elasticsearch::Model::Importing do
|
|
197
172
|
end
|
198
173
|
|
199
174
|
context 'when a transform is provided as an option' do
|
200
|
-
|
201
175
|
context 'when the transform option is not a lambda' do
|
202
|
-
|
203
176
|
let(:transform) do
|
204
177
|
'not_callable'
|
205
178
|
end
|
@@ -212,7 +185,6 @@ describe Elasticsearch::Model::Importing do
|
|
212
185
|
end
|
213
186
|
|
214
187
|
context 'when the transform option is a lambda' do
|
215
|
-
|
216
188
|
before do
|
217
189
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
218
190
|
expect(DummyImportingModel).to receive(:__batch_to_bulk).with(anything, transform)
|
@@ -229,10 +201,9 @@ describe Elasticsearch::Model::Importing do
|
|
229
201
|
end
|
230
202
|
|
231
203
|
context 'when a pipeline is provided as an options' do
|
232
|
-
|
233
204
|
before do
|
234
205
|
expect(DummyImportingModel).to receive(:client).and_return(client)
|
235
|
-
expect(client).to receive(:bulk).with(body: nil, index: 'foo',
|
206
|
+
expect(client).to receive(:bulk).with({ body: nil, index: 'foo', pipeline: 'my-pipeline' }).and_return(response)
|
236
207
|
end
|
237
208
|
|
238
209
|
it 'uses the pipeline option' do
|