dynamoid 1.3.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.gitignore +3 -0
- data/.travis.yml +32 -7
- data/Appraisals +7 -0
- data/CHANGELOG.md +69 -2
- data/Gemfile +2 -0
- data/README.md +108 -28
- data/Rakefile +0 -24
- data/docker-compose.yml +7 -0
- data/dynamoid.gemspec +2 -3
- data/gemfiles/rails_4_0.gemfile +2 -3
- data/gemfiles/rails_4_1.gemfile +2 -3
- data/gemfiles/rails_4_2.gemfile +2 -3
- data/gemfiles/rails_5_0.gemfile +1 -1
- data/gemfiles/rails_5_1.gemfile +7 -0
- data/lib/dynamoid.rb +31 -31
- data/lib/dynamoid/adapter.rb +5 -5
- data/lib/dynamoid/adapter_plugin/aws_sdk_v2.rb +84 -57
- data/lib/dynamoid/associations.rb +21 -12
- data/lib/dynamoid/associations/association.rb +19 -3
- data/lib/dynamoid/associations/belongs_to.rb +26 -16
- data/lib/dynamoid/associations/has_and_belongs_to_many.rb +0 -16
- data/lib/dynamoid/associations/has_many.rb +2 -17
- data/lib/dynamoid/associations/has_one.rb +0 -14
- data/lib/dynamoid/associations/many_association.rb +19 -6
- data/lib/dynamoid/associations/single_association.rb +25 -7
- data/lib/dynamoid/config.rb +18 -18
- data/lib/dynamoid/config/options.rb +1 -1
- data/lib/dynamoid/criteria/chain.rb +29 -21
- data/lib/dynamoid/dirty.rb +2 -2
- data/lib/dynamoid/document.rb +17 -5
- data/lib/dynamoid/errors.rb +4 -1
- data/lib/dynamoid/fields.rb +6 -6
- data/lib/dynamoid/finders.rb +19 -9
- data/lib/dynamoid/identity_map.rb +0 -1
- data/lib/dynamoid/indexes.rb +41 -54
- data/lib/dynamoid/persistence.rb +54 -24
- data/lib/dynamoid/railtie.rb +1 -1
- data/lib/dynamoid/validations.rb +4 -3
- data/lib/dynamoid/version.rb +1 -1
- metadata +14 -29
- data/gemfiles/rails_4_0.gemfile.lock +0 -150
- data/gemfiles/rails_4_1.gemfile.lock +0 -154
- data/gemfiles/rails_4_2.gemfile.lock +0 -175
- data/gemfiles/rails_5_0.gemfile.lock +0 -180
@@ -18,6 +18,11 @@ module Dynamoid #:nodoc:
|
|
18
18
|
@source = source
|
19
19
|
@consistent_read = false
|
20
20
|
@scan_index_forward = true
|
21
|
+
|
22
|
+
# Honor STI and :type field if it presents
|
23
|
+
if @source.attributes.key?(:type)
|
24
|
+
@query[:'type.in'] = @source.deep_subclasses.map(&:name) << @source.name
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
# The workhorse method of the criteria chain. Each key in the passed in hash will become another criteria that the
|
@@ -56,32 +61,36 @@ module Dynamoid #:nodoc:
|
|
56
61
|
end
|
57
62
|
|
58
63
|
# Returns the last fetched record matched the criteria
|
64
|
+
# Enumerable doesn't implement `last`, only `first`
|
65
|
+
# So we have to implement it ourselves
|
59
66
|
#
|
60
67
|
def last
|
61
|
-
all.last
|
68
|
+
all.to_a.last
|
62
69
|
end
|
63
70
|
|
64
71
|
# Destroys all the records matching the criteria.
|
65
72
|
#
|
66
|
-
def
|
73
|
+
def delete_all
|
67
74
|
ids = []
|
75
|
+
ranges = []
|
68
76
|
|
69
77
|
if key_present?
|
70
|
-
ranges = []
|
71
78
|
Dynamoid.adapter.query(source.table_name, range_query).collect do |hash|
|
72
79
|
ids << hash[source.hash_key.to_sym]
|
73
|
-
ranges << hash[source.range_key.to_sym]
|
80
|
+
ranges << hash[source.range_key.to_sym] if source.range_key
|
74
81
|
end
|
75
82
|
|
76
|
-
Dynamoid.adapter.delete(source.table_name, ids,
|
83
|
+
Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
|
77
84
|
else
|
78
|
-
Dynamoid.adapter.scan(source.table_name,
|
85
|
+
Dynamoid.adapter.scan(source.table_name, scan_query, scan_opts).collect do |hash|
|
79
86
|
ids << hash[source.hash_key.to_sym]
|
87
|
+
ranges << hash[source.range_key.to_sym] if source.range_key
|
80
88
|
end
|
81
89
|
|
82
|
-
Dynamoid.adapter.delete(source.table_name, ids)
|
90
|
+
Dynamoid.adapter.delete(source.table_name, ids, range_key: ranges.presence)
|
83
91
|
end
|
84
92
|
end
|
93
|
+
alias_method :destroy_all, :delete_all
|
85
94
|
|
86
95
|
# The record limit is the limit of evaluated records returned by the
|
87
96
|
# query or scan.
|
@@ -121,10 +130,6 @@ module Dynamoid #:nodoc:
|
|
121
130
|
records.each(&block)
|
122
131
|
end
|
123
132
|
|
124
|
-
def consistent_opts
|
125
|
-
{ :consistent_read => consistent_read }
|
126
|
-
end
|
127
|
-
|
128
133
|
private
|
129
134
|
|
130
135
|
# The actual records referenced by the association.
|
@@ -133,12 +138,11 @@ module Dynamoid #:nodoc:
|
|
133
138
|
#
|
134
139
|
# @since 0.2.0
|
135
140
|
def records
|
136
|
-
|
141
|
+
if key_present?
|
137
142
|
records_via_query
|
138
143
|
else
|
139
144
|
records_via_scan
|
140
145
|
end
|
141
|
-
@batch_size ? results : Array(results)
|
142
146
|
end
|
143
147
|
|
144
148
|
def records_via_query
|
@@ -173,17 +177,17 @@ module Dynamoid #:nodoc:
|
|
173
177
|
|
174
178
|
case operation
|
175
179
|
when 'gt'
|
176
|
-
{ :
|
180
|
+
{ range_greater_than: val }
|
177
181
|
when 'lt'
|
178
|
-
{ :
|
182
|
+
{ range_less_than: val }
|
179
183
|
when 'gte'
|
180
|
-
{ :
|
184
|
+
{ range_gte: val }
|
181
185
|
when 'lte'
|
182
|
-
{ :
|
186
|
+
{ range_lte: val }
|
183
187
|
when 'between'
|
184
|
-
{ :
|
188
|
+
{ range_between: val }
|
185
189
|
when 'begins_with'
|
186
|
-
{ :
|
190
|
+
{ range_begins_with: val }
|
187
191
|
end
|
188
192
|
end
|
189
193
|
|
@@ -215,6 +219,10 @@ module Dynamoid #:nodoc:
|
|
215
219
|
return { name.to_sym => hash }
|
216
220
|
end
|
217
221
|
|
222
|
+
def consistent_opts
|
223
|
+
{ consistent_read: consistent_read }
|
224
|
+
end
|
225
|
+
|
218
226
|
def range_query
|
219
227
|
opts = {}
|
220
228
|
|
@@ -227,7 +235,7 @@ module Dynamoid #:nodoc:
|
|
227
235
|
opts[:range_key] = @range_key
|
228
236
|
if query[@range_key].present?
|
229
237
|
value = type_cast_condition_parameter(@range_key, query[@range_key])
|
230
|
-
opts.update(:
|
238
|
+
opts.update(range_eq: value)
|
231
239
|
end
|
232
240
|
|
233
241
|
query.keys.select { |k| k.to_s =~ /^#{@range_key}\./ }.each do |key|
|
@@ -261,7 +269,7 @@ module Dynamoid #:nodoc:
|
|
261
269
|
query_keys = query.keys.collect { |k| k.to_s.split('.').first }
|
262
270
|
|
263
271
|
# See if querying based on table hash key
|
264
|
-
if
|
272
|
+
if query.keys.map(&:to_s).include?(source.hash_key.to_s)
|
265
273
|
@hash_key = source.hash_key
|
266
274
|
|
267
275
|
# Use table's default range key
|
data/lib/dynamoid/dirty.rb
CHANGED
@@ -15,7 +15,7 @@ module Dynamoid
|
|
15
15
|
|
16
16
|
def update!(*)
|
17
17
|
ret = super
|
18
|
-
clear_changes #update! completely reloads all fields on the class, so any extant changes are wiped out
|
18
|
+
clear_changes # update! completely reloads all fields on the class, so any extant changes are wiped out
|
19
19
|
ret
|
20
20
|
end
|
21
21
|
|
@@ -26,7 +26,7 @@ module Dynamoid
|
|
26
26
|
def clear_changes
|
27
27
|
previous = changes
|
28
28
|
(block_given? ? yield : true).tap do |result|
|
29
|
-
unless result == false #failed validation; nil is OK.
|
29
|
+
unless result == false # failed validation; nil is OK.
|
30
30
|
@previously_changed = previous
|
31
31
|
changed_attributes.clear
|
32
32
|
end
|
data/lib/dynamoid/document.rb
CHANGED
@@ -72,7 +72,11 @@ module Dynamoid #:nodoc:
|
|
72
72
|
#
|
73
73
|
# @since 0.2.0
|
74
74
|
def create(attrs = {})
|
75
|
-
|
75
|
+
if attrs.is_a?(Array)
|
76
|
+
attrs.map { |attr| create(attr) }
|
77
|
+
else
|
78
|
+
build(attrs).tap(&:save)
|
79
|
+
end
|
76
80
|
end
|
77
81
|
|
78
82
|
# Initialize a new object and immediately save it to the database. Raise an exception if persistence failed.
|
@@ -83,7 +87,11 @@ module Dynamoid #:nodoc:
|
|
83
87
|
#
|
84
88
|
# @since 0.2.0
|
85
89
|
def create!(attrs = {})
|
86
|
-
|
90
|
+
if attrs.is_a?(Array)
|
91
|
+
attrs.map { |attr| create!(attr) }
|
92
|
+
else
|
93
|
+
build(attrs).tap(&:save!)
|
94
|
+
end
|
87
95
|
end
|
88
96
|
|
89
97
|
# Initialize a new object.
|
@@ -106,10 +114,14 @@ module Dynamoid #:nodoc:
|
|
106
114
|
# @since 0.2.0
|
107
115
|
def exists?(id_or_conditions = {})
|
108
116
|
case id_or_conditions
|
109
|
-
when Hash then
|
110
|
-
else !!
|
117
|
+
when Hash then where(id_or_conditions).first.present?
|
118
|
+
else !! find_by_id(id_or_conditions)
|
111
119
|
end
|
112
120
|
end
|
121
|
+
|
122
|
+
def deep_subclasses
|
123
|
+
subclasses + subclasses.map(&:deep_subclasses).flatten
|
124
|
+
end
|
113
125
|
end
|
114
126
|
|
115
127
|
# Initialize a new object.
|
@@ -167,7 +179,7 @@ module Dynamoid #:nodoc:
|
|
167
179
|
# @since 0.2.0
|
168
180
|
def reload
|
169
181
|
range_key_value = range_value ? dumped_range_value : nil
|
170
|
-
self.attributes = self.class.find(hash_key, :
|
182
|
+
self.attributes = self.class.find(hash_key, range_key: range_key_value, consistent_read: true).attributes
|
171
183
|
@associations.values.each(&:reset)
|
172
184
|
self
|
173
185
|
end
|
data/lib/dynamoid/errors.rb
CHANGED
@@ -27,7 +27,7 @@ module Dynamoid
|
|
27
27
|
attr_reader :record
|
28
28
|
|
29
29
|
def initialize(record)
|
30
|
-
super(
|
30
|
+
super('Failed to destroy item')
|
31
31
|
@record = record
|
32
32
|
end
|
33
33
|
end
|
@@ -61,6 +61,9 @@ module Dynamoid
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
class RecordNotFound < Error
|
65
|
+
end
|
66
|
+
|
64
67
|
class DocumentNotValid < Error
|
65
68
|
attr_reader :document
|
66
69
|
|
data/lib/dynamoid/fields.rb
CHANGED
@@ -23,7 +23,7 @@ module Dynamoid #:nodoc:
|
|
23
23
|
field :created_at, :datetime
|
24
24
|
field :updated_at, :datetime
|
25
25
|
|
26
|
-
field :id #Default primary key
|
26
|
+
field :id # Default primary key
|
27
27
|
end
|
28
28
|
|
29
29
|
module ClassMethods
|
@@ -50,7 +50,7 @@ module Dynamoid #:nodoc:
|
|
50
50
|
Dynamoid.logger.warn("Field type :float, which you declared for '#{name}', is deprecated in favor of :number.")
|
51
51
|
type = :number
|
52
52
|
end
|
53
|
-
self.attributes = attributes.merge(name => {:
|
53
|
+
self.attributes = attributes.merge(name => {type: type}.merge(options))
|
54
54
|
|
55
55
|
generated_methods.module_eval do
|
56
56
|
define_method(named) { read_attribute(named) }
|
@@ -67,13 +67,13 @@ module Dynamoid #:nodoc:
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
def range(name, type = :string)
|
71
|
-
field(name, type)
|
70
|
+
def range(name, type = :string, options = {})
|
71
|
+
field(name, type, options)
|
72
72
|
self.range_key = name
|
73
73
|
end
|
74
74
|
|
75
75
|
def table(options)
|
76
|
-
#a default 'id' column is created when Dynamoid::Document is included
|
76
|
+
# a default 'id' column is created when Dynamoid::Document is included
|
77
77
|
unless(attributes.has_key? hash_key)
|
78
78
|
remove_field :id
|
79
79
|
field(hash_key)
|
@@ -82,7 +82,7 @@ module Dynamoid #:nodoc:
|
|
82
82
|
|
83
83
|
def remove_field(field)
|
84
84
|
field = field.to_sym
|
85
|
-
attributes.delete(field) or raise
|
85
|
+
attributes.delete(field) or raise 'No such field'
|
86
86
|
|
87
87
|
generated_methods.module_eval do
|
88
88
|
remove_method field
|
data/lib/dynamoid/finders.rb
CHANGED
@@ -36,9 +36,19 @@ module Dynamoid
|
|
36
36
|
ids = Array(ids.flatten.uniq)
|
37
37
|
if ids.count == 1
|
38
38
|
result = self.find_by_id(ids.first, options)
|
39
|
+
if result.nil?
|
40
|
+
message = "Couldn't find #{self.name} with '#{self.hash_key}'=#{ids[0]}"
|
41
|
+
raise Errors::RecordNotFound.new(message)
|
42
|
+
end
|
39
43
|
expects_array ? Array(result) : result
|
40
44
|
else
|
41
|
-
find_all(ids)
|
45
|
+
result = find_all(ids)
|
46
|
+
if result.size != ids.size
|
47
|
+
message = "Couldn't find all #{self.name.pluralize} with '#{self.hash_key}': (#{ids.join(', ')}) "
|
48
|
+
message << "(found #{result.size} results, but was looking for #{ids.size})"
|
49
|
+
raise Errors::RecordNotFound.new(message)
|
50
|
+
end
|
51
|
+
result
|
42
52
|
end
|
43
53
|
end
|
44
54
|
|
@@ -80,7 +90,7 @@ module Dynamoid
|
|
80
90
|
# @param [String/Number] range_key of the object to find
|
81
91
|
#
|
82
92
|
def find_by_composite_key(hash_key, range_key, options = {})
|
83
|
-
find_by_id(hash_key, options.merge(
|
93
|
+
find_by_id(hash_key, options.merge(range_key: range_key))
|
84
94
|
end
|
85
95
|
|
86
96
|
# Find all objects by hash and range keys.
|
@@ -105,7 +115,7 @@ module Dynamoid
|
|
105
115
|
# @return [Array] an array of all matching items
|
106
116
|
#
|
107
117
|
def find_all_by_composite_key(hash_key, options = {})
|
108
|
-
Dynamoid.adapter.query(self.table_name, options.merge(
|
118
|
+
Dynamoid.adapter.query(self.table_name, options.merge(hash_value: hash_key)).collect do |item|
|
109
119
|
from_database(item)
|
110
120
|
end
|
111
121
|
end
|
@@ -138,9 +148,9 @@ module Dynamoid
|
|
138
148
|
|
139
149
|
if range_key_field
|
140
150
|
range_key_field = range_key_field.to_s
|
141
|
-
range_key_op =
|
142
|
-
if range_key_field.include?(
|
143
|
-
range_key_field, range_key_op = range_key_field.split(
|
151
|
+
range_key_op = 'eq'
|
152
|
+
if range_key_field.include?('.')
|
153
|
+
range_key_field, range_key_op = range_key_field.split('.', 2)
|
144
154
|
end
|
145
155
|
range_op_mapped = RANGE_MAP.fetch(range_key_op)
|
146
156
|
end
|
@@ -151,9 +161,9 @@ module Dynamoid
|
|
151
161
|
|
152
162
|
# query
|
153
163
|
opts = {
|
154
|
-
:
|
155
|
-
:
|
156
|
-
:
|
164
|
+
hash_key: hash_key_field.to_s,
|
165
|
+
hash_value: hash_key_value,
|
166
|
+
index_name: index.name,
|
157
167
|
}
|
158
168
|
if range_key_field
|
159
169
|
opts[:range_key] = range_key_field
|
data/lib/dynamoid/indexes.rb
CHANGED
@@ -39,8 +39,8 @@ module Dynamoid
|
|
39
39
|
end
|
40
40
|
|
41
41
|
index_opts = {
|
42
|
-
:
|
43
|
-
:
|
42
|
+
read_capacity: Dynamoid::Config.read_capacity,
|
43
|
+
write_capacity: Dynamoid::Config.write_capacity
|
44
44
|
}.merge(options)
|
45
45
|
|
46
46
|
index_opts[:dynamoid_class] = self
|
@@ -52,7 +52,6 @@ module Dynamoid
|
|
52
52
|
self
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
55
|
# Defines a local secondary index on a table. Will use the same primary
|
57
56
|
# hash key as the table.
|
58
57
|
#
|
@@ -83,11 +82,10 @@ module Dynamoid
|
|
83
82
|
' must use a different :range_key than the primary key')
|
84
83
|
end
|
85
84
|
|
86
|
-
index_opts = options.merge(
|
87
|
-
:
|
88
|
-
:
|
89
|
-
:
|
90
|
-
})
|
85
|
+
index_opts = options.merge(
|
86
|
+
dynamoid_class: self,
|
87
|
+
type: :local_secondary,
|
88
|
+
hash_key: primary_hash_key)
|
91
89
|
|
92
90
|
index = Dynamoid::Indexes::Index.new(index_opts)
|
93
91
|
key = index_key(primary_hash_key, index_range_key)
|
@@ -95,13 +93,11 @@ module Dynamoid
|
|
95
93
|
self
|
96
94
|
end
|
97
95
|
|
98
|
-
|
99
96
|
def find_index(hash, range=nil)
|
100
97
|
index = self.indexes[index_key(hash, range)]
|
101
98
|
index
|
102
99
|
end
|
103
100
|
|
104
|
-
|
105
101
|
# Returns true iff the provided hash[,range] key combo is a local
|
106
102
|
# secondary index.
|
107
103
|
#
|
@@ -113,7 +109,6 @@ module Dynamoid
|
|
113
109
|
self.local_secondary_indexes[index_key(hash, range)].present?
|
114
110
|
end
|
115
111
|
|
116
|
-
|
117
112
|
# Returns true iff the provided hash[,range] key combo is a global
|
118
113
|
# secondary index.
|
119
114
|
#
|
@@ -125,7 +120,6 @@ module Dynamoid
|
|
125
120
|
self.global_secondary_indexes[index_key(hash, range)].present?
|
126
121
|
end
|
127
122
|
|
128
|
-
|
129
123
|
# Generates a convenient lookup key name for a hash/range index.
|
130
124
|
# Should normally not be used directly.
|
131
125
|
#
|
@@ -140,7 +134,6 @@ module Dynamoid
|
|
140
134
|
name
|
141
135
|
end
|
142
136
|
|
143
|
-
|
144
137
|
# Generates a default index name.
|
145
138
|
#
|
146
139
|
# @param [Symbol] hash hash key name.
|
@@ -150,7 +143,6 @@ module Dynamoid
|
|
150
143
|
"#{self.table_name}_index_#{self.index_key(hash, range)}"
|
151
144
|
end
|
152
145
|
|
153
|
-
|
154
146
|
# Convenience method to return all indexes on the table.
|
155
147
|
#
|
156
148
|
# @return [Hash<String, Object>] the combined hash of global and local
|
@@ -166,7 +158,6 @@ module Dynamoid
|
|
166
158
|
end
|
167
159
|
end
|
168
160
|
|
169
|
-
|
170
161
|
# Represents the attributes of a DynamoDB index.
|
171
162
|
class Index
|
172
163
|
include ActiveModel::Validations
|
@@ -178,7 +169,6 @@ module Dynamoid
|
|
178
169
|
:hash_key_schema, :range_key_schema, :projected_attributes,
|
179
170
|
:read_capacity, :write_capacity
|
180
171
|
|
181
|
-
|
182
172
|
validate do
|
183
173
|
validate_index_type
|
184
174
|
validate_hash_key
|
@@ -186,7 +176,6 @@ module Dynamoid
|
|
186
176
|
validate_projected_attributes
|
187
177
|
end
|
188
178
|
|
189
|
-
|
190
179
|
def initialize(attrs={})
|
191
180
|
unless attrs[:dynamoid_class].present?
|
192
181
|
raise Dynamoid::Errors::InvalidIndex.new(':dynamoid_class is required')
|
@@ -205,7 +194,6 @@ module Dynamoid
|
|
205
194
|
raise Dynamoid::Errors::InvalidIndex.new(self) unless self.valid?
|
206
195
|
end
|
207
196
|
|
208
|
-
|
209
197
|
# Convenience method to determine the projection type for an index.
|
210
198
|
# Projection types are: :keys_only, :all, :include.
|
211
199
|
#
|
@@ -218,56 +206,55 @@ module Dynamoid
|
|
218
206
|
end
|
219
207
|
end
|
220
208
|
|
221
|
-
|
222
209
|
private
|
223
210
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
211
|
+
def validate_projected_attributes
|
212
|
+
unless (@projected_attributes.is_a?(Array) ||
|
213
|
+
PROJECTION_TYPES.include?(@projected_attributes))
|
214
|
+
errors.add(:projected_attributes, 'Invalid projected attributes specified.')
|
229
215
|
end
|
216
|
+
end
|
230
217
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
end
|
218
|
+
def validate_index_type
|
219
|
+
unless (@type.present? &&
|
220
|
+
[:local_secondary, :global_secondary].include?(@type))
|
221
|
+
errors.add(:type, 'Invalid index :type specified')
|
236
222
|
end
|
223
|
+
end
|
237
224
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
else
|
248
|
-
errors.add(:range_key, 'Index :range_key is not a valid key type')
|
249
|
-
end
|
225
|
+
def validate_range_key
|
226
|
+
if @range_key.present?
|
227
|
+
range_field_attributes = @dynamoid_class.attributes[@range_key]
|
228
|
+
if range_field_attributes.present?
|
229
|
+
range_key_type = range_field_attributes[:type]
|
230
|
+
if Dynamoid::Fields::PERMITTED_KEY_TYPES.include?(range_key_type)
|
231
|
+
@range_key_schema = {
|
232
|
+
@range_key => @dynamoid_class.dynamo_type(range_key_type)
|
233
|
+
}
|
250
234
|
else
|
251
|
-
errors.add(:range_key,
|
235
|
+
errors.add(:range_key, 'Index :range_key is not a valid key type')
|
252
236
|
end
|
237
|
+
else
|
238
|
+
errors.add(:range_key, "No such field #{@range_key} defined on table")
|
253
239
|
end
|
254
240
|
end
|
241
|
+
end
|
255
242
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
else
|
265
|
-
errors.add(:hash_key, 'Index :hash_key is not a valid key type')
|
266
|
-
end
|
243
|
+
def validate_hash_key
|
244
|
+
hash_field_attributes = @dynamoid_class.attributes[@hash_key]
|
245
|
+
if hash_field_attributes.present?
|
246
|
+
hash_field_type = hash_field_attributes[:type]
|
247
|
+
if Dynamoid::Fields::PERMITTED_KEY_TYPES.include?(hash_field_type)
|
248
|
+
@hash_key_schema = {
|
249
|
+
@hash_key => @dynamoid_class.dynamo_type(hash_field_type)
|
250
|
+
}
|
267
251
|
else
|
268
|
-
errors.add(:hash_key,
|
252
|
+
errors.add(:hash_key, 'Index :hash_key is not a valid key type')
|
269
253
|
end
|
254
|
+
else
|
255
|
+
errors.add(:hash_key, "No such field #{@hash_key} defined on table")
|
270
256
|
end
|
257
|
+
end
|
271
258
|
end
|
272
259
|
end
|
273
260
|
end
|