chewy 8.0.0 → 8.1.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.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +30 -16
  4. data/lib/chewy/errors.rb +3 -0
  5. data/lib/chewy/fields/root.rb +3 -3
  6. data/lib/chewy/index/crutch.rb +12 -2
  7. data/lib/chewy/index/import/bulk_builder.rb +4 -3
  8. data/lib/chewy/index/import/routine.rb +2 -1
  9. data/lib/chewy/index/import.rb +4 -4
  10. data/lib/chewy/index/witchcraft.rb +24 -8
  11. data/lib/chewy/multi_search.rb +1 -1
  12. data/lib/chewy/search/parameters/runtime_mappings.rb +14 -0
  13. data/lib/chewy/search/request.rb +18 -2
  14. data/lib/chewy/search/scrolling.rb +14 -6
  15. data/lib/chewy/stash.rb +10 -6
  16. data/lib/chewy/version.rb +1 -1
  17. metadata +5 -131
  18. data/.github/CODEOWNERS +0 -1
  19. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -39
  20. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  21. data/.github/PULL_REQUEST_TEMPLATE.md +0 -16
  22. data/.github/dependabot.yml +0 -42
  23. data/.github/workflows/ruby.yml +0 -61
  24. data/.gitignore +0 -22
  25. data/.rspec +0 -2
  26. data/.rubocop.yml +0 -64
  27. data/.rubocop_todo.yml +0 -225
  28. data/.yardopts +0 -5
  29. data/CODE_OF_CONDUCT.md +0 -14
  30. data/CONTRIBUTING.md +0 -63
  31. data/Gemfile +0 -22
  32. data/Guardfile +0 -25
  33. data/Rakefile +0 -17
  34. data/chewy.gemspec +0 -24
  35. data/docker-compose.yml +0 -14
  36. data/docs/README.md +0 -16
  37. data/docs/configuration.md +0 -440
  38. data/docs/import.md +0 -122
  39. data/docs/indexing.md +0 -329
  40. data/docs/querying.md +0 -72
  41. data/docs/rake_tasks.md +0 -108
  42. data/docs/testing.md +0 -41
  43. data/docs/troubleshooting.md +0 -101
  44. data/filters +0 -78
  45. data/gemfiles/base.gemfile +0 -12
  46. data/gemfiles/rails.7.2.activerecord.gemfile +0 -14
  47. data/gemfiles/rails.8.0.activerecord.gemfile +0 -14
  48. data/migration_guide.md +0 -56
  49. data/spec/chewy/config_spec.rb +0 -110
  50. data/spec/chewy/elastic_client_spec.rb +0 -26
  51. data/spec/chewy/fields/base_spec.rb +0 -700
  52. data/spec/chewy/fields/root_spec.rb +0 -142
  53. data/spec/chewy/fields/time_fields_spec.rb +0 -28
  54. data/spec/chewy/index/actions_spec.rb +0 -851
  55. data/spec/chewy/index/adapter/active_record_spec.rb +0 -663
  56. data/spec/chewy/index/adapter/object_spec.rb +0 -243
  57. data/spec/chewy/index/aliases_spec.rb +0 -49
  58. data/spec/chewy/index/import/bulk_builder_spec.rb +0 -494
  59. data/spec/chewy/index/import/bulk_request_spec.rb +0 -95
  60. data/spec/chewy/index/import/journal_builder_spec.rb +0 -87
  61. data/spec/chewy/index/import/routine_spec.rb +0 -110
  62. data/spec/chewy/index/import_spec.rb +0 -615
  63. data/spec/chewy/index/mapping_spec.rb +0 -135
  64. data/spec/chewy/index/observe/active_record_methods_spec.rb +0 -68
  65. data/spec/chewy/index/observe/callback_spec.rb +0 -139
  66. data/spec/chewy/index/observe_spec.rb +0 -143
  67. data/spec/chewy/index/settings_spec.rb +0 -136
  68. data/spec/chewy/index/specification_spec.rb +0 -156
  69. data/spec/chewy/index/syncer_spec.rb +0 -118
  70. data/spec/chewy/index/witchcraft_spec.rb +0 -245
  71. data/spec/chewy/index/wrapper_spec.rb +0 -100
  72. data/spec/chewy/index_spec.rb +0 -269
  73. data/spec/chewy/journal_spec.rb +0 -223
  74. data/spec/chewy/minitest/helpers_spec.rb +0 -194
  75. data/spec/chewy/minitest/search_index_receiver_spec.rb +0 -120
  76. data/spec/chewy/multi_search_spec.rb +0 -84
  77. data/spec/chewy/rake_helper_spec.rb +0 -656
  78. data/spec/chewy/repository_spec.rb +0 -50
  79. data/spec/chewy/rspec/build_query_spec.rb +0 -34
  80. data/spec/chewy/rspec/helpers_spec.rb +0 -61
  81. data/spec/chewy/rspec/update_index_spec.rb +0 -313
  82. data/spec/chewy/runtime/version_spec.rb +0 -48
  83. data/spec/chewy/runtime_spec.rb +0 -9
  84. data/spec/chewy/search/loader_spec.rb +0 -83
  85. data/spec/chewy/search/pagination/kaminari_examples.rb +0 -69
  86. data/spec/chewy/search/pagination/kaminari_spec.rb +0 -21
  87. data/spec/chewy/search/parameters/aggs_spec.rb +0 -5
  88. data/spec/chewy/search/parameters/bool_storage_examples.rb +0 -53
  89. data/spec/chewy/search/parameters/collapse_spec.rb +0 -5
  90. data/spec/chewy/search/parameters/docvalue_fields_spec.rb +0 -5
  91. data/spec/chewy/search/parameters/explain_spec.rb +0 -5
  92. data/spec/chewy/search/parameters/filter_spec.rb +0 -5
  93. data/spec/chewy/search/parameters/hash_storage_examples.rb +0 -59
  94. data/spec/chewy/search/parameters/highlight_spec.rb +0 -5
  95. data/spec/chewy/search/parameters/ignore_unavailable_spec.rb +0 -67
  96. data/spec/chewy/search/parameters/indices_spec.rb +0 -99
  97. data/spec/chewy/search/parameters/integer_storage_examples.rb +0 -32
  98. data/spec/chewy/search/parameters/knn_spec.rb +0 -5
  99. data/spec/chewy/search/parameters/limit_spec.rb +0 -5
  100. data/spec/chewy/search/parameters/load_spec.rb +0 -60
  101. data/spec/chewy/search/parameters/min_score_spec.rb +0 -32
  102. data/spec/chewy/search/parameters/none_spec.rb +0 -5
  103. data/spec/chewy/search/parameters/offset_spec.rb +0 -5
  104. data/spec/chewy/search/parameters/order_spec.rb +0 -72
  105. data/spec/chewy/search/parameters/post_filter_spec.rb +0 -5
  106. data/spec/chewy/search/parameters/preference_spec.rb +0 -5
  107. data/spec/chewy/search/parameters/profile_spec.rb +0 -5
  108. data/spec/chewy/search/parameters/query_spec.rb +0 -5
  109. data/spec/chewy/search/parameters/query_storage_examples.rb +0 -434
  110. data/spec/chewy/search/parameters/request_cache_spec.rb +0 -67
  111. data/spec/chewy/search/parameters/rescore_spec.rb +0 -62
  112. data/spec/chewy/search/parameters/script_fields_spec.rb +0 -5
  113. data/spec/chewy/search/parameters/search_after_spec.rb +0 -35
  114. data/spec/chewy/search/parameters/search_type_spec.rb +0 -5
  115. data/spec/chewy/search/parameters/source_spec.rb +0 -162
  116. data/spec/chewy/search/parameters/storage_spec.rb +0 -60
  117. data/spec/chewy/search/parameters/stored_fields_spec.rb +0 -126
  118. data/spec/chewy/search/parameters/string_array_storage_examples.rb +0 -63
  119. data/spec/chewy/search/parameters/string_storage_examples.rb +0 -32
  120. data/spec/chewy/search/parameters/suggest_spec.rb +0 -5
  121. data/spec/chewy/search/parameters/terminate_after_spec.rb +0 -5
  122. data/spec/chewy/search/parameters/timeout_spec.rb +0 -5
  123. data/spec/chewy/search/parameters/track_scores_spec.rb +0 -5
  124. data/spec/chewy/search/parameters/track_total_hits_spec.rb +0 -5
  125. data/spec/chewy/search/parameters/version_spec.rb +0 -5
  126. data/spec/chewy/search/parameters_spec.rb +0 -161
  127. data/spec/chewy/search/query_proxy_spec.rb +0 -95
  128. data/spec/chewy/search/request_spec.rb +0 -886
  129. data/spec/chewy/search/response_spec.rb +0 -180
  130. data/spec/chewy/search/scrolling_spec.rb +0 -171
  131. data/spec/chewy/search_spec.rb +0 -127
  132. data/spec/chewy/stash_spec.rb +0 -85
  133. data/spec/chewy/strategy/active_job_spec.rb +0 -73
  134. data/spec/chewy/strategy/atomic_no_refresh_spec.rb +0 -60
  135. data/spec/chewy/strategy/atomic_spec.rb +0 -61
  136. data/spec/chewy/strategy/delayed_sidekiq_spec.rb +0 -225
  137. data/spec/chewy/strategy/lazy_sidekiq_spec.rb +0 -214
  138. data/spec/chewy/strategy/sidekiq_spec.rb +0 -52
  139. data/spec/chewy/strategy_spec.rb +0 -125
  140. data/spec/chewy_spec.rb +0 -100
  141. data/spec/spec_helper.rb +0 -69
  142. data/spec/support/active_record.rb +0 -124
  143. data/spec/support/class_helpers.rb +0 -16
  144. data/spec/support/fail_helpers.rb +0 -13
@@ -1,180 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Search::Response, :orm do
4
- before { drop_indices }
5
-
6
- before do
7
- stub_model(:city)
8
- stub_model(:country)
9
-
10
- stub_index(:cities) do
11
- index_scope City
12
- field :name
13
- field :rating, type: 'integer'
14
- end
15
- stub_index(:countries) do
16
- index_scope Country
17
- field :name
18
- field :rating, type: 'integer'
19
- end
20
- end
21
-
22
- before do
23
- CitiesIndex.import!(cities: cities)
24
- CountriesIndex.import!(countries)
25
- end
26
-
27
- let(:cities) { Array.new(2) { |i| City.create!(rating: i, name: "city #{i}") } }
28
- let(:countries) { Array.new(2) { |i| Country.create!(rating: i + 2, name: "country #{i}") } }
29
-
30
- let(:request) { Chewy::Search::Request.new(CitiesIndex, CountriesIndex).order(:rating) }
31
- let(:raw_response) { request.send(:perform) }
32
- let(:load_options) { {} }
33
- let(:loader) { Chewy::Search::Loader.new(indexes: [CitiesIndex, CountriesIndex], **load_options) }
34
- subject { described_class.new(raw_response, loader) }
35
-
36
- describe '#hits' do
37
- specify { expect(subject.hits).to be_a(Array) }
38
- specify { expect(subject.hits).to have(4).items }
39
- specify { expect(subject.hits).to all be_a(Hash) }
40
- specify do
41
- expect(subject.hits.flat_map(&:keys).uniq)
42
- .to match_array(%w[_id _index _score _source sort])
43
- end
44
-
45
- context do
46
- let(:raw_response) { {} }
47
- specify { expect(subject.hits).to eq([]) }
48
- end
49
- end
50
-
51
- describe '#total' do
52
- specify { expect(subject.total).to eq(4) }
53
-
54
- context do
55
- let(:raw_response) { {} }
56
- specify { expect(subject.total).to eq(0) }
57
- end
58
- end
59
-
60
- describe '#max_score' do
61
- specify { expect(subject.max_score).to be_nil }
62
-
63
- context do
64
- let(:request) { Chewy::Search::Request.new(CitiesIndex).query(range: {rating: {lte: 42}}) }
65
- specify { expect(subject.max_score).to eq(1.0) }
66
- end
67
- end
68
-
69
- describe '#took' do
70
- specify { expect(subject.took).to be >= 0 }
71
- end
72
-
73
- describe '#timed_out?' do
74
- specify { expect(subject.timed_out?).to eq(false) }
75
- end
76
-
77
- describe '#suggest' do
78
- specify { expect(subject.suggest).to eq({}) }
79
-
80
- context do
81
- let(:request) do
82
- Chewy::Search::Request.new(CitiesIndex).suggest(
83
- my_suggestion: {
84
- text: 'city country',
85
- term: {
86
- field: 'name'
87
- }
88
- }
89
- )
90
- end
91
- specify do
92
- expect(subject.suggest).to eq(
93
- 'my_suggestion' => [
94
- {'text' => 'city', 'offset' => 0, 'length' => 4, 'options' => []},
95
- {'text' => 'country', 'offset' => 5, 'length' => 7, 'options' => []}
96
- ]
97
- )
98
- end
99
- end
100
- end
101
-
102
- describe '#aggs' do
103
- specify { expect(subject.aggs).to eq({}) }
104
-
105
- context do
106
- let(:request) do
107
- Chewy::Search::Request.new(CitiesIndex, CountriesIndex).aggs(avg_rating: {avg: {field: :rating}})
108
- end
109
- specify { expect(subject.aggs).to eq('avg_rating' => {'value' => 1.5}) }
110
- end
111
- end
112
-
113
- describe '#wrappers' do
114
- specify { expect(subject.wrappers).to be_a(Array) }
115
- specify { expect(subject.wrappers).to have(4).items }
116
- specify do
117
- expect(subject.wrappers.map(&:class).uniq)
118
- .to contain_exactly(CitiesIndex, CountriesIndex)
119
- end
120
- specify { expect(subject.wrappers.map(&:_data)).to eq(subject.hits) }
121
-
122
- context do
123
- let(:raw_response) { {} }
124
- specify { expect(subject.wrappers).to eq([]) }
125
- end
126
-
127
- context do
128
- let(:raw_response) { {'hits' => {}} }
129
- specify { expect(subject.wrappers).to eq([]) }
130
- end
131
-
132
- context do
133
- let(:raw_response) { {'hits' => {'hits' => []}} }
134
- specify { expect(subject.wrappers).to eq([]) }
135
- end
136
-
137
- context do
138
- let(:raw_response) do
139
- {'hits' => {'hits' => [
140
- {'_index' => 'cities',
141
- '_type' => 'city',
142
- '_id' => '1',
143
- '_score' => 1.3,
144
- '_source' => {'id' => 2, 'rating' => 0}}
145
- ]}}
146
- end
147
- specify { expect(subject.wrappers.first).to be_a(CitiesIndex) }
148
- specify { expect(subject.wrappers.first.id).to eq(2) }
149
- specify { expect(subject.wrappers.first.rating).to eq(0) }
150
- specify { expect(subject.wrappers.first._score).to eq(1.3) }
151
- specify { expect(subject.wrappers.first._explanation).to be_nil }
152
- end
153
-
154
- context do
155
- let(:raw_response) do
156
- {'hits' => {'hits' => [
157
- {'_index' => 'countries',
158
- '_type' => 'country',
159
- '_id' => '2',
160
- '_score' => 1.2,
161
- '_explanation' => {foo: 'bar'}}
162
- ]}}
163
- end
164
- specify { expect(subject.wrappers.first).to be_a(CountriesIndex) }
165
- specify { expect(subject.wrappers.first.id).to eq('2') }
166
- specify { expect(subject.wrappers.first.rating).to be_nil }
167
- specify { expect(subject.wrappers.first._score).to eq(1.2) }
168
- specify { expect(subject.wrappers.first._explanation).to eq(foo: 'bar') }
169
- end
170
- end
171
-
172
- describe '#objects' do
173
- specify { expect(subject.objects).to eq([*cities, *countries]) }
174
- end
175
-
176
- describe '#object_hash' do
177
- specify { expect(subject.object_hash.keys).to eq(subject.wrappers) }
178
- specify { expect(subject.object_hash.values).to eq(subject.objects) }
179
- end
180
- end
@@ -1,171 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Search::Scrolling, :orm do
4
- before { drop_indices }
5
-
6
- before do
7
- stub_model(:city)
8
- stub_model(:country)
9
-
10
- stub_index(:cities) do
11
- index_scope City
12
- field :name
13
- field :rating, type: 'integer'
14
- end
15
- stub_index(:countries) do
16
- index_scope Country
17
- field :name
18
- field :rating, type: 'integer'
19
- end
20
- end
21
-
22
- let(:request) { Chewy::Search::Request.new(CitiesIndex, CountriesIndex).order(:rating) }
23
-
24
- specify { expect(request.scroll_batches.to_a).to eq([]) }
25
-
26
- context do
27
- before do
28
- CitiesIndex.import!(cities)
29
- CountriesIndex.import!(countries: countries)
30
- end
31
-
32
- let(:cities) { Array.new(2) { |i| City.create!(rating: i, name: "city #{i}") } }
33
- let(:countries) { Array.new(3) { |i| Country.create!(rating: i + 2, name: "country #{i}") } }
34
-
35
- describe '#scroll_batches' do
36
- context do
37
- before { expect(Chewy.client).to receive(:scroll).twice.and_call_original }
38
- specify do
39
- expect(request.scroll_batches(batch_size: 2).map do |batch|
40
- batch.map { |hit| hit['_source']['rating'] }
41
- end).to eq([[0, 1], [2, 3], [4]])
42
- end
43
- end
44
-
45
- context do
46
- before { expect(Chewy.client).to receive(:scroll).once.and_call_original }
47
- specify do
48
- expect(request.scroll_batches(batch_size: 3).map do |batch|
49
- batch.map { |hit| hit['_source']['rating'] }
50
- end).to eq([[0, 1, 2], [3, 4]])
51
- end
52
- end
53
-
54
- context do
55
- before { expect(Chewy.client).to receive(:scroll).once.and_call_original }
56
- it 'respects limit' do
57
- expect(request.limit(4).scroll_batches(batch_size: 3).map do |batch|
58
- batch.map { |hit| hit['_source']['rating'] }
59
- end).to eq([[0, 1, 2], [3]])
60
- end
61
- end
62
-
63
- context do
64
- before { expect(Chewy.client).not_to receive(:scroll) }
65
- it 'respects limit and terminate_after' do
66
- expect(request.terminate_after(1).limit(4).scroll_batches(batch_size: 3).map do |batch|
67
- batch.map { |hit| hit['_source']['rating'] }
68
- end).to eq([[0, 2]])
69
- end
70
- end
71
-
72
- context do
73
- before { expect(Chewy.client).not_to receive(:scroll) }
74
- it 'respects limit' do
75
- expect(request.limit(3).scroll_batches(batch_size: 3).map do |batch|
76
- batch.map { |hit| hit['_source']['rating'] }
77
- end).to eq([[0, 1, 2]])
78
- end
79
- end
80
-
81
- context do
82
- before { expect(Chewy.client).not_to receive(:scroll) }
83
- it 'respects limit' do
84
- expect(request.limit(2).scroll_batches(batch_size: 3).map do |batch|
85
- batch.map { |hit| hit['_source']['rating'] }
86
- end).to eq([[0, 1]])
87
- end
88
- end
89
-
90
- context do
91
- before { expect(Chewy.client).not_to receive(:scroll) }
92
- specify do
93
- expect(request.scroll_batches(batch_size: 5).map do |batch|
94
- batch.map { |hit| hit['_source']['rating'] }
95
- end).to eq([[0, 1, 2, 3, 4]])
96
- end
97
- end
98
-
99
- context do
100
- before { expect(Chewy.client).not_to receive(:scroll) }
101
- specify do
102
- expect(request.scroll_batches(batch_size: 10).map do |batch|
103
- batch.map { |hit| hit['_source']['rating'] }
104
- end).to eq([[0, 1, 2, 3, 4]])
105
- end
106
- end
107
-
108
- it 'clears the scroll after completion' do
109
- expect(Chewy.client).to receive(:clear_scroll).with(body: {scroll_id: anything}).once.and_call_original
110
- request.scroll_batches(batch_size: 3) {}
111
- end
112
-
113
- context 'instrumentation' do
114
- specify do
115
- outer_payload = []
116
- ActiveSupport::Notifications.subscribe('search_query.chewy') do |_name, _start, _finish, _id, payload|
117
- outer_payload << payload
118
- end
119
- request.scroll_batches(batch_size: 3).to_a
120
- expect(outer_payload).to match_array([
121
- hash_including(
122
- index: [CitiesIndex, CountriesIndex],
123
- indexes: [CitiesIndex, CountriesIndex],
124
- request: {index: %w[cities countries], body: {sort: ['rating']}, size: 3, scroll: '1m'}
125
- ),
126
- hash_including(
127
- index: [CitiesIndex, CountriesIndex],
128
- indexes: [CitiesIndex, CountriesIndex],
129
- request: {scroll: '1m', scroll_id: an_instance_of(String)}
130
- )
131
- ])
132
- end
133
- end
134
- end
135
-
136
- describe '#scroll_hits' do
137
- before { expect(Chewy.client).to receive(:scroll).twice.and_call_original }
138
- specify do
139
- expect(request.scroll_hits(batch_size: 2).map do |hit|
140
- hit['_source']['rating']
141
- end).to eq([0, 1, 2, 3, 4])
142
- end
143
- end
144
-
145
- describe '#scroll_wrappers' do
146
- before { expect(Chewy.client).to receive(:scroll).twice.and_call_original }
147
-
148
- specify do
149
- expect(request.scroll_wrappers(batch_size: 2).map(&:rating))
150
- .to eq([0, 1, 2, 3, 4])
151
- end
152
- specify do
153
- expect(request.scroll_wrappers(batch_size: 2).map(&:class).uniq)
154
- .to eq([CitiesIndex, CountriesIndex])
155
- end
156
- end
157
-
158
- describe '#scroll_objects' do
159
- before { expect(Chewy.client).to receive(:scroll).twice.and_call_original }
160
-
161
- specify do
162
- expect(request.scroll_objects(batch_size: 2).map(&:rating))
163
- .to eq([0, 1, 2, 3, 4])
164
- end
165
- specify do
166
- expect(request.scroll_objects(batch_size: 2).map(&:class).uniq)
167
- .to eq([City, Country])
168
- end
169
- end
170
- end
171
- end
@@ -1,127 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Search do
4
- before { drop_indices }
5
-
6
- before do
7
- stub_index(:products)
8
- end
9
-
10
- describe '.all' do
11
- specify { expect(ProductsIndex.all).to be_a(Chewy::Search::Request) }
12
-
13
- context do
14
- before { allow(Chewy).to receive_messages(search_class: Chewy::Search::Request) }
15
-
16
- specify { expect(ProductsIndex.all).to be_a(Chewy::Search::Request) }
17
- end
18
- end
19
-
20
- describe '.search_string' do
21
- specify do
22
- expect(ProductsIndex.client).to receive(:search).with(hash_including(q: 'hello')).once
23
- ProductsIndex.search_string('hello')
24
- end
25
-
26
- specify do
27
- expect(ProductsIndex.client).to receive(:search).with(hash_including(explain: true)).once
28
- ProductsIndex.search_string('hello', explain: true)
29
- end
30
-
31
- specify do
32
- expect(ProductsIndex.client).to receive(:search).with(hash_including(index: ['products'])).once
33
- ProductsIndex.search_string('hello')
34
- end
35
- end
36
-
37
- context 'named scopes' do
38
- before do
39
- stub_model(:city)
40
- stub_model(:country)
41
-
42
- stub_index(:cities) do
43
- def self.by_rating(value)
44
- filter { match rating: value }
45
- end
46
-
47
- def self.by_name(index)
48
- filter { match name: "Name#{index}" }
49
- end
50
-
51
- def self.by_rating_with_kwargs(value, options:) # rubocop:disable Lint/UnusedMethodArgument
52
- filter { match rating: value }
53
- end
54
-
55
- index_scope City
56
- field :name, type: 'keyword'
57
- field :rating, type: :integer
58
- end
59
-
60
- stub_index(:countries) do
61
- def self.by_rating(value)
62
- filter { match rating: value }
63
- end
64
-
65
- def self.by_name(index)
66
- filter { match name: "Name#{index}" }
67
- end
68
-
69
- index_scope Country
70
- field :name, type: 'keyword'
71
- field :rating, type: :integer
72
- end
73
- end
74
-
75
- let!(:cities) { Array.new(3) { |i| City.create! rating: i + 1, name: "Name#{i + 2}" } }
76
- let!(:countries) { Array.new(3) { |i| Country.create! rating: i + 1, name: "Name#{i + 3}" } }
77
-
78
- before do
79
- CitiesIndex.import!(cities)
80
- CountriesIndex.import!(country: countries)
81
- end
82
-
83
- specify { expect(CitiesIndex.indices(CountriesIndex).by_rating(1).map(&:rating)).to eq([1, 1]) }
84
- specify do
85
- expect(CitiesIndex.indices(CountriesIndex).by_rating(1).map(&:class))
86
- .to match_array([CitiesIndex, CountriesIndex])
87
- end
88
- specify { expect(CitiesIndex.indices(CountriesIndex).by_rating(1).by_name(2).map(&:rating)).to eq([1]) }
89
- specify do
90
- expect(CitiesIndex.indices(CountriesIndex).by_rating(1).by_name(2).map(&:class))
91
- .to eq([CitiesIndex])
92
- end
93
- specify { expect(CitiesIndex.indices(CountriesIndex).by_name(3).map(&:rating)).to eq([2, 1]) }
94
- specify do
95
- expect(CitiesIndex.indices(CountriesIndex).by_name(3).map(&:class))
96
- .to eq([CitiesIndex, CountriesIndex])
97
- end
98
- specify { expect(CitiesIndex.indices(CountriesIndex).order(:name).by_rating(1).map(&:rating)).to eq([1, 1]) }
99
- specify do
100
- expect(CitiesIndex.indices(CountriesIndex).order(:name).by_rating(1).map(&:class))
101
- .to match_array([CitiesIndex, CountriesIndex])
102
- end
103
-
104
- specify { expect(CitiesIndex.by_rating(2).map(&:rating)).to eq([2]) }
105
- specify { expect(CitiesIndex.by_rating(2).map(&:class)).to eq([CitiesIndex]) }
106
- specify { expect(CitiesIndex.by_rating(2).by_name(3).map(&:rating)).to eq([2]) }
107
- specify { expect(CitiesIndex.by_rating(2).by_name(3).map(&:class)).to eq([CitiesIndex]) }
108
- specify { expect(CitiesIndex.by_name(3).map(&:rating)).to eq([2]) }
109
- specify { expect(CitiesIndex.by_name(3).map(&:rating)).to eq([2]) }
110
- specify { expect(CitiesIndex.order(:name).by_name(3).map(&:rating)).to eq([2]) }
111
- specify { expect(CitiesIndex.order(:name).by_name(3).map(&:rating)).to eq([2]) }
112
- specify { expect(CitiesIndex.order(:name).by_rating(2).map(&:rating)).to eq([2]) }
113
- specify { expect(CitiesIndex.order(:name).by_rating(2).map(&:class)).to eq([CitiesIndex]) }
114
-
115
- specify { expect(CountriesIndex.by_rating(3).map(&:rating)).to eq([3]) }
116
- specify { expect(CountriesIndex.by_rating(3).map(&:class)).to eq([CountriesIndex]) }
117
- specify { expect(CountriesIndex.by_rating(3).by_name(5).map(&:rating)).to eq([3]) }
118
- specify { expect(CountriesIndex.by_rating(3).by_name(5).map(&:class)).to eq([CountriesIndex]) }
119
- specify { expect(CountriesIndex.order(:name).by_rating(3).map(&:rating)).to eq([3]) }
120
- specify { expect(CountriesIndex.order(:name).by_rating(3).map(&:class)).to eq([CountriesIndex]) }
121
-
122
- specify 'supports keyword arguments' do
123
- expect(CitiesIndex.by_rating_with_kwargs(3, options: 'blah blah blah').map(&:rating)).to eq([3])
124
- expect(CitiesIndex.order(:name).by_rating_with_kwargs(3, options: 'blah blah blah').map(&:rating)).to eq([3])
125
- end
126
- end
127
- end
@@ -1,85 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Stash::Journal, :orm do
4
- def fetch_deleted_number(response)
5
- response['deleted'] || response['_indices']['_all']['deleted']
6
- end
7
-
8
- before { drop_indices }
9
-
10
- before do
11
- stub_model(:city)
12
- stub_index(:cities) do
13
- index_scope City
14
- end
15
- stub_index(:countries)
16
- stub_index(:users)
17
- stub_index(:borogoves)
18
- end
19
-
20
- before { Timecop.freeze }
21
- after { Timecop.return }
22
-
23
- before do
24
- CitiesIndex.import!(City.new(id: 1, name: 'City'), journal: true)
25
- Timecop.travel(Time.now + 1.minute) do
26
- CountriesIndex.import!([id: 2, name: 'Country'], journal: true)
27
- end
28
- Timecop.travel(Time.now + 2.minutes) do
29
- UsersIndex.import!([id: 3, name: 'User'], journal: true)
30
- end
31
- end
32
-
33
- describe '.entries' do
34
- specify do
35
- expect(described_class.entries(Time.now - 30.seconds).map(&:references))
36
- .to contain_exactly([1], [{'id' => 2, 'name' => 'Country'}], [{'id' => 3, 'name' => 'User'}])
37
- end
38
- specify do
39
- expect(described_class.entries(Time.now + 30.seconds).map(&:references))
40
- .to contain_exactly([{'id' => 2, 'name' => 'Country'}], [{'id' => 3, 'name' => 'User'}])
41
- end
42
- specify do
43
- expect(described_class.entries(Time.now + 90.seconds).map(&:references))
44
- .to contain_exactly([{'id' => 3, 'name' => 'User'}])
45
- end
46
-
47
- specify do
48
- expect(described_class.entries(Time.now - 30.seconds, only: UsersIndex).map(&:references))
49
- .to contain_exactly([{'id' => 3, 'name' => 'User'}])
50
- end
51
- specify do
52
- expect(described_class.entries(Time.now - 30.seconds, only: [CitiesIndex, UsersIndex]).map(&:references))
53
- .to contain_exactly([1], [{'id' => 3, 'name' => 'User'}])
54
- end
55
- specify do
56
- expect(described_class.entries(Time.now + 30.seconds, only: [CitiesIndex, UsersIndex]).map(&:references))
57
- .to contain_exactly([{'id' => 3, 'name' => 'User'}])
58
- end
59
- specify do
60
- expect(described_class.entries(Time.now + 30.seconds, only: [BorogovesIndex])).to eq([])
61
- end
62
- end
63
-
64
- describe '.clean' do
65
- specify { expect(fetch_deleted_number(described_class.clean)).to eq(3) }
66
- specify { expect(fetch_deleted_number(described_class.clean(Time.now - 30.seconds))).to eq(0) }
67
- specify { expect(fetch_deleted_number(described_class.clean(Time.now + 30.seconds))).to eq(1) }
68
- specify { expect(fetch_deleted_number(described_class.clean(Time.now + 90.seconds))).to eq(2) }
69
- specify { expect(fetch_deleted_number(described_class.clean(only: BorogovesIndex))).to eq(0) }
70
- specify { expect(fetch_deleted_number(described_class.clean(only: UsersIndex))).to eq(1) }
71
- specify { expect(fetch_deleted_number(described_class.clean(only: [CitiesIndex, UsersIndex]))).to eq(2) }
72
-
73
- specify do
74
- expect(fetch_deleted_number(described_class.clean(Time.now + 30.seconds, only: CountriesIndex))).to eq(0)
75
- end
76
- specify { expect(fetch_deleted_number(described_class.clean(Time.now + 30.seconds, only: CitiesIndex))).to eq(1) }
77
- end
78
-
79
- describe '.for' do
80
- specify { expect(described_class.for(UsersIndex).map(&:index_name)).to eq(['users']) }
81
- specify do
82
- expect(described_class.for(CitiesIndex, UsersIndex).map(&:index_name)).to contain_exactly('cities', 'users')
83
- end
84
- end
85
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- if defined?(ActiveJob)
4
- describe Chewy::Strategy::ActiveJob do
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
11
- before(:all) do
12
- ActiveJob::Base.logger = Chewy.logger
13
- end
14
- before do
15
- ActiveJob::Base.queue_adapter = :test
16
- ActiveJob::Base.queue_adapter.enqueued_jobs.clear
17
- ActiveJob::Base.queue_adapter.performed_jobs.clear
18
- end
19
-
20
- before do
21
- stub_model(:city) do
22
- update_index('cities') { self }
23
- end
24
-
25
- stub_index(:cities) do
26
- index_scope City
27
- end
28
- end
29
-
30
- let(:city) { City.create!(name: 'hello') }
31
- let(:other_city) { City.create!(name: 'world') }
32
-
33
- specify do
34
- expect { [city, other_city].map(&:save!) }
35
- .not_to update_index(CitiesIndex, strategy: :active_job)
36
- end
37
-
38
- specify do
39
- Chewy.strategy(:active_job) do
40
- [city, other_city].map(&:save!)
41
- end
42
- enqueued_job = ActiveJob::Base.queue_adapter.enqueued_jobs.first
43
- expect(enqueued_job[:job]).to eq(Chewy::Strategy::ActiveJob::Worker)
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')
53
- end
54
-
55
- specify do
56
- ActiveJob::Base.queue_adapter = :inline
57
- expect { [city, other_city].map(&:save!) }
58
- .to update_index(CitiesIndex, strategy: :active_job)
59
- .and_reindex(city, other_city).only
60
- end
61
-
62
- specify do
63
- expect(CitiesIndex).to receive(:import!).with([city.id, other_city.id], suffix: '201601')
64
- Chewy::Strategy::ActiveJob::Worker.new.perform('CitiesIndex', [city.id, other_city.id], suffix: '201601')
65
- end
66
-
67
- specify do
68
- allow(Chewy).to receive(:disable_refresh_async).and_return(true)
69
- expect(CitiesIndex).to receive(:import!).with([city.id, other_city.id], suffix: '201601', refresh: false)
70
- Chewy::Strategy::ActiveJob::Worker.new.perform('CitiesIndex', [city.id, other_city.id], suffix: '201601')
71
- end
72
- end
73
- end
@@ -1,60 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Strategy::AtomicNoRefresh, :orm do
4
- around { |example| Chewy.strategy(:bypass) { example.run } }
5
-
6
- before do
7
- stub_model(:country) do
8
- update_index('countries') { self }
9
- end
10
-
11
- stub_index(:countries) do
12
- index_scope Country
13
- end
14
- end
15
-
16
- let(:country) { Country.create!(name: 'hello', country_code: 'HL') }
17
- let(:other_country) { Country.create!(name: 'world', country_code: 'WD') }
18
-
19
- specify do
20
- expect { [country, other_country].map(&:save!) }
21
- .to update_index(CountriesIndex, strategy: :atomic_no_refresh)
22
- .and_reindex(country, other_country).only.no_refresh
23
- end
24
-
25
- specify do
26
- expect { [country, other_country].map(&:destroy) }
27
- .to update_index(CountriesIndex, strategy: :atomic_no_refresh)
28
- .and_delete(country, other_country).only.no_refresh
29
- end
30
-
31
- context do
32
- before do
33
- stub_index(:countries) do
34
- index_scope Country
35
- root id: -> { country_code }
36
- end
37
- end
38
-
39
- specify do
40
- expect { [country, other_country].map(&:save!) }
41
- .to update_index(CountriesIndex, strategy: :atomic_no_refresh)
42
- .and_reindex('HL', 'WD').only.no_refresh
43
- end
44
-
45
- specify do
46
- expect { [country, other_country].map(&:destroy) }
47
- .to update_index(CountriesIndex, strategy: :atomic_no_refresh)
48
- .and_delete('HL', 'WD').only.no_refresh
49
- end
50
-
51
- specify do
52
- expect do
53
- country.save!
54
- other_country.destroy
55
- end
56
- .to update_index(CountriesIndex, strategy: :atomic_no_refresh)
57
- .and_reindex('HL').and_delete('WD').only.no_refresh
58
- end
59
- end
60
- end