/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package software.amazon.awssdk.enhanced.dynamodb; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import software.amazon.awssdk.annotations.NotThreadSafe; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.annotations.ThreadSafe; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbEnhancedAsyncClient; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetResultPage; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetResultPagePublisher; import software.amazon.awssdk.enhanced.dynamodb.model.BatchWriteItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.BatchWriteResult; import software.amazon.awssdk.enhanced.dynamodb.model.ConditionCheck; import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.TransactGetItemsEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.TransactWriteItemsEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; /** * Asynchronous interface for running commands against a DynamoDb database. *
* By default, all command methods throw an {@link UnsupportedOperationException} to prevent interface extensions from breaking
* implementing classes.
*/
@SdkPublicApi
@ThreadSafe
public interface DynamoDbEnhancedAsyncClient extends DynamoDbEnhancedResource {
/**
* Returns a mapped table that can be used to execute commands that work with mapped items against that table.
*
* @param tableName The name of the physical table persisted by DynamoDb.
* @param tableSchema A {@link TableSchema} that maps the table to a modelled object.
* @return A {@link DynamoDbAsyncTable} object that can be used to execute table operations against.
* @param
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link BatchGetItemEnhancedRequest}.
*
* Partial results. A single call to DynamoDb has restraints on how much data can be retrieved.
* If those limits are exceeded, the call yields a partial result. This may also be the case if
* provisional throughput is exceeded or there is an internal DynamoDb processing failure. The operation automatically
* retries any unprocessed keys returned from DynamoDb in subsequent calls for pages.
*
* This operation calls the low-level {@link DynamoDbAsyncClient#batchGetItemPaginator} operation. Consult the
* BatchGetItem documentation for further details and constraints as well as current limits of data retrieval.
*
* Example:
*
* The returned {@link BatchGetResultPagePublisher} can be subscribed to request a stream of {@link BatchGetResultPage}s
* or a stream of flattened results belonging to the supplied table across all pages.
*
*
* 1) Subscribing to {@link BatchGetResultPage}s
*
* 2) Subscribing to results across all pages
*
* Note: This is a convenience method that creates an instance of the request builder avoiding the need to create one
* manually via {@link BatchGetItemEnhancedRequest#builder()}.
*
* Example:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link BatchWriteItemEnhancedRequest}.
*
* Note: BatchWriteItem cannot update items. Instead, use the individual updateItem operation
* {@link DynamoDbAsyncTable#updateItem(UpdateItemEnhancedRequest)}.
*
* Partial updates
* There are some conditions that cause the whole batch operation to fail. These include non-existing tables, erroneously
* defined primary key attributes, attempting to put and delete the same item as well as referring more than once to the same
* hash and range (sort) key.
*
* This operation calls the low-level DynamoDB API BatchWriteItem operation. Consult the BatchWriteItem documentation for
* further details and constraints, current limits of data to write and/or delete, how to handle partial updates and retries
* and under which conditions the operation will fail.
*
* Example:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link BatchWriteItemEnhancedRequest}.
*
* Note: BatchWriteItem cannot update items. Instead, use the individual updateItem operation
* {@link DynamoDbAsyncTable#updateItem}}.
*
* Partial updates
* There are some conditions that cause the whole batch operation to fail. These include non-existing tables, erroneously
* defined primary key attributes, attempting to put and delete the same item as well as referring more than once to the same
* hash and range (sort) key.
*
* This operation calls the low-level DynamoDB API BatchWriteItem operation. Consult the BatchWriteItem documentation for
* further details and constraints, current limits of data to write and/or delete, how to handle partial updates and retries
* and under which conditions the operation will fail.
*
* Note: This is a convenience method that creates an instance of the request builder avoiding the need to create one
* manually via {@link BatchWriteItemEnhancedRequest#builder()}.
*
* Example:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link TransactGetItemsEnhancedRequest}.
*
* DynamoDb will reject a call to TransactGetItems if the call exceeds limits such as provisioned throughput or allowed size
* of items, if the request contains errors or if there are conflicting operations accessing the same item, for instance
* updating and reading at the same time.
*
* This operation calls the low-level DynamoDB API TransactGetItems operation. Consult the TransactGetItems documentation for
* further details and constraints.
*
* Examples:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link TransactGetItemsEnhancedRequest}.
*
* DynamoDb will reject a call to TransactGetItems if the call exceeds limits such as provisioned throughput or allowed size
* of items, if the request contains errors or if there are conflicting operations accessing the same item, for instance
* updating and reading at the same time.
*
* This operation calls the low-level DynamoDB API TransactGetItems operation. Consult the TransactGetItems documentation for
* further details and constraints.
*
* Note: This is a convenience method that creates an instance of the request builder avoiding the need to create one
* manually via {@link TransactGetItemsEnhancedRequest#builder()}.
*
* Examples:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link TransactWriteItemsEnhancedRequest}.
*
* DynamoDb will reject a call to TransactWriteItems if the call exceeds limits such as provisioned throughput or allowed size
* of items, if the request contains errors or if there are conflicting operations accessing the same item. If the request
* contains condition checks that aren't met, this will also cause rejection.
*
* This operation calls the low-level DynamoDB API TransactWriteItems operation. Consult the TransactWriteItems documentation
* for further details and constraints, current limits of data to write and/or delete and under which conditions the operation
* will fail.
*
* Example:
*
* The additional configuration parameters that the enhanced client supports are defined
* in the {@link TransactWriteItemsEnhancedRequest}.
*
* DynamoDb will reject a call to TransactWriteItems if the call exceeds limits such as provisioned throughput or allowed size
* of items, if the request contains errors or if there are conflicting operations accessing the same item. If the request
* contains condition checks that aren't met, this will also cause rejection.
*
* This operation calls the low-level DynamoDB API TransactWriteItems operation. Consult the TransactWriteItems documentation
* for further details and constraints, current limits of data to write and/or delete and under which conditions the operation
* will fail.
*
* Note: This is a convenience method that creates an instance of the request builder avoiding the need to create one
* manually via {@link TransactWriteItemsEnhancedRequest#builder()}.
*
* Example:
*
* {@code
*
* BatchGetResultPagePublisher publisher = enhancedClient.batchGetItem(
* BatchGetItemEnhancedRequest.builder()
* .readBatches(ReadBatch.builder(FirstItem.class)
* .mappedTableResource(firstItemTable)
* .addGetItem(GetItemEnhancedRequest.builder().key(key1).build())
* .addGetItem(GetItemEnhancedRequest.builder().key(key2).build())
* .build(),
* ReadBatch.builder(SecondItem.class)
* .mappedTableResource(secondItemTable)
* .addGetItem(GetItemEnhancedRequest.builder().key(key3).build())
* .build())
* .build());
* }
*
*
*
* {@code
* publisher.subscribe(page -> {
* page.resultsForTable(firstItemTable).forEach(item -> System.out.println(item));
* page.resultsForTable(secondItemTable).forEach(item -> System.out.println(item));
* });
* }
*
*
*
* {@code
* publisher.resultsForTable(firstItemTable).subscribe(item -> System.out.println(item));
* publisher.resultsForTable(secondItemTable).subscribe(item -> System.out.println(item));
* }
*
* @see #batchGetItem(Consumer)
* @see DynamoDbAsyncClient#batchGetItemPaginator
* @param request A {@link BatchGetItemEnhancedRequest} containing keys grouped by tables.
* @return a publisher {@link SdkPublisher} with paginated results of type {@link BatchGetResultPage}.
*/
default BatchGetResultPagePublisher batchGetItem(BatchGetItemEnhancedRequest request) {
throw new UnsupportedOperationException();
}
/**
* Retrieves items from one or more tables by their primary keys, see {@link Key}. BatchGetItem is a composite operation
* where the request contains one batch of {@link GetItemEnhancedRequest} per targeted table.
* The operation makes several calls to the database; each time you iterate over the result to retrieve a page,
* a call is made for the items on that page.
*
* {@code
*
* BatchGetResultPagePublisher batchResults = enhancedClient.batchGetItem(r -> r.addReadBatches(
* ReadBatch.builder(FirstItem.class)
* .mappedTableResource(firstItemTable)
* .addGetItem(i -> i.key(key1))
* .addGetItem(i -> i.key(key2))
* .build(),
* ReadBatch.builder(SecondItem.class)
* .mappedTableResource(secondItemTable)
* .addGetItem(i -> i.key(key3))
* .build()));
* }
*
*
* @see #batchGetItem(BatchGetItemEnhancedRequest)
* @see DynamoDbAsyncClient#batchGetItem
* @param requestConsumer a {@link Consumer} of {@link BatchGetItemEnhancedRequest.Builder} containing keys grouped by tables.
* @return a publisher {@link SdkPublisher} with paginated results of type {@link BatchGetResultPage}.
*/
default BatchGetResultPagePublisher batchGetItem(Consumer
Each delete or put call is atomic, but the operation as a whole is not.
* If individual operations fail due to exceeded provisional throughput internal DynamoDb processing failures,
* the failed requests can be retrieved through the result, see {@link BatchWriteResult}.
*
* {@code
*
* BatchWriteResult batchResult = enhancedClient.batchWriteItem(
* BatchWriteItemEnhancedRequest.builder()
* .writeBatches(WriteBatch.builder(FirstItem.class)
* .mappedTableResource(firstItemTable)
* .addPutItem(PutItemEnhancedRequest.builder().item(item1).build())
* .addDeleteItem(DeleteItemEnhancedRequest.builder()
* .key(key2)
* .build())
* .build(),
* WriteBatch.builder(SecondItem.class)
* .mappedTableResource(secondItemTable)
* .addPutItem(PutItemEnhancedRequest.builder().item(item3).build())
* .build())
* .build()).join();
* }
*
*
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys and items grouped by tables.
* @return a {@link CompletableFuture} of {@link BatchWriteResult}, containing any unprocessed requests.
*/
default CompletableFuture
Each delete or put call is atomic, but the operation as a whole is not.
* If individual operations fail due to exceeded provisional throughput internal DynamoDb processing failures,
* the failed requests can be retrieved through the result, see {@link BatchWriteResult}.
*
* {@code
*
* BatchWriteResult batchResult = enhancedClient.batchWriteItem(r -> r.writeBatches(
* WriteBatch.builder(FirstItem.class)
* .mappedTableResource(firstItemTable)
* .addPutItem(i -> i.item(item1))
* .addDeleteItem(i -> i.key(key2))
* .build(),
* WriteBatch.builder(SecondItem.class)
* .mappedTableResource(secondItemTable)
* .addPutItem(i -> i.item(item3))
* .build())).join();
* }
*
*
* @param requestConsumer a {@link Consumer} of {@link BatchWriteItemEnhancedRequest} containing keys and items grouped by
* tables.
* @return a {@link CompletableFuture} of {@link BatchWriteResult}, containing any unprocessed requests.
*/
default CompletableFuture
* {@code
*
* List
*
* @param request A {@link TransactGetItemsEnhancedRequest} containing keys with table references.
* @return a {@link CompletableFuture} containing a list of {@link Document} with the results.
*/
default CompletableFuture> transactGetItems(TransactGetItemsEnhancedRequest request) {
throw new UnsupportedOperationException();
}
/**
* Retrieves multiple items from one or more tables in a single atomic transaction. TransactGetItem is a composite operation
* where the request contains a set of up to 25 get requests, each containing a table reference and a
* {@link GetItemEnhancedRequest}.
*
* {@code
*
* List
*
* @param requestConsumer a {@link Consumer} of {@link TransactGetItemsEnhancedRequest} containing keys with table references.
* @return a {@link CompletableFuture} containing a list of {@link Document} with the results.
*/
default CompletableFuture> transactGetItems(
Consumer
*
*
* {@code
*
* enhancedClient.transactWriteItems(
* TransactWriteItemsEnhancedRequest.builder()
* .addPutItem(firstItemTable, PutItemEnhancedRequest.builder().item(item1).build())
* .addDeleteItem(firstItemTable, DeleteItemEnhancedRequest.builder().key(key2).build())
* .addConditionCheck(firstItemTable,
* ConditionCheck.builder()
* .key(key3)
* .conditionExpression(conditionExpression)
* .build())
* .addUpdateItem(secondItemTable,
* UpdateItemEnhancedRequest.builder().item(item4).build())
* .build()).join();
* }
*
*
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys grouped by tables.
* @return a {@link CompletableFuture} of {@link Void}.
*/
default CompletableFuture
*
*
* {@code
*
* enhancedClient.transactWriteItems(r -> r.addPutItem(firstItemTable, i -> i.item(item1))
* .addDeleteItem(firstItemTable, i -> i.key(k -> k.partitionValue(2)))
* .addConditionCheck(firstItemTable, i -> i.key(key3)
* .conditionExpression(conditionExpression))
* .addUpdateItem(secondItemTable, i -> i.item(item4))).join();
* }
*
*
* @param requestConsumer a {@link Consumer} of {@link TransactWriteItemsEnhancedRequest} containing keys and items grouped by
* tables.
* @return a {@link CompletableFuture} of {@link Void}.
*/
default CompletableFuture