chewy 7.2.5 → 7.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37685481eff7312e08ba8d113f030ee5ab38e3414788c6cd2a0385829c99a712
4
- data.tar.gz: d4a2a9d86d93e9a9c6ec5d11cabe51f67511f6b347faee3be9e276cf528c4dc2
3
+ metadata.gz: 96329a4913f6308f4c7435cd50b962a36dc63b728b50567ff53ce2cb8011086f
4
+ data.tar.gz: a25b93955769a85fdf5de68a6d284060a981c2e3f6e10c929b0cd49816c19720
5
5
  SHA512:
6
- metadata.gz: c973f623b179e98284019a2b2dddc1cb7506719585064673cccab0e1c790f599dce43a1395e364d5ed8be814ee0af1fe4985e188f25dcaa32e75eefa57a4f6e3
7
- data.tar.gz: bd1c55232fd02520382a20109899f3b4d59a174c1d1ff875592f08582b5f3072dd7d6f47760df3be58f38756718f31f802832476a1e0c64ebfb9909748e31eac
6
+ metadata.gz: 66a3dfa94536e8d7b262a6a0ccfe32ff76ca7431850722eef21b14a11b3d162ad0346c3a469293696ce79916c44db7fb17b56f462fd4083c619b2dde09fa6c29
7
+ data.tar.gz: 6e15e9fcb103c64a5565add1e5200caa4bf1018d3fc7e9ac79a8db6829a5bb1699ac77910e838d59df2f6f195d019a88c22987d51f1b02ebdbb8f37844cce8d3
@@ -0,0 +1 @@
1
+ .github/workflows @toptal/rogue-one
@@ -1,6 +1,6 @@
1
1
  name: CI
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  ruby-2:
data/CHANGELOG.md CHANGED
@@ -8,6 +8,17 @@
8
8
 
9
9
  ### Bugs Fixed
10
10
 
11
+ ## 7.2.6 (2022-06-13)
12
+
13
+ ### New Features
14
+
15
+ * [#841](https://github.com/toptal/chewy/pull/841): Add the [`collapse`](https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html) option to the request. ([@jkostolansky][])
16
+
17
+ ### Bugs Fixed
18
+
19
+ * [#842](https://github.com/toptal/chewy/issues/842): Fix `ignore_blank` handling. ([@rabotyaga][])
20
+ * [#848](https://github.com/toptal/chewy/issues/848): Fix invalid journal pagination. ([@konalegi][])
21
+
11
22
  ## 7.2.5 (2022-03-04)
12
23
 
13
24
  ### New Features
@@ -15,7 +26,7 @@
15
26
  * [#827](https://github.com/toptal/chewy/pull/827): Add `:lazy_sidekiq` strategy, that defers not only importing but also `update_index` callback evaluation for created and updated objects. ([@sl4vr][])
16
27
  * [#827](https://github.com/toptal/chewy/pull/827): Add `:atomic_no_refresh` strategy. Like `:atomic`, but `refresh=false` parameter is set. ([@barthez][])
17
28
  * [#827](https://github.com/toptal/chewy/pull/827): Add `:no_refresh` chain call to `update_index` matcher to ensure import was called with `refresh=false`. ([@barthez][])
18
-
29
+
19
30
  ### Bugs Fixed
20
31
 
21
32
  * [#835](https://github.com/toptal/chewy/pull/835): Support keyword arguments in named scopes. ([@milk1000cc][])
@@ -696,6 +707,7 @@
696
707
  [@jimmybaker]: https://github.com/jimmybaker
697
708
  [@jirikolarik]: https://github.com/jirikolarik
698
709
  [@jirutka]: https://github.com/jirutka
710
+ [@jkostolansky]: https://github.com/jkostolansky
699
711
  [@joeljunstrom]: https://github.com/joeljunstrom
700
712
  [@jondavidford]: https://github.com/jondavidford
701
713
  [@joonty]: https://github.com/joonty
data/README.md CHANGED
@@ -694,6 +694,7 @@ UsersIndex.import User.where('rating > 100') # or import specified users scope
694
694
  UsersIndex.import User.where('rating > 100').to_a # or import specified users array
695
695
  UsersIndex.import [1, 2, 42] # pass even ids for import, it will be handled in the most effective way
696
696
  UsersIndex.import User.where('rating > 100'), update_fields: [:email] # if update fields are specified - it will update their values only with the `update` bulk action
697
+ UsersIndex.import! # raises an exception in case of any import errors
697
698
 
698
699
  UsersIndex.reset! # purges index and imports default data for all types
699
700
  ```
@@ -33,7 +33,7 @@ module Chewy
33
33
  else
34
34
  {}
35
35
  end
36
- mapping.reverse_merge!(options)
36
+ mapping.reverse_merge!(options.except(:ignore_blank))
37
37
  mapping.reverse_merge!(type: (children.present? ? 'object' : Chewy.default_field_type))
38
38
 
39
39
  {name => mapping}
data/lib/chewy/journal.rb CHANGED
@@ -16,14 +16,17 @@ module Chewy
16
16
  # specified indexes.
17
17
  #
18
18
  # @param since_time [Time, DateTime] timestamp from which changes will be applied
19
- # @param retries [Integer] maximum number of attempts to make journal empty, 10 by default
19
+ # @param fetch_limit [Int] amount of entries to be fetched on each cycle
20
20
  # @return [Integer] the amount of journal entries found
21
- def apply(since_time, retries: 10, **import_options)
21
+ def apply(since_time, fetch_limit: 10, **import_options)
22
22
  stage = 1
23
23
  since_time -= 1
24
24
  count = 0
25
- while stage <= retries
26
- entries = Chewy::Stash::Journal.entries(since_time, only: @only).to_a.presence or break
25
+
26
+ total_count = entries(since_time, fetch_limit).total_count
27
+
28
+ while count < total_count
29
+ entries = entries(since_time, fetch_limit).to_a.presence or break
27
30
  count += entries.size
28
31
  groups = reference_groups(entries)
29
32
  ActiveSupport::Notifications.instrument 'apply_journal.chewy', stage: stage, groups: groups
@@ -46,6 +49,10 @@ module Chewy
46
49
 
47
50
  private
48
51
 
52
+ def entries(since_time, fetch_limit)
53
+ Chewy::Stash::Journal.entries(since_time, only: @only).order(:created_at).limit(fetch_limit)
54
+ end
55
+
49
56
  def reference_groups(entries)
50
57
  entries.group_by(&:index_name)
51
58
  .transform_keys { |index_name| Chewy.derive_name(index_name) }
@@ -0,0 +1,16 @@
1
+ require 'chewy/search/parameters/storage'
2
+
3
+ module Chewy
4
+ module Search
5
+ class Parameters
6
+ # Just a standard hash storage. Nothing to see here.
7
+ #
8
+ # @see Chewy::Search::Parameters::HashStorage
9
+ # @see Chewy::Search::Request#collapse
10
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html
11
+ class Collapse < Storage
12
+ include HashStorage
13
+ end
14
+ end
15
+ end
16
+ end
@@ -24,7 +24,7 @@ module Chewy
24
24
  track_scores track_total_hits request_cache explain version profile
25
25
  search_type preference limit offset terminate_after
26
26
  timeout min_score source stored_fields search_after
27
- load script_fields suggest aggs aggregations none
27
+ load script_fields suggest aggs aggregations collapse none
28
28
  indices_boost rescore highlight total total_count
29
29
  total_entries indices types delete_all count exists?
30
30
  exist? find pluck scroll_batches scroll_hits
@@ -41,7 +41,7 @@ module Chewy
41
41
  EXTRA_STORAGES = %i[aggs suggest].freeze
42
42
  # An array of storage names that are changing the returned hist collection in any way.
43
43
  WHERE_STORAGES = %i[
44
- query filter post_filter none min_score rescore indices_boost
44
+ query filter post_filter none min_score rescore indices_boost collapse
45
45
  ].freeze
46
46
 
47
47
  delegate :hits, :wrappers, :objects, :records, :documents,
@@ -509,7 +509,18 @@ module Chewy
509
509
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-index.html#multi-index
510
510
  # @param value [true, false, nil]
511
511
  # @return [Chewy::Search::Request]
512
- %i[request_cache search_type preference timeout limit offset terminate_after min_score ignore_unavailable].each do |name|
512
+ #
513
+ # @!method collapse(value)
514
+ # Replaces the value of the `collapse` request part.
515
+ #
516
+ # @example
517
+ # PlacesIndex.collapse(field: :name)
518
+ # # => <PlacesIndex::Query {..., :body=>{:collapse=>{"field"=>:name}}}>
519
+ # @see Chewy::Search::Parameters::Collapse
520
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html
521
+ # @param value [Hash]
522
+ # @return [Chewy::Search::Request]
523
+ %i[request_cache search_type preference timeout limit offset terminate_after min_score ignore_unavailable collapse].each do |name|
513
524
  define_method name do |value|
514
525
  modify(name) { replace!(value) }
515
526
  end
@@ -800,8 +811,8 @@ module Chewy
800
811
  # Returns a new scope containing only specified storages.
801
812
  #
802
813
  # @example
803
- # PlacesIndex.limit(10).offset(10).order(:name).except(:offset, :order)
804
- # # => <PlacesIndex::Query {..., :body=>{:size=>10}}>
814
+ # PlacesIndex.limit(10).offset(10).order(:name).only(:offset, :order)
815
+ # # => <PlacesIndex::Query {..., :body=>{:from=>10, :sort=>["name"]}}>
805
816
  # @param values [Array<String, Symbol>]
806
817
  # @return [Chewy::Search::Request] new scope
807
818
  def only(*values)
@@ -811,8 +822,8 @@ module Chewy
811
822
  # Returns a new scope containing all the storages except specified.
812
823
  #
813
824
  # @example
814
- # PlacesIndex.limit(10).offset(10).order(:name).only(:offset, :order)
815
- # # => <PlacesIndex::Query {..., :body=>{:from=>10, :sort=>["name"]}}>
825
+ # PlacesIndex.limit(10).offset(10).order(:name).except(:offset, :order)
826
+ # # => <PlacesIndex::Query {..., :body=>{:size=>10}}>
816
827
  # @param values [Array<String, Symbol>]
817
828
  # @return [Chewy::Search::Request] new scope
818
829
  def except(*values)
data/lib/chewy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Chewy
2
- VERSION = '7.2.5'.freeze
2
+ VERSION = '7.2.6'.freeze
3
3
  end
@@ -424,6 +424,7 @@ describe Chewy::Fields::Base do
424
424
  ]
425
425
  )
426
426
  end
427
+ specify { expect(CountriesIndex.reset).to eq(true) }
427
428
  end
428
429
 
429
430
  context 'nested fields' do
@@ -199,59 +199,23 @@ describe Chewy::Journal do
199
199
  end
200
200
  end
201
201
 
202
- context 'retries' do
203
- let(:time) { Time.now.to_i }
204
- before do
205
- Timecop.freeze
206
- Chewy.strategy(:urgent)
207
- City.create!(id: 1)
208
- end
209
-
210
- after do
211
- Chewy.strategy.pop
212
- Timecop.return
213
- end
214
-
215
- specify 'journal was cleaned after the first call' do
216
- expect(Chewy::Stash::Journal).to receive(:entries).exactly(2).and_call_original
217
- expect(described_class.new.apply(time)).to eq(1)
218
- end
219
-
220
- context 'endless journal' do
221
- let(:count_of_checks) { 10 } # default
222
- let!(:journal_entries) do
223
- record = Chewy::Stash::Journal.entries(time).first
224
- Array.new(count_of_checks) do |i|
225
- Chewy::Stash::Journal.new(
226
- record.attributes.merge(
227
- 'created_at' => time.to_i + i,
228
- 'references' => [i.to_s]
229
- )
230
- )
231
- end
232
- end
233
-
234
- specify '10 retries by default' do
235
- expect(Chewy::Stash::Journal)
236
- .to receive(:entries).exactly(count_of_checks) { [journal_entries.shift].compact }
237
- expect(described_class.new.apply(time)).to eq(10)
238
- end
202
+ context 'when order is not preserved' do
203
+ let(:time) { Time.now }
239
204
 
240
- specify 'with :once parameter set' do
241
- expect(Chewy::Stash::Journal)
242
- .to receive(:entries).exactly(1) { [journal_entries.shift].compact }
243
- expect(described_class.new.apply(time, retries: 1)).to eq(1)
205
+ it 'paginates properly through all items' do
206
+ Chewy.strategy(:urgent) do
207
+ Timecop.travel(time + 1.minute) { City.create!(id: 2) }
208
+ Timecop.travel(time + 3.minute) { City.create!(id: 4) }
209
+ Timecop.travel(time + 2.minute) { City.create!(id: 1) }
210
+ Timecop.travel(time + 4.minute) { City.create!(id: 3) }
244
211
  end
245
212
 
246
- context 'with retries parameter set' do
247
- let(:retries) { 5 }
213
+ CitiesIndex.purge!
214
+ expect(CitiesIndex.all.to_a.length).to eq 0
248
215
 
249
- specify do
250
- expect(Chewy::Stash::Journal)
251
- .to receive(:entries).exactly(retries) { [journal_entries.shift].compact }
252
- expect(described_class.new.apply(time, retries: retries)).to eq(5)
253
- end
254
- end
216
+ # Replay on specific index
217
+ expect(described_class.new(CitiesIndex).apply(time, fetch_limit: 2)).to eq(4)
218
+ expect(CitiesIndex.all.to_a.map(&:id).sort).to eq([1, 2, 3, 4])
255
219
  end
256
220
  end
257
221
  end
@@ -0,0 +1,5 @@
1
+ require 'chewy/search/parameters/hash_storage_examples'
2
+
3
+ describe Chewy::Search::Parameters::Collapse do
4
+ it_behaves_like :hash_storage, :collapse
5
+ end
@@ -314,6 +314,16 @@ describe Chewy::Search::Request do
314
314
  end
315
315
  end
316
316
 
317
+ describe '#collapse' do
318
+ specify { expect(subject.collapse(foo: {bar: 42}).render[:body]).to include(collapse: {'foo' => {bar: 42}}) }
319
+ specify do
320
+ expect(subject.collapse(foo: {bar: 42}).collapse(moo: {baz: 43}).render[:body])
321
+ .to include(collapse: {'moo' => {baz: 43}})
322
+ end
323
+ specify { expect(subject.collapse(foo: {bar: 42}).collapse(nil).render[:body]).to be_blank }
324
+ specify { expect { subject.collapse(foo: {bar: 42}) }.not_to change { subject.render } }
325
+ end
326
+
317
327
  describe '#docvalue_fields' do
318
328
  specify { expect(subject.docvalue_fields(:foo).render[:body]).to include(docvalue_fields: ['foo']) }
319
329
  specify do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chewy
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.5
4
+ version: 7.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toptal, LLC
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-03-04 00:00:00.000000000 Z
12
+ date: 2022-06-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: database_cleaner
@@ -222,6 +222,7 @@ executables: []
222
222
  extensions: []
223
223
  extra_rdoc_files: []
224
224
  files:
225
+ - ".github/CODEOWNERS"
225
226
  - ".github/ISSUE_TEMPLATE/bug_report.md"
226
227
  - ".github/ISSUE_TEMPLATE/feature_request.md"
227
228
  - ".github/PULL_REQUEST_TEMPLATE.md"
@@ -293,6 +294,7 @@ files:
293
294
  - lib/chewy/search/parameters.rb
294
295
  - lib/chewy/search/parameters/aggs.rb
295
296
  - lib/chewy/search/parameters/allow_partial_search_results.rb
297
+ - lib/chewy/search/parameters/collapse.rb
296
298
  - lib/chewy/search/parameters/concerns/bool_storage.rb
297
299
  - lib/chewy/search/parameters/concerns/hash_storage.rb
298
300
  - lib/chewy/search/parameters/concerns/integer_storage.rb
@@ -389,6 +391,7 @@ files:
389
391
  - spec/chewy/search/pagination/kaminari_spec.rb
390
392
  - spec/chewy/search/parameters/aggs_spec.rb
391
393
  - spec/chewy/search/parameters/bool_storage_examples.rb
394
+ - spec/chewy/search/parameters/collapse_spec.rb
392
395
  - spec/chewy/search/parameters/docvalue_fields_spec.rb
393
396
  - spec/chewy/search/parameters/explain_spec.rb
394
397
  - spec/chewy/search/parameters/filter_spec.rb
@@ -461,7 +464,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
461
464
  - !ruby/object:Gem::Version
462
465
  version: '0'
463
466
  requirements: []
464
- rubygems_version: 3.1.6
467
+ rubygems_version: 3.2.29
465
468
  signing_key:
466
469
  specification_version: 4
467
470
  summary: Elasticsearch ODM client wrapper
@@ -505,6 +508,7 @@ test_files:
505
508
  - spec/chewy/search/pagination/kaminari_spec.rb
506
509
  - spec/chewy/search/parameters/aggs_spec.rb
507
510
  - spec/chewy/search/parameters/bool_storage_examples.rb
511
+ - spec/chewy/search/parameters/collapse_spec.rb
508
512
  - spec/chewy/search/parameters/docvalue_fields_spec.rb
509
513
  - spec/chewy/search/parameters/explain_spec.rb
510
514
  - spec/chewy/search/parameters/filter_spec.rb