aws / aws/aws-sdk-java-v2

DynamoDb enhanced client: support UpdateExpressions in single-request update

Open
#5,554 4 comments 8 reactions 0 assignees View on GitHub
dynamodb-enhanced feature-request p2
Dominant language
Java
Stars
2.6k
Forks
1k
Avg merge
2d 9h
Merged PRs (30d)
51

Description

### Describe the feature

Enhance the `UpdateItemEnhancedRequest` to support update expressions.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html

I see this feature is partially implemented: https://aws.amazon.com/blogs/developer/using-atomic-counters-in-the-enhanced-dynamodb-aws-sdk-for-java-2-x-client/

but as it is also stated in the article:

> Update expressions in the extensions are applicable for use cases where you want to do the same thing with an attribute every time that you call the database, such as atomic counters. However, if you need a one-time effect for a single request, then leveraging the extension framework isn’t useful.

### Use Case

I need to atomically increment a numeric value in a table column by different amounts on demand, without first reading the current value.

Consider this table:

```
@Getter
@Setter
@DynamoDbBean
public class Recording {

private String id;
private Long totalRecordingSeconds;
```

I need to be able to update and increment the value of `totalRecordingSeconds` with different durations: +30, + 20 ... etc, without reading the current value.

It would be helpful to be able to perform something like:

```
String updateExpression = "SET totalRecordingSeconds = if_not_exists(totalRecordingSeconds, :zero) + :increment";

Map expressionValues = new HashMap<>();
expressionValues.put(":increment", AttributeValue.builder().n(Long.toString(incrementBy)).build());
expressionValues.put(":zero", AttributeValue.builder().n("0").build());

Expression expression = Expression.builder()
.expression(updateExpression)
.expressionValues(expressionValues)
.build();

UpdateItemEnhancedRequest request = UpdateItemEnhancedRequest.builder(Recording.class)
.key(k -> k.partitionValue(id))
.updateExpression(expression)
.build();

table.updateItem(request);
```

### Proposed Solution

_No response_

### Other Information

_No response_

### Acknowledgements

- [ ] I may be able to implement this feature request
- [ ] This feature might incur a breaking change

### AWS Java SDK version used

2.21.37

### JDK version used

22.0.2

### Operating System and version

MacOS Sonoma 14.5

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.