Skip to content

Commit 25ea9d6

Browse files
committed
Optimistic Locking for Delete Operations
1 parent b739e14 commit 25ea9d6

File tree

2 files changed

+158
-63
lines changed

2 files changed

+158
-63
lines changed

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/OptimisticLockingAsyncCrudTest.java

Lines changed: 82 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,46 +39,87 @@
3939
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
4040
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
4141
import software.amazon.awssdk.services.dynamodb.model.ConditionalCheckFailedException;
42+
import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest;
4243
import software.amazon.awssdk.services.dynamodb.model.TransactionCanceledException;
4344

4445
public class OptimisticLockingAsyncCrudTest extends LocalDynamoDbAsyncTestBase {
4546

46-
private static final TableSchema<Record> TABLE_SCHEMA = TableSchema.fromClass(Record.class);
47+
private static final TableSchema<Record> TABLE_SCHEMA =
48+
StaticTableSchema.builder(Record.class)
49+
.newItemSupplier(Record::new)
50+
.addAttribute(String.class,
51+
a -> a.name("id")
52+
.getter(Record::getId)
53+
.setter(Record::setId)
54+
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
55+
.addAttribute(Integer.class,
56+
a -> a.name("sort")
57+
.getter(Record::getSort)
58+
.setter(Record::setSort)
59+
.tags(primarySortKey(), secondarySortKey("index1")))
60+
.addAttribute(Integer.class,
61+
a -> a.name("value")
62+
.getter(Record::getValue)
63+
.setter(Record::setValue))
64+
.addAttribute(String.class,
65+
a -> a.name("gsi_id")
66+
.getter(Record::getGsiId)
67+
.setter(Record::setGsiId)
68+
.tags(secondaryPartitionKey("gsi_keys_only")))
69+
.addAttribute(Integer.class,
70+
a -> a.name("gsi_sort")
71+
.getter(Record::getGsiSort)
72+
.setter(Record::setGsiSort)
73+
.tags(secondarySortKey("gsi_keys_only")))
74+
.addAttribute(String.class,
75+
a -> a.name("stringAttribute")
76+
.getter(Record::getStringAttribute)
77+
.setter(Record::setStringAttribute))
78+
.build();
79+
4780
private static final TableSchema<VersionedRecord> VERSIONED_RECORD_TABLE_SCHEMA =
4881
StaticTableSchema.builder(VersionedRecord.class)
4982
.newItemSupplier(VersionedRecord::new)
50-
.addAttribute(String.class, a -> a.name("id")
51-
.getter(VersionedRecord::getId)
52-
.setter(VersionedRecord::setId)
53-
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
54-
.addAttribute(Integer.class, a -> a.name("sort")
55-
.getter(VersionedRecord::getSort)
56-
.setter(VersionedRecord::setSort)
57-
.tags(primarySortKey(), secondarySortKey("index1")))
58-
.addAttribute(Integer.class, a -> a.name("value")
59-
.getter(VersionedRecord::getValue)
60-
.setter(VersionedRecord::setValue))
61-
.addAttribute(String.class, a -> a.name("gsi_id")
62-
.getter(VersionedRecord::getGsiId)
63-
.setter(VersionedRecord::setGsiId)
64-
.tags(secondaryPartitionKey("gsi_keys_only")))
65-
.addAttribute(Integer.class, a -> a.name("gsi_sort")
66-
.getter(VersionedRecord::getGsiSort)
67-
.setter(VersionedRecord::setGsiSort)
68-
.tags(secondarySortKey("gsi_keys_only")))
69-
.addAttribute(String.class, a -> a.name("stringAttribute")
70-
.getter(VersionedRecord::getStringAttribute)
71-
.setter(VersionedRecord::setStringAttribute))
72-
.addAttribute(Integer.class, a -> a.name("version")
73-
.getter(VersionedRecord::getVersion)
74-
.setter(VersionedRecord::setVersion)
75-
.tags(versionAttribute()))
83+
.addAttribute(String.class,
84+
a -> a.name("id")
85+
.getter(VersionedRecord::getId)
86+
.setter(VersionedRecord::setId)
87+
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
88+
.addAttribute(Integer.class,
89+
a -> a.name("sort")
90+
.getter(VersionedRecord::getSort)
91+
.setter(VersionedRecord::setSort)
92+
.tags(primarySortKey(), secondarySortKey("index1")))
93+
.addAttribute(Integer.class,
94+
a -> a.name("value")
95+
.getter(VersionedRecord::getValue)
96+
.setter(VersionedRecord::setValue))
97+
.addAttribute(String.class,
98+
a -> a.name("gsi_id")
99+
.getter(VersionedRecord::getGsiId)
100+
.setter(VersionedRecord::setGsiId)
101+
.tags(secondaryPartitionKey("gsi_keys_only")))
102+
.addAttribute(Integer.class,
103+
a -> a.name("gsi_sort")
104+
.getter(VersionedRecord::getGsiSort)
105+
.setter(VersionedRecord::setGsiSort)
106+
.tags(secondarySortKey("gsi_keys_only")))
107+
.addAttribute(String.class,
108+
a -> a.name("stringAttribute")
109+
.getter(VersionedRecord::getStringAttribute)
110+
.setter(VersionedRecord::setStringAttribute))
111+
.addAttribute(Integer.class,
112+
a -> a.name("version")
113+
.getter(VersionedRecord::getVersion)
114+
.setter(VersionedRecord::setVersion)
115+
.tags(versionAttribute()))
76116
.build();
77117

78118

79-
private final DynamoDbEnhancedAsyncClient enhancedClient = DynamoDbEnhancedAsyncClient.builder()
80-
.dynamoDbClient(getDynamoDbAsyncClient())
81-
.build();
119+
private final DynamoDbEnhancedAsyncClient enhancedClient =
120+
DynamoDbEnhancedAsyncClient.builder()
121+
.dynamoDbClient(getDynamoDbAsyncClient())
122+
.build();
82123

83124
private final DynamoDbAsyncTable<Record> mappedTable =
84125
enhancedClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA);
@@ -87,14 +128,21 @@ public class OptimisticLockingAsyncCrudTest extends LocalDynamoDbAsyncTestBase {
87128

88129
@Before
89130
public void createTable() {
90-
mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()));
91-
versionedRecordTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()));
131+
mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join();
132+
versionedRecordTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join();
92133
}
93134

94135
@After
95136
public void deleteTable() {
96-
getDynamoDbAsyncClient().deleteTable(r -> r.tableName(getConcreteTableName("table-name")));
97-
getDynamoDbAsyncClient().deleteTable(r -> r.tableName(getConcreteTableName("versioned-table-name")));
137+
getDynamoDbAsyncClient().deleteTable(
138+
DeleteTableRequest.builder()
139+
.tableName(getConcreteTableName("table-name"))
140+
.build()).join();
141+
142+
getDynamoDbAsyncClient().deleteTable(
143+
DeleteTableRequest.builder()
144+
.tableName(getConcreteTableName("versioned-table-name"))
145+
.build()).join();
98146
}
99147

100148
// 1. deleteItem(T item) on Non-versioned record

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/functionaltests/OptimisticLockingCrudTest.java

Lines changed: 76 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,40 +41,80 @@
4141
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
4242
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
4343
import software.amazon.awssdk.services.dynamodb.model.ConditionalCheckFailedException;
44+
import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest;
4445
import software.amazon.awssdk.services.dynamodb.model.TransactionCanceledException;
4546

4647
public class OptimisticLockingCrudTest extends LocalDynamoDbSyncTestBase {
4748

48-
private static final TableSchema<Record> TABLE_SCHEMA = TableSchema.fromClass(Record.class);
49+
private static final TableSchema<Record> TABLE_SCHEMA =
50+
StaticTableSchema.builder(Record.class)
51+
.newItemSupplier(Record::new)
52+
.addAttribute(String.class,
53+
a -> a.name("id")
54+
.getter(Record::getId)
55+
.setter(Record::setId)
56+
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
57+
.addAttribute(Integer.class,
58+
a -> a.name("sort")
59+
.getter(Record::getSort)
60+
.setter(Record::setSort)
61+
.tags(primarySortKey(), secondarySortKey("index1")))
62+
.addAttribute(Integer.class,
63+
a -> a.name("value")
64+
.getter(Record::getValue)
65+
.setter(Record::setValue))
66+
.addAttribute(String.class,
67+
a -> a.name("gsi_id")
68+
.getter(Record::getGsiId)
69+
.setter(Record::setGsiId)
70+
.tags(secondaryPartitionKey("gsi_keys_only")))
71+
.addAttribute(Integer.class,
72+
a -> a.name("gsi_sort")
73+
.getter(Record::getGsiSort)
74+
.setter(Record::setGsiSort)
75+
.tags(secondarySortKey("gsi_keys_only")))
76+
.addAttribute(String.class,
77+
a -> a.name("stringAttribute")
78+
.getter(Record::getStringAttribute)
79+
.setter(Record::setStringAttribute))
80+
.build();
81+
4982
private static final TableSchema<VersionedRecord> VERSIONED_RECORD_TABLE_SCHEMA =
5083
StaticTableSchema.builder(VersionedRecord.class)
5184
.newItemSupplier(VersionedRecord::new)
52-
.addAttribute(String.class, a -> a.name("id")
53-
.getter(VersionedRecord::getId)
54-
.setter(VersionedRecord::setId)
55-
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
56-
.addAttribute(Integer.class, a -> a.name("sort")
57-
.getter(VersionedRecord::getSort)
58-
.setter(VersionedRecord::setSort)
59-
.tags(primarySortKey(), secondarySortKey("index1")))
60-
.addAttribute(Integer.class, a -> a.name("value")
61-
.getter(VersionedRecord::getValue)
62-
.setter(VersionedRecord::setValue))
63-
.addAttribute(String.class, a -> a.name("gsi_id")
64-
.getter(VersionedRecord::getGsiId)
65-
.setter(VersionedRecord::setGsiId)
66-
.tags(secondaryPartitionKey("gsi_keys_only")))
67-
.addAttribute(Integer.class, a -> a.name("gsi_sort")
68-
.getter(VersionedRecord::getGsiSort)
69-
.setter(VersionedRecord::setGsiSort)
70-
.tags(secondarySortKey("gsi_keys_only")))
71-
.addAttribute(String.class, a -> a.name("stringAttribute")
72-
.getter(VersionedRecord::getStringAttribute)
73-
.setter(VersionedRecord::setStringAttribute))
74-
.addAttribute(Integer.class, a -> a.name("version")
75-
.getter(VersionedRecord::getVersion)
76-
.setter(VersionedRecord::setVersion)
77-
.tags(versionAttribute()))
85+
.addAttribute(String.class,
86+
a -> a.name("id")
87+
.getter(VersionedRecord::getId)
88+
.setter(VersionedRecord::setId)
89+
.tags(primaryPartitionKey(), secondaryPartitionKey("index1")))
90+
.addAttribute(Integer.class,
91+
a -> a.name("sort")
92+
.getter(VersionedRecord::getSort)
93+
.setter(VersionedRecord::setSort)
94+
.tags(primarySortKey(), secondarySortKey("index1")))
95+
.addAttribute(Integer.class,
96+
a -> a.name("value")
97+
.getter(VersionedRecord::getValue)
98+
.setter(VersionedRecord::setValue))
99+
.addAttribute(String.class,
100+
a -> a.name("gsi_id")
101+
.getter(VersionedRecord::getGsiId)
102+
.setter(VersionedRecord::setGsiId)
103+
.tags(secondaryPartitionKey("gsi_keys_only")))
104+
.addAttribute(Integer.class,
105+
a -> a.name("gsi_sort")
106+
.getter(VersionedRecord::getGsiSort)
107+
.setter(VersionedRecord::setGsiSort)
108+
.tags(secondarySortKey("gsi_keys_only")))
109+
.addAttribute(String.class,
110+
a -> a.name("stringAttribute")
111+
.getter(VersionedRecord::getStringAttribute)
112+
.setter(VersionedRecord::setStringAttribute))
113+
.addAttribute(Integer.class,
114+
a -> a.name("version")
115+
.getter(VersionedRecord::getVersion)
116+
.setter(VersionedRecord::setVersion)
117+
.tags(versionAttribute()))
78118
.build();
79119

80120

@@ -95,8 +135,15 @@ public void createTable() {
95135

96136
@After
97137
public void deleteTable() {
98-
getDynamoDbClient().deleteTable(r -> r.tableName(getConcreteTableName("table-name")));
99-
getDynamoDbClient().deleteTable(r -> r.tableName(getConcreteTableName("versioned-table-name")));
138+
getDynamoDbClient().deleteTable(
139+
DeleteTableRequest.builder()
140+
.tableName(getConcreteTableName("table-name"))
141+
.build());
142+
143+
getDynamoDbClient().deleteTable(
144+
DeleteTableRequest.builder()
145+
.tableName(getConcreteTableName("versioned-table-name"))
146+
.build());
100147
}
101148

102149
// 1. deleteItem(T item) on Non-versioned record

0 commit comments

Comments
 (0)