dymos 0.1.4 → 0.2.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/README.md +71 -2
- data/lib/dymos/client.rb +16 -0
- data/lib/dymos/config.rb +34 -0
- data/lib/dymos/model.rb +109 -26
- data/lib/dymos/persistence.rb +75 -16
- data/lib/dymos/query/base.rb +23 -0
- data/lib/dymos/query/create_table.rb +72 -0
- data/lib/dymos/query/delete_item.rb +60 -32
- data/lib/dymos/query/describe.rb +3 -5
- data/lib/dymos/query/get_item.rb +30 -9
- data/lib/dymos/query/put_item.rb +67 -41
- data/lib/dymos/query/query.rb +112 -26
- data/lib/dymos/query/scan.rb +85 -12
- data/lib/dymos/query/update_item.rb +97 -50
- data/lib/dymos/version.rb +1 -1
- data/lib/dymos.rb +6 -4
- data/spec/lib/dymos/client_spec.rb +4 -0
- data/spec/lib/dymos/config_spec.rb +11 -0
- data/spec/lib/dymos/data.yml +154 -0
- data/spec/lib/dymos/model_spec.rb +23 -29
- data/spec/lib/dymos/query/create_table_spec.rb +56 -0
- data/spec/lib/dymos/query/delete_item_spec.rb +22 -79
- data/spec/lib/dymos/query/describe_spec.rb +6 -40
- data/spec/lib/dymos/query/get_item_spec.rb +8 -47
- data/spec/lib/dymos/query/put_item_spec.rb +45 -301
- data/spec/lib/dymos/query/query_spec.rb +45 -95
- data/spec/lib/dymos/query/scan_spec.rb +49 -43
- data/spec/lib/dymos/query/update_item_spec.rb +36 -113
- data/spec/lib/dymos/query_spec.rb +150 -0
- data/spec/spec_helper.rb +33 -0
- metadata +16 -12
- data/lib/dymos/command.rb +0 -36
- data/lib/dymos/query/attribute.rb +0 -14
- data/lib/dymos/query/builder.rb +0 -79
- data/lib/dymos/query/expect.rb +0 -65
- data/spec/lib/dymos/query/attribute_spec.rb +0 -15
- data/spec/lib/dymos/query/builder_spec.rb +0 -23
- data/spec/lib/dymos/query/expect_spec.rb +0 -5
data/lib/dymos/query/get_item.rb
CHANGED
@@ -1,18 +1,39 @@
|
|
1
1
|
module Dymos
|
2
2
|
module Query
|
3
|
-
class GetItem <
|
3
|
+
class GetItem < Base
|
4
4
|
|
5
|
-
def
|
6
|
-
|
5
|
+
def command
|
6
|
+
'get_item'
|
7
|
+
end
|
8
|
+
|
9
|
+
def key(value)
|
10
|
+
@query[:key] = value.deep_stringify_keys
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def attributes(*value)
|
15
|
+
@query[:attributes_to_get] = value
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def consistent_read(value)
|
20
|
+
@query[:consistent_read] = value
|
7
21
|
self
|
8
22
|
end
|
9
23
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
24
|
+
def return_consumed_capacity(value)
|
25
|
+
@query[:return_consumed_capacity] = value.to_s.upcase
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def projection_expression(value)
|
30
|
+
@query[:projection_expression] = value
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def expression_attribute_names(value)
|
35
|
+
@query[:expression_attribute_names] = value.deep_stringify_keys
|
36
|
+
self
|
16
37
|
end
|
17
38
|
end
|
18
39
|
end
|
data/lib/dymos/query/put_item.rb
CHANGED
@@ -1,48 +1,74 @@
|
|
1
1
|
module Dymos
|
2
2
|
module Query
|
3
|
-
class PutItem <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end]
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def query
|
30
|
-
data = {
|
31
|
-
table_name: @table_name.to_s,
|
32
|
-
item: @item,
|
33
|
-
return_values: @return_values || 'ALL_OLD',
|
34
|
-
# return_consumed_capacity: @return_consumed_capacity || 'TOTAL',
|
35
|
-
# return_item_collection_metrics: @return_item_collection_metrics || 'SIZE',
|
36
|
-
}
|
37
|
-
|
38
|
-
if @expected.present?
|
39
|
-
data[:expected] = @expected
|
40
|
-
if @expected.size > 1
|
41
|
-
data[:conditional_operator] = @conditional_operator || 'AND'
|
42
|
-
end
|
3
|
+
class PutItem < Base
|
4
|
+
def command
|
5
|
+
'put_item'
|
6
|
+
end
|
7
|
+
|
8
|
+
def item(value)
|
9
|
+
@query[:item] = value.deep_stringify_keys
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def expected(value)
|
14
|
+
value.map { |v| add_expected(*v) }
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_expected(*value)
|
19
|
+
if value.count == 2
|
20
|
+
column, operator, value = value[0], :eq, value[1]
|
21
|
+
else
|
22
|
+
column, operator, value = value
|
43
23
|
end
|
44
|
-
|
24
|
+
@query[:expected] ||= {}
|
25
|
+
@query[:expected].store(*_add_expected(column, operator, value))
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def _add_expected(column, operator, value)
|
30
|
+
[column.to_s, {
|
31
|
+
attribute_value_list: ([:BETWEEN, :IN].include? operator) ? [*value] : [value],
|
32
|
+
comparison_operator: operator.to_s.upcase
|
33
|
+
}
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
def return_values(value)
|
38
|
+
@query[:return_values] = value.to_s.upcase
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def return_consumed_capacity(value)
|
43
|
+
@query[:return_consumed_capacity] = value.to_s.upcase
|
44
|
+
self
|
45
45
|
end
|
46
|
+
|
47
|
+
def return_item_collection_metrics(value)
|
48
|
+
@query[:return_item_collection_metrics] = value.to_s.upcase
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def conditional_operator(value)
|
53
|
+
@query[:conditional_operator] = value.to_s.upcase
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def condition_expression(value)
|
58
|
+
@query[:condition_expression] = value
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
def expression_attribute_names(value)
|
63
|
+
@query[:expression_attribute_names] = value.deep_stringify_keys
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
def expression_attribute_values(value)
|
68
|
+
@query[:expression_attribute_values] = value.deep_stringify_keys
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
46
72
|
end
|
47
73
|
end
|
48
74
|
end
|
data/lib/dymos/query/query.rb
CHANGED
@@ -1,40 +1,126 @@
|
|
1
1
|
module Dymos
|
2
2
|
module Query
|
3
|
-
class Query <
|
3
|
+
class Query < Base
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
5
|
+
def command
|
6
|
+
'query'
|
7
|
+
end
|
8
|
+
|
9
|
+
def index(value)
|
10
|
+
@query[:index_name] = value.to_s
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def attributes(*value)
|
15
|
+
@query[:attributes_to_get] = value
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def limit(value)
|
20
|
+
@query[:limit] = value
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def consistent_read(value)
|
25
|
+
@query[:consistent_read] = value
|
26
|
+
self
|
27
|
+
end
|
18
28
|
|
19
|
-
|
29
|
+
def where(*value)
|
30
|
+
if value.count == 1 && value[0].is_a?(Hash)
|
31
|
+
value[0].each { |k, v| add_conditions(k, :eq, v) }
|
32
|
+
else
|
33
|
+
value.each { |v| add_conditions(*v) }
|
34
|
+
end
|
20
35
|
self
|
21
36
|
end
|
22
37
|
|
23
|
-
def
|
24
|
-
|
38
|
+
def conditions(value)
|
39
|
+
value.map { |v| add_conditions(*v) }
|
25
40
|
self
|
26
41
|
end
|
27
42
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
}
|
34
|
-
if @index_name.present?
|
35
|
-
data[:index_name] = @index_name.to_s
|
43
|
+
def add_conditions(*value)
|
44
|
+
if value.count == 2
|
45
|
+
column, operator, value = value[0], :eq, value[1]
|
46
|
+
else
|
47
|
+
column, operator, value = value
|
36
48
|
end
|
37
|
-
|
49
|
+
@query[:key_conditions] ||= {}
|
50
|
+
@query[:key_conditions].store(*_add_filter(column, operator, value))
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def comparison_operator(value)
|
56
|
+
@query[:comparison_operator] = value.to_s.upcase
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
def filter(value, operator='AND')
|
61
|
+
value.map { |v| add_filter(*v) }
|
62
|
+
filter_operator operator.to_s.upcase if value.count > 1
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_filter(*value)
|
67
|
+
if value.count == 2
|
68
|
+
column, operator, value = value[0], :eq, value[1]
|
69
|
+
else
|
70
|
+
column, operator, value = value
|
71
|
+
end
|
72
|
+
@query[:query_filter] ||= {}
|
73
|
+
@query[:query_filter].store(*_add_filter(column, operator, value))
|
74
|
+
filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:query_filter].count > 1
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
def _add_filter(column, operator, value)
|
79
|
+
[column.to_s, {
|
80
|
+
attribute_value_list: [*value],
|
81
|
+
comparison_operator: operator.to_s.upcase
|
82
|
+
}
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
86
|
+
def filter_operator(value)
|
87
|
+
@query[:conditional_operator] = value.to_s.upcase
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
def asc
|
92
|
+
scan_index_forward true
|
93
|
+
end
|
94
|
+
|
95
|
+
def desc
|
96
|
+
scan_index_forward false
|
97
|
+
end
|
98
|
+
|
99
|
+
def scan_index_forward(value)
|
100
|
+
@query[:scan_index_forward] = value
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
def exclusive_start_key(value)
|
105
|
+
@query[:exclusive_start_key] = value.deep_stringify_keys
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
alias :start_key :exclusive_start_key
|
110
|
+
|
111
|
+
def return_consumed_capacity(value)
|
112
|
+
@query[:return_consumed_capacity] = value.to_s.upcase
|
113
|
+
self
|
114
|
+
end
|
115
|
+
|
116
|
+
def projection_expression(value)
|
117
|
+
@query[:projection_expression] = value
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
def expression_attribute_names(value)
|
122
|
+
@query[:expression_attribute_names] = value.deep_stringify_keys
|
123
|
+
self
|
38
124
|
end
|
39
125
|
end
|
40
126
|
end
|
data/lib/dymos/query/scan.rb
CHANGED
@@ -1,25 +1,98 @@
|
|
1
1
|
module Dymos
|
2
2
|
module Query
|
3
|
-
class Scan <
|
3
|
+
class Scan < Base
|
4
|
+
def command
|
5
|
+
'scan'
|
6
|
+
end
|
7
|
+
|
8
|
+
def attributes(*value)
|
9
|
+
@query[:attributes_to_get] = value
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def limit(value)
|
14
|
+
@query[:limit] = value
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def select(value)
|
19
|
+
@query[:select] = value
|
20
|
+
self
|
21
|
+
end
|
4
22
|
|
5
|
-
def
|
6
|
-
|
23
|
+
def filter(value, operator='AND')
|
24
|
+
value.map { |v| add_filter(*v) }
|
25
|
+
filter_operator operator.to_s.upcase if value.count > 1
|
7
26
|
self
|
8
27
|
end
|
9
28
|
|
10
|
-
def
|
11
|
-
|
29
|
+
def add_filter(*value)
|
30
|
+
if value.count == 2
|
31
|
+
column, operator, value = value[0], :eq, value[1]
|
32
|
+
else
|
33
|
+
column, operator, value = value
|
34
|
+
end
|
35
|
+
@query[:scan_filter] ||= {}
|
36
|
+
@query[:scan_filter].store(*_add_filter(column, operator, value))
|
37
|
+
filter_operator 'AND' if @query[:conditional_operator].blank? && @query[:scan_filter].count > 1
|
12
38
|
self
|
13
39
|
end
|
14
40
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
41
|
+
def _add_filter(column, operator, value)
|
42
|
+
[column.to_s, {
|
43
|
+
attribute_value_list: [*value],
|
44
|
+
comparison_operator: operator.to_s.upcase
|
45
|
+
}
|
46
|
+
]
|
47
|
+
end
|
48
|
+
|
49
|
+
def filter_operator(value)
|
50
|
+
@query[:conditional_operator] = value.to_s.upcase
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
def exclusive_start_key(value)
|
55
|
+
@query[:exclusive_start_key] = value.deep_stringify_keys
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
alias :start_key :exclusive_start_key
|
60
|
+
|
61
|
+
def return_consumed_capacity(value)
|
62
|
+
@query[:return_consumed_capacity] = value.to_s.upcase
|
63
|
+
self
|
22
64
|
end
|
65
|
+
|
66
|
+
def total_segments(value)
|
67
|
+
@query[:total_segments] = value
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
def segment(value)
|
72
|
+
@query[:segment] = value
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
def projection_expression(value)
|
77
|
+
@query[:projection_expression] = value
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
def filter_expression(value)
|
82
|
+
@query[:filter_expression] = value
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def expression_attribute_names(value)
|
87
|
+
@query[:expression_attribute_names] = value.deep_stringify_keys
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
def expression_attribute_values(value)
|
92
|
+
@query[:expression_attribute_values] = value.deep_stringify_keys
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
23
96
|
end
|
24
97
|
end
|
25
98
|
end
|
@@ -1,72 +1,119 @@
|
|
1
1
|
module Dymos
|
2
2
|
module Query
|
3
|
-
class UpdateItem <
|
3
|
+
class UpdateItem < Base
|
4
|
+
def command
|
5
|
+
'update_item'
|
6
|
+
end
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
def key(name)
|
8
|
-
@key = name
|
8
|
+
def key(value)
|
9
|
+
@query[:key] = value.deep_stringify_keys
|
9
10
|
self
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
# @return [self]
|
15
|
-
def attribute_updates(param, action="put")
|
16
|
-
@attribute_updates||={}
|
17
|
-
param.each { |key, value|
|
18
|
-
@attribute_updates[key] = {
|
19
|
-
value: value,
|
20
|
-
action: action.upcase
|
21
|
-
}
|
22
|
-
}
|
13
|
+
def add(column, value)
|
14
|
+
add_attribute_updates(column, :add, value)
|
23
15
|
self
|
24
16
|
end
|
25
17
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
operator, values = expression.split(' ', 2)
|
31
|
-
if values.nil?
|
32
|
-
[name, ::Dymos::Query::Expect.new.condition(operator, nil).data]
|
33
|
-
else
|
34
|
-
value1, value2 = values.split(' ')
|
35
|
-
if value2.present?
|
36
|
-
[name, ::Dymos::Query::Expect.new.condition(operator, values).data]
|
37
|
-
else
|
38
|
-
[name, ::Dymos::Query::Expect.new.condition(operator, value1).data]
|
39
|
-
end
|
40
|
-
end
|
18
|
+
def put(column, value)
|
19
|
+
add_attribute_updates(column, :put, value)
|
20
|
+
self
|
21
|
+
end
|
41
22
|
|
42
|
-
|
23
|
+
def delete(column, value)
|
24
|
+
add_attribute_updates(column, :delete, value)
|
43
25
|
self
|
44
26
|
end
|
45
27
|
|
46
|
-
|
47
|
-
|
48
|
-
def return_values(value)
|
49
|
-
@return_values = value.upcase
|
28
|
+
def attribute_updates(*value)
|
29
|
+
value.map { |v| add_attribute_updates(*v) }
|
50
30
|
self
|
51
31
|
end
|
52
32
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
33
|
+
def add_attribute_updates(*value)
|
34
|
+
if value.count == 2
|
35
|
+
column, operator, value = value[0], :put, value[1]
|
36
|
+
else
|
37
|
+
column, operator, value = value
|
38
|
+
end
|
39
|
+
@query[:attribute_updates] ||= {}
|
40
|
+
@query[:attribute_updates].store(*_attribute_updates(column, operator, value))
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def _attribute_updates(column, action, value)
|
45
|
+
[column.to_s, {
|
46
|
+
value: value,
|
47
|
+
action: action.to_s.upcase
|
48
|
+
}
|
49
|
+
]
|
50
|
+
end
|
61
51
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
52
|
+
def expected(value)
|
53
|
+
value.map { |v| add_expected(*v) }
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_expected(*value)
|
58
|
+
if value.count == 2
|
59
|
+
column, operator, value = value[0], :eq, value[1]
|
60
|
+
else
|
61
|
+
column, operator, value = value
|
67
62
|
end
|
68
|
-
|
63
|
+
@query[:expected] ||= {}
|
64
|
+
@query[:expected].store(*_add_expected(column, operator, value))
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
def _add_expected(column, operator, value)
|
69
|
+
[column.to_s, {
|
70
|
+
attribute_value_list: ([:BETWEEN, :IN].include? operator) ? [*value] : [value],
|
71
|
+
comparison_operator: operator.to_s.upcase
|
72
|
+
}
|
73
|
+
]
|
74
|
+
end
|
75
|
+
|
76
|
+
def conditional_operator(value)
|
77
|
+
@query[:conditional_operator] = value.to_s.upcase
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def return_values(value)
|
83
|
+
@query[:return_values] = value.to_s.upcase
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
def return_consumed_capacity(value)
|
88
|
+
@query[:return_consumed_capacity] = value.to_s.upcase
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def return_item_collection_metrics(value)
|
93
|
+
@query[:return_item_collection_metrics] = value.to_s.upcase
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def update_expression(value)
|
98
|
+
@query[:update_expression] = value
|
99
|
+
self
|
69
100
|
end
|
101
|
+
|
102
|
+
def condition_expression(value)
|
103
|
+
@query[:condition_expression] = value
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def expression_attribute_names(value)
|
108
|
+
@query[:expression_attribute_names] = value.deep_stringify_keys
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
def expression_attribute_values(value)
|
113
|
+
@query[:expression_attribute_values] = value.deep_stringify_keys
|
114
|
+
self
|
115
|
+
end
|
116
|
+
|
70
117
|
end
|
71
118
|
end
|
72
119
|
end
|
data/lib/dymos/version.rb
CHANGED
data/lib/dymos.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require "dymos/
|
1
|
+
require 'active_support/all'
|
2
|
+
|
3
|
+
require "dymos/config"
|
4
|
+
require "dymos/query/base"
|
4
5
|
require "dymos/query/put_item"
|
5
6
|
require "dymos/query/update_item"
|
6
7
|
require "dymos/query/delete_item"
|
@@ -8,10 +9,11 @@ require "dymos/query/get_item"
|
|
8
9
|
require "dymos/query/describe"
|
9
10
|
require "dymos/query/scan"
|
10
11
|
require "dymos/query/query"
|
12
|
+
require "dymos/query/create_table"
|
11
13
|
require "dymos/attribute"
|
12
|
-
require "dymos/command"
|
13
14
|
require "dymos/persistence"
|
14
15
|
require "dymos/model"
|
16
|
+
require "dymos/client"
|
15
17
|
require "dymos/version"
|
16
18
|
|
17
19
|
module Dymos
|