chewy 6.0.0 → 7.5.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.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  6. data/.github/dependabot.yml +42 -0
  7. data/.github/workflows/ruby.yml +48 -0
  8. data/.rubocop.yml +16 -8
  9. data/.rubocop_todo.yml +110 -22
  10. data/CHANGELOG.md +385 -105
  11. data/CODE_OF_CONDUCT.md +14 -0
  12. data/CONTRIBUTING.md +63 -0
  13. data/Gemfile +4 -10
  14. data/Guardfile +3 -1
  15. data/README.md +494 -275
  16. data/chewy.gemspec +5 -20
  17. data/gemfiles/base.gemfile +12 -0
  18. data/gemfiles/rails.6.1.activerecord.gemfile +10 -15
  19. data/gemfiles/rails.7.0.activerecord.gemfile +14 -0
  20. data/gemfiles/rails.7.1.activerecord.gemfile +14 -0
  21. data/lib/chewy/config.rb +58 -50
  22. data/lib/chewy/elastic_client.rb +31 -0
  23. data/lib/chewy/errors.rb +7 -10
  24. data/lib/chewy/fields/base.rb +79 -13
  25. data/lib/chewy/fields/root.rb +4 -14
  26. data/lib/chewy/index/actions.rb +54 -37
  27. data/lib/chewy/{type → index}/adapter/active_record.rb +30 -6
  28. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  29. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  30. data/lib/chewy/{type → index}/adapter/orm.rb +17 -18
  31. data/lib/chewy/index/aliases.rb +14 -5
  32. data/lib/chewy/index/crutch.rb +40 -0
  33. data/lib/chewy/index/import/bulk_builder.rb +311 -0
  34. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -7
  35. data/lib/chewy/{type → index}/import/journal_builder.rb +11 -12
  36. data/lib/chewy/{type → index}/import/routine.rb +18 -17
  37. data/lib/chewy/{type → index}/import.rb +76 -32
  38. data/lib/chewy/{type → index}/mapping.rb +29 -34
  39. data/lib/chewy/index/observe/active_record_methods.rb +87 -0
  40. data/lib/chewy/index/observe/callback.rb +34 -0
  41. data/lib/chewy/index/observe.rb +17 -0
  42. data/lib/chewy/index/specification.rb +1 -0
  43. data/lib/chewy/{type → index}/syncer.rb +59 -59
  44. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  45. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  46. data/lib/chewy/index.rb +67 -94
  47. data/lib/chewy/journal.rb +25 -14
  48. data/lib/chewy/log_subscriber.rb +5 -1
  49. data/lib/chewy/minitest/helpers.rb +86 -13
  50. data/lib/chewy/minitest/search_index_receiver.rb +24 -26
  51. data/lib/chewy/railtie.rb +6 -20
  52. data/lib/chewy/rake_helper.rb +169 -113
  53. data/lib/chewy/rspec/build_query.rb +12 -0
  54. data/lib/chewy/rspec/helpers.rb +55 -0
  55. data/lib/chewy/rspec/update_index.rb +55 -44
  56. data/lib/chewy/rspec.rb +2 -0
  57. data/lib/chewy/runtime/version.rb +1 -1
  58. data/lib/chewy/runtime.rb +1 -1
  59. data/lib/chewy/search/loader.rb +19 -41
  60. data/lib/chewy/search/parameters/collapse.rb +16 -0
  61. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  62. data/lib/chewy/search/parameters/ignore_unavailable.rb +27 -0
  63. data/lib/chewy/search/parameters/indices.rb +13 -58
  64. data/lib/chewy/search/parameters/knn.rb +16 -0
  65. data/lib/chewy/search/parameters/order.rb +6 -19
  66. data/lib/chewy/search/parameters/source.rb +5 -1
  67. data/lib/chewy/search/parameters/storage.rb +1 -1
  68. data/lib/chewy/search/parameters/track_total_hits.rb +16 -0
  69. data/lib/chewy/search/parameters.rb +6 -4
  70. data/lib/chewy/search/query_proxy.rb +9 -2
  71. data/lib/chewy/search/request.rb +169 -134
  72. data/lib/chewy/search/response.rb +5 -5
  73. data/lib/chewy/search/scoping.rb +7 -8
  74. data/lib/chewy/search/scrolling.rb +13 -13
  75. data/lib/chewy/search.rb +9 -19
  76. data/lib/chewy/stash.rb +19 -30
  77. data/lib/chewy/strategy/active_job.rb +1 -1
  78. data/lib/chewy/strategy/atomic_no_refresh.rb +18 -0
  79. data/lib/chewy/strategy/base.rb +10 -0
  80. data/lib/chewy/strategy/delayed_sidekiq/scheduler.rb +151 -0
  81. data/lib/chewy/strategy/delayed_sidekiq/worker.rb +52 -0
  82. data/lib/chewy/strategy/delayed_sidekiq.rb +30 -0
  83. data/lib/chewy/strategy/lazy_sidekiq.rb +64 -0
  84. data/lib/chewy/strategy/sidekiq.rb +2 -1
  85. data/lib/chewy/strategy.rb +6 -19
  86. data/lib/chewy/version.rb +1 -1
  87. data/lib/chewy.rb +39 -86
  88. data/lib/generators/chewy/install_generator.rb +1 -1
  89. data/lib/tasks/chewy.rake +36 -32
  90. data/migration_guide.md +46 -8
  91. data/spec/chewy/config_spec.rb +14 -39
  92. data/spec/chewy/elastic_client_spec.rb +26 -0
  93. data/spec/chewy/fields/base_spec.rb +432 -147
  94. data/spec/chewy/fields/root_spec.rb +20 -28
  95. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  96. data/spec/chewy/index/actions_spec.rb +368 -59
  97. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +156 -40
  98. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  99. data/spec/chewy/index/aliases_spec.rb +3 -3
  100. data/spec/chewy/index/import/bulk_builder_spec.rb +494 -0
  101. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -12
  102. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -19
  103. data/spec/chewy/{type → index}/import/routine_spec.rb +19 -19
  104. data/spec/chewy/{type → index}/import_spec.rb +164 -98
  105. data/spec/chewy/index/mapping_spec.rb +135 -0
  106. data/spec/chewy/index/observe/active_record_methods_spec.rb +68 -0
  107. data/spec/chewy/index/observe/callback_spec.rb +139 -0
  108. data/spec/chewy/index/observe_spec.rb +143 -0
  109. data/spec/chewy/index/settings_spec.rb +3 -1
  110. data/spec/chewy/index/specification_spec.rb +20 -30
  111. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  112. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  113. data/spec/chewy/index/wrapper_spec.rb +100 -0
  114. data/spec/chewy/index_spec.rb +60 -105
  115. data/spec/chewy/journal_spec.rb +25 -74
  116. data/spec/chewy/minitest/helpers_spec.rb +123 -15
  117. data/spec/chewy/minitest/search_index_receiver_spec.rb +28 -30
  118. data/spec/chewy/multi_search_spec.rb +4 -5
  119. data/spec/chewy/rake_helper_spec.rb +315 -55
  120. data/spec/chewy/rspec/build_query_spec.rb +34 -0
  121. data/spec/chewy/rspec/helpers_spec.rb +61 -0
  122. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  123. data/spec/chewy/runtime_spec.rb +2 -2
  124. data/spec/chewy/search/loader_spec.rb +19 -53
  125. data/spec/chewy/search/pagination/kaminari_examples.rb +4 -6
  126. data/spec/chewy/search/pagination/kaminari_spec.rb +2 -2
  127. data/spec/chewy/search/parameters/collapse_spec.rb +5 -0
  128. data/spec/chewy/search/parameters/ignore_unavailable_spec.rb +67 -0
  129. data/spec/chewy/search/parameters/indices_spec.rb +26 -117
  130. data/spec/chewy/search/parameters/knn_spec.rb +5 -0
  131. data/spec/chewy/search/parameters/order_spec.rb +18 -11
  132. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  133. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  134. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  135. data/spec/chewy/search/parameters/track_total_hits_spec.rb +5 -0
  136. data/spec/chewy/search/parameters_spec.rb +18 -4
  137. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  138. data/spec/chewy/search/request_spec.rb +292 -110
  139. data/spec/chewy/search/response_spec.rb +12 -12
  140. data/spec/chewy/search/scrolling_spec.rb +10 -17
  141. data/spec/chewy/search_spec.rb +40 -34
  142. data/spec/chewy/stash_spec.rb +9 -21
  143. data/spec/chewy/strategy/active_job_spec.rb +16 -16
  144. data/spec/chewy/strategy/atomic_no_refresh_spec.rb +60 -0
  145. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  146. data/spec/chewy/strategy/delayed_sidekiq_spec.rb +202 -0
  147. data/spec/chewy/strategy/lazy_sidekiq_spec.rb +214 -0
  148. data/spec/chewy/strategy/sidekiq_spec.rb +12 -12
  149. data/spec/chewy/strategy_spec.rb +19 -15
  150. data/spec/chewy_spec.rb +24 -107
  151. data/spec/spec_helper.rb +3 -22
  152. data/spec/support/active_record.rb +25 -7
  153. metadata +78 -339
  154. data/.circleci/config.yml +0 -240
  155. data/Appraisals +0 -81
  156. data/gemfiles/rails.5.2.activerecord.gemfile +0 -17
  157. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  158. data/gemfiles/rails.6.0.activerecord.gemfile +0 -17
  159. data/gemfiles/sequel.4.45.gemfile +0 -11
  160. data/lib/chewy/backports/deep_dup.rb +0 -46
  161. data/lib/chewy/backports/duplicable.rb +0 -91
  162. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  163. data/lib/chewy/search/parameters/types.rb +0 -20
  164. data/lib/chewy/strategy/resque.rb +0 -27
  165. data/lib/chewy/strategy/shoryuken.rb +0 -40
  166. data/lib/chewy/type/actions.rb +0 -43
  167. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  168. data/lib/chewy/type/adapter/sequel.rb +0 -93
  169. data/lib/chewy/type/crutch.rb +0 -32
  170. data/lib/chewy/type/import/bulk_builder.rb +0 -122
  171. data/lib/chewy/type/observe.rb +0 -82
  172. data/lib/chewy/type.rb +0 -120
  173. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  174. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  175. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  176. data/spec/chewy/search/parameters/types_spec.rb +0 -5
  177. data/spec/chewy/strategy/resque_spec.rb +0 -46
  178. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  179. data/spec/chewy/type/actions_spec.rb +0 -50
  180. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  181. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  182. data/spec/chewy/type/import/bulk_builder_spec.rb +0 -194
  183. data/spec/chewy/type/mapping_spec.rb +0 -175
  184. data/spec/chewy/type/observe_spec.rb +0 -137
  185. data/spec/chewy/type/wrapper_spec.rb +0 -100
  186. data/spec/chewy/type_spec.rb +0 -55
  187. data/spec/support/mongoid.rb +0 -93
  188. data/spec/support/sequel.rb +0 -80
@@ -1,6 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chewy::Type::Adapter::ActiveRecord, :active_record do
3
+ RawCity = Struct.new(:id) do
4
+ def rating
5
+ id * 10
6
+ end
7
+ end
8
+
9
+ describe Chewy::Index::Adapter::ActiveRecord, :active_record do
4
10
  before do
5
11
  stub_model(:city)
6
12
  stub_model(:country)
@@ -29,6 +35,68 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
29
35
  specify { expect(described_class.new(City.where(rating: 10)).default_scope).to eq(City.where(rating: 10)) }
30
36
  end
31
37
 
38
+ describe '.new' do
39
+ context 'with logger' do
40
+ let(:test_logger) { Logger.new('/dev/null') }
41
+ let(:default_scope_behavior) { :warn }
42
+
43
+ around do |example|
44
+ previous_logger = Chewy.logger
45
+ Chewy.logger = test_logger
46
+
47
+ previous_default_scope_behavior = Chewy.config.import_scope_cleanup_behavior
48
+ Chewy.config.import_scope_cleanup_behavior = default_scope_behavior
49
+
50
+ example.run
51
+ ensure
52
+ Chewy.logger = previous_logger
53
+ Chewy.config.import_scope_cleanup_behavior = previous_default_scope_behavior
54
+ end
55
+
56
+ specify do
57
+ expect(test_logger).to receive(:warn)
58
+ described_class.new(City.order(:id))
59
+ end
60
+
61
+ specify do
62
+ expect(test_logger).to receive(:warn)
63
+ described_class.new(City.offset(10))
64
+ end
65
+
66
+ specify do
67
+ expect(test_logger).to receive(:warn)
68
+ described_class.new(City.limit(10))
69
+ end
70
+
71
+ context 'ignore import scope warning' do
72
+ let(:default_scope_behavior) { :ignore }
73
+
74
+ specify do
75
+ expect(test_logger).not_to receive(:warn)
76
+ described_class.new(City.order(:id))
77
+ end
78
+
79
+ specify do
80
+ expect(test_logger).not_to receive(:warn)
81
+ described_class.new(City.offset(10))
82
+ end
83
+
84
+ specify do
85
+ expect(test_logger).not_to receive(:warn)
86
+ described_class.new(City.limit(10))
87
+ end
88
+ end
89
+
90
+ context 'raise exception on import scope with order/limit/offset' do
91
+ let(:default_scope_behavior) { :raise }
92
+
93
+ specify { expect { described_class.new(City.order(:id)) }.to raise_error(Chewy::ImportScopeCleanupError) }
94
+ specify { expect { described_class.new(City.limit(10)) }.to raise_error(Chewy::ImportScopeCleanupError) }
95
+ specify { expect { described_class.new(City.offset(10)) }.to raise_error(Chewy::ImportScopeCleanupError) }
96
+ end
97
+ end
98
+ end
99
+
32
100
  describe '#type_name' do
33
101
  specify { expect(described_class.new(City).type_name).to eq('city') }
34
102
  specify { expect(described_class.new(City.order(:id)).type_name).to eq('city') }
@@ -381,11 +449,21 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
381
449
  context 'objects' do
382
450
  specify { expect(subject.import(cities + deleted) { |_data| true }).to eq(true) }
383
451
  specify { expect(subject.import(cities + deleted) { |_data| false }).to eq(false) }
384
- specify { expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[0].id])).to eq(false) }
385
- specify { expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[1].id])).to eq(false) }
386
- specify { expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[2].id])).to eq(false) }
387
- specify { expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[deleted[0].id])).to eq(false) }
388
- specify { expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[deleted[1].id])).to eq(false) }
452
+ specify do
453
+ expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[0].id])).to eq(false)
454
+ end
455
+ specify do
456
+ expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[1].id])).to eq(false)
457
+ end
458
+ specify do
459
+ expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[cities[2].id])).to eq(false)
460
+ end
461
+ specify do
462
+ expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[deleted[0].id])).to eq(false)
463
+ end
464
+ specify do
465
+ expect(subject.import(cities + deleted, batch_size: 1, &data_comparer.curry[deleted[1].id])).to eq(false)
466
+ end
389
467
  end
390
468
 
391
469
  context 'ids' do
@@ -427,7 +505,10 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
427
505
  subject { described_class.new(Country.joins(:cities)) }
428
506
 
429
507
  specify { expect(subject.import_fields(Country.where('rating < 2'))).to match([contain_exactly(1, 2)]) }
430
- specify { expect(subject.import_fields(Country.where('rating < 2'), fields: [:rating])).to match([contain_exactly([1, 0], [2, 1])]) }
508
+ specify do
509
+ expect(subject.import_fields(Country.where('rating < 2'), fields: [:rating]))
510
+ .to match([contain_exactly([1, 0], [2, 1])])
511
+ end
431
512
  end
432
513
  end
433
514
 
@@ -436,21 +517,36 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
436
517
  specify { expect(subject.import_fields(1, 2, fields: [:rating])).to match([contain_exactly([1, 0], [2, 1])]) }
437
518
 
438
519
  specify { expect(subject.import_fields(countries.first(2))).to match([contain_exactly(1, 2)]) }
439
- specify { expect(subject.import_fields(countries.first(2), fields: [:rating])).to match([contain_exactly([1, 0], [2, 1])]) }
520
+ specify do
521
+ expect(subject.import_fields(countries.first(2), fields: [:rating]))
522
+ .to match([contain_exactly([1, 0], [2, 1])])
523
+ end
440
524
  end
441
525
 
442
526
  context 'batch_size' do
443
527
  specify { expect(subject.import_fields(batch_size: 2)).to match([contain_exactly(1, 2), [3]]) }
444
- specify { expect(subject.import_fields(batch_size: 2, fields: [:rating])).to match([contain_exactly([1, 0], [2, 1]), [[3, 2]]]) }
528
+ specify do
529
+ expect(subject.import_fields(batch_size: 2, fields: [:rating]))
530
+ .to match([contain_exactly([1, 0], [2, 1]), [[3, 2]]])
531
+ end
445
532
 
446
- specify { expect(subject.import_fields(Country.where('rating < 2'), batch_size: 2)).to match([contain_exactly(1, 2)]) }
447
- specify { expect(subject.import_fields(Country.where('rating < 2'), batch_size: 2, fields: [:rating])).to match([contain_exactly([1, 0], [2, 1])]) }
533
+ specify do
534
+ expect(subject.import_fields(Country.where('rating < 2'), batch_size: 2))
535
+ .to match([contain_exactly(1, 2)])
536
+ end
537
+ specify do
538
+ expect(subject.import_fields(Country.where('rating < 2'), batch_size: 2, fields: [:rating]))
539
+ .to match([contain_exactly([1, 0], [2, 1])])
540
+ end
448
541
 
449
542
  specify { expect(subject.import_fields(1, 2, batch_size: 1)).to match([[1], [2]]) }
450
543
  specify { expect(subject.import_fields(1, 2, batch_size: 1, fields: [:rating])).to match([[[1, 0]], [[2, 1]]]) }
451
544
 
452
545
  specify { expect(subject.import_fields(countries.first(2), batch_size: 1)).to match([[1], [2]]) }
453
- specify { expect(subject.import_fields(countries.first(2), batch_size: 1, fields: [:rating])).to match([[[1, 0]], [[2, 1]]]) }
546
+ specify do
547
+ expect(subject.import_fields(countries.first(2), batch_size: 1, fields: [:rating]))
548
+ .to match([[[1, 0]], [[2, 1]]])
549
+ end
454
550
  end
455
551
 
456
552
  context 'typecast' do
@@ -481,31 +577,29 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
481
577
  let(:city_ids) { cities.map(&:id) }
482
578
  let(:deleted_ids) { deleted.map(&:id) }
483
579
 
484
- let(:type) { double(type_name: 'user') }
485
-
486
580
  subject { described_class.new(City) }
487
581
 
488
- specify { expect(subject.load(city_ids, _type: type)).to eq(cities) }
489
- specify { expect(subject.load(city_ids.reverse, _type: type)).to eq(cities.reverse) }
490
- specify { expect(subject.load(deleted_ids, _type: type)).to eq([nil, nil]) }
491
- specify { expect(subject.load(city_ids + deleted_ids, _type: type)).to eq([*cities, nil, nil]) }
582
+ specify { expect(subject.load(city_ids, _index: 'users')).to eq(cities) }
583
+ specify { expect(subject.load(city_ids.reverse, _index: 'users')).to eq(cities.reverse) }
584
+ specify { expect(subject.load(deleted_ids, _index: 'users')).to eq([nil, nil]) }
585
+ specify { expect(subject.load(city_ids + deleted_ids, _index: 'users')).to eq([*cities, nil, nil]) }
492
586
  specify do
493
- expect(subject.load(city_ids, _type: type, scope: -> { where(rating: 0) }))
587
+ expect(subject.load(city_ids, _index: 'users', scope: -> { where(rating: 0) }))
494
588
  .to eq(cities.first(2) + [nil])
495
589
  end
496
590
  specify do
497
- expect(subject.load(city_ids,
498
- _type: type, scope: -> { where(rating: 0) }, user: {scope: -> { where(rating: 1) }}))
499
- .to eq([nil, nil] + cities.last(1))
591
+ expect(
592
+ subject.load(city_ids, _index: 'users', scope: -> { where(rating: 0) }, users: {scope: -> { where(rating: 1) }})
593
+ ).to eq([nil, nil] + cities.last(1))
500
594
  end
501
595
  specify do
502
- expect(subject.load(city_ids, _type: type, scope: City.where(rating: 1)))
596
+ expect(subject.load(city_ids, _index: 'users', scope: City.where(rating: 1)))
503
597
  .to eq([nil, nil] + cities.last(1))
504
598
  end
505
599
  specify do
506
- expect(subject.load(city_ids,
507
- _type: type, scope: City.where(rating: 1), user: {scope: -> { where(rating: 0) }}))
508
- .to eq(cities.first(2) + [nil])
600
+ expect(
601
+ subject.load(city_ids, _index: 'users', scope: City.where(rating: 1), users: {scope: -> { where(rating: 0) }})
602
+ ).to eq(cities.first(2) + [nil])
509
603
  end
510
604
  end
511
605
 
@@ -516,31 +610,53 @@ describe Chewy::Type::Adapter::ActiveRecord, :active_record do
516
610
  let(:city_ids) { cities.map(&:rating) }
517
611
  let(:deleted_ids) { deleted.map(&:rating) }
518
612
 
519
- let(:type) { double(type_name: 'user') }
520
-
521
613
  subject { described_class.new(City) }
522
614
 
523
- specify { expect(subject.load(city_ids, _type: type)).to eq(cities) }
524
- specify { expect(subject.load(city_ids.reverse, _type: type)).to eq(cities.reverse) }
525
- specify { expect(subject.load(deleted_ids, _type: type)).to eq([nil, nil]) }
526
- specify { expect(subject.load(city_ids + deleted_ids, _type: type)).to eq([*cities, nil, nil]) }
615
+ specify { expect(subject.load(city_ids, _index: 'users')).to eq(cities) }
616
+ specify { expect(subject.load(city_ids.reverse, _index: 'users')).to eq(cities.reverse) }
617
+ specify { expect(subject.load(deleted_ids, _index: 'users')).to eq([nil, nil]) }
618
+ specify { expect(subject.load(city_ids + deleted_ids, _index: 'users')).to eq([*cities, nil, nil]) }
527
619
  specify do
528
- expect(subject.load(city_ids, _type: type, scope: -> { where(country_id: 0) }))
620
+ expect(subject.load(city_ids, _index: 'users', scope: -> { where(country_id: 0) }))
529
621
  .to eq(cities.first(2) + [nil])
530
622
  end
531
623
  specify do
532
- expect(subject.load(city_ids,
533
- _type: type, scope: -> { where(country_id: 0) }, user: {scope: -> { where(country_id: 1) }}))
534
- .to eq([nil, nil] + cities.last(1))
624
+ expect(
625
+ subject.load(
626
+ city_ids, _index: 'users', scope: -> { where(country_id: 0) }, users: {scope: -> { where(country_id: 1) }}
627
+ )
628
+ ).to eq([nil, nil] + cities.last(1))
535
629
  end
536
630
  specify do
537
- expect(subject.load(city_ids, _type: type, scope: City.where(country_id: 1)))
631
+ expect(subject.load(city_ids, _index: 'users', scope: City.where(country_id: 1)))
538
632
  .to eq([nil, nil] + cities.last(1))
539
633
  end
540
634
  specify do
541
- expect(subject.load(city_ids,
542
- _type: type, scope: City.where(country_id: 1), user: {scope: -> { where(country_id: 0) }}))
543
- .to eq(cities.first(2) + [nil])
635
+ expect(
636
+ subject.load(
637
+ city_ids, _index: 'users', scope: City.where(country_id: 1), users: {scope: -> { where(country_id: 0) }}
638
+ )
639
+ ).to eq(cities.first(2) + [nil])
640
+ end
641
+ end
642
+
643
+ context 'with raw_import option' do
644
+ subject { described_class.new(City) }
645
+
646
+ let!(:cities) { Array.new(3) { |i| City.create!(rating: i / 2) } }
647
+ let(:city_ids) { cities.map(&:id) }
648
+
649
+ let(:raw_import) { ->(hash) { RawCity.new(hash['id']) } }
650
+ it 'uses the custom loader' do
651
+ raw_cities = subject.load(city_ids, _index: 'cities', raw_import: raw_import).map do |c|
652
+ {id: c.id, rating: c.rating}
653
+ end
654
+
655
+ expect(raw_cities).to eq([
656
+ {id: 1, rating: 10},
657
+ {id: 2, rating: 20},
658
+ {id: 3, rating: 30}
659
+ ])
544
660
  end
545
661
  end
546
662
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chewy::Type::Adapter::Object do
3
+ describe Chewy::Index::Adapter::Object do
4
4
  before { stub_class(:product) }
5
5
  subject { described_class.new(:product) }
6
6
 
@@ -104,7 +104,13 @@ describe Chewy::Type::Adapter::Object do
104
104
  end
105
105
 
106
106
  context 'error handling' do
107
- let(:products) { Array.new(3) { |i| double.tap { |product| allow(product).to receive_messages(rating: i.next) } } }
107
+ let(:products) do
108
+ Array.new(3) do |i|
109
+ double.tap do |product|
110
+ allow(product).to receive_messages(rating: i.next)
111
+ end
112
+ end
113
+ end
108
114
  let(:deleted) { Array.new(2) { |i| double(destroyed?: true, rating: i + 4) } }
109
115
  subject { described_class.new('product') }
110
116
 
@@ -135,13 +141,18 @@ describe Chewy::Type::Adapter::Object do
135
141
  context do
136
142
  subject { described_class.new(-> { objects }) }
137
143
  specify { expect(subject.import_fields(batch_size: 2)).to match([[1, 2], [3]]) }
138
- specify { expect(subject.import_fields(fields: [:name], batch_size: 2)).to match([[[1, 'Name0'], [2, 'Name1']], [[3, 'Name2']]]) }
144
+ specify do
145
+ expect(subject.import_fields(fields: [:name], batch_size: 2))
146
+ .to match([[[1, 'Name0'], [2, 'Name1']], [[3, 'Name2']]])
147
+ end
139
148
  end
140
149
 
141
150
  context do
142
151
  subject { described_class.new(-> { objects }) }
143
152
  specify { expect(subject.import_fields(objects.first(2))).to match([[1, 2]]) }
144
- specify { expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]]) }
153
+ specify do
154
+ expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]])
155
+ end
145
156
  end
146
157
 
147
158
  context do
@@ -178,7 +189,9 @@ describe Chewy::Type::Adapter::Object do
178
189
  context do
179
190
  subject { described_class.new(Product) }
180
191
  specify { expect(subject.import_fields(objects.first(2))).to match([[1, 2]]) }
181
- specify { expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]]) }
192
+ specify do
193
+ expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]])
194
+ end
182
195
  end
183
196
 
184
197
  context 'batch_size' do
@@ -196,7 +209,9 @@ describe Chewy::Type::Adapter::Object do
196
209
  specify { expect(subject.import_references).to match([objects]) }
197
210
  specify { expect(subject.import_references(batch_size: 2)).to match([objects.first(2), objects.last(1)]) }
198
211
  specify { expect(subject.import_references(objects.first(2))).to match([objects.first(2)]) }
199
- specify { expect(subject.import_references(objects.first(2), batch_size: 1)).to match([objects.first(1), [objects[1]]]) }
212
+ specify do
213
+ expect(subject.import_references(objects.first(2), batch_size: 1)).to match([objects.first(1), [objects[1]]])
214
+ end
200
215
  end
201
216
 
202
217
  describe '#load' do
@@ -10,13 +10,13 @@ describe Chewy::Index::Aliases do
10
10
 
11
11
  context do
12
12
  before { DummiesIndex.create! }
13
- specify { expect(DummiesIndex.indexes).to eq([]) }
13
+ specify { expect(DummiesIndex.indexes).to eq(['dummies']) }
14
14
  end
15
15
 
16
16
  context do
17
17
  before { DummiesIndex.create! }
18
18
  before { Chewy.client.indices.put_alias index: 'dummies', name: 'dummies_2013' }
19
- specify { expect(DummiesIndex.indexes).to eq([]) }
19
+ specify { expect(DummiesIndex.indexes).to eq(['dummies']) }
20
20
  end
21
21
 
22
22
  context do
@@ -43,7 +43,7 @@ describe Chewy::Index::Aliases do
43
43
 
44
44
  context do
45
45
  before { DummiesIndex.create! '2013' }
46
- specify { expect(DummiesIndex.aliases).to eq([]) }
46
+ specify { expect(DummiesIndex.aliases).to eq(['dummies']) }
47
47
  end
48
48
  end
49
49
  end