dynamoid 3.9.0 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -7
- data/README.md +20 -23
- data/dynamoid.gemspec +1 -2
- data/lib/dynamoid/adapter.rb +18 -12
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb +2 -2
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/filter_expression_convertor.rb +78 -0
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb +19 -1
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/projection_expression_convertor.rb +38 -0
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/query.rb +46 -61
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb +33 -27
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb +87 -62
- data/lib/dynamoid/associations/belongs_to.rb +6 -6
- data/lib/dynamoid/associations.rb +1 -1
- data/lib/dynamoid/config/options.rb +12 -12
- data/lib/dynamoid/config.rb +1 -0
- data/lib/dynamoid/criteria/chain.rb +95 -133
- data/lib/dynamoid/criteria/key_fields_detector.rb +6 -7
- data/lib/dynamoid/criteria/nonexistent_fields_detector.rb +2 -2
- data/lib/dynamoid/criteria/where_conditions.rb +29 -0
- data/lib/dynamoid/dirty.rb +1 -1
- data/lib/dynamoid/document.rb +1 -1
- data/lib/dynamoid/dumping.rb +2 -2
- data/lib/dynamoid/fields/declare.rb +6 -6
- data/lib/dynamoid/fields.rb +6 -8
- data/lib/dynamoid/finders.rb +17 -26
- data/lib/dynamoid/indexes.rb +6 -7
- data/lib/dynamoid/loadable.rb +2 -2
- data/lib/dynamoid/persistence/save.rb +12 -16
- data/lib/dynamoid/persistence/update_fields.rb +2 -2
- data/lib/dynamoid/persistence/update_validations.rb +1 -1
- data/lib/dynamoid/persistence.rb +39 -4
- data/lib/dynamoid/type_casting.rb +15 -14
- data/lib/dynamoid/undumping.rb +1 -1
- data/lib/dynamoid/version.rb +1 -1
- metadata +17 -16
- data/lib/dynamoid/criteria/ignored_conditions_detector.rb +0 -41
- data/lib/dynamoid/criteria/overwritten_conditions_detector.rb +0 -40
data/lib/dynamoid/indexes.rb
CHANGED
@@ -130,13 +130,13 @@ module Dynamoid
|
|
130
130
|
index_range_key = options[:range_key]
|
131
131
|
|
132
132
|
unless index_range_key.present?
|
133
|
-
raise Dynamoid::Errors::InvalidIndex, 'A local secondary index '\
|
134
|
-
|
133
|
+
raise Dynamoid::Errors::InvalidIndex, 'A local secondary index ' \
|
134
|
+
'requires a :range_key to be specified'
|
135
135
|
end
|
136
136
|
|
137
137
|
if primary_range_key.present? && index_range_key == primary_range_key
|
138
|
-
raise Dynamoid::Errors::InvalidIndex, 'A local secondary index'\
|
139
|
-
|
138
|
+
raise Dynamoid::Errors::InvalidIndex, 'A local secondary index ' \
|
139
|
+
'must use a different :range_key than the primary key'
|
140
140
|
end
|
141
141
|
|
142
142
|
index_opts = options.merge(
|
@@ -159,8 +159,7 @@ module Dynamoid
|
|
159
159
|
# @param range [scalar] the range key used to declare an index (optional)
|
160
160
|
# @return [Dynamoid::Indexes::Index, nil] index object or nil if it isn't found
|
161
161
|
def find_index(hash, range = nil)
|
162
|
-
|
163
|
-
index
|
162
|
+
indexes[index_key(hash, range)]
|
164
163
|
end
|
165
164
|
|
166
165
|
# Returns an index by its name
|
@@ -317,7 +316,7 @@ module Dynamoid
|
|
317
316
|
|
318
317
|
key_dynamodb_type = dynamodb_type(key_field_attributes[:type], key_field_attributes)
|
319
318
|
if PERMITTED_KEY_DYNAMODB_TYPES.include?(key_dynamodb_type)
|
320
|
-
send("#{key_param}_schema=", { key_val => key_dynamodb_type })
|
319
|
+
send(:"#{key_param}_schema=", { key_val => key_dynamodb_type })
|
321
320
|
else
|
322
321
|
errors.add(key_param, "Index :#{key_param} is not a valid key type")
|
323
322
|
end
|
data/lib/dynamoid/loadable.rb
CHANGED
@@ -6,7 +6,7 @@ module Dynamoid
|
|
6
6
|
|
7
7
|
def load(attrs)
|
8
8
|
attrs.each do |key, value|
|
9
|
-
send("#{key}=", value) if respond_to?("#{key}=")
|
9
|
+
send(:"#{key}=", value) if respond_to?(:"#{key}=")
|
10
10
|
end
|
11
11
|
|
12
12
|
self
|
@@ -27,7 +27,7 @@ module Dynamoid
|
|
27
27
|
|
28
28
|
self.attributes = self.class.find(hash_key, **options).attributes
|
29
29
|
|
30
|
-
@associations.
|
30
|
+
@associations.each_value(&:reset)
|
31
31
|
@new_record = false
|
32
32
|
|
33
33
|
self
|
@@ -68,13 +68,11 @@ module Dynamoid
|
|
68
68
|
end
|
69
69
|
|
70
70
|
# Add an optimistic locking check if the lock_version column exists
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
conditions[:if][:lock_version] = @model.changes[:lock_version][0]
|
77
|
-
end
|
71
|
+
# Uses the original lock_version value from Dirty API
|
72
|
+
# in case user changed 'lock_version' manually
|
73
|
+
if @model.class.attributes[:lock_version] && (@model.changes[:lock_version][0])
|
74
|
+
conditions[:if] ||= {}
|
75
|
+
conditions[:if][:lock_version] = @model.changes[:lock_version][0]
|
78
76
|
end
|
79
77
|
|
80
78
|
conditions
|
@@ -89,17 +87,15 @@ module Dynamoid
|
|
89
87
|
end
|
90
88
|
|
91
89
|
conditions = {}
|
92
|
-
conditions[:
|
93
|
-
conditions[:
|
90
|
+
conditions[:if] ||= {}
|
91
|
+
conditions[:if][@model.class.hash_key] = @model.hash_key
|
94
92
|
|
95
93
|
# Add an optimistic locking check if the lock_version column exists
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
conditions[:if][:lock_version] = @model.changes[:lock_version][0]
|
102
|
-
end
|
94
|
+
# Uses the original lock_version value from Dirty API
|
95
|
+
# in case user changed 'lock_version' manually
|
96
|
+
if @model.class.attributes[:lock_version] && (@model.changes[:lock_version][0])
|
97
|
+
conditions[:if] ||= {}
|
98
|
+
conditions[:if][:lock_version] = @model.changes[:lock_version][0]
|
103
99
|
end
|
104
100
|
|
105
101
|
options[:conditions] = conditions
|
@@ -54,8 +54,8 @@ module Dynamoid
|
|
54
54
|
end
|
55
55
|
|
56
56
|
conditions = @conditions.deep_dup
|
57
|
-
conditions[:
|
58
|
-
conditions[:
|
57
|
+
conditions[:if] ||= {}
|
58
|
+
conditions[:if][@model_class.hash_key] = @partition_key
|
59
59
|
options[:conditions] = conditions
|
60
60
|
|
61
61
|
options
|
@@ -7,7 +7,7 @@ module Dynamoid
|
|
7
7
|
def self.validate_attributes_exist(model_class, attributes)
|
8
8
|
model_attributes = model_class.attributes.keys
|
9
9
|
|
10
|
-
attributes.
|
10
|
+
attributes.each_key do |attr_name|
|
11
11
|
unless model_attributes.include?(attr_name)
|
12
12
|
raise Dynamoid::Errors::UnknownAttribute, "Attribute #{attr_name} does not exist in #{model_class}"
|
13
13
|
end
|
data/lib/dynamoid/persistence.rb
CHANGED
@@ -271,7 +271,7 @@ module Dynamoid
|
|
271
271
|
# meets the specified conditions. Conditions can be specified as a +Hash+
|
272
272
|
# with +:if+ key:
|
273
273
|
#
|
274
|
-
# User.update_fields('1', { age: 26 }, if: { version: 1 })
|
274
|
+
# User.update_fields('1', { age: 26 }, { if: { version: 1 } })
|
275
275
|
#
|
276
276
|
# Here +User+ model has an integer +version+ field and the document will
|
277
277
|
# be updated only if the +version+ attribute currently has value 1.
|
@@ -279,6 +279,13 @@ module Dynamoid
|
|
279
279
|
# If a document with specified hash and range keys doesn't exist or
|
280
280
|
# conditions were specified and failed the method call returns +nil+.
|
281
281
|
#
|
282
|
+
# To check if some attribute (or attributes) isn't stored in a DynamoDB
|
283
|
+
# item (e.g. it wasn't set explicitly) there is another condition -
|
284
|
+
# +unless_exists+:
|
285
|
+
#
|
286
|
+
# user = User.create(name: 'Tylor')
|
287
|
+
# User.update_fields(user.id, { age: 18 }, { unless_exists: [:age] })
|
288
|
+
#
|
282
289
|
# +update_fields+ uses the +UpdateItem+ operation so it saves changes and
|
283
290
|
# loads an updated document back with one HTTP request.
|
284
291
|
#
|
@@ -323,11 +330,18 @@ module Dynamoid
|
|
323
330
|
# meets the specified conditions. Conditions can be specified as a +Hash+
|
324
331
|
# with +:if+ key:
|
325
332
|
#
|
326
|
-
# User.upsert('1', { age: 26 }, if: { version: 1 })
|
333
|
+
# User.upsert('1', { age: 26 }, { if: { version: 1 } })
|
327
334
|
#
|
328
335
|
# Here +User+ model has an integer +version+ field and the document will
|
329
336
|
# be updated only if the +version+ attribute currently has value 1.
|
330
337
|
#
|
338
|
+
# To check if some attribute (or attributes) isn't stored in a DynamoDB
|
339
|
+
# item (e.g. it wasn't set explicitly) there is another condition -
|
340
|
+
# +unless_exists+:
|
341
|
+
#
|
342
|
+
# user = User.create(name: 'Tylor')
|
343
|
+
# User.upsert(user.id, { age: 18 }, { unless_exists: [:age] })
|
344
|
+
#
|
331
345
|
# If conditions were specified and failed the method call returns +nil+.
|
332
346
|
#
|
333
347
|
# +upsert+ uses the +UpdateItem+ operation so it saves changes and loads
|
@@ -507,7 +521,10 @@ module Dynamoid
|
|
507
521
|
# @return [true|false] Whether saving successful or not
|
508
522
|
# @since 0.2.0
|
509
523
|
def save(options = {})
|
510
|
-
|
524
|
+
if Dynamoid.config.create_table_on_save
|
525
|
+
self.class.create_table(sync: true)
|
526
|
+
end
|
527
|
+
|
511
528
|
create_or_update = new_record? ? :create : :update
|
512
529
|
|
513
530
|
run_callbacks(:save) do
|
@@ -618,6 +635,15 @@ module Dynamoid
|
|
618
635
|
# t.add(age: 1)
|
619
636
|
# end
|
620
637
|
#
|
638
|
+
# To check if some attribute (or attributes) isn't stored in a DynamoDB
|
639
|
+
# item (e.g. it wasn't set explicitly) there is another condition -
|
640
|
+
# +unless_exists+:
|
641
|
+
#
|
642
|
+
# user = User.create(name: 'Tylor')
|
643
|
+
# user.update!(unless_exists: [:age]) do |t|
|
644
|
+
# t.set(age: 18)
|
645
|
+
# end
|
646
|
+
#
|
621
647
|
# If a document doesn't meet conditions it raises
|
622
648
|
# +Dynamoid::Errors::StaleObjectError+ exception.
|
623
649
|
#
|
@@ -714,6 +740,15 @@ module Dynamoid
|
|
714
740
|
# t.add(age: 1)
|
715
741
|
# end
|
716
742
|
#
|
743
|
+
# To check if some attribute (or attributes) isn't stored in a DynamoDB
|
744
|
+
# item (e.g. it wasn't set explicitly) there is another condition -
|
745
|
+
# +unless_exists+:
|
746
|
+
#
|
747
|
+
# user = User.create(name: 'Tylor')
|
748
|
+
# user.update(unless_exists: [:age]) do |t|
|
749
|
+
# t.set(age: 18)
|
750
|
+
# end
|
751
|
+
#
|
717
752
|
# If a document doesn't meet conditions it just returns +false+. Otherwise it returns +true+.
|
718
753
|
#
|
719
754
|
# It will increment the +lock_version+ attribute if a table has the column,
|
@@ -889,7 +924,7 @@ module Dynamoid
|
|
889
924
|
|
890
925
|
Dynamoid.adapter.delete(self.class.table_name, hash_key, options)
|
891
926
|
|
892
|
-
self.class.associations.
|
927
|
+
self.class.associations.each_key do |name|
|
893
928
|
send(name).disassociate_source
|
894
929
|
end
|
895
930
|
|
@@ -57,11 +57,12 @@ module Dynamoid
|
|
57
57
|
|
58
58
|
class StringTypeCaster < Base
|
59
59
|
def process(value)
|
60
|
-
|
60
|
+
case value
|
61
|
+
when true
|
61
62
|
't'
|
62
|
-
|
63
|
+
when false
|
63
64
|
'f'
|
64
|
-
|
65
|
+
when String
|
65
66
|
value.dup
|
66
67
|
else
|
67
68
|
value.to_s
|
@@ -71,6 +72,7 @@ module Dynamoid
|
|
71
72
|
|
72
73
|
class IntegerTypeCaster < Base
|
73
74
|
def process(value)
|
75
|
+
# rubocop:disable Lint/DuplicateBranch
|
74
76
|
if value == true
|
75
77
|
1
|
76
78
|
elsif value == false
|
@@ -84,11 +86,13 @@ module Dynamoid
|
|
84
86
|
else
|
85
87
|
value.to_i
|
86
88
|
end
|
89
|
+
# rubocop:enable Lint/DuplicateBranch
|
87
90
|
end
|
88
91
|
end
|
89
92
|
|
90
93
|
class NumberTypeCaster < Base
|
91
94
|
def process(value)
|
95
|
+
# rubocop:disable Lint/DuplicateBranch
|
92
96
|
if value == true
|
93
97
|
1
|
94
98
|
elsif value == false
|
@@ -104,6 +108,7 @@ module Dynamoid
|
|
104
108
|
else
|
105
109
|
value.to_d
|
106
110
|
end
|
111
|
+
# rubocop:enable Lint/DuplicateBranch
|
107
112
|
end
|
108
113
|
end
|
109
114
|
|
@@ -135,7 +140,7 @@ module Dynamoid
|
|
135
140
|
raise ArgumentError, "Set element type #{element_type} isn't supported"
|
136
141
|
end
|
137
142
|
|
138
|
-
set.
|
143
|
+
set.to_set { |el| type_caster.process(el) }
|
139
144
|
end
|
140
145
|
|
141
146
|
def element_type
|
@@ -227,10 +232,10 @@ module Dynamoid
|
|
227
232
|
nil
|
228
233
|
elsif value.is_a?(String)
|
229
234
|
dt = begin
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
235
|
+
DateTime.parse(value)
|
236
|
+
rescue StandardError
|
237
|
+
nil
|
238
|
+
end
|
234
239
|
if dt
|
235
240
|
seconds = string_utc_offset(value) || ApplicationTimeZone.utc_offset
|
236
241
|
offset = seconds_to_offset(seconds)
|
@@ -255,9 +260,7 @@ module Dynamoid
|
|
255
260
|
|
256
261
|
class DateTypeCaster < Base
|
257
262
|
def process(value)
|
258
|
-
if
|
259
|
-
nil
|
260
|
-
else
|
263
|
+
if value.respond_to?(:to_date)
|
261
264
|
begin
|
262
265
|
value.to_date
|
263
266
|
rescue StandardError
|
@@ -277,10 +280,8 @@ module Dynamoid
|
|
277
280
|
def process(value)
|
278
281
|
if value == ''
|
279
282
|
nil
|
280
|
-
elsif [false, 'false', 'FALSE', 0, '0', 'f', 'F', 'off', 'OFF'].include? value
|
281
|
-
false
|
282
283
|
else
|
283
|
-
|
284
|
+
![false, 'false', 'FALSE', 0, '0', 'f', 'F', 'off', 'OFF'].include? value
|
284
285
|
end
|
285
286
|
end
|
286
287
|
end
|
data/lib/dynamoid/undumping.rb
CHANGED
@@ -115,7 +115,7 @@ module Dynamoid
|
|
115
115
|
def process_typed_collection(set)
|
116
116
|
if allowed_type?
|
117
117
|
undumper = Undumping.find_undumper(element_options)
|
118
|
-
set.
|
118
|
+
set.to_set { |el| undumper.process(el) }
|
119
119
|
else
|
120
120
|
raise ArgumentError, "Set element type #{element_type} isn't supported"
|
121
121
|
end
|
data/lib/dynamoid/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Symonds
|
@@ -21,7 +21,7 @@ authors:
|
|
21
21
|
autorequire:
|
22
22
|
bindir: bin
|
23
23
|
cert_chain: []
|
24
|
-
date:
|
24
|
+
date: 2024-02-10 00:00:00.000000000 Z
|
25
25
|
dependencies:
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activemodel
|
@@ -122,33 +122,33 @@ dependencies:
|
|
122
122
|
- !ruby/object:Gem::Version
|
123
123
|
version: '13.0'
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
|
-
name:
|
125
|
+
name: rexml
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
|
-
- - "
|
128
|
+
- - ">="
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
130
|
+
version: '0'
|
131
131
|
type: :development
|
132
132
|
prerelease: false
|
133
133
|
version_requirements: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
|
-
- - "
|
135
|
+
- - ">="
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '
|
137
|
+
version: '0'
|
138
138
|
- !ruby/object:Gem::Dependency
|
139
|
-
name:
|
139
|
+
name: rspec
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '
|
144
|
+
version: '3.12'
|
145
145
|
type: :development
|
146
146
|
prerelease: false
|
147
147
|
version_requirements: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
149
|
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '
|
151
|
+
version: '3.12'
|
152
152
|
- !ruby/object:Gem::Dependency
|
153
153
|
name: yard
|
154
154
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,10 +185,12 @@ files:
|
|
185
185
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/batch_get_item.rb
|
186
186
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb
|
187
187
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/execute_statement.rb
|
188
|
+
- lib/dynamoid/adapter_plugin/aws_sdk_v3/filter_expression_convertor.rb
|
188
189
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb
|
189
190
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/backoff.rb
|
190
191
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/limit.rb
|
191
192
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/start_key.rb
|
193
|
+
- lib/dynamoid/adapter_plugin/aws_sdk_v3/projection_expression_convertor.rb
|
192
194
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/query.rb
|
193
195
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb
|
194
196
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/table.rb
|
@@ -209,10 +211,9 @@ files:
|
|
209
211
|
- lib/dynamoid/config/options.rb
|
210
212
|
- lib/dynamoid/criteria.rb
|
211
213
|
- lib/dynamoid/criteria/chain.rb
|
212
|
-
- lib/dynamoid/criteria/ignored_conditions_detector.rb
|
213
214
|
- lib/dynamoid/criteria/key_fields_detector.rb
|
214
215
|
- lib/dynamoid/criteria/nonexistent_fields_detector.rb
|
215
|
-
- lib/dynamoid/criteria/
|
216
|
+
- lib/dynamoid/criteria/where_conditions.rb
|
216
217
|
- lib/dynamoid/dirty.rb
|
217
218
|
- lib/dynamoid/document.rb
|
218
219
|
- lib/dynamoid/dumping.rb
|
@@ -247,10 +248,10 @@ licenses:
|
|
247
248
|
- MIT
|
248
249
|
metadata:
|
249
250
|
homepage_uri: http://github.com/Dynamoid/dynamoid
|
250
|
-
source_code_uri: https://github.com/Dynamoid/dynamoid/tree/v3.
|
251
|
-
changelog_uri: https://github.com/Dynamoid/dynamoid/blob/v3.
|
251
|
+
source_code_uri: https://github.com/Dynamoid/dynamoid/tree/v3.10.0
|
252
|
+
changelog_uri: https://github.com/Dynamoid/dynamoid/blob/v3.10.0/CHANGELOG.md
|
252
253
|
bug_tracker_uri: https://github.com/Dynamoid/dynamoid/issues
|
253
|
-
documentation_uri: https://www.rubydoc.info/gems/dynamoid/3.
|
254
|
+
documentation_uri: https://www.rubydoc.info/gems/dynamoid/3.10.0
|
254
255
|
funding_uri: https://opencollective.com/dynamoid
|
255
256
|
wiki_uri: https://github.com/Dynamoid/dynamoid/wiki
|
256
257
|
rubygems_mfa_required: 'true'
|
@@ -269,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
269
270
|
- !ruby/object:Gem::Version
|
270
271
|
version: '0'
|
271
272
|
requirements: []
|
272
|
-
rubygems_version: 3.
|
273
|
+
rubygems_version: 3.5.3
|
273
274
|
signing_key:
|
274
275
|
specification_version: 4
|
275
276
|
summary: Dynamoid is an ORM for Amazon's DynamoDB
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Dynamoid
|
4
|
-
module Criteria
|
5
|
-
# @private
|
6
|
-
class IgnoredConditionsDetector
|
7
|
-
def initialize(conditions)
|
8
|
-
@conditions = conditions
|
9
|
-
@ignored_keys = ignored_keys
|
10
|
-
end
|
11
|
-
|
12
|
-
def found?
|
13
|
-
@ignored_keys.present?
|
14
|
-
end
|
15
|
-
|
16
|
-
def warning_message
|
17
|
-
return unless found?
|
18
|
-
|
19
|
-
'Where conditions may contain only one condition for an attribute. ' \
|
20
|
-
"Following conditions are ignored: #{ignored_conditions}"
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def ignored_keys
|
26
|
-
@conditions.keys
|
27
|
-
.group_by(&method(:key_to_field))
|
28
|
-
.select { |_, ary| ary.size > 1 }
|
29
|
-
.flat_map { |_, ary| ary[0..-2] }
|
30
|
-
end
|
31
|
-
|
32
|
-
def key_to_field(key)
|
33
|
-
key.to_s.split('.')[0]
|
34
|
-
end
|
35
|
-
|
36
|
-
def ignored_conditions
|
37
|
-
@conditions.slice(*@ignored_keys)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Dynamoid
|
4
|
-
module Criteria
|
5
|
-
# @private
|
6
|
-
class OverwrittenConditionsDetector
|
7
|
-
def initialize(conditions, conditions_new)
|
8
|
-
@conditions = conditions
|
9
|
-
@new_conditions = conditions_new
|
10
|
-
@overwritten_keys = overwritten_keys
|
11
|
-
end
|
12
|
-
|
13
|
-
def found?
|
14
|
-
@overwritten_keys.present?
|
15
|
-
end
|
16
|
-
|
17
|
-
def warning_message
|
18
|
-
return unless found?
|
19
|
-
|
20
|
-
'Where conditions may contain only one condition for an attribute. ' \
|
21
|
-
"Following conditions are ignored: #{ignored_conditions}"
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def overwritten_keys
|
27
|
-
new_fields = @new_conditions.keys.map(&method(:key_to_field))
|
28
|
-
@conditions.keys.select { |key| key_to_field(key).in?(new_fields) }
|
29
|
-
end
|
30
|
-
|
31
|
-
def key_to_field(key)
|
32
|
-
key.to_s.split('.')[0]
|
33
|
-
end
|
34
|
-
|
35
|
-
def ignored_conditions
|
36
|
-
@conditions.slice(*@overwritten_keys.map(&:to_sym))
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|