/* * 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.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.pagination.sync.SdkIterable; import software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbEnhancedClient; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetResultPage; import software.amazon.awssdk.enhanced.dynamodb.model.BatchGetResultPageIterable; 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.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.BatchGetItemRequest; /** * Synchronous 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 DynamoDbEnhancedClient 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 DynamoDbTable} 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 DynamoDbClient#batchGetItemPaginator} operation. Consult the BatchGetItem
* documentation for further details and constraints as well as current limits of data retrieval.
*
* Example:
*
* The result can be accessed either through iterable {@link BatchGetResultPage}s or flattened results belonging to the
* supplied table across all pages.
*
*
* 1) Iterating through pages
*
* 2) Iterating through 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}.
*
* A single call to BatchWriteItem has the same limit of items as the low-level DynamoDB API BatchWriteItem operation,
* considering all items across all WriteBatches.
*
* Note: BatchWriteItem cannot update items. Instead, use the individual updateItem operation
* {@link DynamoDbTable#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}.
*
* A single call to BatchWriteItem has the same limit of items as the low-level DynamoDB API BatchWriteItem operation,
* considering all items across all WriteBatches.
*
* Note: BatchWriteItem cannot update items. Instead, use the individual updateItem operation
* {@link DynamoDbTable#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.
*
* 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:
*
* See {@link DynamoDbClient#transactGetItems(Consumer)} to learn more about {@code TransactGetItems}.
*
* @param requestConsumer a {@link Consumer} of {@link TransactGetItemsEnhancedRequest} containing keys with table references.
* @return a list of {@link Document} with the results.
*
*/
default List
* 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
*
* BatchGetResultPageIterable batchResults = 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
* batchResults.forEach(page -> {
* page.resultsForTable(firstItemTable).forEach(item -> System.out.println(item));
* page.resultsForTable(secondItemTable).forEach(item -> System.out.println(item));
* });
* }
*
*
*
* {@code
* results.resultsForTable(firstItemTable).forEach(item -> System.out.println(item));
* results.resultsForTable(secondItemTable).forEach(item -> System.out.println(item));
* }
*
*
* @param request A {@link BatchGetItemEnhancedRequest} containing keys grouped by tables.
* @return an iterator of type {@link SdkIterable} with paginated results of type {@link BatchGetResultPage}.
* @see #batchGetItem(Consumer)
* @see DynamoDbClient#batchGetItemPaginator
*/
default BatchGetResultPageIterable 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
*
* BatchGetResultPageIterable 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()));
* }
*
*
* @param requestConsumer a {@link Consumer} of {@link BatchGetItemEnhancedRequest.Builder} containing keys grouped by tables.
* @return an iterator of type {@link SdkIterable} with paginated results of type {@link BatchGetResultPage}.
* @see #batchGetItem(BatchGetItemEnhancedRequest)
* @see DynamoDbClient#batchGetItemPaginator(BatchGetItemRequest)
*/
default BatchGetResultPageIterable 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());
* }
*
*
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys and items grouped by tables.
* @return a {@link BatchWriteResult} containing any unprocessed requests.
*/
default BatchWriteResult batchWriteItem(BatchWriteItemEnhancedRequest request) {
throw new UnsupportedOperationException();
}
/**
* Puts and/or deletes multiple items in one or more tables. BatchWriteItem is a composite operation where the request
* contains one batch of (a mix of) {@link PutItemEnhancedRequest} and {@link DeleteItemEnhancedRequest} per targeted table.
*
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()));
* }
*
*
* @param requestConsumer a {@link Consumer} of {@link BatchWriteItemEnhancedRequest} containing keys and items grouped by
* tables.
* @return a {@link BatchWriteResult} containing any unprocessed requests.
*/
default BatchWriteResult batchWriteItem(Consumer
* {@code
*
* List
* See {@link DynamoDbClient#transactGetItems(Consumer)} to learn more about {@code TransactGetItems}.
*
* @param request A {@link TransactGetItemsEnhancedRequest} containing keys with table references.
* @return a list of {@link Document} with the results.
*/
default List
* {@code
*
* List
*
*
*
* {@code
*
* result = 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());
* }
*
* See {@link DynamoDbClient#transactWriteItems(Consumer)} to learn more about {@code TransactWriteItems}.
*
* @param request A {@link BatchWriteItemEnhancedRequest} containing keys grouped by tables.
*/
default Void transactWriteItems(TransactWriteItemsEnhancedRequest request) {
throw new UnsupportedOperationException();
}
/**
* Writes and/or modifies multiple items from one or more tables in a single atomic transaction. TransactGetItem is a
* composite operation where the request contains a set of action requests, each containing a table reference and
* one of the following requests:
*
*
*
* {@code
*
* result = 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)));
* }
*
* See {@link DynamoDbClient#transactWriteItems(Consumer)} to learn more about {@code TransactWriteItems}.
*
* @param requestConsumer a {@link Consumer} of {@link TransactWriteItemsEnhancedRequest} containing keys and items grouped
* by tables.
*/
default Void transactWriteItems(Consumer