chewy 7.1.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +58 -0
  3. data/.rubocop.yml +13 -8
  4. data/.rubocop_todo.yml +110 -22
  5. data/CHANGELOG.md +53 -0
  6. data/Gemfile +0 -7
  7. data/Guardfile +3 -1
  8. data/README.md +282 -245
  9. data/chewy.gemspec +3 -5
  10. data/gemfiles/rails.5.2.activerecord.gemfile +8 -14
  11. data/gemfiles/rails.6.0.activerecord.gemfile +8 -14
  12. data/gemfiles/rails.6.1.activerecord.gemfile +8 -14
  13. data/lib/chewy.rb +21 -75
  14. data/lib/chewy/config.rb +40 -40
  15. data/lib/chewy/errors.rb +0 -12
  16. data/lib/chewy/fields/base.rb +11 -1
  17. data/lib/chewy/fields/root.rb +3 -4
  18. data/lib/chewy/index.rb +46 -87
  19. data/lib/chewy/index/actions.rb +51 -32
  20. data/lib/chewy/{type → index}/adapter/active_record.rb +12 -3
  21. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  22. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  23. data/lib/chewy/{type → index}/adapter/orm.rb +11 -14
  24. data/lib/chewy/{type → index}/crutch.rb +5 -5
  25. data/lib/chewy/{type → index}/import.rb +36 -27
  26. data/lib/chewy/{type → index}/import/bulk_builder.rb +15 -13
  27. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -6
  28. data/lib/chewy/{type → index}/import/journal_builder.rb +10 -10
  29. data/lib/chewy/{type → index}/import/routine.rb +15 -14
  30. data/lib/chewy/{type → index}/mapping.rb +26 -31
  31. data/lib/chewy/{type → index}/observe.rb +9 -19
  32. data/lib/chewy/index/specification.rb +1 -0
  33. data/lib/chewy/{type → index}/syncer.rb +60 -57
  34. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  35. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  36. data/lib/chewy/journal.rb +8 -8
  37. data/lib/chewy/minitest/helpers.rb +9 -13
  38. data/lib/chewy/minitest/search_index_receiver.rb +22 -26
  39. data/lib/chewy/railtie.rb +4 -2
  40. data/lib/chewy/rake_helper.rb +82 -107
  41. data/lib/chewy/rspec/update_index.rb +47 -43
  42. data/lib/chewy/search.rb +4 -17
  43. data/lib/chewy/search/loader.rb +18 -30
  44. data/lib/chewy/search/parameters.rb +4 -2
  45. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  46. data/lib/chewy/search/parameters/source.rb +5 -1
  47. data/lib/chewy/search/query_proxy.rb +9 -2
  48. data/lib/chewy/search/request.rb +82 -86
  49. data/lib/chewy/search/response.rb +4 -4
  50. data/lib/chewy/search/scoping.rb +6 -7
  51. data/lib/chewy/search/scrolling.rb +11 -11
  52. data/lib/chewy/stash.rb +14 -22
  53. data/lib/chewy/strategy.rb +3 -19
  54. data/lib/chewy/strategy/sidekiq.rb +1 -0
  55. data/lib/chewy/version.rb +1 -1
  56. data/lib/generators/chewy/install_generator.rb +1 -1
  57. data/lib/tasks/chewy.rake +10 -22
  58. data/migration_guide.md +14 -0
  59. data/spec/chewy/config_spec.rb +14 -39
  60. data/spec/chewy/fields/base_spec.rb +412 -148
  61. data/spec/chewy/fields/root_spec.rb +16 -24
  62. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  63. data/spec/chewy/index/actions_spec.rb +270 -24
  64. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +68 -40
  65. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  66. data/spec/chewy/{type → index}/import/bulk_builder_spec.rb +23 -31
  67. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -6
  68. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -15
  69. data/spec/chewy/{type → index}/import/routine_spec.rb +16 -16
  70. data/spec/chewy/{type → index}/import_spec.rb +102 -98
  71. data/spec/chewy/{type → index}/mapping_spec.rb +46 -54
  72. data/spec/chewy/index/observe_spec.rb +116 -0
  73. data/spec/chewy/index/settings_spec.rb +3 -1
  74. data/spec/chewy/index/specification_spec.rb +7 -17
  75. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  76. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  77. data/spec/chewy/index/wrapper_spec.rb +100 -0
  78. data/spec/chewy/index_spec.rb +59 -102
  79. data/spec/chewy/journal_spec.rb +9 -22
  80. data/spec/chewy/minitest/helpers_spec.rb +13 -15
  81. data/spec/chewy/minitest/search_index_receiver_spec.rb +22 -26
  82. data/spec/chewy/multi_search_spec.rb +4 -5
  83. data/spec/chewy/rake_helper_spec.rb +145 -55
  84. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  85. data/spec/chewy/search/loader_spec.rb +19 -37
  86. data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
  87. data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
  88. data/spec/chewy/search/parameters/indices_spec.rb +2 -8
  89. data/spec/chewy/search/parameters/order_spec.rb +1 -1
  90. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  91. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  92. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  93. data/spec/chewy/search/parameters_spec.rb +12 -3
  94. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  95. data/spec/chewy/search/request_spec.rb +222 -74
  96. data/spec/chewy/search/response_spec.rb +12 -12
  97. data/spec/chewy/search/scrolling_spec.rb +7 -9
  98. data/spec/chewy/search_spec.rb +32 -35
  99. data/spec/chewy/stash_spec.rb +9 -21
  100. data/spec/chewy/strategy/active_job_spec.rb +8 -8
  101. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  102. data/spec/chewy/strategy/sidekiq_spec.rb +8 -8
  103. data/spec/chewy/strategy_spec.rb +19 -15
  104. data/spec/chewy_spec.rb +14 -100
  105. data/spec/spec_helper.rb +2 -21
  106. data/spec/support/active_record.rb +15 -5
  107. metadata +44 -103
  108. data/.circleci/config.yml +0 -214
  109. data/Appraisals +0 -81
  110. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  111. data/gemfiles/sequel.4.45.gemfile +0 -11
  112. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  113. data/lib/chewy/strategy/resque.rb +0 -27
  114. data/lib/chewy/strategy/shoryuken.rb +0 -40
  115. data/lib/chewy/type.rb +0 -120
  116. data/lib/chewy/type/actions.rb +0 -43
  117. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  118. data/lib/chewy/type/adapter/sequel.rb +0 -93
  119. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  120. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  121. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  122. data/spec/chewy/strategy/resque_spec.rb +0 -46
  123. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  124. data/spec/chewy/type/actions_spec.rb +0 -50
  125. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  126. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  127. data/spec/chewy/type/observe_spec.rb +0 -137
  128. data/spec/chewy/type/wrapper_spec.rb +0 -100
  129. data/spec/chewy/type_spec.rb +0 -55
  130. data/spec/support/mongoid.rb +0 -93
  131. data/spec/support/sequel.rb +0 -80
@@ -5,7 +5,7 @@ describe Chewy::Search::Pagination::Kaminari do
5
5
  describe '#objects' do
6
6
  let(:data) { Array.new(12) { |i| {id: i.next.to_s, name: "Name#{i.next}", age: 10 * i.next}.stringify_keys! } }
7
7
 
8
- before { ProductsIndex::Product.import!(data.map { |h| double(h) }) }
8
+ before { ProductsIndex.import!(data.map { |h| double(h) }) }
9
9
  before { allow(::Kaminari.config).to receive_messages(default_per_page: 17) }
10
10
 
11
11
  specify { expect(search.objects.class).to eq(Kaminari::PaginatableArray) }
@@ -2,14 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Chewy::Search::Parameters::Indices do
4
4
  before do
5
- stub_index(:first) do
6
- define_type :one
7
- end
8
-
9
- stub_index(:second) do
10
- define_type :three
11
- end
12
-
5
+ stub_index(:first)
6
+ stub_index(:second)
13
7
  stub_index(:third)
14
8
  end
15
9
 
@@ -10,7 +10,7 @@ describe Chewy::Search::Parameters::Order do
10
10
  specify { expect(described_class.new(42).value).to eq('42' => nil) }
11
11
  specify { expect(described_class.new([42, 43]).value).to eq('42' => nil, '43' => nil) }
12
12
  specify { expect(described_class.new(a: 1).value).to eq('a' => 1) }
13
- specify { expect(described_class.new(['', 43, a: 1]).value).to eq('a' => 1, '43' => nil) }
13
+ specify { expect(described_class.new(['', 43, {a: 1}]).value).to eq('a' => 1, '43' => nil) }
14
14
  end
15
15
 
16
16
  describe '#replace!' do
@@ -4,19 +4,46 @@ shared_examples :query_storage do |param_name|
4
4
  subject { described_class.new(must: {foo: 'bar'}, should: {moo: 'baz'}) }
5
5
 
6
6
  describe '#initialize' do
7
- specify { expect(described_class.new.value.to_h).to eq(must: [], should: [], must_not: [], minimum_should_match: nil) }
8
- specify { expect(described_class.new(nil).value.to_h).to eq(must: [], should: [], must_not: [], minimum_should_match: nil) }
9
- specify { expect(described_class.new(foobar: {}).value.to_h).to eq(must: [{foobar: {}}], should: [], must_not: [], minimum_should_match: nil) }
10
- specify { expect(described_class.new(must: {}, should: {}, must_not: {}).value.to_h).to eq(must: [], should: [], must_not: [], minimum_should_match: nil) }
7
+ specify do
8
+ expect(described_class.new.value.to_h)
9
+ .to eq(must: [], should: [], must_not: [], minimum_should_match: nil)
10
+ end
11
+ specify do
12
+ expect(described_class.new(nil).value.to_h)
13
+ .to eq(must: [], should: [], must_not: [], minimum_should_match: nil)
14
+ end
15
+ specify do
16
+ expect(described_class.new(foobar: {}).value.to_h)
17
+ .to eq(must: [{foobar: {}}], should: [], must_not: [], minimum_should_match: nil)
18
+ end
19
+ specify do
20
+ expect(described_class.new(must: {}, should: {}, must_not: {}).value.to_h)
21
+ .to eq(must: [], should: [], must_not: [], minimum_should_match: nil)
22
+ end
11
23
  specify do
12
24
  expect(described_class.new(must: {foo: 'bar'}, should: {foo: 'bar'}, foobar: {}).value.to_h)
13
25
  .to eq(must: [{foo: 'bar'}], should: [{foo: 'bar'}], must_not: [], minimum_should_match: nil)
14
26
  end
15
- specify { expect(subject.value.to_h).to eq(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil) }
16
- specify { expect(described_class.new(proc { match foo: 'bar' }).value.to_h).to eq(must: [match: {foo: 'bar'}], should: [], must_not: [], minimum_should_match: nil) }
17
- specify { expect(described_class.new(must: proc { match foo: 'bar' }).value.to_h).to eq(must: [match: {foo: 'bar'}], should: [], must_not: [], minimum_should_match: nil) }
18
- specify { expect(described_class.new(minimum_should_match: 3).value.to_h).to eq(must: [], should: [], must_not: [], minimum_should_match: 3) }
19
- specify { expect(described_class.new(must: {foo: 'bar'}, minimum_should_match: 3).value.to_h).to eq(must: [{foo: 'bar'}], should: [], must_not: [], minimum_should_match: 3) }
27
+ specify do
28
+ expect(subject.value.to_h)
29
+ .to eq(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
30
+ end
31
+ specify do
32
+ expect(described_class.new(proc { match foo: 'bar' }).value.to_h)
33
+ .to eq(must: [match: {foo: 'bar'}], should: [], must_not: [], minimum_should_match: nil)
34
+ end
35
+ specify do
36
+ expect(described_class.new(must: proc { match foo: 'bar' }).value.to_h)
37
+ .to eq(must: [match: {foo: 'bar'}], should: [], must_not: [], minimum_should_match: nil)
38
+ end
39
+ specify do
40
+ expect(described_class.new(minimum_should_match: 3).value.to_h)
41
+ .to eq(must: [], should: [], must_not: [], minimum_should_match: 3)
42
+ end
43
+ specify do
44
+ expect(described_class.new(must: {foo: 'bar'}, minimum_should_match: 3).value.to_h)
45
+ .to eq(must: [{foo: 'bar'}], should: [], must_not: [], minimum_should_match: 3)
46
+ end
20
47
  specify do
21
48
  expect(described_class.new(must: [proc { match foo: 'bar' }, {moo: 'baz'}]).value.to_h)
22
49
  .to eq(must: [{match: {foo: 'bar'}}, {moo: 'baz'}], should: [], must_not: [], minimum_should_match: nil)
@@ -73,14 +100,16 @@ shared_examples :query_storage do |param_name|
73
100
  expect { subject.and(moo: 'baz') }
74
101
  .to change { subject.value.to_h }
75
102
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
76
- .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {moo: 'baz'}], should: [], must_not: [], minimum_should_match: nil)
103
+ .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
104
+ {moo: 'baz'}], should: [], must_not: [], minimum_should_match: nil)
77
105
  end
78
106
 
79
107
  specify do
80
108
  expect { subject.and([{moo: 'baz'}, {doo: 'scooby'}]) }
81
109
  .to change { subject.value.to_h }
82
110
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
83
- .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}], should: [], must_not: [], minimum_should_match: nil)
111
+ .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
112
+ bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}], should: [], must_not: [], minimum_should_match: nil)
84
113
  end
85
114
 
86
115
  specify do
@@ -93,7 +122,8 @@ shared_examples :query_storage do |param_name|
93
122
  expect { subject.and(should: {foo: 'bar'}) }
94
123
  .to change { subject.value.to_h }
95
124
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
96
- .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {bool: {should: {foo: 'bar'}}}], should: [], must_not: [], minimum_should_match: nil)
125
+ .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
126
+ {bool: {should: {foo: 'bar'}}}], should: [], must_not: [], minimum_should_match: nil)
97
127
  end
98
128
 
99
129
  context do
@@ -113,14 +143,16 @@ shared_examples :query_storage do |param_name|
113
143
  expect { subject.or(moo: 'baz') }
114
144
  .to change { subject.value.to_h }
115
145
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
116
- .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {moo: 'baz'}], must_not: [], minimum_should_match: nil)
146
+ .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
147
+ {moo: 'baz'}], must_not: [], minimum_should_match: nil)
117
148
  end
118
149
 
119
150
  specify do
120
151
  expect { subject.or([{moo: 'baz'}, {doo: 'scooby'}]) }
121
152
  .to change { subject.value.to_h }
122
153
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
123
- .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}], must_not: [], minimum_should_match: nil)
154
+ .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
155
+ bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}], must_not: [], minimum_should_match: nil)
124
156
  end
125
157
 
126
158
  specify do
@@ -133,7 +165,8 @@ shared_examples :query_storage do |param_name|
133
165
  expect { subject.or(should: {foo: 'bar'}) }
134
166
  .to change { subject.value.to_h }
135
167
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
136
- .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {bool: {should: {foo: 'bar'}}}], must_not: [], minimum_should_match: nil)
168
+ .to(must: [], should: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
169
+ {bool: {should: {foo: 'bar'}}}], must_not: [], minimum_should_match: nil)
137
170
  end
138
171
 
139
172
  context do
@@ -160,7 +193,12 @@ shared_examples :query_storage do |param_name|
160
193
  expect { subject.not([{moo: 'baz'}, {doo: 'scooby'}]) }
161
194
  .to change { subject.value.to_h }
162
195
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
163
- .to(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [{bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}}], minimum_should_match: nil)
196
+ .to(
197
+ must: [{foo: 'bar'}],
198
+ should: [{moo: 'baz'}],
199
+ must_not: [{bool: {must: [{moo: 'baz'}, {doo: 'scooby'}]}}],
200
+ minimum_should_match: nil
201
+ )
164
202
  end
165
203
 
166
204
  specify do
@@ -173,7 +211,11 @@ shared_examples :query_storage do |param_name|
173
211
  expect { subject.not(should: {foo: 'bar'}) }
174
212
  .to change { subject.value.to_h }
175
213
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
176
- .to(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [{bool: {should: {foo: 'bar'}}}], minimum_should_match: nil)
214
+ .to(
215
+ must: [{foo: 'bar'}], should: [{moo: 'baz'}],
216
+ must_not: [{bool: {should: {foo: 'bar'}}}],
217
+ minimum_should_match: nil
218
+ )
177
219
  end
178
220
 
179
221
  context do
@@ -223,7 +265,8 @@ shared_examples :query_storage do |param_name|
223
265
  expect { subject.update!(must: proc { match foo: 'bar' }) }
224
266
  .to change { subject.value.to_h }
225
267
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
226
- .to(must: [{foo: 'bar'}, {match: {foo: 'bar'}}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
268
+ .to(must: [{foo: 'bar'},
269
+ {match: {foo: 'bar'}}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
227
270
  end
228
271
 
229
272
  specify do
@@ -237,7 +280,8 @@ shared_examples :query_storage do |param_name|
237
280
  expect { subject.update!(foobar: {foo: 'bar'}) }
238
281
  .to change { subject.value.to_h }
239
282
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
240
- .to(must: [{foo: 'bar'}, {foobar: {foo: 'bar'}}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
283
+ .to(must: [{foo: 'bar'},
284
+ {foobar: {foo: 'bar'}}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
241
285
  end
242
286
 
243
287
  specify do
@@ -279,7 +323,8 @@ shared_examples :query_storage do |param_name|
279
323
  expect { subject.merge!(described_class.new(moo: 'baz')) }
280
324
  .to change { subject.value.to_h }
281
325
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
282
- .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {moo: 'baz'}], should: [], must_not: [], minimum_should_match: nil)
326
+ .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
327
+ {moo: 'baz'}], should: [], must_not: [], minimum_should_match: nil)
283
328
  end
284
329
 
285
330
  specify do
@@ -292,7 +337,8 @@ shared_examples :query_storage do |param_name|
292
337
  expect { subject.merge!(described_class.new(should: {foo: 'bar'})) }
293
338
  .to change { subject.value.to_h }
294
339
  .from(must: [{foo: 'bar'}], should: [{moo: 'baz'}], must_not: [], minimum_should_match: nil)
295
- .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}}, {bool: {should: {foo: 'bar'}}}], should: [], must_not: [], minimum_should_match: nil)
340
+ .to(must: [{bool: {must: {foo: 'bar'}, should: {moo: 'baz'}}},
341
+ {bool: {should: {foo: 'bar'}}}], should: [], must_not: [], minimum_should_match: nil)
296
342
  end
297
343
 
298
344
  context do
@@ -20,7 +20,10 @@ describe Chewy::Search::Parameters::SearchAfter do
20
20
  end
21
21
 
22
22
  describe '#merge!' do
23
- specify { expect { subject.merge!(described_class.new(:baz)) }.to change { subject.value }.from([:foo, 42]).to([:baz]) }
23
+ specify do
24
+ expect { subject.merge!(described_class.new(:baz)) }
25
+ .to change { subject.value }.from([:foo, 42]).to([:baz])
26
+ end
24
27
  specify { expect { subject.merge!(described_class.new) }.not_to change { subject.value }.from([:foo, 42]) }
25
28
  end
26
29
 
@@ -12,8 +12,14 @@ describe Chewy::Search::Parameters::Source do
12
12
  specify { expect(described_class.new(true).value).to eq(includes: [], excludes: [], enabled: true) }
13
13
  specify { expect(described_class.new(a: 1).value).to eq(includes: [], excludes: [], enabled: true) }
14
14
  specify { expect(described_class.new(includes: :foo).value).to eq(includes: %w[foo], excludes: [], enabled: true) }
15
- specify { expect(described_class.new(includes: :foo, excludes: 42).value).to eq(includes: %w[foo], excludes: %w[42], enabled: true) }
16
- specify { expect(described_class.new(includes: :foo, excludes: 42, enabled: false).value).to eq(includes: %w[foo], excludes: %w[42], enabled: true) }
15
+ specify do
16
+ expect(described_class.new(includes: :foo, excludes: 42).value)
17
+ .to eq(includes: %w[foo], excludes: %w[42], enabled: true)
18
+ end
19
+ specify do
20
+ expect(described_class.new(includes: :foo, excludes: 42, enabled: false).value)
21
+ .to eq(includes: %w[foo], excludes: %w[42], enabled: true)
22
+ end
17
23
  end
18
24
 
19
25
  describe '#replace!' do
@@ -55,7 +55,10 @@ describe Chewy::Search::Parameters do
55
55
  subject { described_class.new(limit: 10, offset: 20, order: :foo) }
56
56
 
57
57
  specify { expect { subject.only!([:limit]) }.to change { subject.clone }.to(described_class.new(limit: 10)) }
58
- specify { expect { subject.only!(%i[offset order]) }.to change { subject.clone }.to(described_class.new(offset: 20, order: :foo)) }
58
+ specify do
59
+ expect { subject.only!(%i[offset order]) }
60
+ .to change { subject.clone }.to(described_class.new(offset: 20, order: :foo))
61
+ end
59
62
  specify { expect { subject.only!(%i[limit something]) }.to raise_error NameError }
60
63
  specify { expect { subject.only!([]) }.to raise_error ArgumentError }
61
64
  end
@@ -63,8 +66,14 @@ describe Chewy::Search::Parameters do
63
66
  describe '#except!' do
64
67
  subject { described_class.new(limit: 10, offset: 20, order: :foo) }
65
68
 
66
- specify { expect { subject.except!([:limit]) }.to change { subject.clone }.to(described_class.new(offset: 20, order: :foo)) }
67
- specify { expect { subject.except!(%i[offset order]) }.to change { subject.clone }.to(described_class.new(limit: 10)) }
69
+ specify do
70
+ expect { subject.except!([:limit]) }
71
+ .to change { subject.clone }.to(described_class.new(offset: 20, order: :foo))
72
+ end
73
+ specify do
74
+ expect { subject.except!(%i[offset order]) }
75
+ .to change { subject.clone }.to(described_class.new(limit: 10))
76
+ end
68
77
  specify { expect { subject.except!(%i[limit something]) }.to raise_error NameError }
69
78
  specify { expect { subject.except!([]) }.to raise_error ArgumentError }
70
79
  end
@@ -8,41 +8,86 @@ describe Chewy::Search::QueryProxy do
8
8
 
9
9
  describe '#must' do
10
10
  specify { expect { subject.must }.to raise_error ArgumentError }
11
- specify { expect(subject.must(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
12
- specify { expect(subject.must { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
11
+ specify do
12
+ expect(subject.must(multi_match: {foo: 'bar'}).render[:body])
13
+ .to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
14
+ end
15
+ specify do
16
+ expect(subject.must(multi_match: {foo: 'bar'}).render[:body])
17
+ .to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
18
+ end
13
19
  end
14
20
 
15
21
  describe '#should' do
16
22
  specify { expect { subject.should }.to raise_error ArgumentError }
17
- specify { expect(subject.should(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}}) }
18
- specify { expect(subject.should { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}}) }
23
+ specify do
24
+ expect(subject.should(multi_match: {foo: 'bar'}).render[:body])
25
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}})
26
+ end
27
+ specify do
28
+ expect(subject.should(multi_match: {foo: 'bar'}).render[:body])
29
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}})
30
+ end
19
31
  end
20
32
 
21
33
  describe '#must_not' do
22
34
  specify { expect { subject.must_not }.to raise_error ArgumentError }
23
- specify { expect(subject.must_not(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}}) }
24
- specify { expect(subject.must_not { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}}) }
35
+ specify do
36
+ expect(subject.must_not(multi_match: {foo: 'bar'}).render[:body])
37
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
38
+ end
39
+ specify do
40
+ expect(subject.must_not(multi_match: {foo: 'bar'}).render[:body])
41
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
42
+ end
25
43
  end
26
44
 
27
45
  describe '#and' do
28
46
  specify { expect { subject.and }.to raise_error ArgumentError }
29
- specify { expect(subject.and(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
30
- specify { expect(subject.and { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
31
- specify { expect(subject.and(scope).render[:body]).to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {bool: {must_not: {match: {foo: 'bar'}}}}]}}) }
47
+ specify do
48
+ expect(subject.and(multi_match: {foo: 'bar'}).render[:body])
49
+ .to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
50
+ end
51
+ specify do
52
+ expect(subject.and(multi_match: {foo: 'bar'}).render[:body])
53
+ .to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
54
+ end
55
+ specify do
56
+ expect(subject.and(scope).render[:body])
57
+ .to eq(query: {bool: {must: [{match: {foo: 'bar'}}, {bool: {must_not: {match: {foo: 'bar'}}}}]}})
58
+ end
32
59
  end
33
60
 
34
61
  describe '#or' do
35
62
  specify { expect { subject.or }.to raise_error ArgumentError }
36
- specify { expect(subject.or(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
37
- specify { expect(subject.or { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}}) }
38
- specify { expect(subject.or(scope).render[:body]).to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {bool: {must_not: {match: {foo: 'bar'}}}}]}}) }
63
+ specify do
64
+ expect(subject.or(multi_match: {foo: 'bar'}).render[:body])
65
+ .to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
66
+ end
67
+ specify do
68
+ expect(subject.or(multi_match: {foo: 'bar'}).render[:body])
69
+ .to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
70
+ end
71
+ specify do
72
+ expect(subject.or(scope).render[:body])
73
+ .to eq(query: {bool: {should: [{match: {foo: 'bar'}}, {bool: {must_not: {match: {foo: 'bar'}}}}]}})
74
+ end
39
75
  end
40
76
 
41
77
  describe '#not' do
42
78
  specify { expect { subject.not }.to raise_error ArgumentError }
43
- specify { expect(subject.not(multi_match: {foo: 'bar'}).render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}}) }
44
- specify { expect(subject.not { multi_match foo: 'bar' }.render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}}) }
45
- specify { expect(subject.not(scope).render[:body]).to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {bool: {must_not: {match: {foo: 'bar'}}}}}}) }
79
+ specify do
80
+ expect(subject.not(multi_match: {foo: 'bar'}).render[:body])
81
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
82
+ end
83
+ specify do
84
+ expect(subject.not(multi_match: {foo: 'bar'}).render[:body])
85
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
86
+ end
87
+ specify do
88
+ expect(subject.not(scope).render[:body])
89
+ .to eq(query: {bool: {must: {match: {foo: 'bar'}}, must_not: {bool: {must_not: {match: {foo: 'bar'}}}}}})
90
+ end
46
91
  end
47
92
 
48
93
  describe '#minimum_should_match' do
@@ -53,7 +98,10 @@ describe Chewy::Search::QueryProxy do
53
98
  Chewy::Search::Request.new(ProductsIndex)
54
99
  .query.should(match: {foo: 'bar'})
55
100
  end
56
- specify { expect(subject.minimum_should_match('100%').render[:body]).to eq(query: {bool: {should: {match: {foo: 'bar'}}, minimum_should_match: '100%'}}) }
101
+ specify do
102
+ expect(subject.minimum_should_match('100%').render[:body])
103
+ .to eq(query: {bool: {should: {match: {foo: 'bar'}}, minimum_should_match: '100%'}})
104
+ end
57
105
  end
58
106
 
59
107
  context do
@@ -62,7 +110,10 @@ describe Chewy::Search::QueryProxy do
62
110
  .query.should(match: {foo: 'bar'})
63
111
  .query.minimum_should_match(2)
64
112
  end
65
- specify { expect(subject.minimum_should_match(nil).render[:body]).to eq(query: {bool: {should: {match: {foo: 'bar'}}}}) }
113
+ specify do
114
+ expect(subject.minimum_should_match(nil).render[:body])
115
+ .to eq(query: {bool: {should: {match: {foo: 'bar'}}}})
116
+ end
66
117
  end
67
118
  end
68
119
  end
@@ -5,23 +5,17 @@ describe Chewy::Search::Request do
5
5
 
6
6
  before do
7
7
  stub_index(:products) do
8
- define_type :product do
9
- field :id, type: :integer
10
- field :name
11
- field :age, type: :integer
12
- end
8
+ field :id, type: :integer
9
+ field :name
10
+ field :age, type: :integer
13
11
  end
14
12
 
15
13
  stub_index(:cities) do
16
- define_type :city do
17
- field :id, type: :integer
18
- end
14
+ field :id, type: :integer
19
15
  end
20
16
 
21
17
  stub_index(:countries) do
22
- define_type :country do
23
- field :id, type: :integer
24
- end
18
+ field :id, type: :integer
25
19
  end
26
20
  end
27
21
 
@@ -31,11 +25,17 @@ describe Chewy::Search::Request do
31
25
  specify { expect(described_class.new(ProductsIndex)).to eq(described_class.new(ProductsIndex)) }
32
26
  specify { expect(described_class.new(ProductsIndex)).not_to eq(described_class.new(CitiesIndex)) }
33
27
  specify { expect(described_class.new(ProductsIndex)).not_to eq(described_class.new(ProductsIndex, CitiesIndex)) }
34
- specify { expect(described_class.new(CitiesIndex, ProductsIndex)).to eq(described_class.new(ProductsIndex, CitiesIndex)) }
35
- specify { expect(described_class.new(ProductsIndex, CitiesIndex)).to eq(described_class.new(CitiesIndex, ProductsIndex)) }
28
+ specify do
29
+ expect(described_class.new(CitiesIndex, ProductsIndex)).to eq(described_class.new(ProductsIndex, CitiesIndex))
30
+ end
31
+ specify do
32
+ expect(described_class.new(ProductsIndex, CitiesIndex)).to eq(described_class.new(CitiesIndex, ProductsIndex))
33
+ end
36
34
 
37
35
  specify { expect(described_class.new(ProductsIndex).limit(10)).to eq(described_class.new(ProductsIndex).limit(10)) }
38
- specify { expect(described_class.new(ProductsIndex).limit(10)).not_to eq(described_class.new(ProductsIndex).limit(20)) }
36
+ specify do
37
+ expect(described_class.new(ProductsIndex).limit(10)).not_to eq(described_class.new(ProductsIndex).limit(20))
38
+ end
39
39
 
40
40
  specify { expect(ProductsIndex.limit(10)).to eq(ProductsIndex.limit(10)) }
41
41
  specify { expect(ProductsIndex.limit(10)).not_to eq(CitiesIndex.limit(10)) }
@@ -64,50 +64,103 @@ describe Chewy::Search::Request do
64
64
 
65
65
  %i[query post_filter].each do |name|
66
66
  describe "##{name}" do
67
- specify { expect(subject.send(name, match: {foo: 'bar'}).render[:body]).to include(name => {match: {foo: 'bar'}}) }
67
+ specify do
68
+ expect(subject.send(name, match: {foo: 'bar'}).render[:body])
69
+ .to include(name => {match: {foo: 'bar'}})
70
+ end
68
71
  specify { expect(subject.send(name, nil)).to be_a described_class }
69
- specify { expect(subject.send(name) { match foo: 'bar' }.render[:body]).to include(name => {match: {foo: 'bar'}}) }
72
+ specify do
73
+ expect(subject.send(name) { match foo: 'bar' }.render[:body])
74
+ .to include(name => {match: {foo: 'bar'}})
75
+ end
70
76
  specify do
71
77
  expect(subject.send(name, match: {foo: 'bar'}).send(name) { multi_match foo: 'bar' }.render[:body])
72
78
  .to include(name => {bool: {must: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
73
79
  end
74
80
  specify { expect { subject.send(name, match: {foo: 'bar'}) }.not_to change { subject.render } }
75
81
  specify do
76
- expect(subject.send(name).should(match: {foo: 'bar'}).send(name).must_not { multi_match foo: 'bar' }.render[:body])
77
- .to include(name => {bool: {should: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
82
+ expect(
83
+ subject.send(name).should(match: {foo: 'bar'}).send(name).must_not { multi_match foo: 'bar' }.render[:body]
84
+ ).to include(name => {bool: {should: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}})
78
85
  end
79
86
 
80
87
  context do
81
88
  let(:other_scope) { subject.send(name).should { multi_match foo: 'bar' }.send(name) { match foo: 'bar' } }
82
89
 
83
90
  specify do
84
- expect(subject.send(name).not(other_scope).render[:body])
85
- .to include(name => {bool: {must_not: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}}}})
91
+ expect(
92
+ subject.send(name).not(other_scope).render[:body]
93
+ ).to include(
94
+ name => {
95
+ bool: {
96
+ must_not: {
97
+ bool: {
98
+ must: {match: {foo: 'bar'}},
99
+ should: {multi_match: {foo: 'bar'}}
100
+ }
101
+ }
102
+ }
103
+ }
104
+ )
86
105
  end
87
106
  end
88
107
  end
89
108
  end
90
109
 
91
110
  describe '#filter' do
92
- specify { expect(subject.filter(match: {foo: 'bar'}).render[:body]).to include(query: {bool: {filter: {match: {foo: 'bar'}}}}) }
111
+ specify do
112
+ expect(subject.filter(match: {foo: 'bar'}).render[:body])
113
+ .to include(query: {bool: {filter: {match: {foo: 'bar'}}}})
114
+ end
93
115
  specify { expect(subject.filter(nil)).to be_a described_class }
94
- specify { expect(subject.filter { match foo: 'bar' }.render[:body]).to include(query: {bool: {filter: {match: {foo: 'bar'}}}}) }
116
+ specify do
117
+ expect(subject.filter(match: {foo: 'bar'}).render[:body])
118
+ .to include(query: {bool: {filter: {match: {foo: 'bar'}}}})
119
+ end
95
120
  specify do
96
121
  expect(subject.filter(match: {foo: 'bar'}).filter { multi_match foo: 'bar' }.render[:body])
97
122
  .to include(query: {bool: {filter: [{match: {foo: 'bar'}}, {multi_match: {foo: 'bar'}}]}})
98
123
  end
99
124
  specify { expect { subject.filter(match: {foo: 'bar'}) }.not_to change { subject.render } }
100
125
  specify do
101
- expect(subject.filter.should(match: {foo: 'bar'}).filter.must_not { multi_match foo: 'bar' }.render[:body])
102
- .to include(query: {bool: {filter: {bool: {should: {match: {foo: 'bar'}}, must_not: {multi_match: {foo: 'bar'}}}}}})
126
+ expect(
127
+ subject.filter.should(match: {foo: 'bar'}).filter.must_not { multi_match foo: 'bar' }.render[:body]
128
+ ).to include(
129
+ query: {
130
+ bool: {
131
+ filter: {
132
+ bool: {
133
+ should: {match: {foo: 'bar'}},
134
+ must_not: {multi_match: {foo: 'bar'}}
135
+ }
136
+ }
137
+ }
138
+ }
139
+ )
103
140
  end
104
141
 
105
142
  context do
106
143
  let(:other_scope) { subject.filter.should { multi_match foo: 'bar' }.filter { match foo: 'bar' } }
107
144
 
108
145
  specify do
109
- expect(subject.filter.not(other_scope).render[:body])
110
- .to include(query: {bool: {filter: {bool: {must_not: {bool: {must: {match: {foo: 'bar'}}, should: {multi_match: {foo: 'bar'}}}}}}}})
146
+ expect(
147
+ subject.filter.not(other_scope).render[:body]
148
+ ).to include(
149
+ query: {
150
+ bool: {
151
+ filter: {
152
+ bool: {
153
+ must_not: {
154
+ bool: {
155
+ must: {match: {foo: 'bar'}},
156
+ should: {multi_match: {foo: 'bar'}}
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ )
111
164
  end
112
165
  end
113
166
  end
@@ -175,23 +228,53 @@ describe Chewy::Search::Request do
175
228
  specify { expect(subject.source(:foo, :bar).source(nil).render[:body]).to include(_source: %w[foo bar]) }
176
229
  specify { expect(subject.source(%i[foo bar]).source(nil).render[:body]).to include(_source: %w[foo bar]) }
177
230
  specify { expect(subject.source(excludes: :foo).render[:body]).to include(_source: {excludes: %w[foo]}) }
178
- specify { expect(subject.source(excludes: :foo).source(excludes: %i[foo bar]).render[:body]).to include(_source: {excludes: %w[foo bar]}) }
179
- specify { expect(subject.source(excludes: :foo).source(excludes: %i[foo bar]).render[:body]).to include(_source: {excludes: %w[foo bar]}) }
180
- specify { expect(subject.source(excludes: :foo).source(:bar).render[:body]).to include(_source: {includes: %w[bar], excludes: %w[foo]}) }
231
+ specify do
232
+ expect(subject.source(excludes: :foo).source(excludes: %i[foo bar]).render[:body])
233
+ .to include(_source: {excludes: %w[foo bar]})
234
+ end
235
+ specify do
236
+ expect(subject.source(excludes: :foo).source(excludes: %i[foo bar]).render[:body])
237
+ .to include(_source: {excludes: %w[foo bar]})
238
+ end
239
+ specify do
240
+ expect(subject.source(excludes: :foo).source(:bar).render[:body])
241
+ .to include(_source: {includes: %w[bar], excludes: %w[foo]})
242
+ end
181
243
  specify { expect(subject.source(excludes: :foo).source(false).render[:body]).to include(_source: false) }
182
- specify { expect(subject.source(excludes: :foo).source(false).source(excludes: :bar).render[:body]).to include(_source: {excludes: %w[foo bar]}) }
183
- specify { expect(subject.source(excludes: :foo).source(false).source(true).render[:body]).to include(_source: {excludes: %w[foo]}) }
244
+ specify do
245
+ expect(subject.source(excludes: :foo).source(false).source(excludes: :bar).render[:body])
246
+ .to include(_source: {excludes: %w[foo bar]})
247
+ end
248
+ specify do
249
+ expect(subject.source(excludes: :foo).source(false).source(true).render[:body])
250
+ .to include(_source: {excludes: %w[foo]})
251
+ end
184
252
  specify { expect(subject.source(nil).render[:body]).to be_blank }
185
253
  specify { expect { subject.source(:foo) }.not_to change { subject.render } }
186
254
  end
187
255
 
188
256
  describe '#stored_fields' do
189
257
  specify { expect(subject.stored_fields(:foo).render[:body]).to include(stored_fields: ['foo']) }
190
- specify { expect(subject.stored_fields(%i[foo bar]).stored_fields(nil).render[:body]).to include(stored_fields: %w[foo bar]) }
191
- specify { expect(subject.stored_fields(:foo).stored_fields(:foo, :bar).render[:body]).to include(stored_fields: %w[foo bar]) }
192
- specify { expect(subject.stored_fields(:foo).stored_fields(false).render[:body]).to include(stored_fields: '_none_') }
193
- specify { expect(subject.stored_fields(:foo).stored_fields(false).stored_fields(:bar).render[:body]).to include(stored_fields: %w[foo bar]) }
194
- specify { expect(subject.stored_fields(:foo).stored_fields(false).stored_fields(true).render[:body]).to include(stored_fields: %w[foo]) }
258
+ specify do
259
+ expect(subject.stored_fields(%i[foo bar]).stored_fields(nil).render[:body])
260
+ .to include(stored_fields: %w[foo bar])
261
+ end
262
+ specify do
263
+ expect(subject.stored_fields(:foo).stored_fields(:foo, :bar).render[:body])
264
+ .to include(stored_fields: %w[foo bar])
265
+ end
266
+ specify do
267
+ expect(subject.stored_fields(:foo).stored_fields(false).render[:body])
268
+ .to include(stored_fields: '_none_')
269
+ end
270
+ specify do
271
+ expect(subject.stored_fields(:foo).stored_fields(false).stored_fields(:bar).render[:body])
272
+ .to include(stored_fields: %w[foo bar])
273
+ end
274
+ specify do
275
+ expect(subject.stored_fields(:foo).stored_fields(false).stored_fields(true).render[:body])
276
+ .to include(stored_fields: %w[foo])
277
+ end
195
278
  specify { expect(subject.stored_fields(nil).render[:body]).to be_blank }
196
279
  specify { expect { subject.stored_fields(:foo) }.not_to change { subject.render } }
197
280
  end
@@ -199,8 +282,14 @@ describe Chewy::Search::Request do
199
282
  %i[script_fields highlight].each do |name|
200
283
  describe "##{name}" do
201
284
  specify { expect(subject.send(name, foo: {bar: 42}).render[:body]).to include(name => {'foo' => {bar: 42}}) }
202
- specify { expect(subject.send(name, foo: {bar: 42}).send(name, moo: {baz: 43}).render[:body]).to include(name => {'foo' => {bar: 42}, 'moo' => {baz: 43}}) }
203
- specify { expect(subject.send(name, foo: {bar: 42}).send(name, nil).render[:body]).to include(name => {'foo' => {bar: 42}}) }
285
+ specify do
286
+ expect(subject.send(name, foo: {bar: 42}).send(name, moo: {baz: 43}).render[:body])
287
+ .to include(name => {'foo' => {bar: 42}, 'moo' => {baz: 43}})
288
+ end
289
+ specify do
290
+ expect(subject.send(name, foo: {bar: 42}).send(name, nil).render[:body])
291
+ .to include(name => {'foo' => {bar: 42}})
292
+ end
204
293
  specify { expect { subject.send(name, foo: {bar: 42}) }.not_to change { subject.render } }
205
294
  end
206
295
  end
@@ -208,16 +297,28 @@ describe Chewy::Search::Request do
208
297
  %i[suggest aggs].each do |name|
209
298
  describe "##{name}" do
210
299
  specify { expect(subject.send(name, foo: {bar: 42}).render[:body]).to include(name => {'foo' => {bar: 42}}) }
211
- specify { expect(subject.send(name, foo: {bar: 42}).send(name, moo: {baz: 43}).render[:body]).to include(name => {'foo' => {bar: 42}, 'moo' => {baz: 43}}) }
212
- specify { expect(subject.send(name, foo: {bar: 42}).send(name, nil).render[:body]).to include(name => {'foo' => {bar: 42}}) }
300
+ specify do
301
+ expect(subject.send(name, foo: {bar: 42}).send(name, moo: {baz: 43}).render[:body])
302
+ .to include(name => {'foo' => {bar: 42}, 'moo' => {baz: 43}})
303
+ end
304
+ specify do
305
+ expect(subject.send(name, foo: {bar: 42}).send(name, nil).render[:body])
306
+ .to include(name => {'foo' => {bar: 42}})
307
+ end
213
308
  specify { expect { subject.send(name, foo: {bar: 42}) }.not_to change { subject.render } }
214
309
  end
215
310
  end
216
311
 
217
312
  describe '#docvalue_fields' do
218
313
  specify { expect(subject.docvalue_fields(:foo).render[:body]).to include(docvalue_fields: ['foo']) }
219
- specify { expect(subject.docvalue_fields(%i[foo bar]).docvalue_fields(nil).render[:body]).to include(docvalue_fields: %w[foo bar]) }
220
- specify { expect(subject.docvalue_fields(:foo).docvalue_fields(:foo, :bar).render[:body]).to include(docvalue_fields: %w[foo bar]) }
314
+ specify do
315
+ expect(subject.docvalue_fields(%i[foo bar]).docvalue_fields(nil).render[:body])
316
+ .to include(docvalue_fields: %w[foo bar])
317
+ end
318
+ specify do
319
+ expect(subject.docvalue_fields(:foo).docvalue_fields(:foo, :bar).render[:body])
320
+ .to include(docvalue_fields: %w[foo bar])
321
+ end
221
322
  specify { expect(subject.docvalue_fields(nil).render[:body]).to be_blank }
222
323
  specify { expect { subject.docvalue_fields(:foo) }.not_to change { subject.render } }
223
324
  end
@@ -232,14 +333,23 @@ describe Chewy::Search::Request do
232
333
 
233
334
  describe '#indices_boost' do
234
335
  specify { expect(subject.indices_boost(foo: 1.2).render[:body]).to include(indices_boost: [{'foo' => 1.2}]) }
235
- specify { expect(subject.indices_boost(foo: 1.2).indices_boost(moo: 1.3).render[:body]).to include(indices_boost: [{'foo' => 1.2}, {'moo' => 1.3}]) }
236
- specify { expect(subject.indices_boost(foo: 1.2).indices_boost(nil).render[:body]).to include(indices_boost: [{'foo' => 1.2}]) }
336
+ specify do
337
+ expect(subject.indices_boost(foo: 1.2).indices_boost(moo: 1.3).render[:body])
338
+ .to include(indices_boost: [{'foo' => 1.2}, {'moo' => 1.3}])
339
+ end
340
+ specify do
341
+ expect(subject.indices_boost(foo: 1.2).indices_boost(nil).render[:body])
342
+ .to include(indices_boost: [{'foo' => 1.2}])
343
+ end
237
344
  specify { expect { subject.indices_boost(foo: 1.2) }.not_to change { subject.render } }
238
345
  end
239
346
 
240
347
  describe '#rescore' do
241
348
  specify { expect(subject.rescore(foo: 42).render[:body]).to include(rescore: [{foo: 42}]) }
242
- specify { expect(subject.rescore(foo: 42).rescore(moo: 43).render[:body]).to include(rescore: [{foo: 42}, {moo: 43}]) }
349
+ specify do
350
+ expect(subject.rescore(foo: 42).rescore(moo: 43).render[:body])
351
+ .to include(rescore: [{foo: 42}, {moo: 43}])
352
+ end
243
353
  specify { expect(subject.rescore(foo: 42).rescore(nil).render[:body]).to include(rescore: [{foo: 42}]) }
244
354
  specify { expect { subject.rescore(foo: 42) }.not_to change { subject.render } }
245
355
  end
@@ -253,7 +363,10 @@ describe Chewy::Search::Request do
253
363
 
254
364
  describe '#search_after' do
255
365
  specify { expect(subject.search_after(:foo, :bar).render[:body]).to include(search_after: %i[foo bar]) }
256
- specify { expect(subject.search_after(%i[foo bar]).search_after(:baz).render[:body]).to include(search_after: [:baz]) }
366
+ specify do
367
+ expect(subject.search_after(%i[foo bar]).search_after(:baz).render[:body])
368
+ .to include(search_after: [:baz])
369
+ end
257
370
  specify { expect(subject.search_after(:foo).search_after(nil).render[:body]).to be_blank }
258
371
  specify { expect { subject.search_after(:foo) }.not_to change { subject.render } }
259
372
  end
@@ -264,15 +377,13 @@ describe Chewy::Search::Request do
264
377
  stub_model(:country)
265
378
 
266
379
  stub_index(:places) do
267
- define_type City do
268
- field :rating, type: 'integer'
269
- end
380
+ index_scope City
381
+ field :rating, type: 'integer'
270
382
  end
271
383
 
272
384
  stub_index(:countries) do
273
- define_type Country do
274
- field :rating, type: 'integer'
275
- end
385
+ index_scope Country
386
+ field :rating, type: 'integer'
276
387
  end
277
388
  end
278
389
 
@@ -290,7 +401,7 @@ describe Chewy::Search::Request do
290
401
 
291
402
  describe '#load' do
292
403
  specify { expect(subject.load(only: 'city')).to eq([*cities]) }
293
- specify { expect(subject.load(only: 'city').map(&:class).uniq).to eq([PlacesIndex::City]) }
404
+ specify { expect(subject.load(only: 'city').map(&:class).uniq).to eq([PlacesIndex]) }
294
405
  specify { expect(subject.load(only: 'city').objects).to eq([*cities]) }
295
406
  end
296
407
  end
@@ -310,7 +421,9 @@ describe Chewy::Search::Request do
310
421
 
311
422
  context do
312
423
  let(:first_scope) { subject.query(foo: 'bar').filter.should(moo: 'baz').post_filter.must_not(boo: 'baf').limit(10) }
313
- let(:second_scope) { subject.filter(foo: 'bar').post_filter.should(moo: 'baz').query.must_not(boo: 'baf').limit(20) }
424
+ let(:second_scope) do
425
+ subject.filter(foo: 'bar').post_filter.should(moo: 'baz').query.must_not(boo: 'baf').limit(20)
426
+ end
314
427
 
315
428
  describe '#and' do
316
429
  specify do
@@ -379,13 +492,17 @@ describe Chewy::Search::Request do
379
492
 
380
493
  context 'integration' do
381
494
  let(:products_count) { 9 }
382
- let(:products) { Array.new(products_count) { |i| {id: i.next.to_i, name: "Name#{i.next}", age: 10 * i.next}.stringify_keys! } }
495
+ let(:products) do
496
+ Array.new(products_count) do |i|
497
+ {id: i.next.to_i, name: "Name#{i.next}", age: 10 * i.next}.stringify_keys!
498
+ end
499
+ end
383
500
  let(:cities) { Array.new(3) { |i| {id: (i.next + 9).to_i}.stringify_keys! } }
384
501
  let(:countries) { Array.new(3) { |i| {id: (i.next + 12).to_i}.stringify_keys! } }
385
502
  before do
386
- ProductsIndex::Product.import!(products.map { |h| double(h) })
387
- CountriesIndex::Country.import!(countries.map { |h| double(h) })
388
- CitiesIndex::City.import!(cities.map { |h| double(h) })
503
+ ProductsIndex.import!(products.map { |h| double(h) })
504
+ CountriesIndex.import!(countries.map { |h| double(h) })
505
+ CitiesIndex.import!(cities.map { |h| double(h) })
389
506
  end
390
507
 
391
508
  specify { expect(subject[0]._data).to be_a Hash }
@@ -425,9 +542,18 @@ describe Chewy::Search::Request do
425
542
 
426
543
  describe '#highlight' do
427
544
  specify { expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first.name).to eq('Name3') }
428
- specify { expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first.name_highlight).to eq('<em>Name3</em>') }
429
- specify { expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first.name_highlights).to eq(['<em>Name3</em>']) }
430
- specify { expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first._data['_source']['name']).to eq('Name3') }
545
+ specify do
546
+ expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first.name_highlight)
547
+ .to eq('<em>Name3</em>')
548
+ end
549
+ specify do
550
+ expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first.name_highlights)
551
+ .to eq(['<em>Name3</em>'])
552
+ end
553
+ specify do
554
+ expect(subject.query(match: {name: 'name3'}).highlight(fields: {name: {}}).first._data['_source']['name'])
555
+ .to eq('Name3')
556
+ end
431
557
  end
432
558
 
433
559
  describe '#suggest' do
@@ -513,7 +639,7 @@ describe Chewy::Search::Request do
513
639
  context do
514
640
  before { expect(Chewy.client).to receive(:search).once.and_call_original }
515
641
 
516
- specify { expect(subject.first).to be_a(ProductsIndex::Product).and have_attributes(id: 9) }
642
+ specify { expect(subject.first).to be_a(ProductsIndex).and have_attributes(id: 9) }
517
643
  specify { expect(subject.first(3).map(&:id)).to eq([9, 8, 7]) }
518
644
  specify { expect(subject.first(10).map(&:id)).to have(9).items }
519
645
  specify { expect(subject.limit(5).first(10).map(&:id)).to have(9).items }
@@ -526,7 +652,7 @@ describe Chewy::Search::Request do
526
652
  expect(Chewy.client).not_to receive(:search)
527
653
  end
528
654
 
529
- specify { expect(subject.first).to be_a(ProductsIndex::Product).and have_attributes(id: 9) }
655
+ specify { expect(subject.first).to be_a(ProductsIndex).and have_attributes(id: 9) }
530
656
  specify { expect(subject.first(3).map(&:id)).to eq([9, 8, 7]) }
531
657
  specify { expect(subject.first(10).map(&:id)).to have(9).items }
532
658
 
@@ -547,16 +673,34 @@ describe Chewy::Search::Request do
547
673
  end
548
674
 
549
675
  describe '#find' do
550
- specify { expect(subject.find('1')).to be_a(ProductsIndex::Product).and have_attributes(id: 1) }
551
- specify { expect(subject.find { |w| w.id == 2 }).to be_a(ProductsIndex::Product).and have_attributes(id: 2) }
676
+ specify { expect(subject.find('1')).to be_a(ProductsIndex).and have_attributes(id: 1) }
677
+ specify { expect(subject.find { |w| w.id == 2 }).to be_a(ProductsIndex).and have_attributes(id: 2) }
552
678
  specify { expect(subject.limit(2).find('1', '3', '7').map(&:id)).to contain_exactly(1, 3, 7) }
553
679
  specify { expect(subject.find(1, 3, 7).map(&:id)).to contain_exactly(1, 3, 7) }
554
- specify { expect { subject.find('1', '3', '42') }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 42' }
555
- specify { expect { subject.find(1, 3, 42) }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 42' }
556
- specify { expect { subject.query(match: {name: 'name3'}).find('1', '3') }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1' }
557
- specify { expect { subject.query(match: {name: 'name2'}).find('1', '3') }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3' }
558
- specify { expect { subject.filter(match: {name: 'name2'}).find('1', '3') }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3' }
559
- specify { expect { subject.post_filter(match: {name: 'name2'}).find('1', '3') }.to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3' }
680
+ specify do
681
+ expect { subject.find('1', '3', '42') }
682
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 42'
683
+ end
684
+ specify do
685
+ expect { subject.find(1, 3, 42) }
686
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 42'
687
+ end
688
+ specify do
689
+ expect { subject.query(match: {name: 'name3'}).find('1', '3') }
690
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1'
691
+ end
692
+ specify do
693
+ expect { subject.query(match: {name: 'name2'}).find('1', '3') }
694
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3'
695
+ end
696
+ specify do
697
+ expect { subject.filter(match: {name: 'name2'}).find('1', '3') }
698
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3'
699
+ end
700
+ specify do
701
+ expect { subject.post_filter(match: {name: 'name2'}).find('1', '3') }
702
+ .to raise_error Chewy::DocumentNotFound, 'Could not find documents for ids: 1 and 3'
703
+ end
560
704
 
561
705
  context 'make sure it returns everything' do
562
706
  let(:products_count) { 12 }
@@ -570,14 +714,18 @@ describe Chewy::Search::Request do
570
714
  before { expect(Chewy.client).to receive(:scroll).once.and_call_original }
571
715
 
572
716
  specify { expect(subject.find((1..9).to_a)).to have(9).items }
573
- specify { expect(subject.find((1..9).to_a)).to all be_a(Chewy::Type) }
717
+ specify { expect(subject.find((1..9).to_a)).to all be_a(Chewy::Index) }
574
718
  end
575
719
  end
576
720
 
577
721
  describe '#pluck' do
578
722
  specify { expect(subject.limit(5).pluck(:_id)).to eq(%w[1 2 3 4 5]) }
579
- specify { expect(subject.limit(5).pluck(:_id, :age)).to eq([['1', 10], ['2', 20], ['3', 30], ['4', 40], ['5', 50]]) }
580
- specify { expect(subject.limit(5).source(:name).pluck(:id, :age)).to eq([[1, 10], [2, 20], [3, 30], [4, 40], [5, 50]]) }
723
+ specify do
724
+ expect(subject.limit(5).pluck(:_id, :age)).to eq([['1', 10], ['2', 20], ['3', 30], ['4', 40], ['5', 50]])
725
+ end
726
+ specify do
727
+ expect(subject.limit(5).source(:name).pluck(:id, :age)).to eq([[1, 10], [2, 20], [3, 30], [4, 40], [5, 50]])
728
+ end
581
729
  specify do
582
730
  expect(subject.limit(5).pluck(:_index, :name)).to eq([
583
731
  %w[products Name1],