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
@@ -2,25 +2,25 @@ require 'i18n/core_ext/hash'
2
2
 
3
3
  # Rspec matcher `update_index`
4
4
  # To use it - add `require 'chewy/rspec'` to the `spec_helper.rb`
5
- # Simple usage - just pass type as argument.
5
+ # Simple usage - just pass index as argument.
6
6
  #
7
- # specify { expect { user.save! }.to update_index(UsersIndex::User) }
8
- # specify { expect { user.save! }.to update_index('users#user') }
9
- # specify { expect { user.save! }.not_to update_index('users#user') }
7
+ # specify { expect { user.save! }.to update_index(UsersIndex) }
8
+ # specify { expect { user.save! }.to update_index('users') }
9
+ # specify { expect { user.save! }.not_to update_index('users') }
10
10
  #
11
11
  # This example will pass as well because user1 was reindexed
12
12
  # and nothing was said about user2:
13
13
  #
14
14
  # specify { expect { [user1, user2].map(&:save!) }
15
- # .to update_index(UsersIndex.user).and_reindex(user1) }
15
+ # .to update_index(UsersIndex).and_reindex(user1) }
16
16
  #
17
17
  # If you need to specify reindexed records strictly - use `only` chain.
18
18
  # Combined matcher chain methods:
19
19
  #
20
20
  # specify { expect { user1.destroy!; user2.save! } }
21
- # .to update_index(UsersIndex::User).and_reindex(user2).and_delete(user1) }
21
+ # .to update_index(UsersIndex).and_reindex(user2).and_delete(user1) }
22
22
  #
23
- RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disable BlockLength
23
+ RSpec::Matchers.define :update_index do |index_name, options = {}| # rubocop:disable Metrics/BlockLength
24
24
  if !respond_to?(:failure_message) && respond_to?(:failure_message_for_should)
25
25
  alias_method :failure_message, :failure_message_for_should
26
26
  alias_method :failure_message_when_negated, :failure_message_for_should_not
@@ -28,30 +28,30 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
28
28
 
29
29
  # Specify indexed records by passing record itself or id.
30
30
  #
31
- # specify { expect { user.save! }.to update_index(UsersIndex::User).and_reindex(user)
32
- # specify { expect { user.save! }.to update_index(UsersIndex::User).and_reindex(42)
31
+ # specify { expect { user.save! }.to update_index(UsersIndex).and_reindex(user)
32
+ # specify { expect { user.save! }.to update_index(UsersIndex).and_reindex(42)
33
33
  # specify { expect { [user1, user2].map(&:save!) }
34
- # .to update_index(UsersIndex::User).and_reindex(user1, user2) }
34
+ # .to update_index(UsersIndex).and_reindex(user1, user2) }
35
35
  # specify { expect { [user1, user2].map(&:save!) }
36
- # .to update_index(UsersIndex::User).and_reindex(user1).and_reindex(user2) }
36
+ # .to update_index(UsersIndex).and_reindex(user1).and_reindex(user2) }
37
37
  #
38
38
  # Specify indexing count for every particular record. Useful in case
39
39
  # urgent index updates.
40
40
  #
41
41
  # specify { expect { 2.times { user.save! } }
42
- # .to update_index(UsersIndex::User).and_reindex(user, times: 2) }
42
+ # .to update_index(UsersIndex).and_reindex(user, times: 2) }
43
43
  #
44
44
  # Specify reindexed attributes. Note that arrays are
45
45
  # compared position-independently.
46
46
  #
47
47
  # specify { expect { user.update_attributes!(name: 'Duke') }
48
- # .to update_index(UsersIndex.user).and_reindex(user, with: {name: 'Duke'}) }
48
+ # .to update_index(UsersIndex).and_reindex(user, with: {name: 'Duke'}) }
49
49
  #
50
50
  # You can combine all the options and chain `and_reindex` method to
51
51
  # specify options for every indexed record:
52
52
  #
53
53
  # specify { expect { 2.times { [user1, user2].map { |u| u.update_attributes!(name: "Duke#{u.id}") } } }
54
- # .to update_index(UsersIndex.user)
54
+ # .to update_index(UsersIndex)
55
55
  # .and_reindex(user1, with: {name: 'Duke42'}) }
56
56
  # .and_reindex(user2, times: 1, with: {name: 'Duke43'}) }
57
57
  #
@@ -62,8 +62,8 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
62
62
 
63
63
  # Specify deleted records with record itself or id passed.
64
64
  #
65
- # specify { expect { user.destroy! }.to update_index(UsersIndex::User).and_delete(user) }
66
- # specify { expect { user.destroy! }.to update_index(UsersIndex::User).and_delete(user.id) }
65
+ # specify { expect { user.destroy! }.to update_index(UsersIndex).and_delete(user) }
66
+ # specify { expect { user.destroy! }.to update_index(UsersIndex).and_delete(user.id) }
67
67
  #
68
68
  chain(:and_delete) do |*args|
69
69
  @delete ||= {}
@@ -73,14 +73,14 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
73
73
  # Used for specifying than no other records would be indexed or deleted:
74
74
  #
75
75
  # specify { expect { [user1, user2].map(&:save!) }
76
- # .to update_index(UsersIndex.user).and_reindex(user1, user2).only }
76
+ # .to update_index(UsersIndex).and_reindex(user1, user2).only }
77
77
  # specify { expect { [user1, user2].map(&:destroy!) }
78
- # .to update_index(UsersIndex.user).and_delete(user1, user2).only }
78
+ # .to update_index(UsersIndex).and_delete(user1, user2).only }
79
79
  #
80
80
  # This example will fail:
81
81
  #
82
82
  # specify { expect { [user1, user2].map(&:save!) }
83
- # .to update_index(UsersIndex.user).and_reindex(user1).only }
83
+ # .to update_index(UsersIndex).and_reindex(user1).only }
84
84
  #
85
85
  chain(:only) do |*_args|
86
86
  raise 'Use `only` in conjunction with `and_reindex` or `and_delete`' if @reindex.blank? && @delete.blank?
@@ -92,19 +92,19 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
92
92
  true
93
93
  end
94
94
 
95
- match do |block| # rubocop:disable BlockLength
95
+ match do |block| # rubocop:disable Metrics/BlockLength
96
96
  @reindex ||= {}
97
97
  @delete ||= {}
98
98
  @missed_reindex = []
99
99
  @missed_delete = []
100
100
 
101
- type = Chewy.derive_type(type_name)
101
+ index = Chewy.derive_name(index_name)
102
102
  if defined?(Mocha) && RSpec.configuration.mock_framework.to_s == 'RSpec::Core::MockingAdapters::Mocha'
103
- Chewy::Type::Import::BulkRequest.stubs(:new).with(type, any_parameters).returns(mock_bulk_request)
103
+ Chewy::Index::Import::BulkRequest.stubs(:new).with(index, any_parameters).returns(mock_bulk_request)
104
104
  else
105
- mocked_already = ::RSpec::Mocks.space.proxy_for(Chewy::Type::Import::BulkRequest).method_double_if_exists_for_message(:new)
106
- allow(Chewy::Type::Import::BulkRequest).to receive(:new).and_call_original unless mocked_already
107
- allow(Chewy::Type::Import::BulkRequest).to receive(:new).with(type, any_args).and_return(mock_bulk_request)
105
+ mocked_already = ::RSpec::Mocks.space.proxy_for(Chewy::Index::Import::BulkRequest).method_double_if_exists_for_message(:new)
106
+ allow(Chewy::Index::Import::BulkRequest).to receive(:new).and_call_original unless mocked_already
107
+ allow(Chewy::Index::Import::BulkRequest).to receive(:new).with(index, any_args).and_return(mock_bulk_request)
108
108
  end
109
109
 
110
110
  Chewy.strategy(options[:strategy] || :atomic) { block.call }
@@ -127,13 +127,13 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
127
127
  end
128
128
 
129
129
  @reindex.each_value do |document|
130
- document[:match_count] = (!document[:expected_count] && document[:real_count] > 0) ||
130
+ document[:match_count] = (!document[:expected_count] && (document[:real_count]).positive?) ||
131
131
  (document[:expected_count] && document[:expected_count] == document[:real_count])
132
132
  document[:match_attributes] = document[:expected_attributes].blank? ||
133
133
  compare_attributes(document[:expected_attributes], document[:real_attributes])
134
134
  end
135
135
  @delete.each_value do |document|
136
- document[:match_count] = (!document[:expected_count] && document[:real_count] > 0) ||
136
+ document[:match_count] = (!document[:expected_count] && (document[:real_count]).positive?) ||
137
137
  (document[:expected_count] && document[:expected_count] == document[:real_count])
138
138
  end
139
139
 
@@ -142,13 +142,13 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
142
142
  @delete.all? { |_, document| document[:match_count] }
143
143
  end
144
144
 
145
- failure_message do # rubocop:disable BlockLength
145
+ failure_message do # rubocop:disable Metrics/BlockLength
146
146
  output = ''
147
147
 
148
148
  if mock_bulk_request.updates.none?
149
- output << "Expected index `#{type_name}` to be updated, but it was not\n"
149
+ output << "Expected index `#{index_name}` to be updated, but it was not\n"
150
150
  elsif @missed_reindex.present? || @missed_delete.present?
151
- message = "Expected index `#{type_name}` "
151
+ message = "Expected index `#{index_name}` "
152
152
  message << [
153
153
  ("to update documents #{@reindex.keys}" if @reindex.present?),
154
154
  ("to delete documents #{@delete.keys}" if @delete.present?)
@@ -166,9 +166,13 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
166
166
  output << @reindex.each.with_object('') do |(id, document), result|
167
167
  unless document[:match_count] && document[:match_attributes]
168
168
  result << "Expected document with id `#{id}` to be reindexed"
169
- if document[:real_count] > 0
170
- result << "\n #{document[:expected_count]} times, but was reindexed #{document[:real_count]} times" if document[:expected_count] && !document[:match_count]
171
- result << "\n with #{document[:expected_attributes]}, but it was reindexed with #{document[:real_attributes]}" if document[:expected_attributes].present? && !document[:match_attributes]
169
+ if (document[:real_count]).positive?
170
+ if document[:expected_count] && !document[:match_count]
171
+ result << "\n #{document[:expected_count]} times, but was reindexed #{document[:real_count]} times"
172
+ end
173
+ if document[:expected_attributes].present? && !document[:match_attributes]
174
+ result << "\n with #{document[:expected_attributes]}, but it was reindexed with #{document[:real_attributes]}"
175
+ end
172
176
  else
173
177
  result << ', but it was not'
174
178
  end
@@ -179,11 +183,11 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
179
183
  output << @delete.each.with_object('') do |(id, document), result|
180
184
  unless document[:match_count]
181
185
  result << "Expected document with id `#{id}` to be deleted"
182
- result << if document[:real_count] > 0 && document[:expected_count]
183
- "\n #{document[:expected_count]} times, but was deleted #{document[:real_count]} times"
184
- else
185
- ', but it was not'
186
- end
186
+ result << if (document[:real_count]).positive? && document[:expected_count]
187
+ "\n #{document[:expected_count]} times, but was deleted #{document[:real_count]} times"
188
+ else
189
+ ', but it was not'
190
+ end
187
191
  result << "\n"
188
192
  end
189
193
  end
@@ -193,9 +197,9 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
193
197
 
194
198
  failure_message_when_negated do
195
199
  if mock_bulk_request.updates.present?
196
- "Expected index `#{type_name}` not to be updated, but it was with #{mock_bulk_request.updates.map(&:values).flatten.group_by { |documents| documents[:_id] }.map do |id, documents|
197
- "\n document id `#{id}` (#{documents.count} times)"
198
- end.join}\n"
200
+ "Expected index `#{index_name}` not to be updated, but it was with #{mock_bulk_request.updates.map(&:values).flatten.group_by { |documents| documents[:_id] }.map do |id, documents|
201
+ "\n document id `#{id}` (#{documents.count} times)"
202
+ end.join}\n"
199
203
  end
200
204
  end
201
205
 
@@ -209,7 +213,7 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
209
213
  expected_count = options[:times] || options[:count]
210
214
  expected_attributes = (options[:with] || options[:attributes] || {}).deep_symbolize_keys
211
215
 
212
- Hash[args.flatten.map do |document|
216
+ args.flatten.map do |document|
213
217
  id = document.respond_to?(:id) ? document.id.to_s : document.to_s
214
218
  [id, {
215
219
  document: document,
@@ -218,7 +222,7 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
218
222
  real_count: 0,
219
223
  real_attributes: {}
220
224
  }]
221
- end]
225
+ end.to_h
222
226
  end
223
227
 
224
228
  def compare_attributes(expected, real)
data/lib/chewy/search.rb CHANGED
@@ -6,29 +6,22 @@ require 'chewy/search/response'
6
6
  require 'chewy/search/loader'
7
7
  require 'chewy/search/request'
8
8
  require 'chewy/search/pagination/kaminari'
9
- require 'chewy/search/pagination/will_paginate'
10
9
 
11
10
  module Chewy
12
11
  # This module being included to any provides an interface to the
13
- # request DSL. By default it is included to {Chewy::Index} and
14
- # {Chewy::Type}.
12
+ # request DSL. By default it is included to {Chewy::Index}.
15
13
  #
16
14
  # The class used as a request DSL provider is
17
15
  # inherited from {Chewy::Search::Request}
18
16
  #
19
- # Also, the search class is refined with one of the pagination-
20
- # providing modules: {Chewy::Search::Pagination::Kaminari} or
21
- # {Chewy::Search::Pagination::WillPaginate}.
17
+ # Also, the search class is refined with the pagination module {Chewy::Search::Pagination::Kaminari}.
22
18
  #
23
19
  # @example
24
20
  # PlacesIndex.query(match: {name: 'Moscow'})
25
- # PlacesIndex::City.query(match: {name: 'Moscow'})
26
21
  # @see Chewy::Index
27
- # @see Chewy::Type
28
22
  # @see Chewy::Search::Request
29
23
  # @see Chewy::Search::ClassMethods
30
24
  # @see Chewy::Search::Pagination::Kaminari
31
- # @see Chewy::Search::Pagination::WillPaginate
32
25
  module Search
33
26
  extend ActiveSupport::Concern
34
27
 
@@ -55,15 +48,14 @@ module Chewy
55
48
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
56
49
  # @return [Hash] the request result
57
50
  def search_string(query, options = {})
58
- options = options.merge(all.render.slice(:index, :type).merge(q: query))
51
+ options = options.merge(all.render.slice(:index).merge(q: query))
59
52
  Chewy.client.search(options)
60
53
  end
61
54
 
62
- # Delegates methods from the request class to the index or type class
55
+ # Delegates methods from the request class to the index class
63
56
  #
64
57
  # @example
65
58
  # PlacesIndex.query(match: {name: 'Moscow'})
66
- # PlacesIndex::City.query(match: {name: 'Moscow'})
67
59
  def method_missing(name, *args, &block)
68
60
  if search_class::DELEGATED_METHODS.include?(name)
69
61
  all.send(name, *args, &block)
@@ -85,11 +77,6 @@ module Chewy
85
77
  def build_search_class(base)
86
78
  search_class = Class.new(base)
87
79
 
88
- if self < Chewy::Type
89
- index_scopes = index.scopes - scopes
90
- delegate_scoped index, search_class, index_scopes
91
- end
92
-
93
80
  delegate_scoped self, search_class, scopes
94
81
  const_set('Query', search_class)
95
82
  end
@@ -3,32 +3,28 @@ module Chewy
3
3
  # This class is used for two different purposes: load ORM/ODM
4
4
  # source objects.
5
5
  #
6
- # @see Chewy::Type::Import
6
+ # @see Chewy::Index::Import
7
7
  # @see Chewy::Search::Request#load
8
8
  # @see Chewy::Search::Response#objects
9
9
  # @see Chewy::Search::Scrolling#scroll_objects
10
10
  class Loader
11
- # @param indexes [Array<Chewy::Index>] list of indexes to lookup types
11
+ # @param indexes [Array<Chewy::Index>] list of indexes to lookup
12
12
  # @param options [Hash] adapter-specific load options
13
- # @see Chewy::Type::Adapter::Base#load
13
+ # @see Chewy::Index::Adapter::Base#load
14
14
  def initialize(indexes: [], **options)
15
15
  @indexes = indexes
16
16
  @options = options
17
17
  end
18
18
 
19
- # Returns a {Chewy::Type} object for index name and type name passed. Caches
20
- # the result for each pair to make lookup faster.
21
- #
22
- # @param index [String] index name
23
- # @param type [String] type name
24
- # @return [Chewy::Type]
25
- # @raise [Chewy::UnderivableType] when index or hash were not found
26
- def derive_type(index, type)
27
- (@derive_type ||= {})[[index, type]] ||= begin
28
- index_class = derive_index(index)
29
- raise Chewy::UnderivableType, "Can not find index named `#{index}`" unless index_class
30
- index_class.type_hash.values.first
31
- end
19
+ def derive_index(index_name)
20
+ index = (@derive_index ||= {})[index_name] ||= indexes_hash[index_name] ||
21
+ indexes_hash[indexes_hash.keys.sort_by(&:length)
22
+ .reverse.detect do |name|
23
+ index_name.match(/#{name}(_.+|\z)/)
24
+ end]
25
+ raise Chewy::UndefinedIndex, "Can not find index named `#{index}`" unless index
26
+
27
+ index
32
28
  end
33
29
 
34
30
  # For each passed hit this method loads an ORM/ORD source object
@@ -37,17 +33,17 @@ module Chewy
37
33
  # will be returned at the corresponding position in array.
38
34
  #
39
35
  # Records/documents are loaded in an efficient manner, performing
40
- # a single query for each type present.
36
+ # a single query for each index present.
41
37
  #
42
38
  # @param hits [Array<Hash>] ES hits array
43
39
  # @return [Array<Object, nil>] the array of corresponding ORM/ODM objects
44
40
  def load(hits)
45
- hit_groups = hits.group_by { |hit| [hit['_index'], hit['_type']] }
46
- loaded_objects = hit_groups.each_with_object({}) do |((index_name, type_name), hit_group), result|
47
- type = derive_type(index_name, type_name)
41
+ hit_groups = hits.group_by { |hit| hit['_index'] }
42
+ loaded_objects = hit_groups.each_with_object({}) do |(index_name, hit_group), result|
43
+ index = derive_index(index_name)
48
44
  ids = hit_group.map { |hit| hit['_id'] }
49
- loaded = type.adapter.load(ids, **@options.merge(_type: type))
50
- loaded ||= hit_group.map { |hit| type.build(hit) }
45
+ loaded = index.adapter.load(ids, **@options.merge(_index: index.base_name))
46
+ loaded ||= hit_group.map { |hit| index.build(hit) }
51
47
 
52
48
  result.merge!(hit_group.zip(loaded).to_h)
53
49
  end
@@ -57,14 +53,6 @@ module Chewy
57
53
 
58
54
  private
59
55
 
60
- def derive_index(index_name)
61
- (@derive_index ||= {})[index_name] ||= indexes_hash[index_name] ||
62
- indexes_hash[indexes_hash.keys.sort_by(&:length)
63
- .reverse.detect do |name|
64
- index_name.match(/#{name}(_.+|\z)/)
65
- end]
66
- end
67
-
68
56
  def indexes_hash
69
57
  @indexes_hash ||= @indexes.index_by(&:index_name)
70
58
  end
@@ -1,5 +1,5 @@
1
- Dir.glob(File.join(File.dirname(__FILE__), 'parameters', 'concerns', '*.rb')) { |f| require f }
2
- Dir.glob(File.join(File.dirname(__FILE__), 'parameters', '*.rb')) { |f| require f }
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'parameters', 'concerns', '*.rb')).sort.each { |f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'parameters', '*.rb')).sort.each { |f| require f }
3
3
 
4
4
  module Chewy
5
5
  module Search
@@ -24,6 +24,7 @@ module Chewy
24
24
 
25
25
  # @return [{Symbol => Chewy::Search::Parameters::Storage}]
26
26
  attr_accessor :storages
27
+
27
28
  delegate :[], :[]=, to: :storages
28
29
 
29
30
  # Accepts an initial hash as basic values or parameter storages.
@@ -120,6 +121,7 @@ module Chewy
120
121
 
121
122
  def assert_storages(names)
122
123
  raise ArgumentError, 'No storage names were specified' if names.empty?
124
+
123
125
  names = names.map(&:to_sym)
124
126
  self.class.storages.values_at(*names)
125
127
  names
@@ -5,7 +5,7 @@ module Chewy
5
5
  class Parameters
6
6
  # This is a basic storage implementation for `query`, `filter`
7
7
  # and `post_filter` storages. It uses `bool` query as a root
8
- # structure for each of them. The `bool` root is ommited on
8
+ # structure for each of them. The `bool` root is omitted on
9
9
  # rendering if there is only a single query in the `must` or
10
10
  # `should` array. Besides the standard parameter storage
11
11
  # capabilities, it provides specialized methods for the `bool`
@@ -86,7 +86,7 @@ module Chewy
86
86
  def reduce
87
87
  value = to_h
88
88
  .reject { |_, v| v.blank? }
89
- .map { |k, v| [k, v.is_a?(Array) && v.one? ? v.first : v] }.to_h
89
+ .transform_values { |v| v.is_a?(Array) && v.one? ? v.first : v }
90
90
  value.delete(:minimum_should_match) if should.empty?
91
91
  value
92
92
  end
@@ -17,7 +17,11 @@ module Chewy
17
17
  # In case of hash, respective values are concatenated as well.
18
18
  #
19
19
  # @see Chewy::Search::Parameters::Storage#update!
20
- # @param other_value [true, false, {Symbol => Array<String, Symbol>, String, Symbol}, Array<String, Symbol>, String, Symbol] any acceptable storage value
20
+ # @param other_value
21
+ # [true, false, {
22
+ # Symbol => Array<String, Symbol>, String, Symbol},
23
+ # Array<String, Symbol>, String, Symbol
24
+ # ] any acceptable storage value
21
25
  # @return [{Symbol => Array<String>, true, false}] updated value
22
26
  def update!(other_value)
23
27
  new_value = normalize(other_value)
@@ -102,6 +102,7 @@ module Chewy
102
102
  %i[must should must_not].each do |method|
103
103
  define_method method do |query_hash = nil, &block|
104
104
  raise ArgumentError, "Please provide a parameter or a block to `#{method}`" unless query_hash || block
105
+
105
106
  @request.send(:modify, @parameter_name) { send(method, block || query_hash) }
106
107
  end
107
108
  end
@@ -237,8 +238,14 @@ module Chewy
237
238
  # @yield the block is processed by `elasticsearch-dsl` gem
238
239
  %i[and or not].each do |method|
239
240
  define_method method do |query_hash_or_scope = nil, &block|
240
- raise ArgumentError, "Please provide a parameter or a block to `#{method}`" unless query_hash_or_scope || block
241
- query_hash_or_scope = query_hash_or_scope.parameters[@parameter_name].value if !block && query_hash_or_scope.is_a?(Chewy::Search::Request)
241
+ unless query_hash_or_scope || block
242
+ raise ArgumentError,
243
+ "Please provide a parameter or a block to `#{method}`"
244
+ end
245
+
246
+ if !block && query_hash_or_scope.is_a?(Chewy::Search::Request)
247
+ query_hash_or_scope = query_hash_or_scope.parameters[@parameter_name].value
248
+ end
242
249
  @request.send(:modify, @parameter_name) { send(method, block || query_hash_or_scope) }
243
250
  end
244
251
  end
@@ -8,11 +8,11 @@ module Chewy
8
8
  # @see Chewy::Search
9
9
  # @example
10
10
  # scope = Chewy::Search::Request.new(PlacesIndex)
11
- # # => <Chewy::Search::Request {:index=>["places"], :type=>["city", "country"]}>
11
+ # # => <Chewy::Search::Request {:index=>["places"], :body=>{}}>
12
12
  # scope.limit(20)
13
- # # => <Chewy::Search::Request {:index=>["places"], :type=>["city", "country"], :body=>{:size=>20}}>
13
+ # # => <Chewy::Search::Request {:index=>["places"], :body=>{:size=>20}}>
14
14
  # scope.order(:name).offset(10)
15
- # # => <Chewy::Search::Request {:index=>["places"], :type=>["city", "country"], :body=>{:sort=>["name"], :from=>10}}>
15
+ # # => <Chewy::Search::Request {:index=>["places"], :body=>{:sort=>["name"], :from=>10}}>
16
16
  class Request
17
17
  include Enumerable
18
18
  include Scoping
@@ -45,40 +45,28 @@ module Chewy
45
45
  ].freeze
46
46
 
47
47
  delegate :hits, :wrappers, :objects, :records, :documents,
48
- :object_hash, :record_hash, :document_hash,
49
- :total, :max_score, :took, :timed_out?, to: :response
48
+ :object_hash, :record_hash, :document_hash,
49
+ :total, :max_score, :took, :timed_out?, to: :response
50
50
  delegate :each, :size, :to_a, :[], to: :wrappers
51
51
  alias_method :to_ary, :to_a
52
52
  alias_method :total_count, :total
53
53
  alias_method :total_entries, :total
54
54
 
55
- # The class is initialized with the list of chewy indexes and/or
56
- # types, which are later used to compose requests.
55
+ # The class is initialized with the list of chewy indexes,
56
+ # which are later used to compose requests.
57
57
  # Any symbol/string passed is treated as an index identifier.
58
58
  #
59
59
  # @example
60
60
  # Chewy::Search::Request.new(:places)
61
- # # => <Chewy::Search::Request {:index=>["places"]}>
61
+ # # => <Chewy::Search::Request {:index=>["places"], :body=>{}}>
62
62
  # Chewy::Search::Request.new(PlacesIndex)
63
- # # => <Chewy::Search::Request {:index=>["places"]}>
64
- # Chewy::Search::Request.new(PlacesIndex::City)
65
- # # => <Chewy::Search::Request {:index=>["places"]}>
66
- # Chewy::Search::Request.new(UsersIndex, PlacesIndex::City)
67
- # # => <Chewy::Search::Request {:index=>["users", "places"]}>
68
- # @param indexes_or_types [Array<Chewy::Index, Chewy::Type, String, Symbol>] indices and types in any combinations
69
- def initialize(*indices_or_types)
70
- indices = indices_or_types.reject do |klass|
71
- klass.is_a?(Class) && klass < Chewy::Type
72
- end
73
-
74
- types = indices_or_types.select do |klass|
75
- klass.is_a?(Class) && klass < Chewy::Type
76
- end
77
-
78
- indices += types.map(&:index)
79
-
63
+ # # => <Chewy::Search::Request {:index=>["places"], :body=>{}}>
64
+ # Chewy::Search::Request.new(UsersIndex, PlacesIndex)
65
+ # # => <Chewy::Search::Request {:index=>["users", "places"], :body=>{}}>
66
+ # @param indexes [Array<Chewy::Index, String, Symbol>] indexes
67
+ def initialize(*indexes)
80
68
  parameters.modify!(:indices) do
81
- replace!(indices: indices)
69
+ replace!(indices: indexes)
82
70
  end
83
71
  end
84
72
 
@@ -140,17 +128,17 @@ module Chewy
140
128
  "<#{self.class} #{render}>"
141
129
  end
142
130
 
143
- # @!group Chainable request modificators
131
+ # @!group Chainable request modifications
144
132
 
145
133
  # @!method query(query_hash=nil, &block)
146
- # Adds `quer` parameter to the search request body.
134
+ # Adds `query` parameter to the search request body.
147
135
  #
148
136
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-query.html
149
137
  # @see Chewy::Search::Parameters::Query
150
138
  # @return [Chewy::Search::Request, Chewy::Search::QueryProxy]
151
139
  #
152
140
  # @overload query(query_hash)
153
- # If pure hash is passed it goes straight to the `quer` parameter storage.
141
+ # If pure hash is passed it goes straight to the `query` parameter storage.
154
142
  # Acts exactly the same way as {Chewy::Search::QueryProxy#must}.
155
143
  #
156
144
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
@@ -169,7 +157,7 @@ module Chewy
169
157
  # @example
170
158
  # PlacesIndex.query { match name: 'Moscow' }
171
159
  # # => <PlacesIndex::Query {..., :body=>{:query=>{:match=>{:name=>"Moscow"}}}}>
172
- # @yield the block is processed by `elasticsearch-ds` gem
160
+ # @yield the block is processed by `elasticsearch-dsl` gem
173
161
  # @return [Chewy::Search::Request]
174
162
  #
175
163
  # @overload query
@@ -185,7 +173,7 @@ module Chewy
185
173
  # @return [Chewy::Search::QueryProxy]
186
174
  #
187
175
  # @!method filter(query_hash=nil, &block)
188
- # Adds `filte` context of the `quer` parameter at the
176
+ # Adds `filter` context of the `query` parameter at the
189
177
  # search request body.
190
178
  #
191
179
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
@@ -193,7 +181,7 @@ module Chewy
193
181
  # @return [Chewy::Search::Request, Chewy::Search::QueryProxy]
194
182
  #
195
183
  # @overload filter(query_hash)
196
- # If pure hash is passed it goes straight to the `filte` context of the `quer` parameter storage.
184
+ # If pure hash is passed it goes straight to the `filter` context of the `query` parameter storage.
197
185
  # Acts exactly the same way as {Chewy::Search::QueryProxy#must}.
198
186
  #
199
187
  # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
@@ -214,7 +202,7 @@ module Chewy
214
202
  # PlacesIndex.filter { match name: 'Moscow' }
215
203
  # # => <PlacesIndex::Query {..., :body=>{:query=>{:bool=>{
216
204
  # # :filter=>{:match=>{:name=>"Moscow"}}}}}}>
217
- # @yield the block is processed by `elasticsearch-ds` gem
205
+ # @yield the block is processed by `elasticsearch-dsl` gem
218
206
  # @return [Chewy::Search::Request]
219
207
  #
220
208
  # @overload filter
@@ -232,7 +220,7 @@ module Chewy
232
220
  # @!method post_filter(query_hash=nil, &block)
233
221
  # Adds `post_filter` parameter to the search request body.
234
222
  #
235
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html
223
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#post-filter
236
224
  # @see Chewy::Search::Parameters::PostFilter
237
225
  # @return [Chewy::Search::Request, Chewy::Search::QueryProxy]
238
226
  #
@@ -256,7 +244,7 @@ module Chewy
256
244
  # @example
257
245
  # PlacesIndex.post_filter { match name: 'Moscow' }
258
246
  # # => <PlacesIndex::Query {..., :body=>{:post_filter=>{:match=>{:name=>"Moscow"}}}}>
259
- # @yield the block is processed by `elasticsearch-ds` gem
247
+ # @yield the block is processed by `elasticsearch-dsl` gem
260
248
  # @return [Chewy::Search::Request]
261
249
  #
262
250
  # @overload post_filter
@@ -287,7 +275,7 @@ module Chewy
287
275
  # PlacesIndex.order(:name, population: {order: :asc}).order(:coordinates)
288
276
  # # => <PlacesIndex::Query {..., :body=>{:sort=>["name", {"population"=>{:order=>:asc}}, "coordinates"]}}>
289
277
  # @see Chewy::Search::Parameters::Order
290
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html
278
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html
291
279
  # @param values [Array<Hash, String, Symbol>] sort fields and options
292
280
  # @return [Chewy::Search::Request]
293
281
  #
@@ -298,7 +286,7 @@ module Chewy
298
286
  # PlacesIndex.docvalue_fields(:name).docvalue_fields(:population, :coordinates)
299
287
  # # => <PlacesIndex::Query {..., :body=>{:docvalue_fields=>["name", "population", "coordinates"]}}>
300
288
  # @see Chewy::Search::Parameters::DocvalueFields
301
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-docvalue-fields.html
289
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#docvalue-fields
302
290
  # @param values [Array<String, Symbol>] field names
303
291
  # @return [Chewy::Search::Request]
304
292
  %i[order docvalue_fields].each do |name|
@@ -328,7 +316,7 @@ module Chewy
328
316
  # PlacesIndex.order(:name, population: {order: :asc}).reorder(:coordinates)
329
317
  # # => <PlacesIndex::Query {..., :body=>{:sort=>["coordinates"]}}>
330
318
  # @see Chewy::Search::Parameters::Order
331
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html
319
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html
332
320
  # @param values [Array<Hash, String, Symbol>] sort fields and options
333
321
  # @return [Chewy::Search::Request]
334
322
  def reorder(value, *values)
@@ -342,9 +330,9 @@ module Chewy
342
330
  # PlacesIndex.track_scores
343
331
  # # => <PlacesIndex::Query {..., :body=>{:track_scores=>true}}>
344
332
  # PlacesIndex.track_scores.track_scores(false)
345
- # # => <PlacesIndex::Query {:index=>["places"], :type=>["city", "country"]}>
333
+ # # => <PlacesIndex::Query {:index=>["places"]}>
346
334
  # @see Chewy::Search::Parameters::TrackScores
347
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-sort.html#_track_scores
335
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html#_track_scores
348
336
  # @param value [true, false]
349
337
  # @return [Chewy::Search::Request]
350
338
  #
@@ -355,9 +343,9 @@ module Chewy
355
343
  # PlacesIndex.explain
356
344
  # # => <PlacesIndex::Query {..., :body=>{:explain=>true}}>
357
345
  # PlacesIndex.explain.explain(false)
358
- # # => <PlacesIndex::Query {:index=>["places"], :type=>["city", "country"]}>
346
+ # # => <PlacesIndex::Query {:index=>["places"]}>
359
347
  # @see Chewy::Search::Parameters::Explain
360
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-explain.html
348
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html
361
349
  # @param value [true, false]
362
350
  # @return [Chewy::Search::Request]
363
351
  #
@@ -368,9 +356,9 @@ module Chewy
368
356
  # PlacesIndex.version
369
357
  # # => <PlacesIndex::Query {..., :body=>{:version=>true}}>
370
358
  # PlacesIndex.version.version(false)
371
- # # => <PlacesIndex::Query {:index=>["places"], :type=>["city", "country"]}>
359
+ # # => <PlacesIndex::Query {:index=>["places"]}>
372
360
  # @see Chewy::Search::Parameters::Version
373
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-version.html
361
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html
374
362
  # @param value [true, false]
375
363
  # @return [Chewy::Search::Request]
376
364
  #
@@ -381,9 +369,9 @@ module Chewy
381
369
  # PlacesIndex.profile
382
370
  # # => <PlacesIndex::Query {..., :body=>{:profile=>true}}>
383
371
  # PlacesIndex.profile.profile(false)
384
- # # => <PlacesIndex::Query {:index=>["places"], :type=>["city", "country"]}>
372
+ # # => <PlacesIndex::Query {:index=>["places"]}>
385
373
  # @see Chewy::Search::Parameters::Profile
386
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-profile.html
374
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-profile.html
387
375
  # @param value [true, false]
388
376
  # @return [Chewy::Search::Request]
389
377
  #
@@ -417,7 +405,7 @@ module Chewy
417
405
  # PlacesIndex.request_cache(false)
418
406
  # # => <PlacesIndex::Query {..., :body=>{:request_cache=>false}}>
419
407
  # @see Chewy::Search::Parameters::RequestCache
420
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/shard-request-cache.html#_enabling_and_disabling_caching_per_request
408
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-request-cache.html#_enabling_and_disabling_caching_per_request
421
409
  # @param value [true, false, nil]
422
410
  # @return [Chewy::Search::Request]
423
411
  #
@@ -428,7 +416,7 @@ module Chewy
428
416
  # PlacesIndex.search_type(:dfs_query_then_fetch)
429
417
  # # => <PlacesIndex::Query {..., :body=>{:search_type=>"dfs_query_then_fetch"}}>
430
418
  # @see Chewy::Search::Parameters::SearchType
431
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-search-type.html
419
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-type
432
420
  # @param value [String, Symbol]
433
421
  # @return [Chewy::Search::Request]
434
422
  #
@@ -439,7 +427,7 @@ module Chewy
439
427
  # PlacesIndex.preference(:_primary_first)
440
428
  # # => <PlacesIndex::Query {..., :body=>{:preference=>"_primary_first"}}>
441
429
  # @see Chewy::Search::Parameters::Preference
442
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-preference.html
430
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-preference
443
431
  # @param value [String, Symbol]
444
432
  # @return [Chewy::Search::Request]
445
433
  #
@@ -450,7 +438,7 @@ module Chewy
450
438
  # PlacesIndex.timeout('1m')
451
439
  # <PlacesIndex::Query {..., :body=>{:timeout=>"1m"}}>
452
440
  # @see Chewy::Search::Parameters::Timeout
453
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/common-options.html#time-units
441
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#time-units
454
442
  # @param value [String, Symbol]
455
443
  # @return [Chewy::Search::Request]
456
444
  #
@@ -461,7 +449,7 @@ module Chewy
461
449
  # PlacesIndex.limit(10)
462
450
  # <PlacesIndex::Query {..., :body=>{:size=>10}}>
463
451
  # @see Chewy::Search::Parameters::Limit
464
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-from-size.html
452
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
465
453
  # @param value [String, Integer]
466
454
  # @return [Chewy::Search::Request]
467
455
  #
@@ -472,7 +460,7 @@ module Chewy
472
460
  # PlacesIndex.offset(10)
473
461
  # <PlacesIndex::Query {..., :body=>{:from=>10}}>
474
462
  # @see Chewy::Search::Parameters::Offset
475
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-from-size.html
463
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
476
464
  # @param value [String, Integer]
477
465
  # @return [Chewy::Search::Request]
478
466
  #
@@ -483,7 +471,7 @@ module Chewy
483
471
  # PlacesIndex.terminate_after(10)
484
472
  # <PlacesIndex::Query {..., :body=>{:terminate_after=>10}}>
485
473
  # @see Chewy::Search::Parameters::Offset
486
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-body.html
474
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-your-data.html#quickly-check-for-matching-docs
487
475
  # @param value [String, Integer]
488
476
  # @return [Chewy::Search::Request]
489
477
  #
@@ -494,7 +482,7 @@ module Chewy
494
482
  # PlacesIndex.min_score(2)
495
483
  # <PlacesIndex::Query {..., :body=>{:min_score=>2.0}}>
496
484
  # @see Chewy::Search::Parameters::Offset
497
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-min-score.html
485
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html#search-api-min-score
498
486
  # @param value [String, Integer, Float]
499
487
  # @return [Chewy::Search::Request]
500
488
  %i[request_cache search_type preference timeout limit offset terminate_after min_score].each do |name|
@@ -506,7 +494,7 @@ module Chewy
506
494
  # @!method source(*values)
507
495
  # Updates `_source` request part. Accepts either an array
508
496
  # of field names/templates or a hash with `includes` and `excludes`
509
- # keys. Source also can be disabled entierly or enabled again.
497
+ # keys. Source also can be disabled entirely or enabled again.
510
498
  #
511
499
  # @example
512
500
  # PlacesIndex.source(:name).source(includes: [:popularity], excludes: :description)
@@ -514,13 +502,13 @@ module Chewy
514
502
  # PlacesIndex.source(false)
515
503
  # # => <PlacesIndex::Query {..., :body=>{:_source=>false}}>
516
504
  # @see Chewy::Search::Parameters::Source
517
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-source-filtering.html
505
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#source-filtering
518
506
  # @param values [true, false, {Symbol => Array<String, Symbol>, String, Symbol}, Array<String, Symbol>, String, Symbol]
519
507
  # @return [Chewy::Search::Request]
520
508
  #
521
509
  # @!method stored_fields(*values)
522
510
  # Updates `stored_fields` request part. Accepts an array of field
523
- # names. Can be entierly disabled and enabled back.
511
+ # names. Can be entirely disabled and enabled back.
524
512
  #
525
513
  # @example
526
514
  # PlacesIndex.stored_fields(:name).stored_fields(:description)
@@ -528,7 +516,7 @@ module Chewy
528
516
  # PlacesIndex.stored_fields(false)
529
517
  # # => <PlacesIndex::Query {..., :body=>{:stored_fields=>"_none_"}}>
530
518
  # @see Chewy::Search::Parameters::StoredFields
531
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-stored-fields.html
519
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#stored-fields
532
520
  # @param values [true, false, String, Symbol, Array<String, Symbol>]
533
521
  # @return [Chewy::Search::Request]
534
522
  %i[source stored_fields].each do |name|
@@ -544,7 +532,7 @@ module Chewy
544
532
  # PlacesIndex.search_after(42, 'Moscow').search_after('London')
545
533
  # # => <PlacesIndex::Query {..., :body=>{:search_after=>["London"]}}>
546
534
  # @see Chewy::Search::Parameters::SearchAfter
547
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-search-after.html
535
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after
548
536
  # @param value [Array, Object]
549
537
  # @return [Chewy::Search::Request]
550
538
  def search_after(value, *values)
@@ -552,9 +540,9 @@ module Chewy
552
540
  end
553
541
 
554
542
  # Stores ORM/ODM objects loading options. Options
555
- # might be define per-type or be global, depends on the adapter
543
+ # might be define per-index or be global, depends on the adapter
556
544
  # loading implementation. Also, there are 2 loading options to select
557
- # or exclude types from loading: `only` and `except` respectively.
545
+ # or exclude indexes from loading: `only` and `except` respectively.
558
546
  # Options are updated on further method calls.
559
547
  #
560
548
  # @example
@@ -579,7 +567,7 @@ module Chewy
579
567
  # # "field1"=>{:script=>{:lang=>"painless", :inline=>"some script here"}},
580
568
  # # "field2"=>{:script=>{:lang=>"painless", :inline=>"some script here"}}}}}>
581
569
  # @see Chewy::Search::Parameters::ScriptFields
582
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-script-fields.html
570
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html#script-fields
583
571
  # @param value [Hash]
584
572
  # @return [Chewy::Search::Request]
585
573
  #
@@ -591,7 +579,7 @@ module Chewy
591
579
  # PlacesIndex.indices_boost(index1: 1.2, index2: 1.3).indices_boost(index1: 1.5)
592
580
  # # => <PlacesIndex::Query {..., :body=>{:indices_boost=>[{"index2"=>1.3}, {"index1"=>1.5}]}}>
593
581
  # @see Chewy::Search::Parameters::IndicesBoost
594
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-index-boost.html
582
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multiple-indices.html#index-boost
595
583
  # @param value [{String, Symbol => String, Integer, Float}]
596
584
  # @return [Chewy::Search::Request]
597
585
  #
@@ -603,7 +591,7 @@ module Chewy
603
591
  # PlacesIndex.rescore(window_size: 100, query: {}).rescore(window_size: 200, query: {})
604
592
  # # => <PlacesIndex::Query {..., :body=>{:rescore=>[{:window_size=>100, :query=>{}}, {:window_size=>200, :query=>{}}]}}>
605
593
  # @see Chewy::Search::Parameters::Rescore
606
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-rescore.html
594
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#rescore
607
595
  # @param value [Hash, Array<Hash>]
608
596
  # @return [Chewy::Search::Request]
609
597
  #
@@ -619,7 +607,7 @@ module Chewy
619
607
  # # "fields"=>{:description=>{:type=>"plain"}},
620
608
  # # "pre_tags"=>["<em>"], "post_tags"=>["</em>"]}}}>
621
609
  # @see Chewy::Search::Parameters::Highlight
622
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-highlighting.html
610
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html
623
611
  # @param value [Hash]
624
612
  # @return [Chewy::Search::Request]
625
613
  %i[script_fields indices_boost rescore highlight].each do |name|
@@ -642,7 +630,7 @@ module Chewy
642
630
  # # "names"=>{:text=>"tring out Elasticsearch"},
643
631
  # # "descriptions"=>{:text=>"some other text"}}}}>
644
632
  # @see Chewy::Search::Parameters::Suggest
645
- # @see https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-suggesters.html
633
+ # @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
646
634
  # @param value [Hash]
647
635
  # @return [Chewy::Search::Request]
648
636
  #
@@ -728,7 +716,10 @@ module Chewy
728
716
  # scope1.and(scope2)
729
717
  # # => <PlacesIndex::Query {..., :body=>{:query=>{:bool=>{
730
718
  # # :must=>[{:match=>{:name=>"London"}}, {:match=>{:name=>"Washington"}}],
731
- # # :filter=>{:bool=>{:must=>[{:term=>{:name=>"Moscow"}}, {:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}]}}}}}}>
719
+ # # :filter=>{
720
+ # # :bool=>{:must=>[{:term=>{:name=>"Moscow"}}, {:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}]}
721
+ # # }
722
+ # # }}}}>
732
723
  # @param other [Chewy::Search::Request] scope to merge
733
724
  # @return [Chewy::Search::Request] new scope
734
725
  #
@@ -745,7 +736,10 @@ module Chewy
745
736
  # scope1.or(scope2)
746
737
  # # => <PlacesIndex::Query {..., :body=>{:query=>{:bool=>{
747
738
  # # :should=>[{:match=>{:name=>"London"}}, {:match=>{:name=>"Washington"}}],
748
- # # :filter=>{:bool=>{:should=>[{:term=>{:name=>"Moscow"}}, {:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}]}}}}}}>
739
+ # # :filter=>{
740
+ # # :bool=>{:should=>[{:term=>{:name=>"Moscow"}}, {:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}]}
741
+ # # }
742
+ # # }}}}>
749
743
  # @param other [Chewy::Search::Request] scope to merge
750
744
  # @return [Chewy::Search::Request] new scope
751
745
  #
@@ -762,7 +756,13 @@ module Chewy
762
756
  # scope1.not(scope2)
763
757
  # # => <PlacesIndex::Query {..., :body=>{:query=>{:bool=>{
764
758
  # # :must=>{:match=>{:name=>"London"}}, :must_not=>{:match=>{:name=>"Washington"}},
765
- # # :filter=>{:bool=>{:must=>{:term=>{:name=>"Moscow"}}, :must_not=>{:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}}}}}}}>
759
+ # # :filter=>{
760
+ # # :bool=>{
761
+ # # :must=>{:term=>{:name=>"Moscow"}},
762
+ # # :must_not=>{:bool=>{:must_not=>{:term=>{:name=>"Berlin"}}}}
763
+ # # }
764
+ # # }
765
+ # # }}}}>
766
766
  # @param other [Chewy::Search::Request] scope to merge
767
767
  # @return [Chewy::Search::Request] new scope
768
768
  %i[and or not].each do |name|
@@ -834,14 +834,14 @@ module Chewy
834
834
  # @overload first
835
835
  # If nothing is passed - it returns a single object.
836
836
  #
837
- # @return [Chewy::Type] result document
837
+ # @return [Chewy::Index] result document
838
838
  #
839
839
  # @overload first(limit)
840
840
  # If limit is provided - it returns the limit amount or less
841
841
  # of wrapper objects.
842
842
  #
843
843
  # @param limit [Integer] amount of requested results
844
- # @return [Array<Chewy::Type>] result document collection
844
+ # @return [Array<Chewy::Index>] result document collection
845
845
  def first(limit = UNDEFINED)
846
846
  request_limit = limit == UNDEFINED ? 1 : limit
847
847
 
@@ -860,7 +860,7 @@ module Chewy
860
860
  # If single id is passed - it returns a single object.
861
861
  #
862
862
  # @param id [Integer, String] id of the desired document
863
- # @return [Chewy::Type] result document
863
+ # @return [Chewy::Index] result document
864
864
  #
865
865
  # @overload find(*ids)
866
866
  # If several field are passed - it returns an array of wrappers.
@@ -868,7 +868,7 @@ module Chewy
868
868
  # batch size - uses scroll API to retrieve everything.
869
869
  #
870
870
  # @param ids [Array<Integer, String>] ids of the desired documents
871
- # @return [Array<Chewy::Type>] result documents
871
+ # @return [Array<Chewy::Index>] result documents
872
872
  def find(*ids)
873
873
  return super if block_given?
874
874
 
@@ -931,11 +931,10 @@ module Chewy
931
931
  # @return [Hash] the result of query execution
932
932
  def delete_all(refresh: true)
933
933
  request_body = only(WHERE_STORAGES).render.merge(refresh: refresh)
934
- ActiveSupport::Notifications.instrument 'delete_query.chewy',
935
- notification_payload(request: request_body) do
936
- request_body[:body] = {query: {match_all: {}}} if request_body[:body].empty?
937
- Chewy.client.delete_by_query(request_body)
938
- end
934
+ ActiveSupport::Notifications.instrument 'delete_query.chewy', notification_payload(request: request_body) do
935
+ request_body[:body] = {query: {match_all: {}}} if request_body[:body].empty?
936
+ Chewy.client.delete_by_query(request_body)
937
+ end
939
938
  end
940
939
 
941
940
  # Returns whether or not the query has been performed.
@@ -976,14 +975,11 @@ module Chewy
976
975
 
977
976
  def perform(additional = {})
978
977
  request_body = render.merge(additional)
979
- ActiveSupport::Notifications.instrument 'search_query.chewy',
980
- notification_payload(request: request_body) do
981
- begin
982
- Chewy.client.search(request_body)
983
- rescue Elasticsearch::Transport::Transport::Errors::NotFound
984
- {}
985
- end
986
- end
978
+ ActiveSupport::Notifications.instrument 'search_query.chewy', notification_payload(request: request_body) do
979
+ Chewy.client.search(request_body)
980
+ rescue Elasticsearch::Transport::Transport::Errors::NotFound
981
+ {}
982
+ end
987
983
  end
988
984
 
989
985
  def notification_payload(additional)