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
@@ -1,319 +1,63 @@
|
|
1
1
|
describe Dymos::Query::PutItem do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
{attribute_name: 'id', attribute_type: 'S'},
|
14
|
-
],
|
15
|
-
key_schema: [
|
16
|
-
{attribute_name: 'id', key_type: 'HASH'}
|
17
|
-
],
|
18
|
-
provisioned_throughput: {
|
19
|
-
read_capacity_units: 1,
|
20
|
-
write_capacity_units: 1,
|
21
|
-
})
|
22
|
-
client.put_item(table_name: 'test_put_item', item: {id: 'hoge', name: '太郎'})
|
23
|
-
client.put_item(table_name: 'test_put_item', item: {id: 'fuga', category_id: 1})
|
24
|
-
|
25
|
-
class TestItem < Dymos::Model
|
26
|
-
table :test_put_item
|
27
|
-
field :id, :string
|
28
|
-
field :name, :string
|
2
|
+
describe 'build query', order: :defined do
|
3
|
+
let(:builder) { Dymos::Query::PutItem.new }
|
4
|
+
let(:table) { 'test_put_item_table' }
|
5
|
+
|
6
|
+
it do
|
7
|
+
@client.delete_table(table_name: table) if @client.list_tables[:table_names].include?(table)
|
8
|
+
query=Dymos::Query::CreateTable.new.name(table).attributes(id: 'S').keys(id: 'HASH').build
|
9
|
+
@client.create_table(query)
|
10
|
+
@client.put_item(table_name: table, item: {id: 'hoge', param1: 101, param2: 201, param3: "hoge", param4: [1, 0, 1]})
|
11
|
+
@client.put_item(table_name: table, item: {id: 'fuga', param1: 102, param2: 202, param3: "fuga", param4: [1, 0, 2]})
|
12
|
+
@client.put_item(table_name: table, item: {id: 'piyo', param1: 103, param2: 203, param3: "piyo", param4: [1, 0, 3]})
|
29
13
|
end
|
30
|
-
end
|
31
14
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
table_name: "test_put_item",
|
39
|
-
item: {id: "foo", name: "John"},
|
40
|
-
return_values: "ALL_OLD",
|
41
|
-
})
|
42
|
-
end
|
15
|
+
it :create do
|
16
|
+
data={id: 'poyo', param1: 104, param2: 204, param3: "poyo", param4: [1, 0, 4]}
|
17
|
+
builder.name(table).item(data).return_values(:ALL_OLD)
|
18
|
+
result = @client.put_item builder.build
|
19
|
+
expect(result.error).to eq(nil)
|
20
|
+
expect(result.attributes).to eq(nil)
|
43
21
|
|
44
|
-
|
45
|
-
|
46
|
-
query = TestItem.put.item(id: "foo", name: "John")
|
47
|
-
result = query.execute client
|
48
|
-
expect(result).to eq(nil)
|
22
|
+
res = @client.get_item(table_name: table, key: {id: 'poyo'})
|
23
|
+
expect(res.item.to_hash).to eq(data.deep_stringify_keys)
|
49
24
|
end
|
50
25
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# item: {id: "hoge", name: "次郎"},
|
56
|
-
# :expected => {:name => {:value => "太郎", :comparison_operator => "EQ"}},
|
57
|
-
# return_values: "ALL_OLD",
|
58
|
-
# })
|
59
|
-
#
|
60
|
-
# query = TestPutItem.put.item(id: "hoge", name: "次郎").expected(category_id: "== 1")
|
61
|
-
# expect(query.query).to eq({
|
62
|
-
# table_name: "test_put_item",
|
63
|
-
# item: {id: "hoge", name: "次郎"},
|
64
|
-
# :expected => {:category_id => {:value => 1, :comparison_operator => "EQ"}},
|
65
|
-
# return_values: "ALL_OLD",
|
66
|
-
# })
|
67
|
-
#
|
68
|
-
# query = TestPutItem.put.item(id: "hoge", name: "次郎").expected(category_id: "between 0 2")
|
69
|
-
# expect(query.query).to eq({
|
70
|
-
# table_name: "test_put_item",
|
71
|
-
# item: {id: "hoge", name: "次郎"},
|
72
|
-
# :expected => {:category_id => {:attribute_value_list => [0, 2], :comparison_operator => "BETWEEN"}},
|
73
|
-
# return_values: "ALL_OLD",
|
74
|
-
# })
|
75
|
-
# end
|
76
|
-
|
77
|
-
it "条件ありput_item実行 成功すると古いデータを返す" do
|
78
|
-
query = TestItem.put.item(id: "hoge", name: "次郎").expected(name: "== 太郎")
|
79
|
-
result = query.execute client
|
80
|
-
expect(result.attributes).to eq({id: "hoge", name: "太郎"})
|
81
|
-
expect(result.metadata).to eq(consumed_capacity: nil, item_collection_metrics: nil)
|
26
|
+
it 'failed expect' do
|
27
|
+
data={id: 'poyo', param1: 104+1, param2: 204, param3: "poyo", param4: [1, 0, 4]<<'x'}
|
28
|
+
builder.name(table).item(data).return_values(:ALL_OLD).expected(param1: 0)
|
29
|
+
expect { @client.put_item(builder.build) }.to raise_error(Aws::DynamoDB::Errors::ConditionalCheckFailedException)
|
82
30
|
end
|
83
31
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "== 1") }
|
91
|
-
it :query do
|
92
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
93
|
-
item: {id: "fuga", category_id: 1},
|
94
|
-
expected: {:category_id => {:value => 1, :comparison_operator => "EQ"}},
|
95
|
-
return_values: "ALL_OLD")
|
96
|
-
end
|
97
|
-
it :execute do
|
98
|
-
result = query.execute client
|
99
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
100
|
-
expect(result.metadata).to eq(consumed_capacity: nil, item_collection_metrics: nil)
|
101
|
-
end
|
102
|
-
it :error do
|
103
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "== 2")
|
104
|
-
expect(query.execute(client)).to eq(false)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe :!= do
|
109
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "!= 0") }
|
110
|
-
it :query do
|
111
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
112
|
-
item: {id: "fuga", category_id: 1},
|
113
|
-
expected: {:category_id => {:value => 0, :comparison_operator => "NE"}},
|
114
|
-
return_values: "ALL_OLD")
|
115
|
-
end
|
116
|
-
it :execute do
|
117
|
-
result = query.execute client
|
118
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
119
|
-
end
|
120
|
-
it :error do
|
121
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "== 2")
|
122
|
-
expect(query.execute(client)).to eq(false)
|
123
|
-
end
|
124
|
-
end
|
32
|
+
it :expected do
|
33
|
+
data={id: 'poyo', param1: 104+1, param2: 204, param3: "poyo", param4: [1, 0, 4]<<'x'}
|
34
|
+
builder.name(table).item(data).return_values(:ALL_OLD).expected(param1: 104, param4: [1, 0, 4])
|
35
|
+
result = @client.put_item(builder.build)
|
36
|
+
expect(result.error).to eq(nil)
|
37
|
+
expect(result.attributes["param1"]).to eq(104)
|
125
38
|
|
126
|
-
describe :> do
|
127
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "> 0") }
|
128
|
-
it :query do
|
129
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
130
|
-
item: {id: "fuga", category_id: 1},
|
131
|
-
expected: {:category_id => {:value => 0, :comparison_operator => "GT"}},
|
132
|
-
return_values: "ALL_OLD")
|
133
|
-
end
|
134
|
-
it :execute do
|
135
|
-
result = query.execute client
|
136
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
137
|
-
end
|
138
|
-
it :error do
|
139
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "> 2")
|
140
|
-
expect(query.execute(client)).to eq(false)
|
141
|
-
end
|
142
|
-
end
|
143
39
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
148
|
-
item: {id: "fuga", category_id: 1},
|
149
|
-
expected: {:category_id => {:value => 1, :comparison_operator => "GE"}},
|
150
|
-
return_values: "ALL_OLD")
|
151
|
-
end
|
152
|
-
it :execute do
|
153
|
-
result = query.execute client
|
154
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
155
|
-
end
|
156
|
-
it :error do
|
157
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "> 2")
|
158
|
-
expect(query.execute(client)).to eq(false)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
describe :< do
|
163
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "< 2") }
|
164
|
-
it :query do
|
165
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
166
|
-
item: {id: "fuga", category_id: 1},
|
167
|
-
expected: {:category_id => {:value => 2, :comparison_operator => "LT"}},
|
168
|
-
return_values: "ALL_OLD")
|
169
|
-
end
|
170
|
-
it :execute do
|
171
|
-
result = query.execute client
|
172
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
173
|
-
end
|
174
|
-
it :error do
|
175
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "< 0")
|
176
|
-
expect(query.execute(client)).to eq(false)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
describe :<= do
|
181
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "<= 1") }
|
182
|
-
it :query do
|
183
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
184
|
-
item: {id: "fuga", category_id: 1},
|
185
|
-
expected: {:category_id => {:value => 1, :comparison_operator => "LE"}},
|
186
|
-
return_values: "ALL_OLD")
|
187
|
-
end
|
188
|
-
it :execute do
|
189
|
-
result = query.execute client
|
190
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
191
|
-
end
|
192
|
-
it :error do
|
193
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "<= 0")
|
194
|
-
expect(query.execute(client)).to eq(false)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
describe :between do
|
199
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "between 1 2") }
|
200
|
-
it :query do
|
201
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
202
|
-
item: {id: "fuga", category_id: 1},
|
203
|
-
expected: {:category_id => {:attribute_value_list => [1, 2], :comparison_operator => "BETWEEN"}},
|
204
|
-
return_values: "ALL_OLD")
|
205
|
-
end
|
206
|
-
it :execute do
|
207
|
-
result = query.execute client
|
208
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
209
|
-
end
|
210
|
-
it :error do
|
211
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "between 2 3")
|
212
|
-
expect(query.execute(client)).to eq(false)
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
describe :contain do
|
217
|
-
let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(id: "contains uga") }
|
218
|
-
it :query do
|
219
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
220
|
-
item: {id: "fuga", category_id: 1},
|
221
|
-
expected: {:id => {:value => "uga", :comparison_operator => "CONTAINS"}},
|
222
|
-
return_values: "ALL_OLD")
|
223
|
-
end
|
224
|
-
it :execute do
|
225
|
-
result = query.execute client
|
226
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
227
|
-
end
|
228
|
-
it :error do
|
229
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(id: "contains ppp")
|
230
|
-
expect(query.execute(client)).to eq(false)
|
231
|
-
end
|
232
|
-
end
|
40
|
+
res = @client.get_item(table_name: table, key: {id: 'poyo'})
|
41
|
+
expect(res.item["param1"]).to eq(105)
|
42
|
+
end
|
233
43
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
238
|
-
item: {id: "fuga", category_id: 1},
|
239
|
-
expected: {:id => {:value => "ppp", :comparison_operator => "NOT_CONTAINS"}},
|
240
|
-
return_values: "ALL_OLD")
|
241
|
-
end
|
242
|
-
it :execute do
|
243
|
-
result = query.execute client
|
244
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
245
|
-
end
|
246
|
-
it :error do
|
247
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(id: "not_contains uga")
|
248
|
-
expect(query.execute(client)).to eq(false)
|
249
|
-
end
|
250
|
-
end
|
44
|
+
it :between do
|
45
|
+
data={id: 'poyo', param1: 105+1, param2: 204, param3: "poyo", param4: [1, 0, 4, 'x']}
|
46
|
+
builder.name(table).item(data).return_values(:ALL_OLD).expected([[:param1, :BETWEEN, [104, 106]]])
|
251
47
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
item: {id: "fuga", category_id: 1},
|
257
|
-
expected: {:id => {:value => "fug", :comparison_operator => "BEGINS_WITH"}},
|
258
|
-
return_values: "ALL_OLD")
|
259
|
-
end
|
260
|
-
it :execute do
|
261
|
-
result = query.execute client
|
262
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
263
|
-
end
|
264
|
-
it :error do
|
265
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(id: "begins_with uga")
|
266
|
-
expect(query.execute(client)).to eq(false)
|
267
|
-
end
|
268
|
-
end
|
48
|
+
result = @client.put_item(builder.build)
|
49
|
+
expect(result.error).to eq(nil)
|
50
|
+
expect(result.attributes["param1"]).to eq(105)
|
51
|
+
end
|
269
52
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
274
|
-
item: {id: "fuga", category_id: 1},
|
275
|
-
expected: {:bar => {:comparison_operator => "NULL"}},
|
276
|
-
return_values: "ALL_OLD")
|
277
|
-
end
|
278
|
-
it :execute do
|
279
|
-
result = query.execute client
|
280
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
281
|
-
end
|
282
|
-
it :error do
|
283
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(id: "is_null")
|
284
|
-
expect(query.execute(client)).to eq(false)
|
285
|
-
end
|
286
|
-
end
|
53
|
+
it :in do
|
54
|
+
data={id: 'poyo', param1: 106+1, param2: 204, param3: "poyo", param4: [1, 0, 4, 'x']}
|
55
|
+
builder.name(table).item(data).return_values(:ALL_OLD).add_expected(:param1, :IN, [101, 103, 106])
|
287
56
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
expect(query.query).to eq(table_name: "test_put_item",
|
292
|
-
item: {id: "fuga", category_id: 1},
|
293
|
-
expected: {:id => {:comparison_operator => "NOT_NULL"}},
|
294
|
-
return_values: "ALL_OLD")
|
295
|
-
end
|
296
|
-
it :execute do
|
297
|
-
result = query.execute client
|
298
|
-
expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
299
|
-
end
|
300
|
-
it :error do
|
301
|
-
query = TestItem.put.item(id: "fuga", category_id: 1).expected(bar: "is_not_null")
|
302
|
-
expect(query.execute(client)).to eq(false)
|
303
|
-
end
|
304
|
-
end
|
57
|
+
result = @client.put_item(builder.build)
|
58
|
+
expect(result.error).to eq(nil)
|
59
|
+
expect(result.attributes["param1"]).to eq(106)
|
305
60
|
end
|
306
|
-
#
|
307
|
-
# it :< do
|
308
|
-
# query = TestPutItem.put.item(id: "fuga", category_id: 1).expected(category_id: "< 2")
|
309
|
-
# result = query.execute client
|
310
|
-
# expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
311
|
-
# end
|
312
|
-
# it :between do
|
313
|
-
# query = TestPutItem.put.item(id: "fuga", category_id: 1).expected(category_id: "between 1 2")
|
314
|
-
# result = query.execute client
|
315
|
-
# expect(result.attributes).to eq({id: "fuga", category_id: 1})
|
316
|
-
# end
|
317
61
|
end
|
318
62
|
end
|
319
63
|
|
@@ -1,107 +1,57 @@
|
|
1
1
|
describe Dymos::Query::Query do
|
2
|
-
before :all do
|
3
|
-
Aws.config[:region] = 'us-west-1'
|
4
|
-
Aws.config[:endpoint] = 'http://localhost:4567'
|
5
|
-
Aws.config[:access_key_id] = 'XXX'
|
6
|
-
Aws.config[:secret_access_key] = 'XXX'
|
7
2
|
|
8
|
-
|
9
|
-
|
10
|
-
client.create_table(
|
11
|
-
table_name: 'test_query_item',
|
12
|
-
attribute_definitions: [
|
13
|
-
{attribute_name: 'id', attribute_type: 'S'},
|
14
|
-
{attribute_name: 'category_id', attribute_type: 'N'},
|
15
|
-
{attribute_name: 'other_id', attribute_type: 'N'},
|
16
|
-
],
|
17
|
-
key_schema: [
|
18
|
-
{attribute_name: 'id', key_type: 'HASH'},
|
19
|
-
{attribute_name: 'category_id', key_type: 'RANGE'}
|
20
|
-
],
|
21
|
-
global_secondary_indexes: [
|
22
|
-
{
|
23
|
-
index_name: "index_other_id",
|
24
|
-
key_schema: [
|
25
|
-
{attribute_name: "id", key_type: "HASH"},
|
26
|
-
{attribute_name: "other_id", key_type: "RANGE"},
|
27
|
-
],
|
28
|
-
projection: {
|
29
|
-
projection_type: "ALL",
|
30
|
-
},
|
31
|
-
provisioned_throughput: {
|
32
|
-
read_capacity_units: 1,
|
33
|
-
write_capacity_units: 1,
|
34
|
-
},
|
35
|
-
},
|
36
|
-
],
|
37
|
-
provisioned_throughput: {
|
38
|
-
read_capacity_units: 1,
|
39
|
-
write_capacity_units: 1,
|
40
|
-
})
|
41
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 0, other_id: 1})
|
42
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 1, other_id: 2})
|
43
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 2, other_id: 3})
|
44
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 3, other_id: 4})
|
45
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 4, other_id: 5})
|
46
|
-
client.put_item(table_name: 'test_query_item', item: {id: 'hoge', category_id: 5, other_id: 6})
|
3
|
+
let(:builder) { Dymos::Query::Query.new }
|
4
|
+
let(:result_count) { @client.query(builder.build)[:count] }
|
47
5
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
6
|
+
it 'HASH search' do
|
7
|
+
builder.name('ProductCatalog').where(Id: 101)
|
8
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
9
|
+
builder.name('ProductCatalog').conditions([[:Id, 101]])
|
10
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
53
11
|
end
|
54
12
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
13
|
+
it 'HASH RANGE search' do
|
14
|
+
builder.name('Thread').where(ForumName: 'DynamoDB', Subject: 'DynamoDB Thread 1')
|
15
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
16
|
+
builder.name('Thread').where([:ForumName, :eq, 'DynamoDB'], [:Subject, :eq, 'DynamoDB Thread 1'])
|
17
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
18
|
+
builder.name('Thread').conditions([[:ForumName, 'DynamoDB'], [:Subject, 'DynamoDB Thread 1']])
|
19
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
20
|
+
builder.name('Thread').add_conditions(:ForumName, 'DynamoDB').add_conditions(:Subject, :eq, 'DynamoDB Thread 1')
|
21
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
22
|
+
end
|
65
23
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
describe "クエリ生成" do
|
73
|
-
describe "グローバルセカンダリインデックスを利用した検索" do
|
74
|
-
let(:query) {
|
75
|
-
TestItem.query.index_name(:index_other_id).key_conditions(
|
76
|
-
id: "== hoge",
|
77
|
-
other_id: "between 1 3"
|
78
|
-
)
|
79
|
-
}
|
80
|
-
it :query do
|
81
|
-
expect(query.query).to eq(
|
82
|
-
table_name: 'test_query_item',
|
83
|
-
index_name: 'index_other_id',
|
84
|
-
key_conditions: {
|
85
|
-
id: {
|
86
|
-
attribute_value_list: ["hoge"],
|
87
|
-
comparison_operator: "EQ"
|
88
|
-
},
|
89
|
-
other_id: {
|
90
|
-
attribute_value_list: [1, 3],
|
91
|
-
comparison_operator: "BETWEEN"
|
92
|
-
}},
|
93
|
-
consistent_read: false,
|
94
|
-
)
|
95
|
-
end
|
96
|
-
it :execute do
|
97
|
-
res = query.execute client
|
98
|
-
expect(res.size).to eq(3)
|
99
|
-
expect(res.first.metadata).to eq(count: 3, scanned_count: 3, last_evaluated_key: nil, consumed_capacity: nil)
|
100
|
-
end
|
24
|
+
it 'only HASH search' do
|
25
|
+
builder.name('Reply').where(Id: 'DynamoDB#DynamoDB Thread 1')
|
26
|
+
result = @client.query(builder.build)
|
27
|
+
expect(result[:count]).to eq(3)
|
28
|
+
end
|
101
29
|
|
30
|
+
it :exclusive_start_key do
|
31
|
+
builder.name('Reply').where(Id: 'DynamoDB#DynamoDB Thread 1').start_key(Id: 'DynamoDB#DynamoDB Thread 1', ReplyDateTime: "2011-12-11T00:40:57.165Z")
|
32
|
+
result = @client.query(builder.build)
|
33
|
+
expect(result[:count]).to eq(2)
|
34
|
+
end
|
102
35
|
|
103
|
-
|
36
|
+
describe :order do
|
37
|
+
it :asc do
|
38
|
+
builder.name('Reply').where(Id: 'DynamoDB#DynamoDB Thread 1').limit(1).asc
|
39
|
+
result = @client.query(builder.build)
|
40
|
+
expect(result[:items].first["ReplyDateTime"]).to eq("2011-12-11T00:40:57.165Z")
|
41
|
+
end
|
42
|
+
it :desc do
|
43
|
+
builder.name('Reply').where(Id: 'DynamoDB#DynamoDB Thread 1').limit(1).desc
|
44
|
+
result = @client.query(builder.build)
|
45
|
+
expect(result[:items].first["ReplyDateTime"]).to eq("2011-12-25T00:40:57.165Z")
|
104
46
|
end
|
105
47
|
end
|
48
|
+
|
49
|
+
it 'HASH RANGE with filter' do
|
50
|
+
builder.name('Thread').where(ForumName: 'DynamoDB')
|
51
|
+
expect(@client.query(builder.build)[:count]).to eq(2)
|
52
|
+
|
53
|
+
builder.name('Thread').where(ForumName: 'DynamoDB').filter([[:Message, "DynamoDB thread 2 message text"]])
|
54
|
+
expect(@client.query(builder.build)[:count]).to eq(1)
|
55
|
+
end
|
106
56
|
end
|
107
57
|
|
@@ -1,55 +1,61 @@
|
|
1
1
|
describe Dymos::Query::Scan do
|
2
|
-
before :all do
|
3
|
-
Aws.config[:region] = 'us-west-1'
|
4
|
-
Aws.config[:endpoint] = 'http://localhost:4567'
|
5
|
-
Aws.config[:access_key_id] = 'XXX'
|
6
|
-
Aws.config[:secret_access_key] = 'XXX'
|
7
|
-
|
8
|
-
client = Aws::DynamoDB::Client.new
|
9
|
-
client.delete_table(table_name: 'test_get_item') if client.list_tables[:table_names].include?('test_get_item')
|
10
|
-
client.create_table(
|
11
|
-
table_name: 'test_get_item',
|
12
|
-
attribute_definitions: [
|
13
|
-
{attribute_name: 'id', attribute_type: 'S'},
|
14
|
-
{attribute_name: 'category_id', attribute_type: 'N'},
|
15
|
-
],
|
16
|
-
key_schema: [
|
17
|
-
{attribute_name: 'id', key_type: 'HASH'},
|
18
|
-
{attribute_name: 'category_id', key_type: 'RANGE'}
|
19
|
-
],
|
20
|
-
provisioned_throughput: {
|
21
|
-
read_capacity_units: 1,
|
22
|
-
write_capacity_units: 1,
|
23
|
-
})
|
24
|
-
client.put_item(table_name: 'test_get_item', item: {id: 'hoge', category_id: 0, name: '太郎'})
|
25
|
-
client.put_item(table_name: 'test_get_item', item: {id: 'hoge', category_id: 1})
|
26
|
-
client.put_item(table_name: 'test_get_item', item: {id: 'hoge', category_id: 2})
|
27
|
-
client.put_item(table_name: 'test_get_item', item: {id: 'hoge', category_id: 3})
|
28
|
-
client.put_item(table_name: 'test_get_item', item: {id: 'hoge', category_id: 4})
|
29
|
-
|
30
|
-
class TestItem < Dymos::Model
|
31
|
-
table :test_get_item
|
32
|
-
field :id, :string
|
33
|
-
end
|
34
|
-
end
|
35
2
|
|
36
|
-
|
37
|
-
|
3
|
+
describe 'build query' do
|
4
|
+
let(:builder) { Dymos::Query::Scan.new }
|
38
5
|
|
39
|
-
it :
|
40
|
-
|
6
|
+
it :name do
|
7
|
+
builder.name('hoge')
|
8
|
+
expect(builder.build).to eq({table_name: 'hoge'})
|
9
|
+
# .attributes('item1', 'item2').limit(20).select('ALL_ATTRIBUTES')
|
10
|
+
# .filter([[:item1, :eq, 1], [:item2, :begins_with, 'fuga']], :or)
|
11
|
+
end
|
12
|
+
it :name do
|
13
|
+
builder.attributes('item1', 'item2')
|
14
|
+
expect(builder.build).to eq({attributes_to_get: ['item1', 'item2']})
|
41
15
|
end
|
42
16
|
|
43
|
-
it :
|
44
|
-
|
45
|
-
expect(
|
46
|
-
|
17
|
+
it :filter do
|
18
|
+
builder.filter([[:item1, :eq, [1, 2, 3]], [:item2, :begins_with, 'fuga']], :or)
|
19
|
+
expect(builder.build).to eq({scan_filter: {
|
20
|
+
'item1' => {
|
21
|
+
attribute_value_list: [1, 2, 3],
|
22
|
+
comparison_operator: 'EQ'
|
23
|
+
},
|
24
|
+
'item2' => {
|
25
|
+
attribute_value_list: ['fuga'],
|
26
|
+
comparison_operator: 'BEGINS_WITH'
|
27
|
+
}},
|
28
|
+
conditional_operator: 'OR'
|
29
|
+
})
|
47
30
|
end
|
48
31
|
|
32
|
+
it :add_filter, :filter_operator do
|
33
|
+
builder.add_filter(:item1, [1, 2, 3]).add_filter(:item2, :begins_with, 'fuga').filter_operator(:or)
|
34
|
+
expect(builder.build).to eq({scan_filter: {
|
35
|
+
'item1' => {
|
36
|
+
attribute_value_list: [1, 2, 3],
|
37
|
+
comparison_operator: 'EQ'
|
38
|
+
},
|
39
|
+
'item2' => {
|
40
|
+
attribute_value_list: ['fuga'],
|
41
|
+
comparison_operator: 'BEGINS_WITH'
|
42
|
+
}},
|
43
|
+
conditional_operator: 'OR'
|
44
|
+
})
|
45
|
+
end
|
49
46
|
|
50
|
-
it :
|
51
|
-
|
47
|
+
it :start_key do
|
48
|
+
builder.start_key(id: 1, hoge: 'fuga')
|
49
|
+
expect(builder.build).to eq({exclusive_start_key: {"id" => 1, "hoge" => "fuga"}})
|
52
50
|
end
|
51
|
+
|
52
|
+
it '絞込' do
|
53
|
+
builder.name(:ProductCatalog).add_filter(:Authors, :contains, "Author 1")
|
54
|
+
result = @client.scan(builder.build)
|
55
|
+
expect(result[:scanned_count]).to eq(8)
|
56
|
+
expect(result[:count]).to eq(3)
|
57
|
+
end
|
58
|
+
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|