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,700 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Fields::Base do
4
- specify { expect(described_class.new('name').name).to eq(:name) }
5
- specify { expect(described_class.new('name', type: 'integer').options[:type]).to eq('integer') }
6
-
7
- describe '#compose' do
8
- let(:field) { described_class.new(:name, value: lambda(&:value)) }
9
-
10
- specify { expect(field.compose(double(value: 'hello'))).to eq(name: 'hello') }
11
- specify { expect(field.compose(double(value: %w[hello world]))).to eq(name: %w[hello world]) }
12
-
13
- specify do
14
- expect(described_class.new(:name, value: :last_name).compose(double(last_name: 'hello'))).to eq(name: 'hello')
15
- end
16
- specify do
17
- expect(described_class.new(:name, value: :last_name).compose('last_name' => 'hello')).to eq(name: 'hello')
18
- end
19
- specify { expect(described_class.new(:name).compose(double(name: 'hello'))).to eq(name: 'hello') }
20
- specify { expect(described_class.new(:false_value).compose(false_value: false)).to eq(false_value: false) }
21
- specify { expect(described_class.new(:true_value).compose(true_value: true)).to eq(true_value: true) }
22
- specify { expect(described_class.new(:nil_value).compose(nil_value: nil)).to eq(nil_value: nil) }
23
-
24
- context 'nested fields' do
25
- before do
26
- field.children.push(described_class.new(:subname1, value: lambda(&:subvalue1)))
27
- field.children.push(described_class.new(:subname2, value: -> { subvalue2 }))
28
- field.children.push(described_class.new(:subname3))
29
- end
30
-
31
- specify do
32
- expect(field.compose(double(value: double(subvalue1: 'hello', subvalue2: 'value', subname3: 'world'))))
33
- .to eq(name: {subname1: 'hello', subname2: 'value', subname3: 'world'})
34
- end
35
- specify do
36
- expect(field.compose(double(value: [
37
- double(subvalue1: 'hello1', subvalue2: 'value1', subname3: 'world1'),
38
- double(subvalue1: 'hello2', subvalue2: 'value2', subname3: 'world2')
39
- ]))).to eq(name: [
40
- {subname1: 'hello1', subname2: 'value1', subname3: 'world1'},
41
- {subname1: 'hello2', subname2: 'value2', subname3: 'world2'}
42
- ])
43
- end
44
- end
45
-
46
- context 'parent objects' do
47
- let!(:country) { described_class.new(:name, value: ->(country, crutches) { country.cities.map { |city| double(districts: city.districts, name: crutches.city_name) } }) }
48
- let!(:city) { described_class.new(:name, value: ->(city, country, crutches) { city.districts.map { |district| [district, country.name, crutches.suffix] } }) }
49
- let!(:district) { described_class.new(:name, value: ->(district, city, country, crutches) { [district, city.name, country.name, crutches] }) }
50
- let(:crutches) { double(suffix: 'suffix', city_name: 'Bangkok') }
51
-
52
- before do
53
- country.children.push(city)
54
- city.children.push(district)
55
- end
56
-
57
- specify do
58
- expect(country.compose(double(name: 'Thailand', cities: [
59
- double(districts: %w[First Second])
60
- ]), crutches)).to eq(name: [
61
- {name: [
62
- {name: [%w[First Thailand suffix], 'Bangkok', 'Thailand', crutches]},
63
- {name: [%w[Second Thailand suffix], 'Bangkok', 'Thailand', crutches]}
64
- ]}
65
- ])
66
- end
67
- end
68
-
69
- context 'implicit values' do
70
- let(:field) { described_class.new(:name, type: 'integer') }
71
- before do
72
- field.children.push(described_class.new(:name))
73
- field.children.push(described_class.new(:untouched))
74
- end
75
-
76
- specify { expect(field.compose(double(name: 'Alex'))).to eq(name: 'Alex') }
77
- end
78
-
79
- context 'hash values' do
80
- let(:field) { described_class.new(:name, type: 'object') }
81
- let(:object) { double(name: {key1: 'value1', key2: 'value2'}) }
82
-
83
- before do
84
- field.children.push(described_class.new(:key1, value: ->(h) { h[:key1] }))
85
- field.children.push(described_class.new(:key2, value: ->(h) { h[:key2] }))
86
- end
87
-
88
- specify { expect(field.compose(object)).to eq(name: {key1: 'value1', key2: 'value2'}) }
89
- end
90
- end
91
-
92
- describe '#mappings_hash' do
93
- let(:field) { described_class.new(:name, type: :object) }
94
- let(:fields1) { Array.new(2) { |i| described_class.new("name#{i + 1}", type: "integer#{i + 1}") } }
95
- let(:fields2) { Array.new(2) { |i| described_class.new("name#{i + 3}", type: "integer#{i + 3}") } }
96
- before do
97
- fields1.each { |m| field.children.push(m) }
98
- fields2.each { |m| fields1[0].children.push(m) }
99
- end
100
-
101
- specify do
102
- expect(field.mappings_hash).to eq(name: {type: :object, properties: {
103
- name1: {type: 'integer1', fields: {
104
- name3: {type: 'integer3'}, name4: {type: 'integer4'}
105
- }}, name2: {type: 'integer2'}
106
- }})
107
- end
108
-
109
- context do
110
- let(:field) { described_class.new(:name, type: :integer) }
111
- let(:fields1) do
112
- [described_class.new(:name1), described_class.new(:name2, type: 'integer')]
113
- end
114
-
115
- specify do
116
- expect(field.mappings_hash).to eq(name: {type: :integer, fields: {
117
- name1: {type: 'object', properties: {
118
- name3: {type: 'integer3'}, name4: {type: 'integer4'}
119
- }}, name2: {type: 'integer'}
120
- }})
121
- end
122
- end
123
- end
124
-
125
- context 'integration' do
126
- context 'default field type' do
127
- before do
128
- stub_index(:events) do
129
- field :id
130
- field :category do
131
- field :id
132
- field :licenses do
133
- field :id
134
- field :created_at, type: 'time'
135
- end
136
- end
137
- end
138
- end
139
-
140
- around do |example|
141
- previous_type = Chewy.default_field_type
142
- Chewy.default_field_type = 'integer'
143
- example.run
144
- Chewy.default_field_type = previous_type
145
- end
146
-
147
- specify do
148
- expect(EventsIndex.mappings_hash).to eq(
149
- mappings: {
150
- properties: {
151
- id: {type: 'integer'},
152
- category: {
153
- type: 'object',
154
- properties: {
155
- id: {type: 'integer'},
156
- licenses: {
157
- type: 'object',
158
- properties: {
159
- id: {type: 'integer'},
160
- created_at: {type: 'time'}
161
- }
162
- }
163
- }
164
- }
165
- }
166
- }
167
- )
168
- end
169
- end
170
-
171
- context 'objects, hashes and arrays' do
172
- before do
173
- stub_index(:events) do
174
- field :id
175
- field :category do
176
- field :id
177
- field :licenses do
178
- field :id
179
- field :name
180
- end
181
- end
182
- end
183
- end
184
-
185
- specify do
186
- expect(
187
- EventsIndex.root.compose({id: 1, category: {id: 2, licenses: {id: 3, name: 'Name'}}})
188
- ).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
189
- end
190
-
191
- specify do
192
- expect(
193
- EventsIndex.root.compose({id: 1, category: [
194
- {id: 2, 'licenses' => {id: 3, name: 'Name1'}},
195
- {id: 4, licenses: nil}
196
- ]})
197
- ).to eq('id' => 1, 'category' => [
198
- {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name1'}},
199
- {'id' => 4, 'licenses' => nil.as_json}
200
- ])
201
- end
202
-
203
- specify do
204
- expect(
205
- EventsIndex.root.compose({
206
- 'id' => 1,
207
- category: {
208
- id: 2, licenses: [
209
- {id: 3, name: 'Name1'},
210
- {id: 4, name: 'Name2'}
211
- ]
212
- }
213
- })
214
- ).to eq(
215
- 'id' => 1,
216
- 'category' => {
217
- 'id' => 2,
218
- 'licenses' => [
219
- {'id' => 3, 'name' => 'Name1'},
220
- {'id' => 4, 'name' => 'Name2'}
221
- ]
222
- }
223
- )
224
- end
225
-
226
- specify do
227
- expect(
228
- EventsIndex.root.compose({id: 1, category: [
229
- {id: 2, licenses: [
230
- {id: 3, 'name' => 'Name1'}, {id: 4, name: 'Name2'}
231
- ]},
232
- {id: 5, licenses: []}
233
- ]})
234
- ).to eq(
235
- 'id' => 1,
236
- 'category' => [
237
- {'id' => 2, 'licenses' => [
238
- {'id' => 3, 'name' => 'Name1'},
239
- {'id' => 4, 'name' => 'Name2'}
240
- ]},
241
- {'id' => 5, 'licenses' => []}
242
- ]
243
- )
244
- end
245
- specify do
246
- expect(
247
- EventsIndex.root.compose(double(id: 1, category: double(id: 2, licenses: double(id: 3, name: 'Name'))))
248
- ).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
249
- end
250
-
251
- specify do
252
- expect(
253
- EventsIndex.root.compose(double(id: 1, category: [
254
- double(id: 2, licenses: double(id: 3, name: 'Name1')),
255
- double(id: 4, licenses: nil)
256
- ]))
257
- ).to eq('id' => 1, 'category' => [
258
- {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name1'}},
259
- {'id' => 4, 'licenses' => nil.as_json}
260
- ])
261
- end
262
-
263
- specify do
264
- expect(
265
- EventsIndex.root.compose(double(id: 1, category: double(id: 2, licenses: [
266
- double(id: 3, name: 'Name1'), double(id: 4, name: 'Name2')
267
- ])))
268
- ).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => [
269
- {'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
270
- ]})
271
- end
272
-
273
- specify do
274
- expect(
275
- EventsIndex.root.compose(double(id: 1, category: [
276
- double(id: 2, licenses: [
277
- double(id: 3, name: 'Name1'), double(id: 4, name: 'Name2')
278
- ]),
279
- double(id: 5, licenses: [])
280
- ]))
281
- ).to eq(
282
- 'id' => 1, 'category' => [
283
- {'id' => 2, 'licenses' => [
284
- {'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
285
- ]},
286
- {'id' => 5, 'licenses' => []}
287
- ]
288
- )
289
- end
290
- end
291
-
292
- context 'custom methods' do
293
- before do
294
- stub_index(:events) do
295
- field :id, type: 'integer'
296
- field :category, value: -> { categories } do
297
- field :id, type: 'integer'
298
- field :licenses, value: -> { license } do
299
- field :id, type: 'integer'
300
- field :name
301
- end
302
- end
303
- end
304
- end
305
-
306
- specify do
307
- expect(
308
- EventsIndex.root.compose(
309
- double(
310
- id: 1, categories: double(
311
- id: 2, license: double(
312
- id: 3, name: 'Name'
313
- )
314
- )
315
- )
316
- )
317
- ).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
318
- end
319
- end
320
-
321
- context 'objects and multi_fields' do
322
- before do
323
- stub_index(:events) do
324
- field :id, type: 'integer'
325
- field :name, type: 'integer' do
326
- field :raw, analyzer: 'my_own'
327
- end
328
- field :category, type: 'object'
329
- end
330
- end
331
-
332
- specify do
333
- expect(EventsIndex.mappings_hash).to eq(
334
- mappings: {
335
- properties: {
336
- id: {type: 'integer'},
337
- name: {
338
- type: 'integer',
339
- fields: {
340
- raw: {analyzer: 'my_own', type: Chewy.default_field_type}
341
- }
342
- },
343
- category: {type: 'object'}
344
- }
345
- }
346
- )
347
- end
348
-
349
- specify do
350
- expect(
351
- EventsIndex.root.compose(
352
- double(
353
- id: 1, name: 'Jonny', category: double(
354
- id: 2, as_json: {'name' => 'Borogoves'}
355
- )
356
- )
357
- )
358
- ).to eq(
359
- 'id' => 1,
360
- 'name' => 'Jonny',
361
- 'category' => {'name' => 'Borogoves'}
362
- )
363
- end
364
-
365
- specify do
366
- expect(
367
- EventsIndex.root.compose(
368
- double(id: 1, name: 'Jonny', category: [
369
- double(id: 2, as_json: {'name' => 'Borogoves1'}),
370
- double(id: 3, as_json: {'name' => 'Borogoves2'})
371
- ])
372
- )
373
- ).to eq(
374
- 'id' => 1,
375
- 'name' => 'Jonny',
376
- 'category' => [
377
- {'name' => 'Borogoves1'},
378
- {'name' => 'Borogoves2'}
379
- ]
380
- )
381
- end
382
- end
383
-
384
- context 'ignore_blank option for field method', :orm do
385
- before do
386
- stub_model(:location)
387
- stub_model(:city)
388
- stub_model(:country)
389
-
390
- City.belongs_to :country
391
- Location.belongs_to :city
392
- City.has_one :location, -> { order :id }
393
- Country.has_many :cities, -> { order :id }
394
- end
395
-
396
- context 'text fields with and without ignore_blank option' do
397
- before do
398
- stub_index(:countries) do
399
- index_scope Country
400
- field :id
401
- field :cities do
402
- field :id
403
- field :name
404
- field :historical_name, ignore_blank: false
405
- field :description, ignore_blank: true
406
- end
407
- end
408
- end
409
-
410
- let(:country_with_cities) do
411
- cities = [
412
- City.create!(id: 1, name: '', historical_name: '', description: ''),
413
- City.create!(id: 2, name: '', historical_name: '', description: '')
414
- ]
415
-
416
- Country.create!(id: 1, cities: cities)
417
- end
418
-
419
- specify do
420
- expect(CountriesIndex.root.compose(country_with_cities)).to eq(
421
- 'id' => 1, 'cities' => [
422
- {'id' => 1, 'name' => '', 'historical_name' => ''},
423
- {'id' => 2, 'name' => '', 'historical_name' => ''}
424
- ]
425
- )
426
- end
427
- specify { expect(CountriesIndex.reset).to eq(true) }
428
- end
429
-
430
- context 'nested fields' do
431
- context 'with ignore_blank: true option' do
432
- before do
433
- stub_index(:countries) do
434
- index_scope Country
435
- field :id
436
- field :cities, ignore_blank: true do
437
- field :id
438
- field :name
439
- field :historical_name, ignore_blank: true
440
- field :description
441
- end
442
- end
443
- end
444
-
445
- let(:country) { Country.create!(id: 1, cities: cities) }
446
- context('without cities') do
447
- let(:cities) { [] }
448
- specify do
449
- expect(CountriesIndex.root.compose(country))
450
- .to eq('id' => 1)
451
- end
452
- end
453
- context('with cities') do
454
- let(:cities) { [City.create!(id: 1, name: '', historical_name: '')] }
455
- specify do
456
- expect(CountriesIndex.root.compose(country)).to eq(
457
- 'id' => 1, 'cities' => [
458
- {'id' => 1, 'name' => '', 'description' => nil}
459
- ]
460
- )
461
- end
462
- end
463
- end
464
-
465
- context 'with ignore_blank: false option' do
466
- before do
467
- stub_index(:countries) do
468
- index_scope Country
469
- field :id
470
- field :cities, ignore_blank: false do
471
- field :id
472
- field :name
473
- field :historical_name
474
- field :description
475
- end
476
- end
477
- end
478
-
479
- let(:country_with_cities) { Country.create!(id: 1) }
480
-
481
- specify do
482
- expect(CountriesIndex.root.compose(country_with_cities))
483
- .to eq('id' => 1, 'cities' => [])
484
- end
485
- end
486
-
487
- context 'without ignore_blank: true option' do
488
- before do
489
- stub_index(:countries) do
490
- index_scope Country
491
- field :id
492
- field :cities do
493
- field :id
494
- field :name
495
- field :historical_name
496
- field :description
497
- end
498
- end
499
- end
500
-
501
- let(:country_with_cities) { Country.create!(id: 1) }
502
-
503
- specify do
504
- expect(CountriesIndex.root.compose(country_with_cities))
505
- .to eq('id' => 1, 'cities' => [])
506
- end
507
- end
508
- end
509
-
510
- context 'geo_point field type' do
511
- context 'with ignore_blank: true option' do
512
- before do
513
- stub_index(:countries) do
514
- index_scope Country
515
- field :id
516
- field :cities do
517
- field :id
518
- field :name
519
- field :location, type: :geo_point, ignore_blank: true do
520
- field :lat
521
- field :lon
522
- end
523
- end
524
- end
525
- end
526
-
527
- specify do
528
- expect(
529
- CountriesIndex.root.compose({
530
- 'id' => 1,
531
- 'cities' => [
532
- {'id' => 1, 'name' => 'City1', 'location' => {}},
533
- {'id' => 2, 'name' => 'City2', 'location' => {}}
534
- ]
535
- })
536
- ).to eq(
537
- 'id' => 1, 'cities' => [
538
- {'id' => 1, 'name' => 'City1'},
539
- {'id' => 2, 'name' => 'City2'}
540
- ]
541
- )
542
- end
543
- end
544
-
545
- context 'join field type' do
546
- before do
547
- stub_model(:comment)
548
- stub_index(:comments) do
549
- index_scope Comment
550
- field :id
551
- field :hierarchy, type: :join, relations: {question: %i[answer comment], answer: :vote, vote: :subvote}, join: {type: :comment_type, id: :commented_id}
552
- end
553
- end
554
-
555
- specify do
556
- expect(
557
- CommentsIndex.root.compose(
558
- {'id' => 1, 'comment_type' => 'question'}
559
- )
560
- ).to eq(
561
- {'id' => 1, 'hierarchy' => 'question'}
562
- )
563
-
564
- expect(
565
- CommentsIndex.root.compose(
566
- {'id' => 2, 'comment_type' => 'answer', 'commented_id' => 1}
567
- )
568
- ).to eq(
569
- {'id' => 2, 'hierarchy' => {'name' => 'answer', 'parent' => 1}}
570
- )
571
-
572
- expect do
573
- CommentsIndex.root.compose(
574
- {'id' => 2, 'comment_type' => 'asd', 'commented_id' => 1}
575
- )
576
- end.to raise_error Chewy::InvalidJoinFieldType
577
- end
578
- end
579
-
580
- context 'without ignore_blank option' do
581
- before do
582
- stub_index(:countries) do
583
- index_scope Country
584
- field :id
585
- field :cities do
586
- field :id
587
- field :name
588
- field :location, type: :geo_point do
589
- field :lat
590
- field :lon
591
- end
592
- end
593
- end
594
- end
595
-
596
- specify do
597
- expect(
598
- CountriesIndex.root.compose({
599
- 'id' => 1,
600
- 'cities' => [
601
- {'id' => 1, 'name' => 'City1', 'location' => {}},
602
- {'id' => 2, 'name' => 'City2', 'location' => {}}
603
- ]
604
- })
605
- ).to eq(
606
- 'id' => 1, 'cities' => [
607
- {'id' => 1, 'name' => 'City1'},
608
- {'id' => 2, 'name' => 'City2'}
609
- ]
610
- )
611
- end
612
- end
613
-
614
- context 'with ignore_blank: false flag' do
615
- before do
616
- stub_index(:countries) do
617
- index_scope Country
618
- field :id
619
- field :cities do
620
- field :id
621
- field :name
622
- field :location, type: :geo_point, ignore_blank: false do
623
- field :lat
624
- field :lon
625
- end
626
- end
627
- end
628
- end
629
-
630
- specify do
631
- expect(
632
- CountriesIndex.root.compose({
633
- 'id' => 1,
634
- 'cities' => [
635
- {'id' => 1, 'location' => {}, 'name' => 'City1'},
636
- {'id' => 2, 'location' => '', 'name' => 'City2'}
637
- ]
638
- })
639
- ).to eq(
640
- 'id' => 1, 'cities' => [
641
- {'id' => 1, 'location' => {}, 'name' => 'City1'},
642
- {'id' => 2, 'location' => '', 'name' => 'City2'}
643
- ]
644
- )
645
- end
646
- end
647
- end
648
- end
649
-
650
- context 'objects and scopes', :orm do
651
- before do
652
- stub_model(:city)
653
- stub_model(:country)
654
-
655
- City.belongs_to :country
656
- Country.has_many :cities, -> { order :id }
657
-
658
- stub_index(:countries) do
659
- index_scope Country
660
- field :id
661
- field :cities do
662
- field :id
663
- field :name
664
- end
665
- end
666
- end
667
-
668
- let(:country_with_cities) do
669
- cities = [City.create!(id: 1, name: 'City1'), City.create!(id: 2, name: 'City2')]
670
-
671
- Country.create!(id: 1, cities: cities)
672
- end
673
-
674
- specify do
675
- expect(CountriesIndex.root.compose(country_with_cities)).to eq('id' => 1, 'cities' => [
676
- {'id' => 1, 'name' => 'City1'}, {'id' => 2, 'name' => 'City2'}
677
- ])
678
- end
679
-
680
- context 'nested object' do
681
- before do
682
- stub_index(:cities) do
683
- index_scope City
684
- field :id
685
- field :country do
686
- field :id
687
- field :name
688
- end
689
- end
690
- end
691
-
692
- specify do
693
- expect(
694
- CitiesIndex.root.compose(City.create!(id: 1, country: Country.create!(id: 1, name: 'Country')))
695
- ).to eq('id' => 1, 'country' => {'id' => 1, 'name' => 'Country'})
696
- end
697
- end
698
- end
699
- end
700
- end