chewy 5.0.0 → 5.2.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/.circleci/config.yml +214 -0
- data/Appraisals +1 -17
- data/CHANGELOG.md +40 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +61 -35
- data/chewy.gemspec +4 -4
- data/gemfiles/rails.5.2.activerecord.gemfile +4 -3
- data/gemfiles/{rails.5.0.activerecord.gemfile → rails.5.2.mongoid.6.4.gemfile} +4 -3
- data/gemfiles/{rails.5.0.mongoid.6.1.gemfile → rails.6.0.activerecord.gemfile} +4 -3
- data/gemfiles/{rails.5.1.activerecord.gemfile → rails.6.1.activerecord.gemfile} +6 -3
- data/gemfiles/ruby3.gemfile +10 -0
- data/lib/chewy/backports/duplicable.rb +1 -1
- data/lib/chewy/fields/base.rb +1 -1
- data/lib/chewy/fields/root.rb +2 -2
- data/lib/chewy/index/actions.rb +9 -3
- data/lib/chewy/query/loading.rb +1 -1
- data/lib/chewy/query/nodes/field.rb +1 -1
- data/lib/chewy/query.rb +5 -0
- data/lib/chewy/railtie.rb +1 -1
- data/lib/chewy/search/loader.rb +1 -1
- data/lib/chewy/search/parameters/allow_partial_search_results.rb +27 -0
- data/lib/chewy/search/parameters/indices.rb +123 -0
- data/lib/chewy/search/parameters.rb +24 -6
- data/lib/chewy/search/request.rb +76 -51
- data/lib/chewy/search/scrolling.rb +3 -5
- data/lib/chewy/search.rb +1 -5
- data/lib/chewy/strategy/active_job.rb +1 -1
- data/lib/chewy/strategy/sidekiq.rb +1 -1
- data/lib/chewy/type/adapter/active_record.rb +1 -1
- data/lib/chewy/type/adapter/mongoid.rb +1 -1
- data/lib/chewy/type/adapter/orm.rb +1 -1
- data/lib/chewy/type/adapter/sequel.rb +1 -1
- data/lib/chewy/type/import/bulk_request.rb +4 -2
- data/lib/chewy/type/import/journal_builder.rb +1 -1
- data/lib/chewy/type/import/routine.rb +1 -1
- data/lib/chewy/type/import.rb +3 -3
- data/lib/chewy/type/mapping.rb +4 -4
- data/lib/chewy/type/observe.rb +3 -3
- data/lib/chewy/type/witchcraft.rb +1 -1
- data/lib/chewy/type/wrapper.rb +1 -1
- data/lib/chewy/version.rb +1 -1
- data/lib/chewy.rb +1 -1
- data/spec/chewy/config_spec.rb +1 -1
- data/spec/chewy/fields/base_spec.rb +11 -9
- data/spec/chewy/index/actions_spec.rb +2 -2
- data/spec/chewy/journal_spec.rb +1 -1
- data/spec/chewy/search/parameters/indices_spec.rb +191 -0
- data/spec/chewy/search/parameters_spec.rb +20 -3
- data/spec/chewy/search/request_spec.rb +25 -9
- data/spec/chewy/search/response_spec.rb +8 -2
- data/spec/chewy/search_spec.rb +2 -2
- data/spec/chewy/strategy/active_job_spec.rb +15 -2
- data/spec/chewy/strategy/shoryuken_spec.rb +6 -2
- data/spec/chewy/strategy/sidekiq_spec.rb +6 -2
- data/spec/chewy/type/adapter/active_record_spec.rb +3 -3
- data/spec/chewy/type/import/bulk_builder_spec.rb +1 -1
- data/spec/chewy/type/observe_spec.rb +4 -4
- data/spec/spec_helper.rb +4 -1
- metadata +21 -22
- data/.travis.yml +0 -45
- data/gemfiles/rails.4.0.activerecord.gemfile +0 -15
- data/gemfiles/rails.4.1.activerecord.gemfile +0 -15
- data/gemfiles/rails.4.2.activerecord.gemfile +0 -16
- data/gemfiles/rails.4.2.mongoid.5.2.gemfile +0 -16
- data/gemfiles/rails.5.1.mongoid.6.3.gemfile +0 -16
- data/spec/chewy/search/parameters/indices_boost_spec.rb +0 -83
data/lib/chewy/type/import.rb
CHANGED
@@ -10,7 +10,7 @@ module Chewy
|
|
10
10
|
|
11
11
|
IMPORT_WORKER = lambda do |type, options, total, ids, index|
|
12
12
|
::Process.setproctitle("chewy [#{type}]: import data (#{index + 1}/#{total})")
|
13
|
-
routine = Routine.new(type, options)
|
13
|
+
routine = Routine.new(type, **options)
|
14
14
|
type.adapter.import(*ids, routine.options) do |action_objects|
|
15
15
|
routine.process(**action_objects)
|
16
16
|
end
|
@@ -19,7 +19,7 @@ module Chewy
|
|
19
19
|
|
20
20
|
LEFTOVERS_WORKER = lambda do |type, options, total, body, index|
|
21
21
|
::Process.setproctitle("chewy [#{type}]: import leftovers (#{index + 1}/#{total})")
|
22
|
-
routine = Routine.new(type, options)
|
22
|
+
routine = Routine.new(type, **options)
|
23
23
|
routine.perform_bulk(body)
|
24
24
|
routine.errors
|
25
25
|
end
|
@@ -127,7 +127,7 @@ module Chewy
|
|
127
127
|
|
128
128
|
def import_routine(*args)
|
129
129
|
return if args.first.blank? && !args.first.nil?
|
130
|
-
routine = Routine.new(self, args.extract_options!)
|
130
|
+
routine = Routine.new(self, **args.extract_options!)
|
131
131
|
routine.create_indexes!
|
132
132
|
|
133
133
|
if routine.parallel_options
|
data/lib/chewy/type/mapping.rb
CHANGED
@@ -35,8 +35,8 @@ module Chewy
|
|
35
35
|
# end
|
36
36
|
#
|
37
37
|
def root(**options)
|
38
|
-
self.root_object ||= Chewy::Fields::Root.new(type_name, Chewy.default_root_options.merge(options))
|
39
|
-
root_object.update_options!(options)
|
38
|
+
self.root_object ||= Chewy::Fields::Root.new(type_name, **Chewy.default_root_options.merge(options))
|
39
|
+
root_object.update_options!(**options)
|
40
40
|
yield if block_given?
|
41
41
|
root_object
|
42
42
|
end
|
@@ -126,9 +126,9 @@ module Chewy
|
|
126
126
|
#
|
127
127
|
def field(*args, **options, &block)
|
128
128
|
if args.size > 1
|
129
|
-
args.map { |name| field(name, options) }
|
129
|
+
args.map { |name| field(name, **options) }
|
130
130
|
else
|
131
|
-
expand_nested(Chewy::Fields::Base.new(args.first, options), &block)
|
131
|
+
expand_nested(Chewy::Fields::Base.new(args.first, **options), &block)
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
data/lib/chewy/type/observe.rb
CHANGED
@@ -63,10 +63,10 @@ module Chewy
|
|
63
63
|
update_proc = Observe.update_proc(type_name, *args, &block)
|
64
64
|
|
65
65
|
if Chewy.use_after_commit_callbacks
|
66
|
-
after_commit(callback_options, &update_proc)
|
66
|
+
after_commit(**callback_options, &update_proc)
|
67
67
|
else
|
68
|
-
after_save(callback_options, &update_proc)
|
69
|
-
after_destroy(callback_options, &update_proc)
|
68
|
+
after_save(**callback_options, &update_proc)
|
69
|
+
after_destroy(**callback_options, &update_proc)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|
data/lib/chewy/type/wrapper.rb
CHANGED
data/lib/chewy/version.rb
CHANGED
data/lib/chewy.rb
CHANGED
@@ -132,7 +132,7 @@ module Chewy
|
|
132
132
|
def create_type(index, target, options = {}, &block)
|
133
133
|
type = Class.new(Chewy::Type)
|
134
134
|
|
135
|
-
adapter = adapters.find { |klass| klass.accepts?(target) }.new(target, options)
|
135
|
+
adapter = adapters.find { |klass| klass.accepts?(target) }.new(target, **options)
|
136
136
|
|
137
137
|
index.const_set(adapter.name, type)
|
138
138
|
type.send(:define_singleton_method, :index) { index }
|
data/spec/chewy/config_spec.rb
CHANGED
@@ -141,7 +141,7 @@ describe Chewy::Config do
|
|
141
141
|
context 'when Rails::VERSION constant is defined' do
|
142
142
|
it 'looks for configuration in "config/chewy.yml"' do
|
143
143
|
module Rails
|
144
|
-
VERSION = '5.1.
|
144
|
+
VERSION = '5.1.1'.freeze
|
145
145
|
|
146
146
|
def self.root
|
147
147
|
Pathname.new(__dir__)
|
@@ -180,43 +180,45 @@ describe Chewy::Fields::Base do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
# rubocop:disable Style/BracesAroundHashParameters
|
183
184
|
specify do
|
184
|
-
expect(EventsIndex::Event.root.compose(
|
185
|
-
|
186
|
-
)).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
|
185
|
+
expect(EventsIndex::Event.root.compose({
|
186
|
+
id: 1, category: {id: 2, licenses: {id: 3, name: 'Name'}}
|
187
|
+
})).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
|
187
188
|
end
|
188
189
|
|
189
190
|
specify do
|
190
|
-
expect(EventsIndex::Event.root.compose(id: 1, category: [
|
191
|
+
expect(EventsIndex::Event.root.compose({id: 1, category: [
|
191
192
|
{id: 2, 'licenses' => {id: 3, name: 'Name1'}},
|
192
193
|
{id: 4, licenses: nil}
|
193
|
-
])).to eq('id' => 1, 'category' => [
|
194
|
+
]})).to eq('id' => 1, 'category' => [
|
194
195
|
{'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name1'}},
|
195
196
|
{'id' => 4, 'licenses' => nil.as_json}
|
196
197
|
])
|
197
198
|
end
|
198
199
|
|
199
200
|
specify do
|
200
|
-
expect(EventsIndex::Event.root.compose('id' => 1, category: {id: 2, licenses: [
|
201
|
+
expect(EventsIndex::Event.root.compose({'id' => 1, category: {id: 2, licenses: [
|
201
202
|
{id: 3, name: 'Name1'}, {id: 4, name: 'Name2'}
|
202
|
-
]})).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => [
|
203
|
+
]}})).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => [
|
203
204
|
{'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
|
204
205
|
]})
|
205
206
|
end
|
206
207
|
|
207
208
|
specify do
|
208
|
-
expect(EventsIndex::Event.root.compose(id: 1, category: [
|
209
|
+
expect(EventsIndex::Event.root.compose({id: 1, category: [
|
209
210
|
{id: 2, licenses: [
|
210
211
|
{id: 3, 'name' => 'Name1'}, {id: 4, name: 'Name2'}
|
211
212
|
]},
|
212
213
|
{id: 5, licenses: []}
|
213
|
-
])).to eq('id' => 1, 'category' => [
|
214
|
+
]})).to eq('id' => 1, 'category' => [
|
214
215
|
{'id' => 2, 'licenses' => [
|
215
216
|
{'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
|
216
217
|
]},
|
217
218
|
{'id' => 5, 'licenses' => []}
|
218
219
|
])
|
219
220
|
end
|
221
|
+
# rubocop:enable Style/BracesAroundHashParameters
|
220
222
|
|
221
223
|
specify do
|
222
224
|
expect(EventsIndex::Event.root.compose(
|
@@ -55,7 +55,7 @@ describe Chewy::Index::Actions do
|
|
55
55
|
context do
|
56
56
|
before { DummiesIndex.create }
|
57
57
|
specify do
|
58
|
-
expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/
|
58
|
+
expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies/)
|
59
59
|
end
|
60
60
|
specify { expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/Invalid alias name \[dummies\]/) }
|
61
61
|
end
|
@@ -67,7 +67,7 @@ describe Chewy::Index::Actions do
|
|
67
67
|
specify { expect(DummiesIndex.aliases).to eq([]) }
|
68
68
|
specify { expect(DummiesIndex.indexes).to eq(['dummies_2013']) }
|
69
69
|
specify do
|
70
|
-
expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/
|
70
|
+
expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies_2013/)
|
71
71
|
end
|
72
72
|
specify { expect(DummiesIndex.create!('2014')['acknowledged']).to eq(true) }
|
73
73
|
|
data/spec/chewy/journal_spec.rb
CHANGED
@@ -54,7 +54,7 @@ describe Chewy::Journal do
|
|
54
54
|
expect(Chewy::Stash::Journal.exists?).to eq true
|
55
55
|
|
56
56
|
Timecop.freeze(update_time)
|
57
|
-
cities.first.
|
57
|
+
cities.first.update!(name: 'Supername')
|
58
58
|
|
59
59
|
Timecop.freeze(destroy_time)
|
60
60
|
countries.last.destroy
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chewy::Search::Parameters::Indices do
|
4
|
+
before do
|
5
|
+
stub_index(:first) do
|
6
|
+
define_type :one
|
7
|
+
define_type :two
|
8
|
+
end
|
9
|
+
|
10
|
+
stub_index(:second) do
|
11
|
+
define_type :three
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
subject { described_class.new(indices: FirstIndex, types: SecondIndex::Three) }
|
16
|
+
|
17
|
+
describe '#initialize' do
|
18
|
+
specify { expect(described_class.new.value).to eq(indices: [], types: []) }
|
19
|
+
specify { expect(described_class.new(nil).value).to eq(indices: [], types: []) }
|
20
|
+
specify { expect(described_class.new(foo: :whatever).value).to eq(indices: [], types: []) }
|
21
|
+
specify { expect(subject.value).to eq(indices: [FirstIndex], types: [SecondIndex::Three]) }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#replace!' do
|
25
|
+
specify do
|
26
|
+
expect { subject.replace!(nil) }
|
27
|
+
.to change { subject.value }
|
28
|
+
.from(indices: [FirstIndex], types: [SecondIndex::Three])
|
29
|
+
.to(indices: [], types: [])
|
30
|
+
end
|
31
|
+
|
32
|
+
specify do
|
33
|
+
expect { subject.replace!(indices: SecondIndex, types: FirstIndex::One) }
|
34
|
+
.to change { subject.value }
|
35
|
+
.from(indices: [FirstIndex], types: [SecondIndex::Three])
|
36
|
+
.to(indices: [SecondIndex], types: [FirstIndex::One])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#update!' do
|
41
|
+
specify do
|
42
|
+
expect { subject.update!(nil) }
|
43
|
+
.not_to change { subject.value }
|
44
|
+
end
|
45
|
+
|
46
|
+
specify do
|
47
|
+
expect { subject.update!(indices: SecondIndex, types: [FirstIndex::One, SecondIndex::Three]) }
|
48
|
+
.to change { subject.value }
|
49
|
+
.from(indices: [FirstIndex], types: [SecondIndex::Three])
|
50
|
+
.to(indices: [FirstIndex, SecondIndex], types: [SecondIndex::Three, FirstIndex::One])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#merge!' do
|
55
|
+
specify do
|
56
|
+
expect { subject.merge!(described_class.new) }
|
57
|
+
.not_to change { subject.value }
|
58
|
+
end
|
59
|
+
|
60
|
+
specify do
|
61
|
+
expect { subject.merge!(described_class.new(indices: SecondIndex, types: [FirstIndex::One, SecondIndex::Three])) }
|
62
|
+
.to change { subject.value }
|
63
|
+
.from(indices: [FirstIndex], types: [SecondIndex::Three])
|
64
|
+
.to(indices: [FirstIndex, SecondIndex], types: [SecondIndex::Three, FirstIndex::One])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#render' do
|
69
|
+
specify { expect(described_class.new.render).to eq({}) }
|
70
|
+
specify do
|
71
|
+
expect(described_class.new(
|
72
|
+
indices: FirstIndex
|
73
|
+
).render).to eq(index: %w[first], type: %w[one two])
|
74
|
+
end
|
75
|
+
specify do
|
76
|
+
expect(described_class.new(
|
77
|
+
indices: :whatever
|
78
|
+
).render).to eq(index: %w[whatever])
|
79
|
+
end
|
80
|
+
specify do
|
81
|
+
expect(described_class.new(
|
82
|
+
types: FirstIndex::One
|
83
|
+
).render).to eq(index: %w[first], type: %w[one])
|
84
|
+
end
|
85
|
+
specify do
|
86
|
+
expect(described_class.new(
|
87
|
+
types: :whatever
|
88
|
+
).render).to eq({})
|
89
|
+
end
|
90
|
+
specify do
|
91
|
+
expect(described_class.new(
|
92
|
+
indices: FirstIndex, types: SecondIndex::Three
|
93
|
+
).render).to eq(index: %w[first second], type: %w[one three two])
|
94
|
+
end
|
95
|
+
specify do
|
96
|
+
expect(described_class.new(
|
97
|
+
indices: FirstIndex, types: :one
|
98
|
+
).render).to eq(index: %w[first], type: %w[one])
|
99
|
+
end
|
100
|
+
specify do
|
101
|
+
expect(described_class.new(
|
102
|
+
indices: FirstIndex, types: :whatever
|
103
|
+
).render).to eq(index: %w[first], type: %w[one two])
|
104
|
+
end
|
105
|
+
specify do
|
106
|
+
expect(described_class.new(
|
107
|
+
indices: FirstIndex, types: %i[one whatever]
|
108
|
+
).render).to eq(index: %w[first], type: %w[one])
|
109
|
+
end
|
110
|
+
specify do
|
111
|
+
expect(described_class.new(
|
112
|
+
indices: :whatever, types: SecondIndex::Three
|
113
|
+
).render).to eq(index: %w[second whatever], type: %w[three])
|
114
|
+
end
|
115
|
+
specify do
|
116
|
+
expect(described_class.new(
|
117
|
+
indices: :whatever, types: [SecondIndex::Three, :whatever]
|
118
|
+
).render).to eq(index: %w[second whatever], type: %w[three whatever])
|
119
|
+
end
|
120
|
+
specify do
|
121
|
+
expect(described_class.new(
|
122
|
+
indices: [FirstIndex, :whatever], types: FirstIndex::One
|
123
|
+
).render).to eq(index: %w[first whatever], type: %w[one])
|
124
|
+
end
|
125
|
+
specify do
|
126
|
+
expect(described_class.new(
|
127
|
+
indices: FirstIndex, types: [FirstIndex::One, :whatever]
|
128
|
+
).render).to eq(index: %w[first], type: %w[one])
|
129
|
+
end
|
130
|
+
specify do
|
131
|
+
expect(described_class.new(
|
132
|
+
indices: FirstIndex, types: [SecondIndex::Three, :whatever]
|
133
|
+
).render).to eq(index: %w[first second], type: %w[one three two])
|
134
|
+
end
|
135
|
+
specify do
|
136
|
+
expect(described_class.new(
|
137
|
+
indices: [FirstIndex, :whatever], types: [FirstIndex::One, :whatever]
|
138
|
+
).render).to eq(index: %w[first whatever], type: %w[one whatever])
|
139
|
+
end
|
140
|
+
specify do
|
141
|
+
expect(described_class.new(
|
142
|
+
indices: [FirstIndex, :whatever], types: [SecondIndex::Three, FirstIndex::One]
|
143
|
+
).render).to eq(index: %w[first second whatever], type: %w[one three])
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe '#==' do
|
148
|
+
specify { expect(described_class.new).to eq(described_class.new) }
|
149
|
+
specify do
|
150
|
+
expect(described_class.new(indices: SecondIndex, types: [SecondIndex::Three, :whatever]))
|
151
|
+
.to eq(described_class.new(indices: SecondIndex, types: :whatever))
|
152
|
+
end
|
153
|
+
specify do
|
154
|
+
expect(described_class.new(indices: :first, types: %w[one two]))
|
155
|
+
.to eq(described_class.new(indices: FirstIndex))
|
156
|
+
end
|
157
|
+
specify do
|
158
|
+
expect(described_class.new(indices: FirstIndex, types: SecondIndex::Three))
|
159
|
+
.not_to eq(described_class.new(indices: FirstIndex))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#indices' do
|
164
|
+
specify do
|
165
|
+
expect(described_class.new(
|
166
|
+
indices: [FirstIndex, :whatever],
|
167
|
+
types: [SecondIndex::Three, :whatever]
|
168
|
+
).indices).to contain_exactly(FirstIndex, SecondIndex)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe '#types' do
|
173
|
+
specify do
|
174
|
+
expect(described_class.new(
|
175
|
+
indices: [FirstIndex, :whatever],
|
176
|
+
types: [SecondIndex::Three, :whatever]
|
177
|
+
).types).to contain_exactly(
|
178
|
+
FirstIndex::One, FirstIndex::Two, SecondIndex::Three
|
179
|
+
)
|
180
|
+
end
|
181
|
+
|
182
|
+
specify do
|
183
|
+
expect(described_class.new(
|
184
|
+
indices: [FirstIndex, :whatever],
|
185
|
+
types: [FirstIndex::One, SecondIndex::Three, :whatever]
|
186
|
+
).types).to contain_exactly(
|
187
|
+
FirstIndex::One, SecondIndex::Three
|
188
|
+
)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -72,18 +72,20 @@ describe Chewy::Search::Parameters do
|
|
72
72
|
describe '#merge!' do
|
73
73
|
let(:first) { described_class.new(offset: 10, order: 'foo') }
|
74
74
|
let(:second) { described_class.new(limit: 20, offset: 20, order: 'bar') }
|
75
|
+
let(:first_clone) { first.clone }
|
76
|
+
let(:second_clone) { second.clone }
|
75
77
|
|
76
78
|
specify do
|
77
79
|
expect { first.merge!(second) }.to change { first.clone }
|
78
80
|
.to(described_class.new(limit: 20, offset: 20, order: %w[foo bar]))
|
79
81
|
end
|
80
|
-
specify { expect { first.merge!(second) }.not_to change {
|
82
|
+
specify { expect { first.merge!(second) }.not_to change { second_clone } }
|
81
83
|
|
82
84
|
specify do
|
83
85
|
expect { second.merge!(first) }.to change { second.clone }
|
84
86
|
.to(described_class.new(limit: 20, offset: 10, order: %w[bar foo]))
|
85
87
|
end
|
86
|
-
specify { expect { second.merge!(first) }.not_to change {
|
88
|
+
specify { expect { second.merge!(first) }.not_to change { first_clone } }
|
87
89
|
|
88
90
|
context 'spawns new storages for the merge' do
|
89
91
|
let(:names) { %i[limit offset order] }
|
@@ -100,7 +102,22 @@ describe Chewy::Search::Parameters do
|
|
100
102
|
subject { described_class.new(offset: 10, order: 'foo') }
|
101
103
|
|
102
104
|
specify { expect(subject.render).to eq(body: {from: 10, sort: ['foo']}) }
|
103
|
-
specify { expect(described_class.new.render).to eq({}) }
|
105
|
+
specify { expect(described_class.new.render).to eq(body: {}) }
|
106
|
+
|
107
|
+
context do
|
108
|
+
subject { described_class.new(request_cache: true) }
|
109
|
+
specify { expect(subject.render).to eq(body: {}, request_cache: true) }
|
110
|
+
end
|
111
|
+
|
112
|
+
context do
|
113
|
+
subject { described_class.new(search_type: 'query_then_fetch') }
|
114
|
+
specify { expect(subject.render).to eq(body: {}, search_type: 'query_then_fetch') }
|
115
|
+
end
|
116
|
+
|
117
|
+
context do
|
118
|
+
subject { described_class.new(allow_partial_search_results: true) }
|
119
|
+
specify { expect(subject.render).to eq(body: {}, allow_partial_search_results: true) }
|
120
|
+
end
|
104
121
|
|
105
122
|
context do
|
106
123
|
subject { described_class.new(query: {foo: 'bar'}, filter: {moo: 'baz'}) }
|
@@ -57,11 +57,11 @@ describe Chewy::Search::Request do
|
|
57
57
|
describe '#inspect' do
|
58
58
|
specify do
|
59
59
|
expect(described_class.new(ProductsIndex).inspect)
|
60
|
-
.to eq('<Chewy::Search::Request {:index=>["products"], :type=>["
|
60
|
+
.to eq('<Chewy::Search::Request {:index=>["products"], :type=>["city", "country", "product"], :body=>{}}>')
|
61
61
|
end
|
62
62
|
specify do
|
63
63
|
expect(ProductsIndex.limit(10).inspect)
|
64
|
-
.to eq('<ProductsIndex::Query {:index=>["products"], :type=>["
|
64
|
+
.to eq('<ProductsIndex::Query {:index=>["products"], :type=>["city", "country", "product"], :body=>{:size=>10}}>')
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -151,13 +151,20 @@ describe Chewy::Search::Request do
|
|
151
151
|
end
|
152
152
|
|
153
153
|
describe '#request_cache' do
|
154
|
-
specify { expect(subject.request_cache(true).render
|
155
|
-
specify { expect(subject.request_cache(true).request_cache(false).render
|
156
|
-
specify { expect(subject.request_cache(true).request_cache(nil).render[:
|
154
|
+
specify { expect(subject.request_cache(true).render).to include(request_cache: true) }
|
155
|
+
specify { expect(subject.request_cache(true).request_cache(false).render).to include(request_cache: false) }
|
156
|
+
specify { expect(subject.request_cache(true).request_cache(nil).render[:request_cache]).to be_blank }
|
157
157
|
specify { expect { subject.request_cache(true) }.not_to change { subject.render } }
|
158
158
|
end
|
159
159
|
|
160
|
-
|
160
|
+
describe '#search_type' do
|
161
|
+
specify { expect(subject.search_type('foo').render).to include(search_type: 'foo') }
|
162
|
+
specify { expect(subject.search_type('foo').search_type('bar').render).to include(search_type: 'bar') }
|
163
|
+
specify { expect(subject.search_type('foo').search_type(nil).render[:search_type]).to be_blank }
|
164
|
+
specify { expect { subject.search_type('foo') }.not_to change { subject.render } }
|
165
|
+
end
|
166
|
+
|
167
|
+
%i[preference timeout].each do |name|
|
161
168
|
describe "##{name}" do
|
162
169
|
specify { expect(subject.send(name, :foo).render[:body]).to include(name => 'foo') }
|
163
170
|
specify { expect(subject.send(name, :foo).send(name, :bar).render[:body]).to include(name => 'bar') }
|
@@ -218,8 +225,17 @@ describe Chewy::Search::Request do
|
|
218
225
|
specify { expect { subject.docvalue_fields(:foo) }.not_to change { subject.render } }
|
219
226
|
end
|
220
227
|
|
228
|
+
describe '#indices' do
|
229
|
+
specify { expect(described_class.new(:products).render[:index]).to eq(%w[products]) }
|
230
|
+
specify { expect(subject.indices(:cities).render[:index]).to eq(%w[cities products]) }
|
231
|
+
specify { expect(subject.indices(CitiesIndex, :whatever).render[:index]).to eq(%w[cities products whatever]) }
|
232
|
+
specify { expect(subject.indices([CitiesIndex, :products]).render[:index]).to eq(%w[cities products]) }
|
233
|
+
specify { expect { subject.indices(:cities) }.not_to change { subject.render } }
|
234
|
+
end
|
235
|
+
|
221
236
|
describe '#types' do
|
222
237
|
specify { expect(subject.types(:product).render[:type]).to contain_exactly('product') }
|
238
|
+
specify { expect(described_class.new(ProductsIndex::City).types(ProductsIndex::Country).render[:type]).to match_array(%w[city country]) }
|
223
239
|
specify { expect(subject.types(%i[product city]).types(nil).render[:type]).to match_array(%w[product city]) }
|
224
240
|
specify { expect(subject.types(:product).types(:product, :city, :something).render[:type]).to match_array(%w[product city]) }
|
225
241
|
specify { expect(subject.types(nil).render[:body]).to be_blank }
|
@@ -415,7 +431,7 @@ describe Chewy::Search::Request do
|
|
415
431
|
expect(outer_payload).to eq(
|
416
432
|
index: ProductsIndex,
|
417
433
|
indexes: [ProductsIndex],
|
418
|
-
request: {index: ['products'], type: %w[
|
434
|
+
request: {index: ['products'], type: %w[city country product], body: {query: {match: {name: 'name3'}}}},
|
419
435
|
type: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country],
|
420
436
|
types: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country]
|
421
437
|
)
|
@@ -644,7 +660,7 @@ describe Chewy::Search::Request do
|
|
644
660
|
expect(outer_payload).to eq(
|
645
661
|
index: ProductsIndex,
|
646
662
|
indexes: [ProductsIndex],
|
647
|
-
request: {index: ['products'], type: %w[
|
663
|
+
request: {index: ['products'], type: %w[city country product], body: {query: {match: {name: 'name3'}}}, refresh: true},
|
648
664
|
type: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country],
|
649
665
|
types: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country]
|
650
666
|
)
|
@@ -659,7 +675,7 @@ describe Chewy::Search::Request do
|
|
659
675
|
expect(outer_payload).to eq(
|
660
676
|
index: ProductsIndex,
|
661
677
|
indexes: [ProductsIndex],
|
662
|
-
request: {index: ['products'], type: %w[
|
678
|
+
request: {index: ['products'], type: %w[city country product], body: {query: {match: {name: 'name3'}}}, refresh: false},
|
663
679
|
type: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country],
|
664
680
|
types: [ProductsIndex::Product, ProductsIndex::City, ProductsIndex::Country]
|
665
681
|
)
|
@@ -72,7 +72,10 @@ describe Chewy::Search::Response, :orm do
|
|
72
72
|
Chewy::Search::Request.new(PlacesIndex)
|
73
73
|
.query(script: {script: {inline: 'sleep(100); true', lang: 'groovy'}})
|
74
74
|
end
|
75
|
-
specify
|
75
|
+
specify do
|
76
|
+
pending
|
77
|
+
expect(subject.took).to be > 100
|
78
|
+
end
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
@@ -84,7 +87,10 @@ describe Chewy::Search::Response, :orm do
|
|
84
87
|
Chewy::Search::Request.new(PlacesIndex)
|
85
88
|
.query(script: {script: {inline: 'sleep(100); true', lang: 'groovy'}}).timeout('10ms')
|
86
89
|
end
|
87
|
-
specify
|
90
|
+
specify do
|
91
|
+
pending
|
92
|
+
expect(subject.timed_out?).to eq(true)
|
93
|
+
end
|
88
94
|
end
|
89
95
|
end
|
90
96
|
|
data/spec/chewy/search_spec.rb
CHANGED
@@ -71,12 +71,12 @@ describe Chewy::Search do
|
|
71
71
|
filter { match name: "Name#{index}" }
|
72
72
|
end
|
73
73
|
|
74
|
-
field :name, KEYWORD_FIELD
|
74
|
+
field :name, **KEYWORD_FIELD
|
75
75
|
field :rating, type: :integer
|
76
76
|
end
|
77
77
|
|
78
78
|
define_type Country do
|
79
|
-
field :name, KEYWORD_FIELD
|
79
|
+
field :name, **KEYWORD_FIELD
|
80
80
|
field :rating, type: :integer
|
81
81
|
end
|
82
82
|
end
|
@@ -2,7 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
if defined?(::ActiveJob)
|
4
4
|
describe Chewy::Strategy::ActiveJob do
|
5
|
-
around
|
5
|
+
around do |example|
|
6
|
+
active_job_settings = Chewy.settings[:active_job]
|
7
|
+
Chewy.settings[:active_job] = {queue: 'low'}
|
8
|
+
Chewy.strategy(:bypass) { example.run }
|
9
|
+
Chewy.settings[:active_job] = active_job_settings
|
10
|
+
end
|
6
11
|
before(:all) do
|
7
12
|
::ActiveJob::Base.logger = Chewy.logger
|
8
13
|
end
|
@@ -36,7 +41,15 @@ if defined?(::ActiveJob)
|
|
36
41
|
end
|
37
42
|
enqueued_job = ::ActiveJob::Base.queue_adapter.enqueued_jobs.first
|
38
43
|
expect(enqueued_job[:job]).to eq(Chewy::Strategy::ActiveJob::Worker)
|
39
|
-
expect(enqueued_job[:queue]).to eq('
|
44
|
+
expect(enqueued_job[:queue]).to eq('low')
|
45
|
+
end
|
46
|
+
|
47
|
+
specify do
|
48
|
+
Chewy.strategy(:active_job) do
|
49
|
+
[city, other_city].map(&:save!)
|
50
|
+
end
|
51
|
+
enqueued_job = ::ActiveJob::Base.queue_adapter.enqueued_jobs.first
|
52
|
+
expect(enqueued_job[:queue]).to eq('low')
|
40
53
|
end
|
41
54
|
|
42
55
|
specify do
|
@@ -4,7 +4,12 @@ if defined?(::Shoryuken)
|
|
4
4
|
require 'aws-sdk-sqs'
|
5
5
|
|
6
6
|
describe Chewy::Strategy::Shoryuken do
|
7
|
-
around
|
7
|
+
around do |example|
|
8
|
+
shoryuken_settings = Chewy.settings[:shoryuken]
|
9
|
+
Chewy.settings[:shoryuken] = {queue: 'low'}
|
10
|
+
Chewy.strategy(:bypass) { example.run }
|
11
|
+
Chewy.settings[:shoryuken] = shoryuken_settings
|
12
|
+
end
|
8
13
|
before { ::Shoryuken.groups.clear }
|
9
14
|
before do
|
10
15
|
stub_model(:city) do
|
@@ -31,7 +36,6 @@ if defined?(::Shoryuken)
|
|
31
36
|
end
|
32
37
|
|
33
38
|
specify do
|
34
|
-
Chewy.settings[:shoryuken] = {queue: 'low'}
|
35
39
|
expect(Chewy::Strategy::Shoryuken::Worker).to receive(:perform_async)
|
36
40
|
.with(hash_including(type: 'CitiesIndex::City', ids: [city.id, other_city.id]), hash_including(queue: 'low'))
|
37
41
|
Chewy.strategy(:shoryuken) do
|
@@ -4,7 +4,12 @@ if defined?(::Sidekiq)
|
|
4
4
|
require 'sidekiq/testing'
|
5
5
|
|
6
6
|
describe Chewy::Strategy::Sidekiq do
|
7
|
-
around
|
7
|
+
around do |example|
|
8
|
+
sidekiq_settings = Chewy.settings[:sidekiq]
|
9
|
+
Chewy.settings[:sidekiq] = {queue: 'low'}
|
10
|
+
Chewy.strategy(:bypass) { example.run }
|
11
|
+
Chewy.settings[:sidekiq] = sidekiq_settings
|
12
|
+
end
|
8
13
|
before { ::Sidekiq::Worker.clear_all }
|
9
14
|
before do
|
10
15
|
stub_model(:city) do
|
@@ -25,7 +30,6 @@ if defined?(::Sidekiq)
|
|
25
30
|
end
|
26
31
|
|
27
32
|
specify do
|
28
|
-
Chewy.settings[:sidekiq] = {queue: 'low'}
|
29
33
|
expect(::Sidekiq::Client).to receive(:push).with(hash_including('queue' => 'low')).and_call_original
|
30
34
|
::Sidekiq::Testing.inline! do
|
31
35
|
expect { [city, other_city].map(&:save!) }
|
@@ -454,9 +454,9 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
|
|
454
454
|
specify do
|
455
455
|
expect(subject.import_fields(fields: [:updated_at], typecast: false))
|
456
456
|
.to match([contain_exactly(
|
457
|
-
[1, match(/#{Time.now.strftime('%Y-%m-%d')}/)],
|
458
|
-
[2, match(/#{Time.now.strftime('%Y-%m-%d')}/)],
|
459
|
-
[3, match(/#{Time.now.strftime('%Y-%m-%d')}/)]
|
457
|
+
[1, match(/#{Time.now.utc.strftime('%Y-%m-%d')}/)],
|
458
|
+
[2, match(/#{Time.now.utc.strftime('%Y-%m-%d')}/)],
|
459
|
+
[3, match(/#{Time.now.utc.strftime('%Y-%m-%d')}/)]
|
460
460
|
)])
|
461
461
|
end
|
462
462
|
end
|
@@ -117,7 +117,7 @@ describe Chewy::Type::Import::BulkBuilder do
|
|
117
117
|
context 'updating parent' do
|
118
118
|
before do
|
119
119
|
PlacesIndex::City.import(city)
|
120
|
-
city.
|
120
|
+
city.update(country_id: another_country.id)
|
121
121
|
end
|
122
122
|
let(:index) { [city] }
|
123
123
|
|