aws-record 2.10.1 → 2.12.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +83 -19
- data/VERSION +1 -1
- data/lib/aws-record/record/attribute.rb +8 -8
- data/lib/aws-record/record/attributes.rb +36 -49
- data/lib/aws-record/record/batch.rb +13 -12
- data/lib/aws-record/record/batch_read.rb +10 -12
- data/lib/aws-record/record/batch_write.rb +2 -1
- data/lib/aws-record/record/buildable_search.rb +37 -39
- data/lib/aws-record/record/client_configuration.rb +14 -14
- data/lib/aws-record/record/dirty_tracking.rb +29 -40
- data/lib/aws-record/record/errors.rb +11 -2
- data/lib/aws-record/record/item_collection.rb +7 -7
- data/lib/aws-record/record/item_data.rb +13 -17
- data/lib/aws-record/record/item_operations.rb +150 -138
- data/lib/aws-record/record/key_attributes.rb +0 -2
- data/lib/aws-record/record/marshalers/boolean_marshaler.rb +2 -5
- data/lib/aws-record/record/marshalers/date_marshaler.rb +1 -6
- data/lib/aws-record/record/marshalers/date_time_marshaler.rb +2 -5
- data/lib/aws-record/record/marshalers/epoch_time_marshaler.rb +2 -8
- data/lib/aws-record/record/marshalers/float_marshaler.rb +3 -8
- data/lib/aws-record/record/marshalers/integer_marshaler.rb +3 -8
- data/lib/aws-record/record/marshalers/list_marshaler.rb +4 -7
- data/lib/aws-record/record/marshalers/map_marshaler.rb +4 -7
- data/lib/aws-record/record/marshalers/numeric_set_marshaler.rb +7 -9
- data/lib/aws-record/record/marshalers/string_marshaler.rb +1 -2
- data/lib/aws-record/record/marshalers/string_set_marshaler.rb +5 -7
- data/lib/aws-record/record/marshalers/time_marshaler.rb +1 -5
- data/lib/aws-record/record/model_attributes.rb +17 -29
- data/lib/aws-record/record/query.rb +8 -11
- data/lib/aws-record/record/secondary_indexes.rb +40 -51
- data/lib/aws-record/record/table_config.rb +93 -115
- data/lib/aws-record/record/table_migration.rb +56 -72
- data/lib/aws-record/record/transactions.rb +40 -43
- data/lib/aws-record/record/version.rb +1 -1
- data/lib/aws-record/record.rb +36 -44
- metadata +13 -8
@@ -5,7 +5,6 @@ require 'date'
|
|
5
5
|
module Aws
|
6
6
|
module Record
|
7
7
|
module Marshalers
|
8
|
-
|
9
8
|
class DateTimeMarshaler
|
10
9
|
def initialize(opts = {})
|
11
10
|
@formatter = opts[:formatter] || Iso8601Formatter
|
@@ -34,11 +33,10 @@ module Aws
|
|
34
33
|
end
|
35
34
|
|
36
35
|
private
|
36
|
+
|
37
37
|
def _format(raw_value)
|
38
38
|
case raw_value
|
39
|
-
when nil
|
40
|
-
nil
|
41
|
-
when ''
|
39
|
+
when nil, ''
|
42
40
|
nil
|
43
41
|
when ::DateTime
|
44
42
|
raw_value
|
@@ -55,7 +53,6 @@ module Aws
|
|
55
53
|
datetime.iso8601
|
56
54
|
end
|
57
55
|
end
|
58
|
-
|
59
56
|
end
|
60
57
|
end
|
61
58
|
end
|
@@ -5,7 +5,6 @@ require 'time'
|
|
5
5
|
module Aws
|
6
6
|
module Record
|
7
7
|
module Marshalers
|
8
|
-
|
9
8
|
class EpochTimeMarshaler
|
10
9
|
def initialize(opts = {})
|
11
10
|
@use_local_time = opts[:use_local_time] ? true : false
|
@@ -36,22 +35,17 @@ module Aws
|
|
36
35
|
|
37
36
|
def _format(raw_value)
|
38
37
|
case raw_value
|
39
|
-
when nil
|
40
|
-
nil
|
41
|
-
when ''
|
38
|
+
when nil, ''
|
42
39
|
nil
|
43
40
|
when ::Time
|
44
41
|
raw_value
|
45
|
-
when Integer # timestamp
|
46
|
-
::Time.at(raw_value)
|
47
|
-
when BigDecimal
|
42
|
+
when Integer, BigDecimal # timestamp
|
48
43
|
::Time.at(raw_value)
|
49
44
|
else # Date, DateTime, or String
|
50
45
|
::Time.parse(raw_value.to_s)
|
51
46
|
end
|
52
47
|
end
|
53
48
|
end
|
54
|
-
|
55
49
|
end
|
56
50
|
end
|
57
51
|
end
|
@@ -3,23 +3,19 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
-
|
7
6
|
class FloatMarshaler
|
8
7
|
def initialize(opts = {})
|
8
|
+
# pass
|
9
9
|
end
|
10
10
|
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
nil
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
nil
|
17
15
|
when Float
|
18
16
|
raw_value
|
19
17
|
else
|
20
|
-
raw_value.respond_to?(:to_f) ?
|
21
|
-
raw_value.to_f :
|
22
|
-
raw_value.to_s.to_f
|
18
|
+
raw_value.respond_to?(:to_f) ? raw_value.to_f : raw_value.to_s.to_f
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -35,7 +31,6 @@ module Aws
|
|
35
31
|
end
|
36
32
|
end
|
37
33
|
end
|
38
|
-
|
39
34
|
end
|
40
35
|
end
|
41
36
|
end
|
@@ -3,23 +3,19 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
-
|
7
6
|
class IntegerMarshaler
|
8
7
|
def initialize(opts = {})
|
8
|
+
# pass
|
9
9
|
end
|
10
10
|
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
nil
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
nil
|
17
15
|
when Integer
|
18
16
|
raw_value
|
19
17
|
else
|
20
|
-
raw_value.respond_to?(:to_i) ?
|
21
|
-
raw_value.to_i :
|
22
|
-
raw_value.to_s.to_i
|
18
|
+
raw_value.respond_to?(:to_i) ? raw_value.to_i : raw_value.to_s.to_i
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -35,7 +31,6 @@ module Aws
|
|
35
31
|
end
|
36
32
|
end
|
37
33
|
end
|
38
|
-
|
39
34
|
end
|
40
35
|
end
|
41
36
|
end
|
@@ -3,16 +3,14 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
-
|
7
6
|
class ListMarshaler
|
8
7
|
def initialize(opts = {})
|
8
|
+
# pass
|
9
9
|
end
|
10
10
|
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
nil
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
nil
|
17
15
|
when Array
|
18
16
|
raw_value
|
@@ -20,8 +18,8 @@ module Aws
|
|
20
18
|
if raw_value.respond_to?(:to_a)
|
21
19
|
raw_value.to_a
|
22
20
|
else
|
23
|
-
msg = "Don't know how to make #{raw_value} of type"\
|
24
|
-
|
21
|
+
msg = "Don't know how to make #{raw_value} of type " \
|
22
|
+
"#{raw_value.class} into an array!"
|
25
23
|
raise ArgumentError, msg
|
26
24
|
end
|
27
25
|
end
|
@@ -39,7 +37,6 @@ module Aws
|
|
39
37
|
end
|
40
38
|
end
|
41
39
|
end
|
42
|
-
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
@@ -3,16 +3,14 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
-
|
7
6
|
class MapMarshaler
|
8
7
|
def initialize(opts = {})
|
8
|
+
# pass
|
9
9
|
end
|
10
10
|
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
nil
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
nil
|
17
15
|
when Hash
|
18
16
|
raw_value
|
@@ -20,8 +18,8 @@ module Aws
|
|
20
18
|
if raw_value.respond_to?(:to_h)
|
21
19
|
raw_value.to_h
|
22
20
|
else
|
23
|
-
msg = "Don't know how to make #{raw_value} of type"\
|
24
|
-
|
21
|
+
msg = "Don't know how to make #{raw_value} of type " \
|
22
|
+
"#{raw_value.class} into a hash!"
|
25
23
|
raise ArgumentError, msg
|
26
24
|
end
|
27
25
|
end
|
@@ -39,7 +37,6 @@ module Aws
|
|
39
37
|
end
|
40
38
|
end
|
41
39
|
end
|
42
|
-
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
@@ -3,16 +3,14 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
+
def initialize(opts = {})
|
7
|
+
# pass
|
8
|
+
end
|
6
9
|
|
7
10
|
class NumericSetMarshaler
|
8
|
-
def initialize(opts = {})
|
9
|
-
end
|
10
|
-
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
Set.new
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
Set.new
|
17
15
|
when Set
|
18
16
|
_as_numeric(raw_value)
|
@@ -20,8 +18,8 @@ module Aws
|
|
20
18
|
if raw_value.respond_to?(:to_set)
|
21
19
|
_as_numeric(raw_value.to_set)
|
22
20
|
else
|
23
|
-
msg = "Don't know how to make #{raw_value} of type"\
|
24
|
-
|
21
|
+
msg = "Don't know how to make #{raw_value} of type " \
|
22
|
+
"#{raw_value.class} into a Numeric Set!"
|
25
23
|
raise ArgumentError, msg
|
26
24
|
end
|
27
25
|
end
|
@@ -42,6 +40,7 @@ module Aws
|
|
42
40
|
end
|
43
41
|
|
44
42
|
private
|
43
|
+
|
45
44
|
def _as_numeric(set)
|
46
45
|
set.collect! do |item|
|
47
46
|
if item.is_a?(Numeric)
|
@@ -52,7 +51,6 @@ module Aws
|
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
55
|
-
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
@@ -3,16 +3,14 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Marshalers
|
6
|
-
|
7
6
|
class StringSetMarshaler
|
8
7
|
def initialize(opts = {})
|
8
|
+
# pass
|
9
9
|
end
|
10
10
|
|
11
11
|
def type_cast(raw_value)
|
12
12
|
case raw_value
|
13
|
-
when nil
|
14
|
-
Set.new
|
15
|
-
when ''
|
13
|
+
when nil, ''
|
16
14
|
Set.new
|
17
15
|
when Set
|
18
16
|
_as_strings(raw_value)
|
@@ -20,8 +18,8 @@ module Aws
|
|
20
18
|
if raw_value.respond_to?(:to_set)
|
21
19
|
_as_strings(raw_value.to_set)
|
22
20
|
else
|
23
|
-
msg = "Don't know how to make #{raw_value} of type"\
|
24
|
-
|
21
|
+
msg = "Don't know how to make #{raw_value} of type " \
|
22
|
+
"#{raw_value.class} into a String Set!"
|
25
23
|
raise ArgumentError, msg
|
26
24
|
end
|
27
25
|
end
|
@@ -42,6 +40,7 @@ module Aws
|
|
42
40
|
end
|
43
41
|
|
44
42
|
private
|
43
|
+
|
45
44
|
def _as_strings(set)
|
46
45
|
set.collect! do |item|
|
47
46
|
if item.is_a?(String)
|
@@ -52,7 +51,6 @@ module Aws
|
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
55
|
-
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
@@ -5,7 +5,6 @@ require 'time'
|
|
5
5
|
module Aws
|
6
6
|
module Record
|
7
7
|
module Marshalers
|
8
|
-
|
9
8
|
class TimeMarshaler
|
10
9
|
def initialize(opts = {})
|
11
10
|
@formatter = opts[:formatter] || Iso8601Formatter
|
@@ -37,9 +36,7 @@ module Aws
|
|
37
36
|
|
38
37
|
def _format(raw_value)
|
39
38
|
case raw_value
|
40
|
-
when nil
|
41
|
-
nil
|
42
|
-
when ''
|
39
|
+
when nil, ''
|
43
40
|
nil
|
44
41
|
when ::Time
|
45
42
|
raw_value
|
@@ -56,7 +53,6 @@ module Aws
|
|
56
53
|
time.iso8601
|
57
54
|
end
|
58
55
|
end
|
59
|
-
|
60
56
|
end
|
61
57
|
end
|
62
58
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
|
-
|
6
5
|
# @api private
|
7
6
|
class ModelAttributes
|
8
7
|
attr_reader :attributes, :storage_attributes
|
@@ -21,7 +20,7 @@ module Aws
|
|
21
20
|
attribute
|
22
21
|
end
|
23
22
|
|
24
|
-
def register_superclass_attribute
|
23
|
+
def register_superclass_attribute(name, attribute)
|
25
24
|
_new_attr_validation(name, attribute)
|
26
25
|
@attributes[name] = attribute.dup
|
27
26
|
@storage_attributes[attribute.database_name] = name
|
@@ -45,6 +44,7 @@ module Aws
|
|
45
44
|
end
|
46
45
|
|
47
46
|
private
|
47
|
+
|
48
48
|
def _new_attr_validation(name, attribute)
|
49
49
|
_validate_attr_name(name)
|
50
50
|
_check_for_naming_collisions(name, attribute.database_name)
|
@@ -52,44 +52,32 @@ module Aws
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def _validate_attr_name(name)
|
55
|
-
unless name.is_a?(Symbol)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
raise Errors::NameCollision.new(
|
60
|
-
"Cannot overwrite existing attribute #{name}"
|
61
|
-
)
|
62
|
-
end
|
55
|
+
raise ArgumentError, 'Must use symbolized :name attribute.' unless name.is_a?(Symbol)
|
56
|
+
return unless @attributes[name]
|
57
|
+
|
58
|
+
raise Errors::NameCollision, "Cannot overwrite existing attribute #{name}"
|
63
59
|
end
|
64
60
|
|
65
61
|
def _check_if_reserved(name)
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
)
|
71
|
-
end
|
62
|
+
return unless @model_class.instance_methods.include?(name)
|
63
|
+
|
64
|
+
raise Errors::ReservedName, "Cannot name an attribute #{name}, that would collide with an " \
|
65
|
+
'existing instance method.'
|
72
66
|
end
|
73
67
|
|
74
68
|
def _check_for_naming_collisions(name, storage_name)
|
75
69
|
if @attributes[storage_name.to_sym]
|
76
|
-
raise Errors::NameCollision
|
77
|
-
|
78
|
-
" attribute name in #{@attributes}"
|
79
|
-
)
|
70
|
+
raise Errors::NameCollision, "Custom storage name #{storage_name} already exists as an " \
|
71
|
+
"attribute name in #{@attributes}"
|
80
72
|
elsif @storage_attributes[name.to_s]
|
81
|
-
raise Errors::NameCollision
|
82
|
-
|
83
|
-
" name in #{@storage_attributes}"
|
84
|
-
)
|
73
|
+
raise Errors::NameCollision, "Attribute name #{name} already exists as a custom storage " \
|
74
|
+
"name in #{@storage_attributes}"
|
85
75
|
elsif @storage_attributes[storage_name]
|
86
|
-
raise Errors::NameCollision
|
87
|
-
|
88
|
-
|
89
|
-
)
|
76
|
+
raise Errors::NameCollision, "Custom storage name #{storage_name} already in use in " \
|
77
|
+
"#{@storage_attributes}"
|
78
|
+
|
90
79
|
end
|
91
80
|
end
|
92
81
|
end
|
93
|
-
|
94
82
|
end
|
95
83
|
end
|
@@ -3,18 +3,16 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module Query
|
6
|
-
|
7
6
|
# @api private
|
8
7
|
def self.included(sub_class)
|
9
8
|
sub_class.extend(QueryClassMethods)
|
10
9
|
end
|
11
10
|
|
12
11
|
module QueryClassMethods
|
13
|
-
|
14
12
|
# This method calls
|
15
|
-
# {http://docs.aws.amazon.com/
|
16
|
-
# populating the +:table_name+ parameter from the model
|
17
|
-
# combining this with the other parameters you provide.
|
13
|
+
# {http://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#query-instance_method
|
14
|
+
# Aws::DynamoDB::Client#query}, populating the +:table_name+ parameter from the model
|
15
|
+
# class, and combining this with the other parameters you provide.
|
18
16
|
#
|
19
17
|
# @example A query with key and filter expressions:
|
20
18
|
# # Example model class
|
@@ -46,7 +44,7 @@ module Aws
|
|
46
44
|
# end
|
47
45
|
#
|
48
46
|
# @param [Hash] opts options to pass on to the client call to +#query+.
|
49
|
-
# See the documentation above in the AWS SDK for Ruby
|
47
|
+
# See the documentation above in the AWS SDK for Ruby V3.
|
50
48
|
# @return [Aws::Record::ItemCollection] an enumerable collection of the
|
51
49
|
# query result.
|
52
50
|
def query(opts)
|
@@ -55,9 +53,9 @@ module Aws
|
|
55
53
|
end
|
56
54
|
|
57
55
|
# This method calls
|
58
|
-
# {http://docs.aws.amazon.com/
|
59
|
-
# populating the +:table_name+ parameter from the model
|
60
|
-
# combining this with the other parameters you provide.
|
56
|
+
# {http://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Client.html#scan-instance_method
|
57
|
+
# Aws::DynamoDB::Client#scan}, populating the +:table_name+ parameter from the model
|
58
|
+
# class, and combining this with the other parameters you provide.
|
61
59
|
#
|
62
60
|
# @example A scan with a filter expression:
|
63
61
|
# # Example model class
|
@@ -84,7 +82,7 @@ module Aws
|
|
84
82
|
# end
|
85
83
|
#
|
86
84
|
# @param [Hash] opts options to pass on to the client call to +#scan+.
|
87
|
-
# See the documentation above in the AWS SDK for Ruby
|
85
|
+
# See the documentation above in the AWS SDK for Ruby V3.
|
88
86
|
# @return [Aws::Record::ItemCollection] an enumerable collection of the
|
89
87
|
# scan result.
|
90
88
|
def scan(opts = {})
|
@@ -140,7 +138,6 @@ module Aws
|
|
140
138
|
)
|
141
139
|
end
|
142
140
|
end
|
143
|
-
|
144
141
|
end
|
145
142
|
end
|
146
143
|
end
|
@@ -3,27 +3,24 @@
|
|
3
3
|
module Aws
|
4
4
|
module Record
|
5
5
|
module SecondaryIndexes
|
6
|
-
|
7
6
|
# @api private
|
8
7
|
def self.included(sub_class)
|
9
|
-
sub_class.instance_variable_set(
|
10
|
-
sub_class.instance_variable_set(
|
8
|
+
sub_class.instance_variable_set('@local_secondary_indexes', {})
|
9
|
+
sub_class.instance_variable_set('@global_secondary_indexes', {})
|
11
10
|
sub_class.extend(SecondaryIndexesClassMethods)
|
12
|
-
if Aws::Record.extends_record?(sub_class)
|
13
|
-
inherit_indexes(sub_class)
|
14
|
-
end
|
11
|
+
inherit_indexes(sub_class) if Aws::Record.extends_record?(sub_class)
|
15
12
|
end
|
16
13
|
|
17
|
-
private
|
18
14
|
def self.inherit_indexes(klass)
|
19
|
-
superclass_lsi = klass.superclass.instance_variable_get(
|
20
|
-
superclass_gsi = klass.superclass.instance_variable_get(
|
21
|
-
klass.instance_variable_set(
|
22
|
-
klass.instance_variable_set(
|
15
|
+
superclass_lsi = klass.superclass.instance_variable_get('@local_secondary_indexes').dup
|
16
|
+
superclass_gsi = klass.superclass.instance_variable_get('@global_secondary_indexes').dup
|
17
|
+
klass.instance_variable_set('@local_secondary_indexes', superclass_lsi)
|
18
|
+
klass.instance_variable_set('@global_secondary_indexes', superclass_gsi)
|
23
19
|
end
|
24
20
|
|
25
|
-
|
21
|
+
private_class_method :inherit_indexes
|
26
22
|
|
23
|
+
module SecondaryIndexesClassMethods
|
27
24
|
# Creates a local secondary index for the model. Learn more about Local
|
28
25
|
# Secondary Indexes in the
|
29
26
|
# {http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html Amazon DynamoDB Developer Guide}.
|
@@ -33,11 +30,11 @@ module Aws
|
|
33
30
|
# @param [Symbol] name index name for this local secondary index
|
34
31
|
# @param [Hash] opts
|
35
32
|
# @option opts [Symbol] :range_key the range key used by this local
|
36
|
-
#
|
37
|
-
#
|
33
|
+
# secondary index. Note that the hash key MUST be the table's hash
|
34
|
+
# key, and so that value will be filled in for you.
|
38
35
|
# @option opts [Hash] :projection a hash which defines which attributes
|
39
|
-
#
|
40
|
-
#
|
36
|
+
# are copied from the table to the index. See shape details in the
|
37
|
+
# {http://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Types/Projection.html AWS SDK for Ruby V3 docs}.
|
41
38
|
def local_secondary_index(name, opts)
|
42
39
|
opts[:hash_key] = hash_key
|
43
40
|
_validate_required_lsi_keys(opts)
|
@@ -53,18 +50,18 @@ module Aws
|
|
53
50
|
# @param [Symbol] name index name for this global secondary index
|
54
51
|
# @param [Hash] opts
|
55
52
|
# @option opts [Symbol] :hash_key the hash key used by this global
|
56
|
-
#
|
53
|
+
# secondary index.
|
57
54
|
# @option opts [Symbol] :range_key the range key used by this global
|
58
|
-
#
|
55
|
+
# secondary index.
|
59
56
|
# @option opts [Hash] :projection a hash which defines which attributes
|
60
|
-
#
|
61
|
-
#
|
57
|
+
# are copied from the table to the index. See shape details in the
|
58
|
+
# {http://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/DynamoDB/Types/Projection.html AWS SDK for Ruby V3 docs}.
|
62
59
|
def global_secondary_index(name, opts)
|
63
60
|
_validate_required_gsi_keys(opts)
|
64
61
|
global_secondary_indexes[name] = opts
|
65
62
|
end
|
66
63
|
|
67
|
-
# Returns hash of local secondary index names to the index
|
64
|
+
# Returns hash of local secondary index names to the index's attributes.
|
68
65
|
#
|
69
66
|
# *Note*: +local_secondary_indexes+ is inherited from a parent model when {#local_secondary_index}
|
70
67
|
# is explicitly specified in the parent.
|
@@ -74,7 +71,7 @@ module Aws
|
|
74
71
|
@local_secondary_indexes
|
75
72
|
end
|
76
73
|
|
77
|
-
# Returns hash of global secondary index names to the index
|
74
|
+
# Returns hash of global secondary index names to the index's attributes.
|
78
75
|
#
|
79
76
|
# *Note*: +global_secondary_indexes+ is inherited from a parent model when {#global_secondary_index}
|
80
77
|
# is explicitly specified in the parent.
|
@@ -99,9 +96,11 @@ module Aws
|
|
99
96
|
end
|
100
97
|
|
101
98
|
private
|
99
|
+
|
102
100
|
def _migration_format_indexes(indexes)
|
103
101
|
return nil if indexes.empty?
|
104
|
-
|
102
|
+
|
103
|
+
indexes.collect do |name, opts|
|
105
104
|
h = { index_name: name }
|
106
105
|
h[:key_schema] = _si_key_schema(opts)
|
107
106
|
hk = opts.delete(:hash_key)
|
@@ -111,17 +110,16 @@ module Aws
|
|
111
110
|
opts[:range_key] = rk if rk
|
112
111
|
h
|
113
112
|
end
|
114
|
-
mfi
|
115
113
|
end
|
116
114
|
|
117
115
|
def _si_key_schema(opts)
|
118
116
|
key_schema = [{
|
119
|
-
key_type:
|
117
|
+
key_type: 'HASH',
|
120
118
|
attribute_name: @attributes.storage_name_for(opts[:hash_key])
|
121
119
|
}]
|
122
120
|
if opts[:range_key]
|
123
121
|
key_schema << {
|
124
|
-
key_type:
|
122
|
+
key_type: 'RANGE',
|
125
123
|
attribute_name: @attributes.storage_name_for(opts[:range_key])
|
126
124
|
}
|
127
125
|
end
|
@@ -129,43 +127,34 @@ module Aws
|
|
129
127
|
end
|
130
128
|
|
131
129
|
def _validate_required_lsi_keys(params)
|
132
|
-
|
133
|
-
|
134
|
-
else
|
135
|
-
raise ArgumentError.new(
|
136
|
-
"Local Secondary Indexes require a hash and range key!"
|
137
|
-
)
|
130
|
+
unless params[:hash_key] && params[:range_key]
|
131
|
+
raise ArgumentError, 'Local Secondary Indexes require a hash and range key!'
|
138
132
|
end
|
133
|
+
|
134
|
+
_validate_attributes_exist(params[:hash_key], params[:range_key])
|
139
135
|
end
|
140
136
|
|
141
137
|
def _validate_required_gsi_keys(params)
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
_validate_attributes_exist(params[:hash_key])
|
147
|
-
end
|
138
|
+
raise ArgumentError, 'Global Secondary Indexes require at least a hash key!' unless params[:hash_key]
|
139
|
+
|
140
|
+
if params[:range_key]
|
141
|
+
_validate_attributes_exist(params[:hash_key], params[:range_key])
|
148
142
|
else
|
149
|
-
|
150
|
-
"Global Secondary Indexes require at least a hash key!"
|
151
|
-
)
|
143
|
+
_validate_attributes_exist(params[:hash_key])
|
152
144
|
end
|
153
145
|
end
|
154
146
|
|
155
147
|
def _validate_attributes_exist(*attr_names)
|
156
|
-
missing = attr_names.
|
157
|
-
|
158
|
-
end
|
159
|
-
unless missing.empty?
|
160
|
-
raise ArgumentError.new(
|
161
|
-
"#{missing.join(", ")} not present in model attributes."\
|
162
|
-
" Please ensure that attributes are defined in the model"\
|
163
|
-
" class BEFORE defining an index on those attributes."
|
164
|
-
)
|
148
|
+
missing = attr_names.reject do |attr_name|
|
149
|
+
@attributes.present?(attr_name)
|
165
150
|
end
|
151
|
+
return if missing.empty?
|
152
|
+
|
153
|
+
raise ArgumentError, "#{missing.join(', ')} not present in model attributes. " \
|
154
|
+
'Please ensure that attributes are defined in the model ' \
|
155
|
+
'class BEFORE defining an index on those attributes.'
|
166
156
|
end
|
167
157
|
end
|
168
|
-
|
169
158
|
end
|
170
159
|
end
|
171
160
|
end
|