dynamoid 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +53 -0
- data/.rubocop_todo.yml +55 -0
- data/.travis.yml +5 -27
- data/Appraisals +17 -15
- data/CHANGELOG.md +26 -3
- data/Gemfile +4 -2
- data/README.md +95 -77
- data/Rakefile +17 -17
- data/Vagrantfile +5 -3
- data/dynamoid.gemspec +39 -45
- data/gemfiles/rails_4_2.gemfile +7 -5
- data/gemfiles/rails_5_0.gemfile +6 -4
- data/gemfiles/rails_5_1.gemfile +6 -4
- data/gemfiles/rails_5_2.gemfile +6 -4
- data/lib/dynamoid.rb +11 -4
- data/lib/dynamoid/adapter.rb +21 -27
- data/lib/dynamoid/adapter_plugin/{aws_sdk_v2.rb → aws_sdk_v3.rb} +118 -113
- data/lib/dynamoid/application_time_zone.rb +27 -0
- data/lib/dynamoid/associations.rb +3 -6
- data/lib/dynamoid/associations/association.rb +3 -6
- data/lib/dynamoid/associations/belongs_to.rb +4 -5
- data/lib/dynamoid/associations/has_and_belongs_to_many.rb +2 -3
- data/lib/dynamoid/associations/has_many.rb +2 -3
- data/lib/dynamoid/associations/has_one.rb +2 -3
- data/lib/dynamoid/associations/many_association.rb +8 -9
- data/lib/dynamoid/associations/single_association.rb +3 -3
- data/lib/dynamoid/components.rb +2 -2
- data/lib/dynamoid/config.rb +9 -5
- data/lib/dynamoid/config/backoff_strategies/constant_backoff.rb +4 -2
- data/lib/dynamoid/config/backoff_strategies/exponential_backoff.rb +3 -1
- data/lib/dynamoid/config/options.rb +4 -4
- data/lib/dynamoid/criteria.rb +3 -5
- data/lib/dynamoid/criteria/chain.rb +42 -49
- data/lib/dynamoid/dirty.rb +5 -4
- data/lib/dynamoid/document.rb +142 -36
- data/lib/dynamoid/dumping.rb +167 -0
- data/lib/dynamoid/dynamodb_time_zone.rb +16 -0
- data/lib/dynamoid/errors.rb +7 -6
- data/lib/dynamoid/fields.rb +24 -23
- data/lib/dynamoid/finders.rb +101 -59
- data/lib/dynamoid/identity_map.rb +5 -11
- data/lib/dynamoid/indexes.rb +45 -46
- data/lib/dynamoid/middleware/identity_map.rb +2 -0
- data/lib/dynamoid/persistence.rb +67 -307
- data/lib/dynamoid/primary_key_type_mapping.rb +34 -0
- data/lib/dynamoid/railtie.rb +3 -1
- data/lib/dynamoid/tasks/database.rake +11 -11
- data/lib/dynamoid/tasks/database.rb +4 -3
- data/lib/dynamoid/type_casting.rb +193 -0
- data/lib/dynamoid/undumping.rb +188 -0
- data/lib/dynamoid/validations.rb +4 -7
- data/lib/dynamoid/version.rb +3 -1
- metadata +59 -53
- data/gemfiles/rails_4_0.gemfile +0 -9
- data/gemfiles/rails_4_1.gemfile +0 -9
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dynamoid
|
4
|
+
module DynamodbTimeZone
|
5
|
+
def self.in_time_zone(value)
|
6
|
+
case Dynamoid::Config.dynamodb_timezone
|
7
|
+
when :utc
|
8
|
+
value.utc.to_datetime
|
9
|
+
when :local
|
10
|
+
value.getlocal.to_datetime
|
11
|
+
else
|
12
|
+
value.in_time_zone(Dynamoid::Config.dynamodb_timezone).to_datetime
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/dynamoid/errors.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
#
|
2
|
-
module Dynamoid
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
module Dynamoid
|
4
4
|
# All the errors specific to Dynamoid. The goal is to mimic ActiveRecord.
|
5
5
|
module Errors
|
6
|
-
|
7
6
|
# Generic Dynamoid error
|
8
7
|
class Error < StandardError; end
|
9
8
|
|
@@ -15,10 +14,10 @@ module Dynamoid
|
|
15
14
|
# specified key attribute(s) or projected attributes do not exist.
|
16
15
|
class InvalidIndex < Error
|
17
16
|
def initialize(item)
|
18
|
-
if
|
17
|
+
if item.is_a? String
|
19
18
|
super(item)
|
20
19
|
else
|
21
|
-
super("Validation failed: #{item.errors.full_messages.join(
|
20
|
+
super("Validation failed: #{item.errors.full_messages.join(', ')}")
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
@@ -68,11 +67,13 @@ module Dynamoid
|
|
68
67
|
attr_reader :document
|
69
68
|
|
70
69
|
def initialize(document)
|
71
|
-
super("Validation failed: #{document.errors.full_messages.join(
|
70
|
+
super("Validation failed: #{document.errors.full_messages.join(', ')}")
|
72
71
|
@document = document
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
76
75
|
class InvalidQuery < Error; end
|
76
|
+
|
77
|
+
class UnsupportedKeyType < Error; end
|
77
78
|
end
|
78
79
|
end
|
data/lib/dynamoid/fields.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Dynamoid #:nodoc:
|
3
4
|
# All fields on a Dynamoid::Document must be explicitly defined -- if you have fields in the database that are not
|
4
5
|
# specified with field, then they will be ignored.
|
@@ -6,13 +7,13 @@ module Dynamoid #:nodoc:
|
|
6
7
|
extend ActiveSupport::Concern
|
7
8
|
|
8
9
|
# Types allowed in indexes:
|
9
|
-
PERMITTED_KEY_TYPES = [
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
]
|
10
|
+
PERMITTED_KEY_TYPES = %i[
|
11
|
+
number
|
12
|
+
integer
|
13
|
+
string
|
14
|
+
datetime
|
15
|
+
serialized
|
16
|
+
].freeze
|
16
17
|
|
17
18
|
# Initialize the attributes we know the class has, in addition to our magic attributes: id, created_at, and updated_at.
|
18
19
|
included do
|
@@ -27,7 +28,6 @@ module Dynamoid #:nodoc:
|
|
27
28
|
end
|
28
29
|
|
29
30
|
module ClassMethods
|
30
|
-
|
31
31
|
# Specify a field for a document.
|
32
32
|
#
|
33
33
|
# Its type determines how it is coerced when read in and out of the datastore.
|
@@ -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 => {type: type}.merge(options))
|
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) }
|
@@ -63,7 +63,7 @@ module Dynamoid #:nodoc:
|
|
63
63
|
!value.nil?
|
64
64
|
end
|
65
65
|
end
|
66
|
-
define_method("#{named}=") {|value| write_attribute(named, value) }
|
66
|
+
define_method("#{named}=") { |value| write_attribute(named, value) }
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -72,9 +72,9 @@ module Dynamoid #:nodoc:
|
|
72
72
|
self.range_key = name
|
73
73
|
end
|
74
74
|
|
75
|
-
def table(
|
75
|
+
def table(_options)
|
76
76
|
# a default 'id' column is created when Dynamoid::Document is included
|
77
|
-
unless
|
77
|
+
unless attributes.key? hash_key
|
78
78
|
remove_field :id
|
79
79
|
field(hash_key)
|
80
80
|
end
|
@@ -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)
|
85
|
+
attributes.delete(field) || raise('No such field')
|
86
86
|
|
87
87
|
generated_methods.module_eval do
|
88
88
|
remove_method field
|
@@ -104,7 +104,7 @@ module Dynamoid #:nodoc:
|
|
104
104
|
|
105
105
|
# You can access the attributes of an object directly on its attributes method, which is by default an empty hash.
|
106
106
|
attr_accessor :attributes
|
107
|
-
alias
|
107
|
+
alias raw_attributes attributes
|
108
108
|
|
109
109
|
# Write an attribute on the object. Also marks the previous value as dirty.
|
110
110
|
#
|
@@ -113,13 +113,16 @@ module Dynamoid #:nodoc:
|
|
113
113
|
#
|
114
114
|
# @since 0.2.0
|
115
115
|
def write_attribute(name, value)
|
116
|
+
name = name.to_sym
|
117
|
+
|
116
118
|
if association = @associations[name]
|
117
119
|
association.reset
|
118
120
|
end
|
119
121
|
|
120
|
-
attributes[name
|
122
|
+
value_casted = TypeCasting.cast_field(value, self.class.attributes[name])
|
123
|
+
attributes[name] = value_casted
|
121
124
|
end
|
122
|
-
alias
|
125
|
+
alias []= write_attribute
|
123
126
|
|
124
127
|
# Read an attribute from an object.
|
125
128
|
#
|
@@ -129,7 +132,7 @@ module Dynamoid #:nodoc:
|
|
129
132
|
def read_attribute(name)
|
130
133
|
attributes[name.to_sym]
|
131
134
|
end
|
132
|
-
alias
|
135
|
+
alias [] read_attribute
|
133
136
|
|
134
137
|
# Updates multiple attibutes at once, saving the object once the updates are complete.
|
135
138
|
#
|
@@ -137,7 +140,7 @@ module Dynamoid #:nodoc:
|
|
137
140
|
#
|
138
141
|
# @since 0.2.0
|
139
142
|
def update_attributes(attributes)
|
140
|
-
attributes.each {|attribute, value|
|
143
|
+
attributes.each { |attribute, value| write_attribute(attribute, value) } unless attributes.nil? || attributes.empty?
|
141
144
|
save
|
142
145
|
end
|
143
146
|
|
@@ -165,15 +168,13 @@ module Dynamoid #:nodoc:
|
|
165
168
|
#
|
166
169
|
# @since 0.2.0
|
167
170
|
def set_updated_at
|
168
|
-
if Dynamoid::Config.timestamps && !
|
171
|
+
if Dynamoid::Config.timestamps && !updated_at_changed?
|
169
172
|
self.updated_at = DateTime.now.in_time_zone(Time.zone)
|
170
173
|
end
|
171
174
|
end
|
172
175
|
|
173
176
|
def set_type
|
174
|
-
self.type ||= self.class.
|
177
|
+
self.type ||= self.class.name if self.class.attributes[:type]
|
175
178
|
end
|
176
|
-
|
177
179
|
end
|
178
|
-
|
179
180
|
end
|
data/lib/dynamoid/finders.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
2
|
-
module Dynamoid
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
module Dynamoid
|
4
4
|
# This module defines the finder methods that hang off the document at the
|
5
5
|
# class level, like find, find_by_id, and the method_missing style finders.
|
6
6
|
module Finders
|
@@ -14,41 +14,35 @@ module Dynamoid
|
|
14
14
|
'begins_with' => :range_begins_with,
|
15
15
|
'between' => :range_between,
|
16
16
|
'eq' => :range_eq
|
17
|
-
}
|
17
|
+
}.freeze
|
18
18
|
|
19
19
|
module ClassMethods
|
20
|
-
|
21
20
|
# Find one or many objects, specified by one id or an array of ids.
|
22
21
|
#
|
23
22
|
# @param [Array/String] *id an array of ids or one single id
|
23
|
+
# @param [Hash] options
|
24
24
|
#
|
25
25
|
# @return [Dynamoid::Document] one object or an array of objects, depending on whether the input was an array or not
|
26
26
|
#
|
27
|
+
# @example Find by partition key
|
28
|
+
# Document.find(101)
|
29
|
+
#
|
30
|
+
# @example Find by partition key and sort key
|
31
|
+
# Document.find(101, range_key: 'archived')
|
32
|
+
#
|
33
|
+
# @example Find several documents by partition key
|
34
|
+
# Document.find(101, 102, 103)
|
35
|
+
# Document.find([101, 102, 103])
|
36
|
+
#
|
37
|
+
# @example Find several documents by partition key and sort key
|
38
|
+
# Document.find([[101, 'archived'], [102, 'new'], [103, 'deleted']])
|
39
|
+
#
|
27
40
|
# @since 0.2.0
|
28
|
-
def find(*ids)
|
29
|
-
|
30
|
-
|
31
|
-
else
|
32
|
-
{}
|
33
|
-
end
|
34
|
-
expects_array = ids.first.kind_of?(Array)
|
35
|
-
|
36
|
-
ids = Array(ids.flatten.uniq)
|
37
|
-
if ids.count == 1
|
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
|
43
|
-
expects_array ? Array(result) : result
|
41
|
+
def find(*ids, **options)
|
42
|
+
if ids.size == 1 && !ids[0].is_a?(Array)
|
43
|
+
_find_by_id(ids[0], options.merge(raise_error: true))
|
44
44
|
else
|
45
|
-
|
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
|
45
|
+
_find_all(ids.flatten(1), raise_error: true)
|
52
46
|
end
|
53
47
|
end
|
54
48
|
|
@@ -67,26 +61,9 @@ module Dynamoid
|
|
67
61
|
# find all the tweets using hash key and range key with consistent read
|
68
62
|
# Tweet.find_all([['1', 'red'], ['1', 'green']], :consistent_read => true)
|
69
63
|
def find_all(ids, options = {})
|
70
|
-
|
71
|
-
items = Dynamoid.adapter.read(self.table_name, ids, options)
|
72
|
-
items ? items[self.table_name] : []
|
73
|
-
else
|
74
|
-
items = []
|
75
|
-
backoff = nil
|
76
|
-
Dynamoid.adapter.read(self.table_name, ids, options) do |hash, has_unprocessed_items|
|
77
|
-
items += hash[self.table_name]
|
78
|
-
|
79
|
-
if has_unprocessed_items
|
80
|
-
backoff ||= Dynamoid.config.build_backoff
|
81
|
-
backoff.call
|
82
|
-
else
|
83
|
-
backoff = nil
|
84
|
-
end
|
85
|
-
end
|
86
|
-
items
|
87
|
-
end
|
64
|
+
ActiveSupport::Deprecation.warn('[Dynamoid] .find_all is deprecated! Call .find instead of')
|
88
65
|
|
89
|
-
|
66
|
+
_find_all(ids, options)
|
90
67
|
end
|
91
68
|
|
92
69
|
# Find one object directly by id.
|
@@ -95,12 +72,71 @@ module Dynamoid
|
|
95
72
|
#
|
96
73
|
# @return [Dynamoid::Document] the found object, or nil if nothing was found
|
97
74
|
#
|
75
|
+
# @example Find by partition key
|
76
|
+
# Document.find_by_id(101)
|
77
|
+
#
|
78
|
+
# @example Find by partition key and sort key
|
79
|
+
# Document.find_by_id(101, range_key: 'archived')
|
80
|
+
#
|
98
81
|
# @since 0.2.0
|
99
82
|
def find_by_id(id, options = {})
|
100
|
-
|
101
|
-
|
83
|
+
ActiveSupport::Deprecation.warn('[Dynamoid] .find_by_id is deprecated! Call .find instead of', caller[1..-1])
|
84
|
+
|
85
|
+
_find_by_id(id, options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def _find_all(ids, options = {})
|
89
|
+
if range_key
|
90
|
+
ids = ids.map do |pk, sk|
|
91
|
+
sk_casted = TypeCasting.cast_field(sk, attributes[range_key])
|
92
|
+
sk_dumped = Dumping.dump_field(sk_casted, attributes[range_key])
|
93
|
+
|
94
|
+
[pk, sk_dumped]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
items = if Dynamoid.config.backoff
|
99
|
+
items = []
|
100
|
+
backoff = nil
|
101
|
+
Dynamoid.adapter.read(table_name, ids, options) do |hash, has_unprocessed_items|
|
102
|
+
items += hash[table_name]
|
103
|
+
|
104
|
+
if has_unprocessed_items
|
105
|
+
backoff ||= Dynamoid.config.build_backoff
|
106
|
+
backoff.call
|
107
|
+
else
|
108
|
+
backoff = nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
items
|
112
|
+
else
|
113
|
+
items = Dynamoid.adapter.read(table_name, ids, options)
|
114
|
+
items ? items[table_name] : []
|
115
|
+
end
|
116
|
+
|
117
|
+
if items.size == ids.size || !options[:raise_error]
|
118
|
+
items ? items.map { |i| from_database(i) } : []
|
102
119
|
else
|
103
|
-
|
120
|
+
message = "Couldn't find all #{name.pluralize} with '#{hash_key}': (#{ids.join(', ')}) "
|
121
|
+
message += "(found #{items.size} results, but was looking for #{ids.size})"
|
122
|
+
raise Errors::RecordNotFound, message
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def _find_by_id(id, options = {})
|
127
|
+
if range_key
|
128
|
+
key = options[:range_key]
|
129
|
+
key_casted = TypeCasting.cast_field(key, attributes[range_key])
|
130
|
+
key_dumped = Dumping.dump_field(key_casted, attributes[range_key])
|
131
|
+
|
132
|
+
options[:range_key] = key_dumped
|
133
|
+
end
|
134
|
+
|
135
|
+
if item = Dynamoid.adapter.read(table_name, id, options)
|
136
|
+
from_database(item)
|
137
|
+
elsif options[:raise_error]
|
138
|
+
message = "Couldn't find #{name} with '#{hash_key}'=#{id}"
|
139
|
+
raise Errors::RecordNotFound, message
|
104
140
|
end
|
105
141
|
end
|
106
142
|
|
@@ -110,7 +146,9 @@ module Dynamoid
|
|
110
146
|
# @param [String/Number] range_key of the object to find
|
111
147
|
#
|
112
148
|
def find_by_composite_key(hash_key, range_key, options = {})
|
113
|
-
|
149
|
+
ActiveSupport::Deprecation.warn('[Dynamoid] .find_by_composite_key is deprecated! Call .find instead of')
|
150
|
+
|
151
|
+
_find_by_id(hash_key, options.merge(range_key: range_key))
|
114
152
|
end
|
115
153
|
|
116
154
|
# Find all objects by hash and range keys.
|
@@ -133,9 +171,10 @@ module Dynamoid
|
|
133
171
|
# @option options [Number] :range_lte find range keys less than or equal to this
|
134
172
|
#
|
135
173
|
# @return [Array] an array of all matching items
|
136
|
-
#
|
137
174
|
def find_all_by_composite_key(hash_key, options = {})
|
138
|
-
|
175
|
+
ActiveSupport::Deprecation.warn('[Dynamoid] .find_all_composite_key is deprecated! Call .where instead of')
|
176
|
+
|
177
|
+
Dynamoid.adapter.query(table_name, options.merge(hash_value: hash_key)).collect do |item|
|
139
178
|
from_database(item)
|
140
179
|
end
|
141
180
|
end
|
@@ -161,6 +200,8 @@ module Dynamoid
|
|
161
200
|
# @param [Hash] options - query filter, projected keys, scan_index_forward etc
|
162
201
|
# @return [Array] an array of all matching items
|
163
202
|
def find_all_by_secondary_index(hash, options = {})
|
203
|
+
ActiveSupport::Deprecation.warn('[Dynamoid] .find_all_by_secondary_index is deprecated! Call .where instead of')
|
204
|
+
|
164
205
|
range = options[:range] || {}
|
165
206
|
hash_key_field, hash_key_value = hash.first
|
166
207
|
range_key_field, range_key_value = range.first
|
@@ -176,21 +217,21 @@ module Dynamoid
|
|
176
217
|
end
|
177
218
|
|
178
219
|
# Find the index
|
179
|
-
index =
|
180
|
-
raise Dynamoid::Errors::MissingIndex
|
220
|
+
index = find_index(hash_key_field, range_key_field)
|
221
|
+
raise Dynamoid::Errors::MissingIndex, "attempted to find #{[hash_key_field, range_key_field]}" if index.nil?
|
181
222
|
|
182
223
|
# query
|
183
224
|
opts = {
|
184
225
|
hash_key: hash_key_field.to_s,
|
185
226
|
hash_value: hash_key_value,
|
186
|
-
index_name: index.name
|
227
|
+
index_name: index.name
|
187
228
|
}
|
188
229
|
if range_key_field
|
189
230
|
opts[:range_key] = range_key_field
|
190
231
|
opts[range_op_mapped] = range_key_value
|
191
232
|
end
|
192
|
-
dynamo_options = opts.merge(options.reject {|key, _| key == :range })
|
193
|
-
Dynamoid.adapter.query(
|
233
|
+
dynamo_options = opts.merge(options.reject { |key, _| key == :range })
|
234
|
+
Dynamoid.adapter.query(table_name, dynamo_options).map do |item|
|
194
235
|
from_database(item)
|
195
236
|
end
|
196
237
|
end
|
@@ -208,11 +249,13 @@ module Dynamoid
|
|
208
249
|
# @since 0.2.0
|
209
250
|
def method_missing(method, *args)
|
210
251
|
if method =~ /find/
|
252
|
+
ActiveSupport::Deprecation.warn("[Dynamoid] .#{method} is deprecated! Call .where instead of")
|
253
|
+
|
211
254
|
finder = method.to_s.split('_by_').first
|
212
255
|
attributes = method.to_s.split('_by_').last.split('_and_')
|
213
256
|
|
214
257
|
chain = Dynamoid::Criteria::Chain.new(self)
|
215
|
-
chain.query =
|
258
|
+
chain.query = {}.tap { |h| attributes.each_with_index { |attr, index| h[attr.to_sym] = args[index] } }
|
216
259
|
|
217
260
|
if finder =~ /all/
|
218
261
|
return chain.all
|
@@ -225,5 +268,4 @@ module Dynamoid
|
|
225
268
|
end
|
226
269
|
end
|
227
270
|
end
|
228
|
-
|
229
271
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dynamoid
|
2
4
|
module IdentityMap
|
3
5
|
extend ActiveSupport::Concern
|
@@ -36,18 +38,12 @@ module Dynamoid
|
|
36
38
|
key += "::#{range_key}"
|
37
39
|
end
|
38
40
|
|
39
|
-
|
40
|
-
identity_map[key]
|
41
|
-
else
|
42
|
-
super
|
43
|
-
end
|
41
|
+
identity_map[key] || super
|
44
42
|
end
|
45
43
|
|
46
44
|
def identity_map_key(attrs)
|
47
45
|
key = attrs[hash_key].to_s
|
48
|
-
if range_key
|
49
|
-
key += "::#{attrs[range_key]}"
|
50
|
-
end
|
46
|
+
key += "::#{attrs[range_key]}" if range_key
|
51
47
|
key
|
52
48
|
end
|
53
49
|
|
@@ -82,9 +78,7 @@ module Dynamoid
|
|
82
78
|
|
83
79
|
def identity_map_key
|
84
80
|
key = hash_key.to_s
|
85
|
-
if self.class.range_key
|
86
|
-
key += "::#{range_value}"
|
87
|
-
end
|
81
|
+
key += "::#{range_value}" if self.class.range_key
|
88
82
|
key
|
89
83
|
end
|
90
84
|
end
|