Skip to content

Commit a7bd547

Browse files
committed
Add support for consumed capacity in transactWriteItems
1 parent 4430299 commit a7bd547

File tree

12 files changed

+335
-16
lines changed

12 files changed

+335
-16
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"type": "feature",
33
"category": "DynamoDBEnhancedClient",
4-
"description": "This commit introduces ConsumedCapacity in the response of a BatchWrite response",
4+
"description": "Support of ReturnConsumedCapacity in DynamoDBEnhancedClient's BatchWrite and TransctWriteItems operations",
55
"contributor": "prateek-vats"
66
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest;
3636
import software.amazon.awssdk.enhanced.dynamodb.model.TransactGetItemsEnhancedRequest;
3737
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
38+
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedResponse;
3839
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
3940
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
4041

@@ -380,7 +381,7 @@ default CompletableFuture<List<Document>> transactGetItems(
380381
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys grouped by tables.
381382
* @return a {@link CompletableFuture} of {@link Void}.
382383
*/
383-
default CompletableFuture<Void> transactWriteItems(TransactWriteItemsEnhancedRequest request) {
384+
default CompletableFuture<TransactWriteItemsEnhancedResponse> transactWriteItems(TransactWriteItemsEnhancedRequest request) {
384385
throw new UnsupportedOperationException();
385386
}
386387

@@ -425,7 +426,7 @@ default CompletableFuture<Void> transactWriteItems(TransactWriteItemsEnhancedReq
425426
* tables.
426427
* @return a {@link CompletableFuture} of {@link Void}.
427428
*/
428-
default CompletableFuture<Void> transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
429+
default CompletableFuture<TransactWriteItemsEnhancedResponse> transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
429430
throw new UnsupportedOperationException();
430431
}
431432

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest;
3535
import software.amazon.awssdk.enhanced.dynamodb.model.TransactGetItemsEnhancedRequest;
3636
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
37+
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedResponse;
3738
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
3839
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
3940
import software.amazon.awssdk.services.dynamodb.model.BatchGetItemRequest;
@@ -394,7 +395,7 @@ default List<Document> transactGetItems(Consumer<TransactGetItemsEnhancedRequest
394395
*
395396
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys grouped by tables.
396397
*/
397-
default Void transactWriteItems(TransactWriteItemsEnhancedRequest request) {
398+
default TransactWriteItemsEnhancedResponse transactWriteItems(TransactWriteItemsEnhancedRequest request) {
398399
throw new UnsupportedOperationException();
399400
}
400401

@@ -439,7 +440,7 @@ default Void transactWriteItems(TransactWriteItemsEnhancedRequest request) {
439440
* @param requestConsumer a {@link Consumer} of {@link TransactWriteItemsEnhancedRequest} containing keys and items grouped
440441
* by tables.
441442
*/
442-
default Void transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
443+
default TransactWriteItemsEnhancedResponse transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
443444
throw new UnsupportedOperationException();
444445
}
445446

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import software.amazon.awssdk.enhanced.dynamodb.model.BatchWriteResult;
3737
import software.amazon.awssdk.enhanced.dynamodb.model.TransactGetItemsEnhancedRequest;
3838
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
39+
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedResponse;
3940
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
4041

4142
@SdkInternalApi
@@ -102,13 +103,13 @@ public CompletableFuture<List<Document>> transactGetItems(
102103
}
103104

104105
@Override
105-
public CompletableFuture<Void> transactWriteItems(TransactWriteItemsEnhancedRequest request) {
106+
public CompletableFuture<TransactWriteItemsEnhancedResponse> transactWriteItems(TransactWriteItemsEnhancedRequest request) {
106107
TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(request);
107108
return operation.executeAsync(dynamoDbClient, extension);
108109
}
109110

110111
@Override
111-
public CompletableFuture<Void> transactWriteItems(
112+
public CompletableFuture<TransactWriteItemsEnhancedResponse> transactWriteItems(
112113
Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
113114

114115
TransactWriteItemsEnhancedRequest.Builder builder = TransactWriteItemsEnhancedRequest.builder();

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import software.amazon.awssdk.enhanced.dynamodb.model.BatchWriteResult;
3636
import software.amazon.awssdk.enhanced.dynamodb.model.TransactGetItemsEnhancedRequest;
3737
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
38+
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedResponse;
3839
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
3940

4041
@SdkInternalApi
@@ -98,13 +99,13 @@ public List<Document> transactGetItems(
9899
}
99100

100101
@Override
101-
public Void transactWriteItems(TransactWriteItemsEnhancedRequest request) {
102+
public TransactWriteItemsEnhancedResponse transactWriteItems(TransactWriteItemsEnhancedRequest request) {
102103
TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(request);
103104
return operation.execute(dynamoDbClient, extension);
104105
}
105106

106107
@Override
107-
public Void transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
108+
public TransactWriteItemsEnhancedResponse transactWriteItems(Consumer<TransactWriteItemsEnhancedRequest.Builder> requestConsumer) {
108109
TransactWriteItemsEnhancedRequest.Builder builder = TransactWriteItemsEnhancedRequest.builder();
109110
requestConsumer.accept(builder);
110111
return transactWriteItems(builder.build());

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/operations/TransactWriteItemsOperation.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.function.Function;
2020
import software.amazon.awssdk.annotations.SdkInternalApi;
2121
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension;
22+
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedResponse;
2223
import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest;
2324
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
2425
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
@@ -27,7 +28,7 @@
2728

2829
@SdkInternalApi
2930
public class TransactWriteItemsOperation
30-
implements DatabaseOperation<TransactWriteItemsRequest, TransactWriteItemsResponse, Void> {
31+
implements DatabaseOperation<TransactWriteItemsRequest, TransactWriteItemsResponse, TransactWriteItemsEnhancedResponse> {
3132

3233
private TransactWriteItemsEnhancedRequest request;
3334

@@ -49,12 +50,17 @@ public TransactWriteItemsRequest generateRequest(DynamoDbEnhancedClientExtension
4950
return TransactWriteItemsRequest.builder()
5051
.transactItems(this.request.transactWriteItems())
5152
.clientRequestToken(this.request.clientRequestToken())
53+
.returnConsumedCapacity(this.request.returnConsumedCapacity())
54+
.returnItemCollectionMetrics(this.request.returnItemCollectionMetrics())
5255
.build();
5356
}
5457

5558
@Override
56-
public Void transformResponse(TransactWriteItemsResponse response, DynamoDbEnhancedClientExtension extension) {
57-
return null; // this operation does not return results
59+
public TransactWriteItemsEnhancedResponse transformResponse(TransactWriteItemsResponse response, DynamoDbEnhancedClientExtension extension) {
60+
return TransactWriteItemsEnhancedResponse.builder()
61+
.consumedCapacity(response.consumedCapacity())
62+
.itemCollectionMetrics(response.itemCollectionMetrics())
63+
.build();
5864
}
5965

6066
@Override

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

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.ArrayList;
2121
import java.util.List;
22+
import java.util.Objects;
2223
import java.util.function.Consumer;
2324
import java.util.function.Supplier;
2425
import software.amazon.awssdk.annotations.NotThreadSafe;
@@ -33,7 +34,12 @@
3334
import software.amazon.awssdk.enhanced.dynamodb.internal.operations.PutItemOperation;
3435
import software.amazon.awssdk.enhanced.dynamodb.internal.operations.TransactableWriteOperation;
3536
import software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation;
37+
import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;
38+
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
39+
import software.amazon.awssdk.services.dynamodb.model.ReturnConsumedCapacity;
40+
import software.amazon.awssdk.services.dynamodb.model.ReturnItemCollectionMetrics;
3641
import software.amazon.awssdk.services.dynamodb.model.TransactWriteItem;
42+
import software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest;
3743

3844
/**
3945
* Defines parameters used for the transaction operation transactWriteItems() (such as
@@ -56,10 +62,14 @@ public final class TransactWriteItemsEnhancedRequest {
5662
private final List<TransactWriteItem> transactWriteItems;
5763

5864
private final String clientRequestToken;
65+
private final String returnConsumedCapacity;
66+
private final String returnItemCollectionMetrics;
5967

6068
private TransactWriteItemsEnhancedRequest(Builder builder) {
6169
this.transactWriteItems = getItemsFromSupplier(builder.itemSupplierList);
6270
this.clientRequestToken = builder.clientRequestToken;
71+
this.returnConsumedCapacity = builder.returnConsumedCapacity;
72+
this.returnItemCollectionMetrics = builder.returnItemCollectionMetrics;
6373
}
6474

6575
/**
@@ -89,6 +99,34 @@ public String clientRequestToken() {
8999
return clientRequestToken;
90100
}
91101

102+
/**
103+
* Whether to return the capacity consumed by this operation.
104+
*
105+
* @see PutItemRequest#returnConsumedCapacity()
106+
*/
107+
public ReturnConsumedCapacity returnConsumedCapacity() {
108+
return ReturnConsumedCapacity.fromValue(returnConsumedCapacity);
109+
}
110+
111+
/**
112+
* Whether to return the capacity consumed by this operation.
113+
* <p>
114+
* Similar to {@link #returnConsumedCapacity()} but return the value as a string. This is useful in situations where the
115+
* value is not defined in {@link ReturnConsumedCapacity}.
116+
*/
117+
public String returnConsumedCapacityAsString() {
118+
return returnConsumedCapacity;
119+
}
120+
121+
/**
122+
* Whether to return the item collection metrics.
123+
*
124+
* @see DeleteItemRequest#returnItemCollectionMetrics()
125+
*/
126+
public ReturnItemCollectionMetrics returnItemCollectionMetrics() {
127+
return ReturnItemCollectionMetrics.fromValue(returnItemCollectionMetrics);
128+
}
129+
92130
/**
93131
* Returns the list of {@link TransactWriteItem} that represents all actions in the request.
94132
*/
@@ -104,15 +142,13 @@ public boolean equals(Object o) {
104142
if (o == null || getClass() != o.getClass()) {
105143
return false;
106144
}
107-
108145
TransactWriteItemsEnhancedRequest that = (TransactWriteItemsEnhancedRequest) o;
109-
110-
return transactWriteItems != null ? transactWriteItems.equals(that.transactWriteItems) : that.transactWriteItems == null;
146+
return Objects.equals(transactWriteItems, that.transactWriteItems) && Objects.equals(clientRequestToken, that.clientRequestToken) && Objects.equals(returnConsumedCapacity, that.returnConsumedCapacity) && Objects.equals(returnItemCollectionMetrics, that.returnItemCollectionMetrics);
111147
}
112148

113149
@Override
114150
public int hashCode() {
115-
return transactWriteItems != null ? transactWriteItems.hashCode() : 0;
151+
return Objects.hash(transactWriteItems, clientRequestToken, returnConsumedCapacity, returnItemCollectionMetrics);
116152
}
117153

118154
/**
@@ -125,6 +161,8 @@ public static final class Builder {
125161
private List<Supplier<TransactWriteItem>> itemSupplierList = new ArrayList<>();
126162

127163
private String clientRequestToken;
164+
private String returnConsumedCapacity;
165+
private String returnItemCollectionMetrics;
128166

129167
private Builder() {
130168
}
@@ -337,6 +375,37 @@ public <T> Builder addUpdateItem(MappedTableResource<T> mappedTableResource, T i
337375
.build());
338376
}
339377

378+
/**
379+
* Whether to return the capacity consumed by this operation.
380+
*
381+
* @see TransactWriteItemsEnhancedRequest.Builder#returnConsumedCapacity(ReturnConsumedCapacity)
382+
*/
383+
public TransactWriteItemsEnhancedRequest.Builder returnConsumedCapacity(ReturnConsumedCapacity returnConsumedCapacity) {
384+
this.returnConsumedCapacity = returnConsumedCapacity == null ? null : returnConsumedCapacity.toString();
385+
return this;
386+
}
387+
388+
/**
389+
* Whether to return the capacity consumed by this operation.
390+
*
391+
* @see TransactWriteItemsEnhancedRequest.Builder#returnConsumedCapacity(String)
392+
*/
393+
public TransactWriteItemsEnhancedRequest.Builder returnConsumedCapacity(String returnConsumedCapacity) {
394+
this.returnConsumedCapacity = returnConsumedCapacity;
395+
return this;
396+
}
397+
398+
/**
399+
* Whether to return the item collection metrics.
400+
*
401+
* @see UpdateItemRequest.Builder#returnItemCollectionMetrics(ReturnItemCollectionMetrics)
402+
*/
403+
public TransactWriteItemsEnhancedRequest.Builder returnItemCollectionMetrics(ReturnItemCollectionMetrics returnItemCollectionMetrics) {
404+
this.returnItemCollectionMetrics = returnItemCollectionMetrics == null ? null :
405+
returnItemCollectionMetrics.toString();
406+
return this;
407+
}
408+
340409
/**
341410
* Sets the clientRequestToken in this builder.
342411
*
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.enhanced.dynamodb.model;
17+
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Objects;
21+
import software.amazon.awssdk.annotations.NotThreadSafe;
22+
import software.amazon.awssdk.annotations.SdkPublicApi;
23+
import software.amazon.awssdk.annotations.ThreadSafe;
24+
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
25+
import software.amazon.awssdk.services.dynamodb.model.ConsumedCapacity;
26+
import software.amazon.awssdk.services.dynamodb.model.ItemCollectionMetrics;
27+
28+
/**
29+
* Defines the elements returned by DynamoDB from a {@code TransactWriteItemsOperation} operation, such as
30+
* {@link DynamoDbEnhancedClient#transactWriteItems(TransactWriteItemsEnhancedRequest)}
31+
*
32+
*/
33+
@SdkPublicApi
34+
@ThreadSafe
35+
public final class TransactWriteItemsEnhancedResponse {
36+
private final List<ConsumedCapacity> consumedCapacity;
37+
private final Map<String, List<ItemCollectionMetrics>> itemCollectionMetrics;
38+
39+
private TransactWriteItemsEnhancedResponse(Builder builder) {
40+
this.consumedCapacity = builder.consumedCapacity;
41+
this.itemCollectionMetrics = builder.itemCollectionMetrics;
42+
}
43+
44+
/**
45+
* The capacity units consumed by the {@code UpdateItem} operation.
46+
*
47+
* @see TransactWriteItemsEnhancedResponse#consumedCapacity() for more information.
48+
*/
49+
public List<ConsumedCapacity> consumedCapacity() {
50+
return consumedCapacity;
51+
}
52+
53+
/**
54+
* Information about item collections, if any, that were affected by the {@code UpdateItem} operation.
55+
*
56+
* @see TransactWriteItemsEnhancedResponse#itemCollectionMetrics() for more information.
57+
*/
58+
public Map<String, List<ItemCollectionMetrics>> itemCollectionMetrics() {
59+
return itemCollectionMetrics;
60+
}
61+
62+
@Override
63+
public boolean equals(Object o) {
64+
if (this == o) {
65+
return true;
66+
}
67+
if (o == null || getClass() != o.getClass()) {
68+
return false;
69+
}
70+
TransactWriteItemsEnhancedResponse that = (TransactWriteItemsEnhancedResponse) o;
71+
return Objects.equals(consumedCapacity, that.consumedCapacity) && Objects.equals(itemCollectionMetrics, that.itemCollectionMetrics);
72+
}
73+
74+
@Override
75+
public int hashCode() {
76+
return Objects.hash(consumedCapacity, itemCollectionMetrics);
77+
}
78+
79+
/**
80+
* Creates a newly initialized builder for a request object.
81+
*/
82+
public static TransactWriteItemsEnhancedResponse.Builder builder() {
83+
return new TransactWriteItemsEnhancedResponse.Builder();
84+
}
85+
86+
@NotThreadSafe
87+
public static final class Builder{
88+
private List<ConsumedCapacity> consumedCapacity;
89+
private Map<String, List<ItemCollectionMetrics>> itemCollectionMetrics;
90+
91+
public Builder consumedCapacity(List<ConsumedCapacity> consumedCapacity) {
92+
this.consumedCapacity = consumedCapacity;
93+
return this;
94+
}
95+
96+
public Builder itemCollectionMetrics(Map<String, List<ItemCollectionMetrics>> itemCollectionMetrics) {
97+
this.itemCollectionMetrics = itemCollectionMetrics;
98+
return this;
99+
}
100+
101+
public TransactWriteItemsEnhancedResponse build() {
102+
return new TransactWriteItemsEnhancedResponse(this);
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)