Skip to content

Commit bf6decc

Browse files
committed
[POC] Optimistic Locking for Delete Operations
1 parent 5853883 commit bf6decc

File tree

3 files changed

+26
-39
lines changed

3 files changed

+26
-39
lines changed

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/client/DefaultDynamoDbAsyncTable.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package software.amazon.awssdk.enhanced.dynamodb.internal.client;
1717

1818
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.createKeyFromItem;
19-
import static software.amazon.awssdk.enhanced.dynamodb.model.OptimisticLockingHelper.applyOptimisticLockingIfApplicable;
19+
import static software.amazon.awssdk.enhanced.dynamodb.model.OptimisticLockingHelper.conditionallyApplyOptimisticLocking;
2020

2121
import java.util.ArrayList;
2222
import java.util.concurrent.CompletableFuture;
@@ -54,7 +54,6 @@
5454
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
5555
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedResponse;
5656
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
57-
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
5857
import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;
5958
import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse;
6059

@@ -172,7 +171,7 @@ public CompletableFuture<T> deleteItem(T keyItem) {
172171
*/
173172
public CompletableFuture<T> deleteItem(T keyItem, boolean useOptimisticLocking) {
174173
DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder().key(keyFrom(keyItem)).build();
175-
request = applyOptimisticLockingIfApplicable(request, keyItem, tableSchema, useOptimisticLocking);
174+
request = conditionallyApplyOptimisticLocking(request, keyItem, tableSchema, useOptimisticLocking);
176175
return deleteItem(request);
177176
}
178177

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/client/DefaultDynamoDbTable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package software.amazon.awssdk.enhanced.dynamodb.internal.client;
1717

1818
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.createKeyFromItem;
19-
import static software.amazon.awssdk.enhanced.dynamodb.model.OptimisticLockingHelper.applyOptimisticLockingIfApplicable;
19+
import static software.amazon.awssdk.enhanced.dynamodb.model.OptimisticLockingHelper.conditionallyApplyOptimisticLocking;
2020

2121
import java.util.ArrayList;
2222
import java.util.function.Consumer;
@@ -172,7 +172,7 @@ public T deleteItem(T keyItem) {
172172
*/
173173
public T deleteItem(T keyItem, boolean useOptimisticLocking) {
174174
DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder().key(keyFrom(keyItem)).build();
175-
request = applyOptimisticLockingIfApplicable(request, keyItem, tableSchema, useOptimisticLocking);
175+
request = conditionallyApplyOptimisticLocking(request, keyItem, tableSchema, useOptimisticLocking);
176176
return deleteItem(request);
177177
}
178178

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/model/OptimisticLockingHelper.java

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,6 @@ public static TransactDeleteItemEnhancedRequest withOptimisticLocking(
6767
.build();
6868
}
6969

70-
/**
71-
* Applies optimistic locking if the item has version information.
72-
*
73-
* @param <T> the type of the item
74-
* @param request the original delete request
75-
* @param keyItem the item containing version information
76-
* @param tableSchema the table schema
77-
* @return delete request with optimistic locking if version exists, otherwise original request
78-
*/
79-
public static <T> DeleteItemEnhancedRequest applyOptimisticLockingIfApplicable(
80-
DeleteItemEnhancedRequest request, T keyItem, TableSchema<T> tableSchema) {
81-
82-
Optional<String> versionAttributeName = getVersionAttributeName(tableSchema);
83-
if (versionAttributeName.isPresent()) {
84-
AttributeValue version = tableSchema.attributeValue(keyItem, versionAttributeName.get());
85-
if (version != null) {
86-
return withOptimisticLocking(request, version, versionAttributeName.get());
87-
}
88-
}
89-
return request;
90-
}
91-
9270
/**
9371
* Conditionally applies optimistic locking if enabled and version information exists.
9472
*
@@ -99,20 +77,19 @@ public static <T> DeleteItemEnhancedRequest applyOptimisticLockingIfApplicable(
9977
* @param useOptimisticLocking if true, applies optimistic locking
10078
* @return delete request with optimistic locking if enabled and version exists, otherwise original request
10179
*/
102-
public static <T> DeleteItemEnhancedRequest applyOptimisticLockingIfApplicable(
80+
public static <T> DeleteItemEnhancedRequest conditionallyApplyOptimisticLocking(
10381
DeleteItemEnhancedRequest request, T keyItem, TableSchema<T> tableSchema, boolean useOptimisticLocking) {
104-
return useOptimisticLocking ? applyOptimisticLockingIfApplicable(request, keyItem, tableSchema) : request;
105-
}
10682

107-
/**
108-
* Gets the version attribute name from table schema.
109-
*
110-
* @param <T> the type of the item
111-
* @param tableSchema the table schema
112-
* @return version attribute name if present, empty otherwise
113-
*/
114-
public static <T> Optional<String> getVersionAttributeName(TableSchema<T> tableSchema) {
115-
return tableSchema.tableMetadata().customMetadataObject("VersionedRecordExtension:VersionAttribute", String.class);
83+
if (!useOptimisticLocking) {
84+
return request;
85+
}
86+
87+
return getVersionAttributeName(tableSchema)
88+
.map(versionAttributeName -> {
89+
AttributeValue version = tableSchema.attributeValue(keyItem, versionAttributeName);
90+
return version != null ? withOptimisticLocking(request, version, versionAttributeName) : request;
91+
})
92+
.orElse(request);
11693
}
11794

11895
/**
@@ -128,4 +105,15 @@ public static Expression createVersionCondition(AttributeValue versionValue, Str
128105
.putExpressionValue(":version_value", versionValue)
129106
.build();
130107
}
108+
109+
/**
110+
* Gets the version attribute name from table schema.
111+
*
112+
* @param <T> the type of the item
113+
* @param tableSchema the table schema
114+
* @return version attribute name if present, empty otherwise
115+
*/
116+
public static <T> Optional<String> getVersionAttributeName(TableSchema<T> tableSchema) {
117+
return tableSchema.tableMetadata().customMetadataObject("VersionedRecordExtension:VersionAttribute", String.class);
118+
}
131119
}

0 commit comments

Comments
 (0)