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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -2
  3. data/lib/dymos/client.rb +16 -0
  4. data/lib/dymos/config.rb +34 -0
  5. data/lib/dymos/model.rb +109 -26
  6. data/lib/dymos/persistence.rb +75 -16
  7. data/lib/dymos/query/base.rb +23 -0
  8. data/lib/dymos/query/create_table.rb +72 -0
  9. data/lib/dymos/query/delete_item.rb +60 -32
  10. data/lib/dymos/query/describe.rb +3 -5
  11. data/lib/dymos/query/get_item.rb +30 -9
  12. data/lib/dymos/query/put_item.rb +67 -41
  13. data/lib/dymos/query/query.rb +112 -26
  14. data/lib/dymos/query/scan.rb +85 -12
  15. data/lib/dymos/query/update_item.rb +97 -50
  16. data/lib/dymos/version.rb +1 -1
  17. data/lib/dymos.rb +6 -4
  18. data/spec/lib/dymos/client_spec.rb +4 -0
  19. data/spec/lib/dymos/config_spec.rb +11 -0
  20. data/spec/lib/dymos/data.yml +154 -0
  21. data/spec/lib/dymos/model_spec.rb +23 -29
  22. data/spec/lib/dymos/query/create_table_spec.rb +56 -0
  23. data/spec/lib/dymos/query/delete_item_spec.rb +22 -79
  24. data/spec/lib/dymos/query/describe_spec.rb +6 -40
  25. data/spec/lib/dymos/query/get_item_spec.rb +8 -47
  26. data/spec/lib/dymos/query/put_item_spec.rb +45 -301
  27. data/spec/lib/dymos/query/query_spec.rb +45 -95
  28. data/spec/lib/dymos/query/scan_spec.rb +49 -43
  29. data/spec/lib/dymos/query/update_item_spec.rb +36 -113
  30. data/spec/lib/dymos/query_spec.rb +150 -0
  31. data/spec/spec_helper.rb +33 -0
  32. metadata +16 -12
  33. data/lib/dymos/command.rb +0 -36
  34. data/lib/dymos/query/attribute.rb +0 -14
  35. data/lib/dymos/query/builder.rb +0 -79
  36. data/lib/dymos/query/expect.rb +0 -65
  37. data/spec/lib/dymos/query/attribute_spec.rb +0 -15
  38. data/spec/lib/dymos/query/builder_spec.rb +0 -23
  39. data/spec/lib/dymos/query/expect_spec.rb +0 -5
@@ -1,319 +1,63 @@
1
1
  describe Dymos::Query::PutItem 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_put_item') if client.list_tables[:table_names].include?('test_put_item')
10
- client.create_table(
11
- table_name: 'test_put_item',
12
- attribute_definitions: [
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
- let(:client) { Aws::DynamoDB::Client.new }
33
- describe :put_item do
34
- describe "クエリ生成" do
35
- it "追加のみ" do
36
- query = TestItem.put.item(id: "foo", name: "John")
37
- expect(query.query).to eq({
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
- end
45
- it "条件なしput_item実行 追加時はattributesがnilになる" do
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
- # it "条件ありput_item" do
52
- # query = TestPutItem.put.item(id: "hoge", name: "次郎").expected(name: "== 太郎")
53
- # expect(query.query).to eq({
54
- # table_name: "test_put_item",
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
- describe "条件指定" do
85
- it "undefined operator" do
86
- expect { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: "= 1") }.to raise_error(ArgumentError)
87
- end
88
-
89
- describe :== do
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
- describe :>= do
145
- let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(category_id: ">= 1") }
146
- it :query do
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
- describe :not_contain do
235
- let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(id: "not_contains ppp") }
236
- it :query do
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
- describe :begins_with do
253
- let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(id: "begins_with fug") }
254
- it :query do
255
- expect(query.query).to eq(table_name: "test_put_item",
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
- describe :is_null do
271
- let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(bar: "is_null") }
272
- it :query do
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
- describe :is_not_null do
289
- let(:query) { TestItem.put.item(id: "fuga", category_id: 1).expected(id: "is_not_null") }
290
- it :query do
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
- client = Aws::DynamoDB::Client.new
9
- client.delete_table(table_name: 'test_query_item') if client.list_tables[:table_names].include?('test_query_item')
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
- class TestItem < Dymos::Model
49
- table :test_query_item
50
- field :id, :string
51
- field :other_id, :integer
52
- end
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
- let(:client) { Aws::DynamoDB::Client.new }
56
- describe :put_item do
57
- it "ハッシュ+レンジ検索" do
58
- items = TestItem.query.key_conditions(
59
- id: "== hoge",
60
- category_id:"== 0"
61
- ).execute
62
- expect(items.first.id).to eq('hoge')
63
- expect(items.first.other_id).to eq(1)
64
- end
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
- it "ハッシュのみ検索" do
67
- items = TestItem.query.key_conditions(
68
- id: "== hoge"
69
- ).execute
70
- expect(items.length).to eq(6)
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
- end
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
- let(:client) { Aws::DynamoDB::Client.new }
37
- describe :scan do
3
+ describe 'build query' do
4
+ let(:builder) { Dymos::Query::Scan.new }
38
5
 
39
- it :query do
40
- expect(TestItem.scan.limit(100).query).to eq(table_name: "test_get_item", limit: 100)
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 :execute do
44
- res=TestItem.scan.execute
45
- expect(res.size).to eq(5)
46
- expect(res.first.metadata).to eq(count: 5, scanned_count: 5, last_evaluated_key: nil, consumed_capacity: nil)
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 :query do
51
- expect(TestItem.scan.limit(100).exclusive_start_key('hoge').query).to eq(table_name: "test_get_item", exclusive_start_key:"hoge", limit: 100)
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