chewy 0.10.1 → 5.0.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 (73) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +25 -25
  3. data/.travis.yml +21 -29
  4. data/Appraisals +27 -9
  5. data/CHANGELOG.md +36 -0
  6. data/Gemfile +3 -1
  7. data/README.md +73 -23
  8. data/chewy.gemspec +6 -8
  9. data/gemfiles/rails.4.0.activerecord.gemfile +1 -0
  10. data/gemfiles/rails.4.1.activerecord.gemfile +1 -0
  11. data/gemfiles/rails.4.2.activerecord.gemfile +1 -0
  12. data/gemfiles/{rails.4.2.mongoid.5.1.gemfile → rails.4.2.mongoid.5.2.gemfile} +2 -1
  13. data/gemfiles/rails.5.0.activerecord.gemfile +2 -1
  14. data/gemfiles/{rails.5.0.mongoid.6.0.gemfile → rails.5.0.mongoid.6.1.gemfile} +3 -2
  15. data/gemfiles/rails.5.1.activerecord.gemfile +2 -1
  16. data/gemfiles/{rails.5.1.mongoid.6.1.gemfile → rails.5.1.mongoid.6.3.gemfile} +3 -2
  17. data/gemfiles/rails.5.2.activerecord.gemfile +16 -0
  18. data/gemfiles/sequel.4.45.gemfile +2 -2
  19. data/lib/chewy.rb +1 -0
  20. data/lib/chewy/config.rb +8 -19
  21. data/lib/chewy/fields/base.rb +15 -3
  22. data/lib/chewy/fields/root.rb +13 -9
  23. data/lib/chewy/index.rb +1 -1
  24. data/lib/chewy/index/actions.rb +14 -12
  25. data/lib/chewy/index/settings.rb +2 -0
  26. data/lib/chewy/index/specification.rb +12 -10
  27. data/lib/chewy/minitest/helpers.rb +6 -6
  28. data/lib/chewy/minitest/search_index_receiver.rb +17 -17
  29. data/lib/chewy/query.rb +135 -96
  30. data/lib/chewy/query/filters.rb +20 -3
  31. data/lib/chewy/query/loading.rb +0 -1
  32. data/lib/chewy/railtie.rb +2 -4
  33. data/lib/chewy/rake_helper.rb +5 -5
  34. data/lib/chewy/rspec/update_index.rb +3 -5
  35. data/lib/chewy/search.rb +2 -2
  36. data/lib/chewy/search/parameters/concerns/query_storage.rb +4 -3
  37. data/lib/chewy/stash.rb +30 -21
  38. data/lib/chewy/strategy/atomic.rb +1 -1
  39. data/lib/chewy/type.rb +2 -2
  40. data/lib/chewy/type/adapter/base.rb +9 -9
  41. data/lib/chewy/type/adapter/mongoid.rb +1 -3
  42. data/lib/chewy/type/adapter/sequel.rb +4 -6
  43. data/lib/chewy/type/crutch.rb +1 -1
  44. data/lib/chewy/type/import.rb +3 -2
  45. data/lib/chewy/type/import/bulk_builder.rb +1 -1
  46. data/lib/chewy/type/import/journal_builder.rb +3 -3
  47. data/lib/chewy/type/import/routine.rb +2 -2
  48. data/lib/chewy/type/mapping.rb +40 -34
  49. data/lib/chewy/type/observe.rb +13 -9
  50. data/lib/chewy/type/syncer.rb +2 -2
  51. data/lib/chewy/type/witchcraft.rb +2 -2
  52. data/lib/chewy/type/wrapper.rb +2 -2
  53. data/lib/chewy/version.rb +1 -1
  54. data/lib/sequel/plugins/chewy_observe.rb +4 -19
  55. data/spec/chewy/config_spec.rb +16 -0
  56. data/spec/chewy/fields/base_spec.rb +61 -65
  57. data/spec/chewy/fields/root_spec.rb +13 -13
  58. data/spec/chewy/index/actions_spec.rb +37 -5
  59. data/spec/chewy/index/specification_spec.rb +25 -16
  60. data/spec/chewy/index_spec.rb +61 -8
  61. data/spec/chewy/journal_spec.rb +11 -11
  62. data/spec/chewy/query/filters_spec.rb +1 -1
  63. data/spec/chewy/query/nodes/not_spec.rb +1 -0
  64. data/spec/chewy/query_spec.rb +3 -2
  65. data/spec/chewy/rake_helper_spec.rb +46 -33
  66. data/spec/chewy/search_spec.rb +20 -10
  67. data/spec/chewy/stash_spec.rb +1 -1
  68. data/spec/chewy/strategy/shoryuken_spec.rb +2 -0
  69. data/spec/chewy/type/import/journal_builder_spec.rb +8 -8
  70. data/spec/chewy/type/import_spec.rb +6 -0
  71. data/spec/chewy/type/mapping_spec.rb +48 -17
  72. data/spec/spec_helper.rb +8 -0
  73. metadata +26 -25
@@ -24,18 +24,20 @@ module Chewy
24
24
  # You can use logic operations <tt>&</tt> and <tt>|</tt> to concat
25
25
  # expressions.
26
26
  #
27
+ # @example
27
28
  # UsersIndex.filter{ (article.title =~ /Honey/) & (age < 42) & !rate }
28
29
  #
29
30
  #
30
31
  class Filters
31
32
  def initialize(outer = nil, &block)
32
33
  @block = block
33
- @outer = outer || eval('self', block.binding)
34
+ @outer = outer || eval('self', block.binding, __FILE__, __LINE__)
34
35
  end
35
36
 
36
37
  # Outer scope call
37
38
  # Block evaluates in the external context
38
39
  #
40
+ # @example
39
41
  # def name
40
42
  # 'Friend'
41
43
  # end
@@ -50,12 +52,14 @@ module Chewy
50
52
  # Used if method_missing is not working by some reason.
51
53
  # Additional expression options might be passed as second argument hash.
52
54
  #
55
+ # @example
53
56
  # UsersIndex.filter{ f(:name) == 'Name' } == UsersIndex.filter{ name == 'Name' } # => true
54
57
  # UsersIndex.filter{ f(:name, execution: :bool) == ['Name1', 'Name2'] } ==
55
58
  # UsersIndex.filter{ name(execution: :bool) == ['Name1', 'Name2'] } # => true
56
59
  #
57
60
  # Supports block for getting field name from the outer scope
58
61
  #
62
+ # @example
59
63
  # def field
60
64
  # :name
61
65
  # end
@@ -70,11 +74,13 @@ module Chewy
70
74
  # Returns script filter
71
75
  # Just script filter. Supports additional params.
72
76
  #
77
+ # @example
73
78
  # UsersIndex.filter{ s('doc["num1"].value > 1') }
74
79
  # UsersIndex.filter{ s('doc["num1"].value > param1', param1: 42) }
75
80
  #
76
81
  # Supports block for getting script from the outer scope
77
82
  #
83
+ # @example
78
84
  # def script
79
85
  # 'doc["num1"].value > param1 || 1'
80
86
  # end
@@ -90,10 +96,12 @@ module Chewy
90
96
 
91
97
  # Returns query filter
92
98
  #
99
+ # @example
93
100
  # UsersIndex.filter{ q(query_string: {query: 'name: hello'}) }
94
101
  #
95
102
  # Supports block for getting query from the outer scope
96
103
  #
104
+ # @example
97
105
  # def query
98
106
  # {query_string: {query: 'name: hello'}}
99
107
  # end
@@ -107,11 +115,13 @@ module Chewy
107
115
  # Returns raw expression
108
116
  # Same as filter with arguments instead of block, but can participate in expressions
109
117
  #
118
+ # @example
110
119
  # UsersIndex.filter{ r(term: {name: 'Name'}) }
111
120
  # UsersIndex.filter{ r(term: {name: 'Name'}) & (age < 42) }
112
121
  #
113
122
  # Supports block for getting raw filter from the outer scope
114
123
  #
124
+ # @example
115
125
  # def filter
116
126
  # {term: {name: 'Name'}}
117
127
  # end
@@ -126,6 +136,7 @@ module Chewy
126
136
  # Bool filter chainable methods
127
137
  # Used to create bool query. Nodes are passed as arguments.
128
138
  #
139
+ # @example
129
140
  # UsersIndex.filter{ must(age < 42, name == 'Name') }
130
141
  # UsersIndex.filter{ should(age < 42, name == 'Name') }
131
142
  # UsersIndex.filter{ must(age < 42).should(name == 'Name1', name == 'Name2') }
@@ -141,12 +152,14 @@ module Chewy
141
152
  # Chainable interface acts the same as main query interface. You can pass plain
142
153
  # filters or plain queries or filter with DSL block.
143
154
  #
155
+ # @example
144
156
  # UsersIndex.filter{ has_child('user').filter(term: {role: 'Admin'}) }
145
157
  # UsersIndex.filter{ has_child('user').filter{ role == 'Admin' } }
146
158
  # UsersIndex.filter{ has_child('user').query(match: {name: 'borogoves'}) }
147
159
  #
148
160
  # Filters and queries might be combined and filter_mode and query_mode are configurable:
149
161
  #
162
+ # @example
150
163
  # UsersIndex.filter do
151
164
  # has_child('user')
152
165
  # .filter{ name: 'Peter' }
@@ -155,7 +168,7 @@ module Chewy
155
168
  # .filter_mode(:or)
156
169
  # end
157
170
  #
158
- def has_child(type) # rubocop:disable Style/PredicateName
171
+ def has_child(type) # rubocop:disable Naming/PredicateName
159
172
  Nodes::HasChild.new(type, @outer)
160
173
  end
161
174
 
@@ -163,12 +176,14 @@ module Chewy
163
176
  # Chainable interface acts the same as main query interface. You can pass plain
164
177
  # filters or plain queries or filter with DSL block.
165
178
  #
179
+ # @example
166
180
  # UsersIndex.filter{ has_parent('user').filter(term: {role: 'Admin'}) }
167
181
  # UsersIndex.filter{ has_parent('user').filter{ role == 'Admin' } }
168
182
  # UsersIndex.filter{ has_parent('user').query(match: {name: 'borogoves'}) }
169
183
  #
170
184
  # Filters and queries might be combined and filter_mode and query_mode are configurable:
171
185
  #
186
+ # @example
172
187
  # UsersIndex.filter do
173
188
  # has_parent('user')
174
189
  # .filter{ name: 'Peter' }
@@ -177,7 +192,7 @@ module Chewy
177
192
  # .filter_mode(:or)
178
193
  # end
179
194
  #
180
- def has_parent(type) # rubocop:disable Style/PredicateName
195
+ def has_parent(type) # rubocop:disable Naming/PredicateName
181
196
  Nodes::HasParent.new(type, @outer)
182
197
  end
183
198
 
@@ -190,6 +205,7 @@ module Chewy
190
205
  # Creates field or exists node
191
206
  # Additional options for further expression might be passed as hash
192
207
  #
208
+ # @example
193
209
  # UsersIndex.filter{ name == 'Name' } == UsersIndex.filter(term: {name: 'Name'}) # => true
194
210
  # UsersIndex.filter{ name? } == UsersIndex.filter(exists: {term: 'name'}) # => true
195
211
  # UsersIndex.filter{ name(execution: :bool) == ['Name1', 'Name2'] } ==
@@ -197,6 +213,7 @@ module Chewy
197
213
  #
198
214
  # Also field names might be chained to use dot-notation for ES field names
199
215
  #
216
+ # @example
200
217
  # UsersIndex.filter{ article.title =~ 'Hello' }
201
218
  # UsersIndex.filter{ article.tags? }
202
219
  #
@@ -94,7 +94,6 @@ module Chewy
94
94
  loaded_objects = Hash[_results.group_by(&:class).map do |type, objects|
95
95
  next if except.include?(type.type_name)
96
96
  next if only.present? && !only.include?(type.type_name)
97
-
98
97
  loaded = type.adapter.load(objects.map(&:id), options.merge(_type: type)) || objects
99
98
  [type, loaded.index_by.with_index do |loaded_object, i|
100
99
  objects[i]._object = loaded_object
@@ -14,7 +14,7 @@ module Chewy
14
14
  if Rails.application.config.respond_to?(:assets) && env['PATH_INFO'].start_with?(Rails.application.config.assets.prefix)
15
15
  @app.call(env)
16
16
  else
17
- Chewy.logger.info("Chewy request strategy is `#{Chewy.request_strategy}`") if @request_strategy != Chewy.request_strategy
17
+ Chewy.logger.info("Chewy request strategy is `#{Chewy.request_strategy}`") if Chewy.logger && @request_strategy != Chewy.request_strategy
18
18
  @request_strategy = Chewy.request_strategy
19
19
  Chewy.strategy(Chewy.request_strategy) { @app.call(env) }
20
20
  end
@@ -43,14 +43,12 @@ module Chewy
43
43
  end
44
44
 
45
45
  console do |app|
46
- Chewy.logger = ActiveRecord::Base.logger if defined?(ActiveRecord)
47
-
48
46
  if app.sandbox?
49
47
  Chewy.strategy(:bypass)
50
48
  else
51
49
  Chewy.strategy(:urgent)
52
50
  end
53
- Chewy.logger.info("Chewy console strategy is `#{Chewy.strategy.current.name}`")
51
+ puts "Chewy console strategy is `#{Chewy.strategy.current.name}`"
54
52
  end
55
53
 
56
54
  initializer 'chewy.logger', after: 'active_record.logger' do
@@ -1,9 +1,9 @@
1
1
  module Chewy
2
2
  module RakeHelper
3
- IMPORT_CALLBACK = lambda do |output, _name, start, finish, _id, payload| # rubocop:disable Metrics/ParameterLists
3
+ IMPORT_CALLBACK = lambda do |output, _name, start, finish, _id, payload|
4
4
  duration = (finish - start).ceil
5
5
  stats = payload.fetch(:import, {}).map { |key, count| "#{key} #{count}" }.join(', ')
6
- output.puts " Imported #{payload[:type]} for #{human_duration(duration)}, stats: #{stats}"
6
+ output.puts " Imported #{payload[:type]} in #{human_duration(duration)}, stats: #{stats}"
7
7
  if payload[:errors]
8
8
  payload[:errors].each do |action, errors|
9
9
  output.puts " #{action.to_s.humanize} errors:"
@@ -15,7 +15,7 @@ module Chewy
15
15
  end
16
16
  end
17
17
 
18
- JOURNAL_CALLBACK = lambda do |output, _, _, _, _, payload| # rubocop:disable Metrics/ParameterLists
18
+ JOURNAL_CALLBACK = lambda do |output, _, _, _, _, payload|
19
19
  count = payload[:groups].values.map(&:size).sum
20
20
  targets = payload[:groups].keys.sort_by(&:derivable_name)
21
21
  output.puts " Applying journal to #{targets}, #{count} entries, stage #{payload[:stage]}"
@@ -196,12 +196,12 @@ module Chewy
196
196
  end
197
197
 
198
198
  # Eager loads and returns all the indexes defined in the application
199
- # except the Chewy::Stash.
199
+ # except Chewy::Stash::Specification and Chewy::Stash::Journal.
200
200
  #
201
201
  # @return [Array<Chewy::Index>] indexes found
202
202
  def all_indexes
203
203
  Chewy.eager_load!
204
- Chewy::Index.descendants - [Chewy::Stash]
204
+ Chewy::Index.descendants - [Chewy::Stash::Journal, Chewy::Stash::Specification]
205
205
  end
206
206
 
207
207
  def normalize_indexes(*identifiers)
@@ -83,9 +83,7 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
83
83
  # .to update_index(UsersIndex.user).and_reindex(user1).only }
84
84
  #
85
85
  chain(:only) do |*_args|
86
- if @reindex.blank? && @delete.blank?
87
- raise 'Use `only` in conjunction with `and_reindex` or `and_delete`'
88
- end
86
+ raise 'Use `only` in conjunction with `and_reindex` or `and_delete`' if @reindex.blank? && @delete.blank?
89
87
 
90
88
  @only = true
91
89
  end
@@ -128,13 +126,13 @@ RSpec::Matchers.define :update_index do |type_name, options = {}| # rubocop:disa
128
126
  end
129
127
  end
130
128
 
131
- @reindex.each do |_, document|
129
+ @reindex.each_value do |document|
132
130
  document[:match_count] = (!document[:expected_count] && document[:real_count] > 0) ||
133
131
  (document[:expected_count] && document[:expected_count] == document[:real_count])
134
132
  document[:match_attributes] = document[:expected_attributes].blank? ||
135
133
  compare_attributes(document[:expected_attributes], document[:real_attributes])
136
134
  end
137
- @delete.each do |_, document|
135
+ @delete.each_value do |document|
138
136
  document[:match_count] = (!document[:expected_count] && document[:real_count] > 0) ||
139
137
  (document[:expected_count] && document[:expected_count] == document[:real_count])
140
138
  end
@@ -91,12 +91,12 @@ module Chewy
91
91
 
92
92
  def build_search_class(base)
93
93
  search_class = Class.new(base)
94
+
94
95
  if self < Chewy::Type
95
96
  index_scopes = index.scopes - scopes
96
-
97
97
  delegate_scoped index, search_class, index_scopes
98
- delegate_scoped index, self, index_scopes
99
98
  end
99
+
100
100
  delegate_scoped self, search_class, scopes
101
101
  const_set('Query', search_class)
102
102
  end
@@ -20,16 +20,17 @@ module Chewy
20
20
  # rendering logic.
21
21
  #
22
22
  # @!attribute must
23
- # @return [Array<Hash>]
23
+ # @return [Array<Hash>, Hash, nil]
24
24
  # @!attribute should
25
- # @return [Array<Hash>]
25
+ # @return [Array<Hash>, Hash, nil]
26
26
  # @!attribute must_not
27
- # @return [Array<Hash>]
27
+ # @return [[Array<Hash>, Hash, nil]
28
28
  # @!attribute minimum_should_match
29
29
  # @return [String, Integer, nil]
30
30
  class Bool
31
31
  # Acceptable bool query keys
32
32
  KEYS = %i[must should must_not minimum_should_match].freeze
33
+ # @!ignorewarning
33
34
  attr_reader(*KEYS)
34
35
 
35
36
  # @param must [Array<Hash>, Hash, nil]
@@ -1,26 +1,23 @@
1
1
  module Chewy
2
2
  # This class is the main storage for Chewy service data,
3
- # Now index raw specifications are stored in the `chewy_stash`
4
- # index. In the future the journal will be moved here as well.
3
+ # Now index raw specifications are stored in the `chewy_specifications`
4
+ # index.
5
+ # Journal entries are stored in `chewy_journal`
5
6
  #
6
7
  # @see Chewy::Index::Specification
7
- class Stash < Chewy::Index
8
- index_name 'chewy_stash'
8
+ module Stash
9
+ class Specification < Chewy::Index
10
+ index_name 'chewy_specifications'
9
11
 
10
- define_type :specification do
11
- default_import_options journal: false
12
+ define_type :specification do
13
+ default_import_options journal: false
12
14
 
13
- field :value, index: 'no'
15
+ field :specification, type: 'binary'
16
+ end
14
17
  end
15
18
 
16
- define_type :journal do # rubocop:disable Metrics/BlockLength
17
- default_import_options journal: false
18
-
19
- field :index_name, type: 'string', index: 'not_analyzed'
20
- field :type_name, type: 'string', index: 'not_analyzed'
21
- field :action, type: 'string', index: 'not_analyzed'
22
- field :references, type: 'string', index: 'no'
23
- field :created_at, type: 'date'
19
+ class Journal < Chewy::Index
20
+ index_name 'chewy_journal'
24
21
 
25
22
  # Loads all entries since the specified time.
26
23
  #
@@ -52,18 +49,30 @@ module Chewy
52
49
  types.group_by(&:index).each do |index, index_types|
53
50
  scope = scope.or(
54
51
  filter(term: {index_name: index.derivable_name})
55
- .filter(terms: {type_name: index_types.map(&:type_name)})
52
+ .filter(terms: {type_name: index_types.map(&:type_name)})
56
53
  )
57
54
  end
58
55
  scope
59
56
  end
60
57
 
61
- def type
62
- @type ||= Chewy.derive_type("#{index_name}##{type_name}")
63
- end
58
+ define_type :journal do
59
+ default_import_options journal: false
60
+
61
+ field :index_name, type: 'keyword'
62
+ field :type_name, type: 'keyword'
63
+ field :action, type: 'keyword'
64
+ field :references, type: 'binary'
65
+ field :created_at, type: 'date'
64
66
 
65
- def references
66
- @references ||= Array.wrap(@attributes['references']).map { |r| JSON.load(r) } # rubocop:disable Security/JSONLoad
67
+ def type
68
+ @type ||= Chewy.derive_type("#{index_name}##{type_name}")
69
+ end
70
+
71
+ def references
72
+ @references ||= Array.wrap(@attributes['references']).map do |item|
73
+ JSON.load(Base64.decode64(item)) # rubocop:disable Security/JSONLoad
74
+ end
75
+ end
67
76
  end
68
77
  end
69
78
  end
@@ -18,7 +18,7 @@ module Chewy
18
18
 
19
19
  def update(type, objects, _options = {})
20
20
  @stash[type] ||= []
21
- @stash[type] |= type.send(:build_root).id ? Array.wrap(objects) : type.adapter.identify(objects)
21
+ @stash[type] |= type.root.id ? Array.wrap(objects) : type.adapter.identify(objects)
22
22
  end
23
23
 
24
24
  def leave
@@ -14,7 +14,7 @@ require 'chewy/type/witchcraft'
14
14
 
15
15
  module Chewy
16
16
  class Type
17
- IMPORT_OPTIONS_KEYS = %i[batch_size bulk_size refresh consistency replication raw_import journal].freeze
17
+ IMPORT_OPTIONS_KEYS = %i[batch_size bulk_size refresh consistency replication raw_import journal pipeline].freeze
18
18
 
19
19
  include Search
20
20
  include Mapping
@@ -34,7 +34,7 @@ module Chewy
34
34
  # Chewy index current type belongs to. Defined inside `Chewy.create_type`
35
35
  #
36
36
  def index
37
- raise NotImplementedError, 'Looks like this type ws defined outside the index scope and `.index` method is undefined for it'
37
+ raise NotImplementedError, 'Looks like this type was defined outside the index scope and `.index` method is undefined for it'
38
38
  end
39
39
 
40
40
  # Current type adapter. Defined inside `Chewy.create_type`, derived from
@@ -41,19 +41,19 @@ module Chewy
41
41
  #
42
42
  # { delete: [object_or_id1, object_or_id2], index: [object3, object4, object5] }
43
43
  #
44
- # @yield batch [Array<Object>] each batch of objects
44
+ # @yieldparam _batch [Array<Object>] each batch of objects
45
45
  # @return [true, false] returns true if all the block call returns true and false otherwise
46
- def import(*_args, &_block)
46
+ def import(_batch, &_block)
47
47
  raise NotImplementedError
48
48
  end
49
49
 
50
50
  # Unlike {#import} fetches only ids (references) to the imported objects,
51
51
  # using the same procedures as {#import}.
52
52
  #
53
- # @param fields [Array<Symbol>] additional fields to fetch
54
- # @param batch_size [Integer] batch size, defaults to 1000
55
- # @yield batch [Array<Object>] each batch of objects
56
- def import_fields(*_args, &_block)
53
+ # @param _fields [Array<Symbol>] additional fields to fetch
54
+ # @param _batch_size [Integer] batch size, defaults to 1000
55
+ # @yieldparam batch [Array<Object>] each batch of objects
56
+ def import_fields(_fields, _batch_size, &_block)
57
57
  raise NotImplementedError
58
58
  end
59
59
 
@@ -61,9 +61,9 @@ module Chewy
61
61
  # an array of references to the passed objects. Returns ids if possible.
62
62
  # Otherwise - and array of objects themselves.
63
63
  #
64
- # @param batch_size [Integer] batch size, defaults to 1000
65
- # @yield batch [Array<Object>] each batch of objects
66
- def import_references(*_args, &_block)
64
+ # @param _batch_size [Integer] batch size, defaults to 1000
65
+ # @yieldparam batch [Array<Object>] each batch of objects
66
+ def import_references(_batch_size, &_block)
67
67
  raise NotImplementedError
68
68
  end
69
69
 
@@ -17,9 +17,7 @@ module Chewy
17
17
  private
18
18
 
19
19
  def cleanup_default_scope!
20
- if Chewy.logger && @default_scope.options.values_at(:sort, :limit, :skip).compact.present?
21
- Chewy.logger.warn('Default type scope order, limit and offset are ignored and will be nullified')
22
- end
20
+ Chewy.logger.warn('Default type scope order, limit and offset are ignored and will be nullified') if Chewy.logger && @default_scope.options.values_at(:sort, :limit, :skip).compact.present?
23
21
 
24
22
  @default_scope.options.delete(:limit)
25
23
  @default_scope.options.delete(:skip)
@@ -16,9 +16,7 @@ module Chewy
16
16
  private
17
17
 
18
18
  def cleanup_default_scope!
19
- if Chewy.logger && @default_scope != @default_scope.unordered.unlimited
20
- Chewy.logger.warn('Default type scope order, limit and offset are ignored and will be nullified')
21
- end
19
+ Chewy.logger.warn('Default type scope order, limit and offset are ignored and will be nullified') if Chewy.logger && @default_scope != @default_scope.unordered.unlimited
22
20
 
23
21
  @default_scope = @default_scope.unordered.unlimited
24
22
  end
@@ -34,7 +32,7 @@ module Chewy
34
32
  end
35
33
 
36
34
  def full_column_name(column)
37
- "#{target.table_name}__#{column}".to_sym
35
+ ::Sequel.qualify(target.table_name, column)
38
36
  end
39
37
 
40
38
  def all_scope
@@ -55,7 +53,7 @@ module Chewy
55
53
  def pluck_in_batches(scope, fields: [], batch_size: nil, **options)
56
54
  return enum_for(:pluck_in_batches, scope, fields: fields, batch_size: batch_size, **options) unless block_given?
57
55
 
58
- scope = scope.unordered.order(::Sequel.asc(full_column_name(primary_key))).limit(batch_size)
56
+ scope = scope.unordered.order(full_column_name(primary_key).asc).limit(batch_size)
59
57
 
60
58
  ids = pluck(scope, fields: fields)
61
59
  count = 0
@@ -64,7 +62,7 @@ module Chewy
64
62
  yield ids
65
63
  break if ids.size < batch_size
66
64
  last_id = ids.last.is_a?(Array) ? ids.last.first : ids.last
67
- ids = pluck(scope.where { |o| o.__send__(full_column_name(primary_key)) > last_id }, fields: fields)
65
+ ids = pluck(scope.where { |_o| full_column_name(primary_key) > last_id }, fields: fields)
68
66
  end
69
67
 
70
68
  count