dymos 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,119 +1,42 @@
|
|
1
1
|
describe Dymos::Query::UpdateItem do
|
2
|
-
before
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
Aws.config[:secret_access_key] = 'XXX'
|
7
|
-
|
8
|
-
client = Aws::DynamoDB::Client.new
|
9
|
-
client.delete_table(table_name: 'test_update_item') if client.list_tables[:table_names].include?('test_update_item')
|
10
|
-
client.create_table(
|
11
|
-
table_name: 'test_update_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_update_item', item: {id: 'hoge', name: '太郎'})
|
23
|
-
client.put_item(table_name: 'test_update_item', item: {id: 'fuga', count: 0})
|
24
|
-
client.put_item(table_name: 'test_update_item', item: {id: 'poyo', name: '可奈'})
|
25
|
-
client.put_item(table_name: 'test_update_item', item: {id: 'piyo', name: '杏奈', count: 10})
|
26
|
-
|
27
|
-
class TestItem < Dymos::Model
|
28
|
-
table :test_update_item
|
29
|
-
field :id, :string
|
30
|
-
field :name, :string
|
31
|
-
field :count, :string
|
32
|
-
end
|
2
|
+
before do
|
3
|
+
Dymos::Config.default[:update_item]={
|
4
|
+
return_values: 'ALL_NEW'
|
5
|
+
}
|
33
6
|
end
|
34
7
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
it "アイテムに加算する" do
|
68
|
-
query = TestItem.update.key(id: "fuga").attribute_updates({count: 1}, 'add')
|
69
|
-
res = query.execute client
|
70
|
-
expect(res.count).to eq(1)
|
71
|
-
end
|
72
|
-
|
73
|
-
describe "条件付き更新" do
|
74
|
-
describe :== do
|
75
|
-
let(:query) { TestItem.update.key(id: "poyo").attribute_updates({name: "志保"}, 'PUT').expected(name: "== 可奈") }
|
76
|
-
|
77
|
-
it :query do
|
78
|
-
expect(query.query).to eq({
|
79
|
-
table_name: "test_update_item",
|
80
|
-
key: {id: "poyo"},
|
81
|
-
attribute_updates: {name: {value: "志保", action: "PUT"}},
|
82
|
-
expected: ({name: {value: "可奈", comparison_operator: "EQ"}}),
|
83
|
-
return_values: "ALL_NEW",
|
84
|
-
})
|
85
|
-
end
|
86
|
-
it "成功すると新しいアイテムを返す" do
|
87
|
-
res = query.execute client
|
88
|
-
expect(res.name).to eq("志保")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
describe "複数条件" do
|
92
|
-
let(:query) { TestItem.update.key(id: "piyo").attribute_updates({name: "百合子"}, 'PUT')
|
93
|
-
.expected(count: "between 9 12", name: "== 杏奈", hoge:"is_null")}
|
94
|
-
|
95
|
-
it :query do
|
96
|
-
expect(query.query).to eq({
|
97
|
-
table_name: "test_update_item",
|
98
|
-
key: {id: "piyo"},
|
99
|
-
attribute_updates: {name: {value: "百合子", action: "PUT"}},
|
100
|
-
expected: ({
|
101
|
-
name: {value: "杏奈", comparison_operator: "EQ"},
|
102
|
-
count: {attribute_value_list: [9, 12], comparison_operator: "BETWEEN"},
|
103
|
-
hoge: {comparison_operator: "NULL"},
|
104
|
-
}),
|
105
|
-
return_values: "ALL_NEW",
|
106
|
-
conditional_operator: "AND"
|
107
|
-
})
|
108
|
-
end
|
109
|
-
it "成功すると新しいアイテムを返す" do
|
110
|
-
res = query.execute client
|
111
|
-
expect(res.name).to eq("百合子")
|
112
|
-
expect(res.metadata[:consumed_capacity]).to eq(nil)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
8
|
+
describe 'build query', order: :defined do
|
9
|
+
let(:builder) { Dymos::Query::UpdateItem.new }
|
10
|
+
table='test_update_item_table'
|
11
|
+
|
12
|
+
before :all do
|
13
|
+
@client.delete_table(table_name: table) if @client.list_tables[:table_names].include?(table)
|
14
|
+
query=Dymos::Query::CreateTable.new.name(table).attributes(id: 'S').keys(id: 'HASH').build
|
15
|
+
@client.create_table(query)
|
16
|
+
@client.put_item(table_name: table, item: {id: 'hoge', param1: 101, param2: 201, param3: "hoge", param4: [1, 0, 1]})
|
17
|
+
@client.put_item(table_name: table, item: {id: 'fuga', param1: 102, param2: 202, param3: "fuga", param4: [1, 0, 2]})
|
18
|
+
@client.put_item(table_name: table, item: {id: 'piyo', param1: 103, param2: 203, param3: "piyo", param4: [1, 0, 3]})
|
19
|
+
end
|
20
|
+
it :attribute_updates do
|
21
|
+
builder.name(table).key(id: 'hoge').attribute_updates([:param1, :add, 1000], [:param2, :put, 1201]).return_values(:all_new)
|
22
|
+
result = @client.update_item(builder.build)
|
23
|
+
expect(result.error).to eq(nil)
|
24
|
+
expect(result.attributes["param1"]).to eq(1101)
|
25
|
+
expect(result.attributes["param2"]).to eq(1201)
|
26
|
+
end
|
27
|
+
it 'put, add' do
|
28
|
+
builder.name(table).key(id: 'hoge').add(:param1, 1).put(:param2, 1202)
|
29
|
+
result = @client.update_item(builder.build)
|
30
|
+
expect(result.error).to eq(nil)
|
31
|
+
expect(result.attributes["param1"]).to eq(1102)
|
32
|
+
expect(result.attributes["param2"]).to eq(1202)
|
33
|
+
end
|
34
|
+
it 'expected' do
|
35
|
+
builder.name(table).key(id: 'hoge').add(:param1, 1).put(:param2, 1203).expected(param3: "hoge", param4: [1, 0, 1])
|
36
|
+
result = @client.update_item(builder.build)
|
37
|
+
expect(result.error).to eq(nil)
|
38
|
+
expect(result.attributes["param1"]).to eq(1103)
|
39
|
+
expect(result.attributes["param2"]).to eq(1203)
|
117
40
|
end
|
118
41
|
end
|
119
42
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
describe 'query' do
|
2
|
+
class ProductCatalogModel < Dymos::Model
|
3
|
+
table 'ProductCatalog'
|
4
|
+
field :Id, :integer
|
5
|
+
field :Title, :string
|
6
|
+
field :ISBN, :string
|
7
|
+
field :Price, :integer
|
8
|
+
field :Authors, :array
|
9
|
+
field :Dimensions, :string
|
10
|
+
field :PageCount, :integer
|
11
|
+
field :InPublication, :integer
|
12
|
+
field :ProductCategory, :string
|
13
|
+
end
|
14
|
+
class ForumModel < Dymos::Model
|
15
|
+
table 'Forum'
|
16
|
+
field :Name, :string
|
17
|
+
field :Category, :string
|
18
|
+
field :Threads, :integer
|
19
|
+
field :Messages, :string
|
20
|
+
field :Views, :integer
|
21
|
+
field :LastPostBy, :string
|
22
|
+
field :LastPostDateTime, :time
|
23
|
+
end
|
24
|
+
class ThreadModel < Dymos::Model
|
25
|
+
table 'Thread'
|
26
|
+
field :ForumName, :string
|
27
|
+
field :Subject, :string
|
28
|
+
field :Message, :string
|
29
|
+
field :LastPostedBy, :string
|
30
|
+
field :Views, :integer
|
31
|
+
field :Replies, :integer
|
32
|
+
field :Views, :integer
|
33
|
+
field :Answered, :string
|
34
|
+
field :Tags, :array
|
35
|
+
field :LastPostDateTime, :time
|
36
|
+
end
|
37
|
+
class ReplyModel < Dymos::Model
|
38
|
+
table 'Reply'
|
39
|
+
field :Id, :string
|
40
|
+
field :ReplyDateTime, :time
|
41
|
+
field :Message, :string
|
42
|
+
field :ReplyDateTime, :string
|
43
|
+
end
|
44
|
+
|
45
|
+
describe :find do
|
46
|
+
it 'only' do
|
47
|
+
expect(ProductCatalogModel.find(101).Id).to eq(101)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe :all do
|
52
|
+
it :only do
|
53
|
+
result = ForumModel.all
|
54
|
+
expect(result.count).to eq(2)
|
55
|
+
end
|
56
|
+
it :where do
|
57
|
+
result = ThreadModel.where(ForumName: "DynamoDB").all
|
58
|
+
expect(result.count).to eq(2)
|
59
|
+
end
|
60
|
+
|
61
|
+
it :add_filter do
|
62
|
+
result = ThreadModel.where(ForumName: "DynamoDB").add_filter(:Tags, :contains, 'table').all
|
63
|
+
expect(result.count).to eq(1)
|
64
|
+
end
|
65
|
+
|
66
|
+
it :index do
|
67
|
+
result = ReplyModel.index(:PostedByIndex).where(Id: "DynamoDB#DynamoDB Thread 1").all
|
68
|
+
expect(result.count).to eq(3)
|
69
|
+
result = ReplyModel.index(:PostedByIndex).where(Id: "DynamoDB#DynamoDB Thread 1", PostedBy: "User A").all
|
70
|
+
expect(result.count).to eq(2)
|
71
|
+
result = ReplyModel.index(:PostedByIndex).
|
72
|
+
where(Id: "DynamoDB#DynamoDB Thread 1", PostedBy: "User A").all
|
73
|
+
expect(result.count).to eq(2)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
it :one do
|
77
|
+
result = ThreadModel.where(ForumName: "DynamoDB").desc.one
|
78
|
+
expect(result.Subject).to eq("DynamoDB Thread 2")
|
79
|
+
result = ThreadModel.where(ForumName: "DynamoDB").asc.one
|
80
|
+
expect(result.Subject).to eq("DynamoDB Thread 1")
|
81
|
+
end
|
82
|
+
|
83
|
+
describe :save do
|
84
|
+
table='test_model_save_item_table'
|
85
|
+
|
86
|
+
class TestModelSaveItem < Dymos::Model
|
87
|
+
table 'test_model_save_item_table'
|
88
|
+
field :id, :string
|
89
|
+
field :param1, :integer
|
90
|
+
field :param2, :integer
|
91
|
+
field :param3, :string
|
92
|
+
field :param4, :array
|
93
|
+
end
|
94
|
+
before :all do
|
95
|
+
@client.delete_table(table_name: table) if @client.list_tables[:table_names].include?(table)
|
96
|
+
query=Dymos::Query::CreateTable.new.name(table).attributes(id: 'S').keys(id: 'HASH').build
|
97
|
+
@client.create_table(query)
|
98
|
+
@client.put_item(table_name: table, item: {id: 'hoge', param1: 101, param2: 201, param3: "hoge", param4: [1, 0, 1]})
|
99
|
+
@client.put_item(table_name: table, item: {id: 'fuga', param1: 102, param2: 202, param3: "fuga", param4: [1, 0, 2]})
|
100
|
+
@client.put_item(table_name: table, item: {id: 'piyo', param1: 103, param2: 203, param3: "piyo", param4: [1, 0, 3]})
|
101
|
+
end
|
102
|
+
|
103
|
+
describe :new do
|
104
|
+
it '通常のsave' do
|
105
|
+
data={id: 'abc', param1: 104, param2: 204, param3: 'abc', param4: [1, 0, 4]}
|
106
|
+
model = TestModelSaveItem.new(data)
|
107
|
+
expect(model.save!).to eq(true)
|
108
|
+
expect(TestModelSaveItem.find('abc').attributes).to eq(data)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'itemメソッドからパラメータを追加するとモデルの値は影響を受けない' do
|
112
|
+
model = TestModelSaveItem.new
|
113
|
+
data={id: 'efg', param1: 105, param2: 205, param3: 'efg', param4: [1, 0, 5]}
|
114
|
+
expect(model.item(data).save!).to eq(true)
|
115
|
+
expect(model.id).to eq(nil)
|
116
|
+
expect(TestModelSaveItem.find('efg').attributes).to eq(data)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe :update do
|
121
|
+
it 'addメソッドから値を変更' do
|
122
|
+
model = TestModelSaveItem.find('hoge')
|
123
|
+
expect(model.param1).to eq(101)
|
124
|
+
expect(model.add(:param1, 1).update!).to eq(true)
|
125
|
+
expect(model.last_execute_query[:query][:attribute_updates]).to eq({"param1" => {:value => 1, :action => "ADD"}})
|
126
|
+
expect(model.param1).to eq(101)
|
127
|
+
expect(TestModelSaveItem.find('hoge').param1).to eq(102)
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
it 'モデルの値の変更されたものだけアップデートする' do
|
132
|
+
model = TestModelSaveItem.find('fuga')
|
133
|
+
expect(model.param1).to eq(102)
|
134
|
+
model.param1+=1
|
135
|
+
expect(model.update!).to eq(true)
|
136
|
+
expect(model.last_execute_query[:query][:attribute_updates]).to eq({"param1" => {:value => 103, :action => "PUT"}})
|
137
|
+
model = TestModelSaveItem.find('fuga')
|
138
|
+
expect(model.param1).to eq(103)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
describe :delete do
|
142
|
+
it 'del' do
|
143
|
+
model = TestModelSaveItem.find('piyo')
|
144
|
+
expect(model.add_expected(:param1,:eq,103).delete.class).to eq(TestModelSaveItem)
|
145
|
+
expect(TestModelSaveItem.find('piyo')).to eq(nil)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -7,3 +7,36 @@ require 'timecop'
|
|
7
7
|
require 'dymos'
|
8
8
|
|
9
9
|
I18n.enforce_available_locales = false
|
10
|
+
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.before :all do
|
14
|
+
Aws.config[:region] = 'us-west-1'
|
15
|
+
Aws.config[:endpoint] = 'http://localhost:4567'
|
16
|
+
Aws.config[:access_key_id] = 'dymos_test'
|
17
|
+
Aws.config[:secret_access_key] = 'dymos_test'
|
18
|
+
@client=Aws::DynamoDB::Client.new
|
19
|
+
|
20
|
+
list_tables = @client.list_tables.table_names
|
21
|
+
%w(ProductCatalog Forum Thread Reply).each do |name|
|
22
|
+
@client.delete_table(table_name: name) if list_tables.include? name
|
23
|
+
end
|
24
|
+
@client.create_table(table_name: 'ProductCatalog', attribute_definitions: [{attribute_name: 'Id', attribute_type: 'N'}], key_schema: [{attribute_name: 'Id', key_type: 'HASH'}], provisioned_throughput: {read_capacity_units: 10, write_capacity_units: 5})
|
25
|
+
@client.create_table(table_name: 'Forum', attribute_definitions: [{attribute_name: 'Name', attribute_type: 'S'}], key_schema: [{attribute_name: 'Name', key_type: 'HASH'}], provisioned_throughput: {read_capacity_units: 10, write_capacity_units: 5})
|
26
|
+
@client.create_table(table_name: 'Thread', attribute_definitions: [{attribute_name: 'ForumName', attribute_type: 'S'}, {attribute_name: 'Subject', attribute_type: 'S'}], key_schema: [{attribute_name: 'ForumName', key_type: 'HASH'}, {attribute_name: 'Subject', key_type: 'RANGE'}], provisioned_throughput: {read_capacity_units: 10, write_capacity_units: 5})
|
27
|
+
@client.create_table(table_name: 'Reply', attribute_definitions: [{attribute_name: 'Id', attribute_type: 'S'}, {attribute_name: 'ReplyDateTime', attribute_type: 'S'}, {attribute_name: 'PostedBy', attribute_type: 'S'}], key_schema: [{attribute_name: 'Id', key_type: 'HASH'}, {attribute_name: 'ReplyDateTime', key_type: 'RANGE'}], provisioned_throughput: {read_capacity_units: 10, write_capacity_units: 5}, local_secondary_indexes: [{index_name: 'PostedByIndex', key_schema: [{attribute_name: 'Id', key_type: 'HASH'}, {attribute_name: 'PostedBy', key_type: 'RANGE'}], projection: {projection_type: 'KEYS_ONLY'}}])
|
28
|
+
YAML.load_file('spec/lib/dymos/data.yml').each do |table_name, data|
|
29
|
+
data.each do |datum|
|
30
|
+
@client.put_item(table_name: table_name, item: datum)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Dymos::Config.default[:create_table]={
|
35
|
+
provisioned_throughput: {
|
36
|
+
read_capacity_units: 10,
|
37
|
+
write_capacity_units: 5
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dymos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hoshina85
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -139,31 +139,33 @@ files:
|
|
139
139
|
- dymos.gemspec
|
140
140
|
- lib/dymos.rb
|
141
141
|
- lib/dymos/attribute.rb
|
142
|
-
- lib/dymos/
|
142
|
+
- lib/dymos/client.rb
|
143
|
+
- lib/dymos/config.rb
|
143
144
|
- lib/dymos/model.rb
|
144
145
|
- lib/dymos/persistence.rb
|
145
|
-
- lib/dymos/query/
|
146
|
-
- lib/dymos/query/
|
146
|
+
- lib/dymos/query/base.rb
|
147
|
+
- lib/dymos/query/create_table.rb
|
147
148
|
- lib/dymos/query/delete_item.rb
|
148
149
|
- lib/dymos/query/describe.rb
|
149
|
-
- lib/dymos/query/expect.rb
|
150
150
|
- lib/dymos/query/get_item.rb
|
151
151
|
- lib/dymos/query/put_item.rb
|
152
152
|
- lib/dymos/query/query.rb
|
153
153
|
- lib/dymos/query/scan.rb
|
154
154
|
- lib/dymos/query/update_item.rb
|
155
155
|
- lib/dymos/version.rb
|
156
|
+
- spec/lib/dymos/client_spec.rb
|
157
|
+
- spec/lib/dymos/config_spec.rb
|
158
|
+
- spec/lib/dymos/data.yml
|
156
159
|
- spec/lib/dymos/model_spec.rb
|
157
|
-
- spec/lib/dymos/query/
|
158
|
-
- spec/lib/dymos/query/builder_spec.rb
|
160
|
+
- spec/lib/dymos/query/create_table_spec.rb
|
159
161
|
- spec/lib/dymos/query/delete_item_spec.rb
|
160
162
|
- spec/lib/dymos/query/describe_spec.rb
|
161
|
-
- spec/lib/dymos/query/expect_spec.rb
|
162
163
|
- spec/lib/dymos/query/get_item_spec.rb
|
163
164
|
- spec/lib/dymos/query/put_item_spec.rb
|
164
165
|
- spec/lib/dymos/query/query_spec.rb
|
165
166
|
- spec/lib/dymos/query/scan_spec.rb
|
166
167
|
- spec/lib/dymos/query/update_item_spec.rb
|
168
|
+
- spec/lib/dymos/query_spec.rb
|
167
169
|
- spec/spec_helper.rb
|
168
170
|
homepage: ''
|
169
171
|
licenses:
|
@@ -190,15 +192,17 @@ signing_key:
|
|
190
192
|
specification_version: 4
|
191
193
|
summary: aws-sdk-core-ruby dynamodb client wrapper
|
192
194
|
test_files:
|
195
|
+
- spec/lib/dymos/client_spec.rb
|
196
|
+
- spec/lib/dymos/config_spec.rb
|
197
|
+
- spec/lib/dymos/data.yml
|
193
198
|
- spec/lib/dymos/model_spec.rb
|
194
|
-
- spec/lib/dymos/query/
|
195
|
-
- spec/lib/dymos/query/builder_spec.rb
|
199
|
+
- spec/lib/dymos/query/create_table_spec.rb
|
196
200
|
- spec/lib/dymos/query/delete_item_spec.rb
|
197
201
|
- spec/lib/dymos/query/describe_spec.rb
|
198
|
-
- spec/lib/dymos/query/expect_spec.rb
|
199
202
|
- spec/lib/dymos/query/get_item_spec.rb
|
200
203
|
- spec/lib/dymos/query/put_item_spec.rb
|
201
204
|
- spec/lib/dymos/query/query_spec.rb
|
202
205
|
- spec/lib/dymos/query/scan_spec.rb
|
203
206
|
- spec/lib/dymos/query/update_item_spec.rb
|
207
|
+
- spec/lib/dymos/query_spec.rb
|
204
208
|
- spec/spec_helper.rb
|
data/lib/dymos/command.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Dymos
|
2
|
-
module Command
|
3
|
-
|
4
|
-
# @return [PutItem]
|
5
|
-
def put
|
6
|
-
Dymos::Query::PutItem.new(:put_item, table_name, class_name)
|
7
|
-
end
|
8
|
-
|
9
|
-
# @return [UpdateItem]
|
10
|
-
def update
|
11
|
-
Dymos::Query::UpdateItem.new(:update_item, table_name, class_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
# @return [GetItem]
|
15
|
-
def get
|
16
|
-
Dymos::Query::GetItem.new(:get_item, table_name, class_name)
|
17
|
-
end
|
18
|
-
|
19
|
-
# @return [Query]
|
20
|
-
def query
|
21
|
-
Dymos::Query::Query.new(:query, table_name, class_name)
|
22
|
-
end
|
23
|
-
|
24
|
-
def describe
|
25
|
-
Dymos::Query::Describe.new(:describe_table, table_name, class_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
def scan
|
29
|
-
Dymos::Query::Scan.new(:scan, table_name, class_name)
|
30
|
-
end
|
31
|
-
|
32
|
-
def delete
|
33
|
-
Dymos::Query::DeleteItem.new(:delete_item, table_name, class_name)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/dymos/query/builder.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
module Dymos
|
2
|
-
module Query
|
3
|
-
class Builder
|
4
|
-
attr_accessor :table_name, :command, :query
|
5
|
-
|
6
|
-
def initialize(command, table_name=nil, class_name=nil)
|
7
|
-
@class_name = class_name
|
8
|
-
@command = command
|
9
|
-
@table_name = table_name if table_name.present?
|
10
|
-
self
|
11
|
-
end
|
12
|
-
|
13
|
-
def query
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def before_send_query(command, query)
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
def after_send_query(command, query)
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
def raw_execute(client=nil)
|
26
|
-
client ||= Aws::DynamoDB::Client.new
|
27
|
-
begin
|
28
|
-
before_send_query command, query
|
29
|
-
res = client.send command, query
|
30
|
-
after_send_query command, query
|
31
|
-
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException
|
32
|
-
return false
|
33
|
-
end
|
34
|
-
res
|
35
|
-
end
|
36
|
-
|
37
|
-
def execute(client = nil)
|
38
|
-
res = raw_execute client
|
39
|
-
|
40
|
-
return false unless res
|
41
|
-
|
42
|
-
if @class_name.present?
|
43
|
-
if res.data.respond_to? :items # scan, query
|
44
|
-
metadata = extract(res, :items)
|
45
|
-
res.data[:items].map do |datum|
|
46
|
-
obj = Object.const_get(@class_name).new(datum)
|
47
|
-
obj.metadata = metadata
|
48
|
-
obj.new_record = false
|
49
|
-
obj
|
50
|
-
end
|
51
|
-
elsif res.data.respond_to? :attributes # put_item, update_item
|
52
|
-
return nil if res.attributes.nil?
|
53
|
-
obj = Object.const_get(@class_name).new(res.attributes)
|
54
|
-
obj.metadata = extract(res, :attributes)
|
55
|
-
obj
|
56
|
-
elsif res.respond_to? :data
|
57
|
-
if res.data.respond_to? :item # get_item, delete_item
|
58
|
-
return nil if res.data.item.nil?
|
59
|
-
obj = Object.const_get(@class_name).new(res.data.item)
|
60
|
-
obj.metadata = extract(res, :item)
|
61
|
-
obj.new_record = false
|
62
|
-
obj
|
63
|
-
else
|
64
|
-
res.data.to_hash # describe
|
65
|
-
end
|
66
|
-
end
|
67
|
-
else
|
68
|
-
res.data.to_hash #list_tables
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
def extract(res, ignore_key)
|
74
|
-
keys = res.data.members.reject { |a| a == ignore_key }
|
75
|
-
keys.map { |k| [k, res.data[k]] }.to_h
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
data/lib/dymos/query/expect.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
module Dymos
|
2
|
-
module Query
|
3
|
-
class Expect < Attribute
|
4
|
-
def initialize
|
5
|
-
end
|
6
|
-
|
7
|
-
def condition(operator, value)
|
8
|
-
if value.present?
|
9
|
-
value1, value2 = value.split(" ")
|
10
|
-
value1 =value1.to_i if /^[0-9]+$/.match(value1)
|
11
|
-
value2 =value2.to_i if /^[0-9]+$/.match(value2)
|
12
|
-
@value = value1
|
13
|
-
end
|
14
|
-
|
15
|
-
case operator.to_sym
|
16
|
-
when :==, :eq
|
17
|
-
@operator = 'EQ'
|
18
|
-
when :!=, :nq
|
19
|
-
@operator = 'NE'
|
20
|
-
when :<=, :le
|
21
|
-
@operator = 'LE'
|
22
|
-
when :<, :lt
|
23
|
-
@operator = 'LT'
|
24
|
-
when :>=, :ge
|
25
|
-
@operator = 'GE'
|
26
|
-
when :>, :gt
|
27
|
-
@operator = 'GT'
|
28
|
-
when :between
|
29
|
-
@operator = 'BETWEEN'
|
30
|
-
@value =[value1, value2]
|
31
|
-
when :is_null
|
32
|
-
@operator = 'NULL'
|
33
|
-
when :is_not_null
|
34
|
-
@operator = 'NOT_NULL'
|
35
|
-
when :contains
|
36
|
-
@operator = 'CONTAINS'
|
37
|
-
when :not_contains
|
38
|
-
@operator = 'NOT_CONTAINS'
|
39
|
-
when :begins_with
|
40
|
-
@operator = 'BEGINS_WITH'
|
41
|
-
else
|
42
|
-
raise ArgumentError, '%s is not defined ' % operator
|
43
|
-
end
|
44
|
-
self
|
45
|
-
end
|
46
|
-
|
47
|
-
def data(is_force_array=false)
|
48
|
-
value = super()
|
49
|
-
if is_force_array or value.is_a? Array
|
50
|
-
data = {
|
51
|
-
attribute_value_list: (is_force_array and !(value.is_a? Array)) ? [value] : value,
|
52
|
-
comparison_operator: @operator
|
53
|
-
}
|
54
|
-
else
|
55
|
-
data = {}
|
56
|
-
data[:value]= value if value.present?
|
57
|
-
data[:comparison_operator]= @operator
|
58
|
-
end
|
59
|
-
|
60
|
-
data[:exists] = true if @exists.present?
|
61
|
-
data
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
describe Dymos::Query::Attribute do
|
2
|
-
describe :new do
|
3
|
-
describe "DynamoDBClientで取り扱う値の形式に変換" do
|
4
|
-
it "文字列" do
|
5
|
-
attribute = Dymos::Query::Attribute.new('10')
|
6
|
-
expect(attribute.data).to eq(10)
|
7
|
-
end
|
8
|
-
it "数値に変換可能な文字列はintになる" do
|
9
|
-
attribute = Dymos::Query::Attribute.new('10')
|
10
|
-
expect(attribute.data).to eq(10)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
@@ -1,23 +0,0 @@
|
|
1
|
-
describe Dymos::Query::Builder 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
|
-
end
|
8
|
-
|
9
|
-
describe :list_tables do
|
10
|
-
let(:query) { Dymos::Query::Builder.new(:list_tables) }
|
11
|
-
|
12
|
-
it "command" do
|
13
|
-
expect(query.command).to eq(:list_tables)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "execute" do
|
17
|
-
result = query.execute
|
18
|
-
expect(result.include? :table_names).to eq(true)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|