diff --git a/.changes/next-release/feature-AmazonDynamoDBEnhancedClientPreview-e4729fe.json b/.changes/next-release/feature-AmazonDynamoDBEnhancedClientPreview-e4729fe.json new file mode 100644 index 000000000000..e9e2553cf6af --- /dev/null +++ b/.changes/next-release/feature-AmazonDynamoDBEnhancedClientPreview-e4729fe.json @@ -0,0 +1,5 @@ +{ + "type": "feature", + "category": "Amazon DynamoDB Enhanced Client [Preview]", + "description": "Improves discoverability by adding consumer-style methods for all client, table and index operations." +} diff --git a/services-custom/dynamodb-enhanced/README.md b/services-custom/dynamodb-enhanced/README.md index 8e0183ff1915..089f057afc44 100644 --- a/services-custom/dynamodb-enhanced/README.md +++ b/services-custom/dynamodb-enhanced/README.md @@ -80,66 +80,109 @@ values used are also completely arbitrary. ### Common primitive operations These all strongly map to the primitive DynamoDB operations they are -named after. These examples are the most simple variants of each -operation possible. These commands can be customized by using the -builders provided for each command and offer most of the features -available in the low-level DynamoDB SDK client. +named after. The examples below are the most simple variants of each +operation possible, using the the two styles available for constructing +requests with either builder or consumers. These commands can be +customized by using the builders provided for each command and offer +most of the features available in the low-level DynamoDB SDK client. ```java // CreateTable - customerTable.createTable(CreateTableEnhancedRequest.create()); + customerTable.createTable(); + customerTable.createTable(CreateTableEnhancedRequest.builder().build()); // GetItem - Customer customer = customerTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("a123")))); - + Customer customer = customerTable.getItem(r -> r.key(Key.create(stringValue("a123")))); + Customer customer = customerTable.getItem(GetItemEnhancedRequest.builder() + .key(Key.create(stringValue("a123"))) + .build()); // UpdateItem - Customer updatedCustomer = customerTable.updateItem(UpdateItemEnhancedRequest.create(customer)); + Customer updatedCustomer = customerTable.updateItem(Customer.class, r -> r.item(customer)); + Customer updatedCustomer = customerTable.updateItem(UpdateItemEnhancedRequest.builder(Customer.class) + .item(customer) + .build()); // PutItem - customerTable.putItem(PutItemEnhancedRequest.create(customer)); + customerTable.putItem(Customer.class, r -> r.item(customer)); + customerTable.putItem(PutItemEnhancedRequest.builder(Customer.class) + .item(customer) + .build()); // DeleteItem - Customer deletedCustomer = customerTable.deleteItem(DeleteItemEnhancedRequest.create(Key.create(stringValue("a123"), numberValue(456)))); + Customer deletedCustomer = customerTable.deleteItem(r -> r.key(Key.create(stringValue("a123"), numberValue(456)))); + Customer deletedCustomer = customerTable.deleteItem(DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue("a123"), numberValue(456))) + .build()); // Query - Iterable> customers = customerTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("a123"))))); - + Iterable> customers = customerTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("a123"))))); + Iterable> customers = customerTable.query(QueryEnhancedRequest.builder() + .queryConditional(equalTo(Key.create(stringValue("a123")))) + .build()); // Scan - Iterable> customers = customerTable.scan(ScanEnhancedRequest.create()); + Iterable> customers = customerTable.scan(); + Iterable> customers = customerTable.scan(ScanEnhancedRequest.builder().build()); // BatchGetItem + batchResults = enhancedClient.batchGetItem(r -> r.addReadBatch(ReadBatch.builder(Customer.class) + .mappedTableResource(customerTable) + .addGetItem(i -> i.key(key1)) + .addGetItem(i -> i.key(key2)) + .addGetItem(i -> i.key(key3)) + .build())); batchResults = enhancedClient.batchGetItem( - BatchGetItemEnhancedRequest.builder().addReadBatch(ReadBatch.builder(Customer.class) - .mappedTableResource(customerTable) - .addGetItem(GetItemEnhancedRequest.create(key1)) - .addGetItem(GetItemEnhancedRequest.create(key2)) - .addGetItem(GetItemEnhancedRequest.create(key3)) - .build()) + BatchGetItemEnhancedRequest.builder() + .readBatches(ReadBatch.builder(Customer.class) + .mappedTableResource(customerTable) + .addGetItem(GetItemEnhancedRequest.builder().key(key1).build()) + .addGetItem(GetItemEnhancedRequest.builder().key(key2).build()) + .addGetItem(GetItemEnhancedRequest.builder().key(key3).build()) + .build()) .build()); // BatchWriteItem + batchResults = enhancedClient.batchWriteItem(r -> r.addWriteBatch(WriteBatch.builder(Customer.class) + .mappedTableResource(customerTable) + .addPutItem(i -> i.item(customer)) + .addDeleteItem(i -> i.key(key1)) + .addDeleteItem(i -> i.key(key1)) + .build())); batchResults = enhancedClient.batchWriteItem( - BatchWriteItemEnhancedRequest.builder().addWriteBatch(WriteBatch.builder(Customer.class) - .mappedTableResource(customerTable) - .putItem(PutItemEnhancedRequest.create(item)) - .deleteItem(DeleteItemEnhancedRequest.create(key1)) - .deleteItem(DeleteItemEnhancedRequest.create(key2)) - .build()) + BatchWriteItemEnhancedRequest.builder() + .addWriteBatch(WriteBatch.builder(Customer.class) + .mappedTableResource(customerTable) + .addPutItem(PutItemEnhancedRequest.builder(Customer.class).item(customer).build()) + .addDeleteItem(DeleteItemEnhancedRequest.builder().key(key1).build()) + .addDeleteItem(DeleteItemEnhancedRequest.builder().key(key2).build()) + .build()) .build()); // TransactGetItems + transactResults = enhancedClient.transactGetItems(r -> r.addGetItem(customerTable, r -> r.key(Key.create(key1))) + .addGetItem(customerTable, r -> r.key(Key.create(key2)))); transactResults = enhancedClient.transactGetItems( TransactGetItemsEnhancedRequest.builder() - .addGetItem(customerTable, GetItemEnhancedRequest.create(Key.create(key1))) - .addGetItem(customerTable, GetItemEnhancedRequest.create(Key.create(key2))) + .addGetItem(customerTable, GetItemEnhancedRequest.builder().key(Key.create(key1)).build()) + .addGetItem(customerTable, GetItemEnhancedRequest.builder().key(Key.create(key2)).build()) .build()); // TransactWriteItems + enhancedClient.transactWriteItems(r -> r.addConditionCheck(customerTable, i -> i.key(orderKey).conditionExpression(conditionExpression)) + .addUpdateItem(customerTable, Customer.class, i -> i.item(customer)) + .addDeleteItem(customerTable, i -> i.key(key))); + enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(customerTable, ConditionCheck.create(orderKey, conditionExpression)) - .addUpdateItem(customerTable, UpdateItemEnhancedRequest.create(customer)) - .addDeleteItem(customerTable, DeleteItemEnhancedRequest.create(key)) + .addConditionCheck(customerTable, ConditionCheck.builder() + .key(orderKey) + .conditionExpression(conditionExpression) + .build()) + .addUpdateItem(customerTable, UpdateItemEnhancedRequest.builder(Customer.class) + .item(customer) + .build()) + .addDeleteItem(customerTable, DeleteItemEnhancedRequest.builder() + .key(key) + .build()) .build()); ``` @@ -149,7 +192,7 @@ index. Here's an example of how to do this: ``` DynamoDbIndex customersByName = customerTable.index("customers_by_name"); - Iterable> customersWithName = customersByName.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("Smith"))))); + Iterable> customersWithName = customersByName.query(r -> r.queryConditional(equalTo(Key.create(stringValue("Smith"))))); ``` ### Non-blocking asynchronous operations @@ -172,7 +215,7 @@ key differences: application can then do other work without having to block on the result: ```java - CompletableFuture result = mappedTable.getItem(GetItemEnhancedRequest.create(customerKey)); + CompletableFuture result = mappedTable.getItem(r -> r.key(customerKey)); // Perform other work here return result.join(); // now block and wait for the result ``` @@ -182,7 +225,7 @@ key differences: application can then subscribe a handler to that publisher and deal with the results asynchronously without having to block: ```java - SdkPublisher results = mappedTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("a123"))))); + SdkPublisher results = mappedTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("a123"))))); results.subscribe(myCustomerResultsProcessor); // Perform other work and let the processor handle the results asynchronously ``` diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncIndex.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncIndex.java index b7cad6bfeada..1a9ff3149ef6 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncIndex.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncIndex.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; @@ -33,10 +34,22 @@ default SdkPublisher> query(QueryEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkPublisher> query(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkPublisher> scan(ScanEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkPublisher> scan(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default SdkPublisher> scan() { + throw new UnsupportedOperationException(); + } + /** * Gets the {@link MapperExtension} associated with this mapped resource. * @return The {@link MapperExtension} associated with this mapped resource. diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncTable.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncTable.java index b768f7635c22..1deae9c29a72 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncTable.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbAsyncTable.java @@ -16,6 +16,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; @@ -48,7 +49,19 @@ default CompletableFuture createTable(CreateTableEnhancedRequest request) throw new UnsupportedOperationException(); } - default CompletableFuture deleteItem(DeleteItemEnhancedRequest request) { + default CompletableFuture createTable(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default CompletableFuture createTable() { + throw new UnsupportedOperationException(); + } + + default CompletableFuture deleteItem(DeleteItemEnhancedRequest request) { + throw new UnsupportedOperationException(); + } + + default CompletableFuture deleteItem(Consumer requestConsumer) { throw new UnsupportedOperationException(); } @@ -56,20 +69,45 @@ default CompletableFuture getItem(GetItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture getItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkPublisher> query(QueryEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkPublisher> query(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default CompletableFuture putItem(PutItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture putItem(Class itemClass, + Consumer> requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkPublisher> scan(ScanEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkPublisher> scan(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default SdkPublisher> scan() { + throw new UnsupportedOperationException(); + } + default CompletableFuture updateItem(UpdateItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture updateItem(Class itemClass, + Consumer> requestConsumer) { + throw new UnsupportedOperationException(); + } } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedAsyncClient.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedAsyncClient.java index 4d6151e47f46..0a8ccdc9773e 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedAsyncClient.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedAsyncClient.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; @@ -49,18 +50,35 @@ default SdkPublisher batchGetItem(BatchGetItemEnhancedReques throw new UnsupportedOperationException(); } + default SdkPublisher batchGetItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default CompletableFuture batchWriteItem(BatchWriteItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture batchWriteItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default CompletableFuture> transactGetItems(TransactGetItemsEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture> transactGetItems( + Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default CompletableFuture transactWriteItems(TransactWriteItemsEnhancedRequest request) { throw new UnsupportedOperationException(); } + default CompletableFuture transactWriteItems(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + /** * Creates a default builder for {@link DynamoDbEnhancedAsyncClient}. */ diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedClient.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedClient.java index 8dec336fe043..25e08be1d2ee 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedClient.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbEnhancedClient.java @@ -16,6 +16,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient; import java.util.List; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedClient; @@ -48,18 +49,34 @@ default SdkIterable batchGetItem(BatchGetItemEnhancedRequest throw new UnsupportedOperationException(); } + default SdkIterable batchGetItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default BatchWriteResult batchWriteItem(BatchWriteItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default BatchWriteResult batchWriteItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default List transactGetItems(TransactGetItemsEnhancedRequest request) { throw new UnsupportedOperationException(); } + default List transactGetItems(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default Void transactWriteItems(TransactWriteItemsEnhancedRequest request) { throw new UnsupportedOperationException(); } + default Void transactWriteItems(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + /** * Creates a default builder for {@link DynamoDbEnhancedClient}. */ diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbIndex.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbIndex.java index 9cf93da6d9d8..132def2b35a4 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbIndex.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbIndex.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; @@ -33,10 +34,22 @@ default SdkIterable> query(QueryEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkIterable> query(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkIterable> scan(ScanEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkIterable> scan(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default SdkIterable> scan() { + throw new UnsupportedOperationException(); + } + /** * Gets the {@link MapperExtension} associated with this mapped resource. * @return The {@link MapperExtension} associated with this mapped resource. diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbTable.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbTable.java index aeda6412334b..addecc639389 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbTable.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/DynamoDbTable.java @@ -15,6 +15,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; @@ -47,7 +48,19 @@ default Void createTable(CreateTableEnhancedRequest request) { throw new UnsupportedOperationException(); } - default T deleteItem(DeleteItemEnhancedRequest request) { + default Void createTable(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default Void createTable() { + throw new UnsupportedOperationException(); + } + + default T deleteItem(DeleteItemEnhancedRequest request) { + throw new UnsupportedOperationException(); + } + + default T deleteItem(Consumer requestConsumer) { throw new UnsupportedOperationException(); } @@ -55,20 +68,43 @@ default T getItem(GetItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default T getItem(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkIterable> query(QueryEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkIterable> query(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + default Void putItem(PutItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default Void putItem(Class itemClass, Consumer> requestConsumer) { + throw new UnsupportedOperationException(); + } + default SdkIterable> scan(ScanEnhancedRequest request) { throw new UnsupportedOperationException(); } + default SdkIterable> scan(Consumer requestConsumer) { + throw new UnsupportedOperationException(); + } + + default SdkIterable> scan() { + throw new UnsupportedOperationException(); + } + default T updateItem(UpdateItemEnhancedRequest request) { throw new UnsupportedOperationException(); } + default T updateItem(Class itemClass, Consumer> requestConsumer) { + throw new UnsupportedOperationException(); + } } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncIndex.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncIndex.java index e36b52e461bf..a93228f4fee3 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncIndex.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncIndex.java @@ -17,6 +17,7 @@ import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.createKeyFromItem; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbAsyncIndex; @@ -57,12 +58,31 @@ public SdkPublisher> query(QueryEnhancedRequest request) { return operation.executeOnSecondaryIndexAsync(tableSchema, tableName, indexName, mapperExtension, dynamoDbClient); } + @Override + public SdkPublisher> query(Consumer requestConsumer) { + QueryEnhancedRequest.Builder builder = QueryEnhancedRequest.builder(); + requestConsumer.accept(builder); + return query(builder.build()); + } + @Override public SdkPublisher> scan(ScanEnhancedRequest request) { PaginatedIndexOperation> operation = ScanOperation.create(request); return operation.executeOnSecondaryIndexAsync(tableSchema, tableName, indexName, mapperExtension, dynamoDbClient); } + @Override + public SdkPublisher> scan(Consumer requestConsumer) { + ScanEnhancedRequest.Builder builder = ScanEnhancedRequest.builder(); + requestConsumer.accept(builder); + return scan(builder.build()); + } + + @Override + public SdkPublisher> scan() { + return scan(ScanEnhancedRequest.builder().build()); + } + @Override public MapperExtension mapperExtension() { return this.mapperExtension; diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncTable.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncTable.java index e10e8638fa82..edad70aac7e6 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncTable.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbAsyncTable.java @@ -18,6 +18,7 @@ import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.createKeyFromItem; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbAsyncTable; @@ -93,42 +94,104 @@ public CompletableFuture createTable(CreateTableEnhancedRequest request) { return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public CompletableFuture createTable(Consumer requestConsumer) { + CreateTableEnhancedRequest.Builder builder = CreateTableEnhancedRequest.builder(); + requestConsumer.accept(builder); + return createTable(builder.build()); + } + + + @Override + public CompletableFuture createTable() { + return createTable(CreateTableEnhancedRequest.builder().build()); + } + @Override public CompletableFuture deleteItem(DeleteItemEnhancedRequest request) { TableOperation operation = DeleteItemOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public CompletableFuture deleteItem(Consumer requestConsumer) { + DeleteItemEnhancedRequest.Builder builder = DeleteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return deleteItem(builder.build()); + } + @Override public CompletableFuture getItem(GetItemEnhancedRequest request) { TableOperation operation = GetItemOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public CompletableFuture getItem(Consumer requestConsumer) { + GetItemEnhancedRequest.Builder builder = GetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return getItem(builder.build()); + } + @Override public SdkPublisher> query(QueryEnhancedRequest request) { PaginatedTableOperation> operation = QueryOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public SdkPublisher> query(Consumer requestConsumer) { + QueryEnhancedRequest.Builder builder = QueryEnhancedRequest.builder(); + requestConsumer.accept(builder); + return query(builder.build()); + } + @Override public CompletableFuture putItem(PutItemEnhancedRequest request) { TableOperation operation = PutItemOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public CompletableFuture putItem(Class itemClass, + Consumer> requestConsumer) { + PutItemEnhancedRequest.Builder builder = PutItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return putItem(builder.build()); + } + @Override public SdkPublisher> scan(ScanEnhancedRequest request) { PaginatedTableOperation> operation = ScanOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public SdkPublisher> scan(Consumer requestConsumer) { + ScanEnhancedRequest.Builder builder = ScanEnhancedRequest.builder(); + requestConsumer.accept(builder); + return scan(builder.build()); + } + + @Override + public SdkPublisher> scan() { + return scan(ScanEnhancedRequest.builder().build()); + } + @Override public CompletableFuture updateItem(UpdateItemEnhancedRequest request) { TableOperation operation = UpdateItemOperation.create(request); return operation.executeOnPrimaryIndexAsync(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public CompletableFuture updateItem(Class itemClass, + Consumer> requestConsumer) { + UpdateItemEnhancedRequest.Builder builder = UpdateItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return updateItem(builder.build()); + } + @Override public Key keyFrom(T item) { return createKeyFromItem(item, tableSchema, TableMetadata.primaryIndexName()); diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedAsyncClient.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedAsyncClient.java index 561e32e4b007..c01fc85c344e 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedAsyncClient.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedAsyncClient.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedAsyncClient; @@ -60,24 +61,53 @@ public SdkPublisher batchGetItem(BatchGetItemEnhancedRequest return operation.executeAsync(dynamoDbClient, mapperExtension); } + @Override + public SdkPublisher batchGetItem(Consumer requestConsumer) { + BatchGetItemEnhancedRequest.Builder builder = BatchGetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return batchGetItem(builder.build()); + } + @Override public CompletableFuture batchWriteItem(BatchWriteItemEnhancedRequest request) { BatchWriteItemOperation operation = BatchWriteItemOperation.create(request); return operation.executeAsync(dynamoDbClient, mapperExtension); } + @Override + public CompletableFuture batchWriteItem(Consumer requestConsumer) { + BatchWriteItemEnhancedRequest.Builder builder = BatchWriteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return batchWriteItem(builder.build()); + } + @Override public CompletableFuture> transactGetItems(TransactGetItemsEnhancedRequest request) { TransactGetItemsOperation operation = TransactGetItemsOperation.create(request); return operation.executeAsync(dynamoDbClient, mapperExtension); } + @Override + public CompletableFuture> transactGetItems( + Consumer requestConsumer) { + TransactGetItemsEnhancedRequest.Builder builder = TransactGetItemsEnhancedRequest.builder(); + requestConsumer.accept(builder); + return transactGetItems(builder.build()); + } + @Override public CompletableFuture transactWriteItems(TransactWriteItemsEnhancedRequest request) { TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(request); return operation.executeAsync(dynamoDbClient, mapperExtension); } + @Override + public CompletableFuture transactWriteItems(Consumer requestConsumer) { + TransactWriteItemsEnhancedRequest.Builder builder = TransactWriteItemsEnhancedRequest.builder(); + requestConsumer.accept(builder); + return transactWriteItems(builder.build()); + } + public DynamoDbAsyncClient dynamoDbAsyncClient() { return dynamoDbClient; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClient.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClient.java index 19500323e157..3548df7d996f 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClient.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClient.java @@ -16,6 +16,7 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.core; import java.util.List; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; @@ -59,24 +60,52 @@ public SdkIterable batchGetItem(BatchGetItemEnhancedRequest return operation.execute(dynamoDbClient, mapperExtension); } + @Override + public SdkIterable batchGetItem(Consumer requestConsumer) { + BatchGetItemEnhancedRequest.Builder builder = BatchGetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return batchGetItem(builder.build()); + } + @Override public BatchWriteResult batchWriteItem(BatchWriteItemEnhancedRequest request) { BatchWriteItemOperation operation = BatchWriteItemOperation.create(request); return operation.execute(dynamoDbClient, mapperExtension); } + @Override + public BatchWriteResult batchWriteItem(Consumer requestConsumer) { + BatchWriteItemEnhancedRequest.Builder builder = BatchWriteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return batchWriteItem(builder.build()); + } + @Override public List transactGetItems(TransactGetItemsEnhancedRequest request) { TransactGetItemsOperation operation = TransactGetItemsOperation.create(request); return operation.execute(dynamoDbClient, mapperExtension); } + @Override + public List transactGetItems(Consumer requestConsumer) { + TransactGetItemsEnhancedRequest.Builder builder = TransactGetItemsEnhancedRequest.builder(); + requestConsumer.accept(builder); + return transactGetItems(builder.build()); + } + @Override public Void transactWriteItems(TransactWriteItemsEnhancedRequest request) { TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(request); return operation.execute(dynamoDbClient, mapperExtension); } + @Override + public Void transactWriteItems(Consumer requestConsumer) { + TransactWriteItemsEnhancedRequest.Builder builder = TransactWriteItemsEnhancedRequest.builder(); + requestConsumer.accept(builder); + return transactWriteItems(builder.build()); + } + public DynamoDbClient dynamoDbClient() { return dynamoDbClient; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbIndex.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbIndex.java index 12fbb8179919..c689e3893894 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbIndex.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbIndex.java @@ -17,6 +17,7 @@ import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.createKeyFromItem; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbIndex; @@ -57,12 +58,31 @@ public SdkIterable> query(QueryEnhancedRequest request) { return operation.executeOnSecondaryIndex(tableSchema, tableName, indexName, mapperExtension, dynamoDbClient); } + @Override + public SdkIterable> query(Consumer requestConsumer) { + QueryEnhancedRequest.Builder builder = QueryEnhancedRequest.builder(); + requestConsumer.accept(builder); + return query(builder.build()); + } + @Override public SdkIterable> scan(ScanEnhancedRequest request) { PaginatedIndexOperation> operation = ScanOperation.create(request); return operation.executeOnSecondaryIndex(tableSchema, tableName, indexName, mapperExtension, dynamoDbClient); } + @Override + public SdkIterable> scan(Consumer requestConsumer) { + ScanEnhancedRequest.Builder builder = ScanEnhancedRequest.builder(); + requestConsumer.accept(builder); + return scan(builder.build()); + } + + @Override + public SdkIterable> scan() { + return scan(ScanEnhancedRequest.builder().build()); + } + @Override public MapperExtension mapperExtension() { return this.mapperExtension; diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbTable.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbTable.java index bcbb3c8d7187..3f6bf77a571a 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbTable.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbTable.java @@ -17,6 +17,7 @@ import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.createKeyFromItem; +import java.util.function.Consumer; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; @@ -92,24 +93,57 @@ public Void createTable(CreateTableEnhancedRequest request) { return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public Void createTable(Consumer requestConsumer) { + CreateTableEnhancedRequest.Builder builder = CreateTableEnhancedRequest.builder(); + requestConsumer.accept(builder); + return createTable(builder.build()); + } + + @Override + public Void createTable() { + return createTable(CreateTableEnhancedRequest.builder().build()); + } + @Override public T deleteItem(DeleteItemEnhancedRequest request) { TableOperation operation = DeleteItemOperation.create(request); return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public T deleteItem(Consumer requestConsumer) { + DeleteItemEnhancedRequest.Builder builder = DeleteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return deleteItem(builder.build()); + } + @Override public T getItem(GetItemEnhancedRequest request) { TableOperation operation = GetItemOperation.create(request); return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public T getItem(Consumer requestConsumer) { + GetItemEnhancedRequest.Builder builder = GetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return getItem(builder.build()); + } + @Override public SdkIterable> query(QueryEnhancedRequest request) { PaginatedTableOperation> operation = QueryOperation.create(request); return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public SdkIterable> query(Consumer requestConsumer) { + QueryEnhancedRequest.Builder builder = QueryEnhancedRequest.builder(); + requestConsumer.accept(builder); + return query(builder.build()); + } + @Override public Void putItem(PutItemEnhancedRequest request) { TableOperation operation = PutItemOperation.create(request); @@ -117,9 +151,10 @@ public Void putItem(PutItemEnhancedRequest request) { } @Override - public T updateItem(UpdateItemEnhancedRequest request) { - TableOperation operation = UpdateItemOperation.create(request); - return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); + public Void putItem(Class itemClass, Consumer> requestConsumer) { + PutItemEnhancedRequest.Builder builder = PutItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return putItem(builder.build()); } @Override @@ -128,6 +163,31 @@ public SdkIterable> scan(ScanEnhancedRequest request) { return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); } + @Override + public SdkIterable> scan(Consumer requestConsumer) { + ScanEnhancedRequest.Builder builder = ScanEnhancedRequest.builder(); + requestConsumer.accept(builder); + return scan(builder.build()); + } + + @Override + public SdkIterable> scan() { + return scan(ScanEnhancedRequest.builder().build()); + } + + @Override + public T updateItem(UpdateItemEnhancedRequest request) { + TableOperation operation = UpdateItemOperation.create(request); + return operation.executeOnPrimaryIndex(tableSchema, tableName, mapperExtension, dynamoDbClient); + } + + @Override + public T updateItem(Class itemClass, Consumer> requestConsumer) { + UpdateItemEnhancedRequest.Builder builder = UpdateItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return updateItem(builder.build()); + } + @Override public Key keyFrom(T item) { return createKeyFromItem(item, tableSchema, TableMetadata.primaryIndexName()); diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/Utils.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/Utils.java index 1111c78c18c4..0ea83ecbb7e2 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/Utils.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/Utils.java @@ -15,10 +15,12 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.core; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import software.amazon.awssdk.annotations.SdkInternalApi; @@ -117,4 +119,13 @@ public static Key createKeyFromItem(T item, TableSchema tableSchema, Stri return sortKeyValue.map(attributeValue -> Key.create(partitionKeyValue, attributeValue)) .orElseGet(() -> Key.create(partitionKeyValue)); } + + public static List getItemsFromSupplier(List> itemSupplierList) { + if (itemSupplierList == null || itemSupplierList.isEmpty()) { + return null; + } + return Collections.unmodifiableList(itemSupplierList.stream() + .map(Supplier::get) + .collect(Collectors.toList())); + } } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequest.java index 2d7fa29c2b80..9030e1d5bafd 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequest.java @@ -28,11 +28,7 @@ public final class BatchGetItemEnhancedRequest { private final List readBatches; private BatchGetItemEnhancedRequest(Builder builder) { - this.readBatches = Collections.unmodifiableList(builder.readBatches); - } - - public static BatchGetItemEnhancedRequest create(Collection readBatches) { - return builder().readBatches(readBatches).build(); + this.readBatches = getListIfExist(builder.readBatches); } public static Builder builder() { @@ -66,6 +62,10 @@ public int hashCode() { return readBatches != null ? readBatches.hashCode() : 0; } + private static List getListIfExist(List readBatches) { + return readBatches != null ? Collections.unmodifiableList(readBatches) : null; + } + public static final class Builder { private List readBatches; @@ -73,7 +73,7 @@ private Builder() { } public Builder readBatches(Collection readBatches) { - this.readBatches = new ArrayList<>(readBatches); + this.readBatches = readBatches != null ? new ArrayList<>(readBatches) : null; return this; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequest.java index fe986b7249c7..410539ddfd6b 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequest.java @@ -28,11 +28,7 @@ public final class BatchWriteItemEnhancedRequest { private final List writeBatches; private BatchWriteItemEnhancedRequest(Builder builder) { - this.writeBatches = Collections.unmodifiableList(builder.writeBatches); - } - - public static BatchWriteItemEnhancedRequest create(Collection writeBatches) { - return builder().writeBatches(writeBatches).build(); + this.writeBatches = getListIfExist(builder.writeBatches); } public static Builder builder() { @@ -66,6 +62,10 @@ public int hashCode() { return writeBatches != null ? writeBatches.hashCode() : 0; } + private static List getListIfExist(List writeBatches) { + return writeBatches != null ? Collections.unmodifiableList(writeBatches) : null; + } + public static final class Builder { private List writeBatches; @@ -73,7 +73,7 @@ private Builder() { } public Builder writeBatches(Collection writeBatches) { - this.writeBatches = new ArrayList<>(writeBatches); + this.writeBatches = writeBatches != null ? new ArrayList<>(writeBatches) : null; return this; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ConditionCheck.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ConditionCheck.java index 612cf00d7cdc..65d0cfad657d 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ConditionCheck.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ConditionCheck.java @@ -34,10 +34,6 @@ private ConditionCheck(Key key, Expression conditionExpression) { this.conditionExpression = conditionExpression; } - public static ConditionCheck create(Key key, Expression conditionExpression) { - return new ConditionCheck<>(key, conditionExpression); - } - public static Builder builder() { return new Builder(); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequest.java index 4fdced12e937..768fde47a8fc 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequest.java @@ -32,14 +32,6 @@ private CreateTableEnhancedRequest(Builder builder) { this.globalSecondaryIndices = builder.globalSecondaryIndices; } - public static CreateTableEnhancedRequest create(ProvisionedThroughput provisionedThroughput) { - return builder().provisionedThroughput(provisionedThroughput).build(); - } - - public static CreateTableEnhancedRequest create() { - return builder().build(); - } - public static Builder builder() { return new Builder(); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequest.java index d14eca6b369a..e578c4979f2f 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequest.java @@ -20,7 +20,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; @SdkPublicApi -public final class DeleteItemEnhancedRequest { +public final class DeleteItemEnhancedRequest { private final Key key; private final Expression conditionExpression; @@ -30,10 +30,6 @@ private DeleteItemEnhancedRequest(Builder builder) { this.conditionExpression = builder.conditionExpression; } - public static DeleteItemEnhancedRequest create(Key key) { - return builder().key(key).build(); - } - public static Builder builder() { return new Builder(); } @@ -59,7 +55,7 @@ public boolean equals(Object o) { return false; } - DeleteItemEnhancedRequest that = (DeleteItemEnhancedRequest) o; + DeleteItemEnhancedRequest that = (DeleteItemEnhancedRequest) o; return key != null ? key.equals(that.key) : that.key == null; } @@ -86,8 +82,8 @@ public Builder conditionExpression(Expression conditionExpression) { return this; } - public DeleteItemEnhancedRequest build() { - return new DeleteItemEnhancedRequest<>(this); + public DeleteItemEnhancedRequest build() { + return new DeleteItemEnhancedRequest(this); } } } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequest.java index cccea1a3ab1e..9fc8c19508f2 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequest.java @@ -19,7 +19,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; @SdkPublicApi -public final class GetItemEnhancedRequest { +public final class GetItemEnhancedRequest { private final Key key; private final Boolean consistentRead; @@ -29,10 +29,6 @@ private GetItemEnhancedRequest(Builder builder) { this.consistentRead = builder.consistentRead; } - public static GetItemEnhancedRequest create(Key key) { - return builder().key(key).build(); - } - public static Builder builder() { return new Builder(); } @@ -58,7 +54,7 @@ public boolean equals(Object o) { return false; } - GetItemEnhancedRequest getItem = (GetItemEnhancedRequest) o; + GetItemEnhancedRequest getItem = (GetItemEnhancedRequest) o; if (key != null ? ! key.equals(getItem.key) : getItem.key != null) { return false; @@ -90,8 +86,8 @@ public Builder key(Key key) { return this; } - public GetItemEnhancedRequest build() { - return new GetItemEnhancedRequest<>(this); + public GetItemEnhancedRequest build() { + return new GetItemEnhancedRequest(this); } } } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequest.java index 4f3ecc55702c..b638dd06f332 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequest.java @@ -29,10 +29,6 @@ private PutItemEnhancedRequest(Builder builder) { this.conditionExpression = builder.conditionExpression; } - public static PutItemEnhancedRequest create(T item) { - return new Builder().item(item).build(); - } - public static Builder builder(Class itemClass) { return new Builder<>(); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequest.java index 65cbed0ac195..31fe48209e3a 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequest.java @@ -40,10 +40,6 @@ private QueryEnhancedRequest(Builder builder) { this.filterExpression = builder.filterExpression; } - public static QueryEnhancedRequest create(QueryConditional queryConditional) { - return builder().queryConditional(queryConditional).build(); - } - public static Builder builder() { return new Builder(); } @@ -146,7 +142,7 @@ public Builder scanIndexForward(Boolean scanIndexForward) { } public Builder exclusiveStartKey(Map exclusiveStartKey) { - this.exclusiveStartKey = new HashMap<>(exclusiveStartKey); + this.exclusiveStartKey = exclusiveStartKey != null ? new HashMap<>(exclusiveStartKey) : null; return this; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatch.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatch.java index ffd3d5d4f6ef..9fbfd2e37a03 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatch.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatch.java @@ -18,11 +18,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Collectors; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.extensions.dynamodb.mappingclient.MappedTableResource; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableMetadata; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.KeysAndAttributes; @@ -32,8 +32,8 @@ public final class ReadBatch { private final KeysAndAttributes keysAndAttributes; private ReadBatch(BuilderImpl builder) { - this.tableName = builder.mappedTableResource.tableName(); - this.keysAndAttributes = generateKeysAndAttributes(builder.requests, builder.mappedTableResource.tableSchema()); + this.tableName = builder.mappedTableResource != null ? builder.mappedTableResource.tableName() : null; + this.keysAndAttributes = generateKeysAndAttributes(builder.requests, builder.mappedTableResource); } public static Builder builder(Class itemClass) { @@ -81,19 +81,23 @@ public interface Builder { Builder addGetItem(GetItemEnhancedRequest request); + Builder addGetItem(Consumer requestConsumer); + ReadBatch build(); } private static KeysAndAttributes generateKeysAndAttributes(List readRequests, - TableSchema tableSchema) { - + MappedTableResource mappedTableResource) { + if (readRequests == null || readRequests.isEmpty()) { + return null; + } Boolean firstRecordConsistentRead = validateAndGetConsistentRead(readRequests); List> keys = readRequests.stream() .map(GetItemEnhancedRequest::key) - .map(key -> key.keyMap(tableSchema, TableMetadata.primaryIndexName())) + .map(key -> key.keyMap(mappedTableResource.tableSchema(), TableMetadata.primaryIndexName())) .collect(Collectors.toList()); return KeysAndAttributes.builder() @@ -151,6 +155,12 @@ public Builder addGetItem(GetItemEnhancedRequest request) { return this; } + public Builder addGetItem(Consumer requestConsumer) { + GetItemEnhancedRequest.Builder builder = GetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return addGetItem(builder.build()); + } + public ReadBatch build() { return new ReadBatch(this); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequest.java index 2b0ca378fa83..63899f91cf90 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequest.java @@ -36,10 +36,6 @@ private ScanEnhancedRequest(Builder builder) { this.filterExpression = builder.filterExpression; } - public static ScanEnhancedRequest create() { - return builder().build(); - } - public static Builder builder() { return new Builder(); } @@ -110,7 +106,7 @@ private Builder() { } public Builder exclusiveStartKey(Map exclusiveStartKey) { - this.exclusiveStartKey = new HashMap<>(exclusiveStartKey); + this.exclusiveStartKey = exclusiveStartKey != null ? new HashMap<>(exclusiveStartKey) : null; return this; } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequest.java index 7a1475621ded..3e860c02acf2 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequest.java @@ -15,11 +15,12 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.model; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.getItemsFromSupplier; + import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.stream.Collectors; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.extensions.dynamodb.mappingclient.MappedTableResource; import software.amazon.awssdk.extensions.dynamodb.mappingclient.OperationContext; @@ -33,9 +34,7 @@ public final class TransactGetItemsEnhancedRequest { private final List transactGetItems; private TransactGetItemsEnhancedRequest(Builder builder) { - this.transactGetItems = Collections.unmodifiableList(builder.itemSupplierList.stream() - .map(Supplier::get) - .collect(Collectors.toList())); + this.transactGetItems = getItemsFromSupplier(builder.itemSupplierList); } public static Builder builder() { @@ -71,11 +70,18 @@ public static final class Builder { private Builder() { } - public Builder addGetItem(MappedTableResource mappedTableResource, GetItemEnhancedRequest request) { + public Builder addGetItem(MappedTableResource mappedTableResource, GetItemEnhancedRequest request) { itemSupplierList.add(() -> generateTransactWriteItem(mappedTableResource, GetItemOperation.create(request))); return this; } + public Builder addGetItem(MappedTableResource mappedTableResource, + Consumer requestConsumer) { + GetItemEnhancedRequest.Builder builder = GetItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return addGetItem(mappedTableResource, builder.build()); + } + public TransactGetItemsEnhancedRequest build() { return new TransactGetItemsEnhancedRequest(this); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequest.java index 2f8c435262f9..fc1bebab9ea8 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequest.java @@ -15,11 +15,12 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.model; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.getItemsFromSupplier; + import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.stream.Collectors; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.extensions.dynamodb.mappingclient.MappedTableResource; import software.amazon.awssdk.extensions.dynamodb.mappingclient.OperationContext; @@ -35,9 +36,7 @@ public final class TransactWriteItemsEnhancedRequest { private final List transactWriteItems; private TransactWriteItemsEnhancedRequest(Builder builder) { - this.transactWriteItems = Collections.unmodifiableList(builder.itemSupplierList.stream() - .map(Supplier::get) - .collect(Collectors.toList())); + this.transactWriteItems = getItemsFromSupplier(builder.itemSupplierList); } public static Builder builder() { @@ -78,21 +77,49 @@ public Builder addConditionCheck(MappedTableResource mappedTableResource, return this; } - public Builder addDeleteItem(MappedTableResource mappedTableResource, DeleteItemEnhancedRequest request) { + public Builder addConditionCheck(MappedTableResource mappedTableResource, + Consumer requestConsumer) { + ConditionCheck.Builder builder = ConditionCheck.builder(); + requestConsumer.accept(builder); + return addConditionCheck(mappedTableResource, builder.build()); + } + + public Builder addDeleteItem(MappedTableResource mappedTableResource, DeleteItemEnhancedRequest request) { itemSupplierList.add(() -> generateTransactWriteItem(mappedTableResource, DeleteItemOperation.create(request))); return this; } + public Builder addDeleteItem(MappedTableResource mappedTableResource, + Consumer requestConsumer) { + DeleteItemEnhancedRequest.Builder builder = DeleteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return addDeleteItem(mappedTableResource, builder.build()); + } + public Builder addPutItem(MappedTableResource mappedTableResource, PutItemEnhancedRequest request) { itemSupplierList.add(() -> generateTransactWriteItem(mappedTableResource, PutItemOperation.create(request))); return this; } + public Builder addPutItem(MappedTableResource mappedTableResource, Class itemClass, + Consumer> requestConsumer) { + PutItemEnhancedRequest.Builder builder = PutItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return addPutItem(mappedTableResource, builder.build()); + } + public Builder addUpdateItem(MappedTableResource mappedTableResource, UpdateItemEnhancedRequest request) { itemSupplierList.add(() -> generateTransactWriteItem(mappedTableResource, UpdateItemOperation.create(request))); return this; } + public Builder addUpdateItem(MappedTableResource mappedTableResource, Class itemClass, + Consumer> requestConsumer) { + UpdateItemEnhancedRequest.Builder builder = UpdateItemEnhancedRequest.builder(itemClass); + requestConsumer.accept(builder); + return addUpdateItem(mappedTableResource, builder.build()); + } + public TransactWriteItemsEnhancedRequest build() { return new TransactWriteItemsEnhancedRequest(this); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequest.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequest.java index c2735bd97eb4..7b5c57bf7a4f 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequest.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequest.java @@ -31,10 +31,6 @@ private UpdateItemEnhancedRequest(Builder builder) { this.conditionExpression = builder.conditionExpression; } - public static UpdateItemEnhancedRequest create(T item) { - return new Builder().item(item).build(); - } - public static Builder builder(Class itemClass) { return new Builder<>(); } diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatch.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatch.java index 667d3be6d9c0..10f3e6ea2c44 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatch.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatch.java @@ -15,12 +15,13 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.model; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.core.Utils.getItemsFromSupplier; + import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.stream.Collectors; import software.amazon.awssdk.annotations.SdkPublicApi; import software.amazon.awssdk.extensions.dynamodb.mappingclient.BatchableWriteOperation; import software.amazon.awssdk.extensions.dynamodb.mappingclient.MappedTableResource; @@ -35,14 +36,12 @@ public final class WriteBatch { private final List writeRequests; private WriteBatch(BuilderImpl builder) { - this.tableName = builder.mappedTableResource.tableName(); - this.writeRequests = Collections.unmodifiableList(builder.itemSupplierList.stream() - .map(Supplier::get) - .collect(Collectors.toList())); + this.tableName = builder.mappedTableResource != null ? builder.mappedTableResource.tableName() : null; + this.writeRequests = getItemsFromSupplier(builder.itemSupplierList); } public static Builder builder(Class itemClass) { - return new BuilderImpl<>(); + return new BuilderImpl<>(itemClass); } public String tableName() { @@ -82,19 +81,25 @@ public int hashCode() { public interface Builder { Builder mappedTableResource(MappedTableResource mappedTableResource); - Builder addDeleteItem(DeleteItemEnhancedRequest request); + Builder addDeleteItem(DeleteItemEnhancedRequest request); + + Builder addDeleteItem(Consumer requestConsumer); Builder addPutItem(PutItemEnhancedRequest request); + Builder addPutItem(Consumer> requestConsumer); + WriteBatch build(); } private static final class BuilderImpl implements Builder { + private Class itemClass; private List> itemSupplierList = new ArrayList<>(); private MappedTableResource mappedTableResource; - private BuilderImpl() { + private BuilderImpl(Class itemClass) { + this.itemClass = itemClass; } public Builder mappedTableResource(MappedTableResource mappedTableResource) { @@ -102,16 +107,28 @@ public Builder mappedTableResource(MappedTableResource mappedTableResource return this; } - public Builder addDeleteItem(DeleteItemEnhancedRequest request) { + public Builder addDeleteItem(DeleteItemEnhancedRequest request) { itemSupplierList.add(() -> generateWriteRequest(() -> mappedTableResource, DeleteItemOperation.create(request))); return this; } + public Builder addDeleteItem(Consumer requestConsumer) { + DeleteItemEnhancedRequest.Builder builder = DeleteItemEnhancedRequest.builder(); + requestConsumer.accept(builder); + return addDeleteItem(builder.build()); + } + public Builder addPutItem(PutItemEnhancedRequest request) { itemSupplierList.add(() -> generateWriteRequest(() -> mappedTableResource, PutItemOperation.create(request))); return this; } + public Builder addPutItem(Consumer> requestConsumer) { + PutItemEnhancedRequest.Builder builder = PutItemEnhancedRequest.builder(this.itemClass); + requestConsumer.accept(builder); + return addPutItem(builder.build()); + } + public WriteBatch build() { return new WriteBatch(this); } @@ -123,4 +140,5 @@ private WriteRequest generateWriteRequest(Supplier> mappe mappedTableResourceSupplier.get().mapperExtension()); } } + } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClientTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClientTest.java index 49f11d56ba6a..f38ecb07356e 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClientTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/core/DefaultDynamoDbEnhancedClientTest.java @@ -25,20 +25,18 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.DatabaseOperation; import software.amazon.awssdk.extensions.dynamodb.mappingclient.MapperExtension; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchWriteResult; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; @RunWith(MockitoJUnitRunner.class) public class DefaultDynamoDbEnhancedClientTest { @Mock private DynamoDbClient mockDynamoDbClient; + @Mock private MapperExtension mockMapperExtension; - @Mock - private DatabaseOperation mockDatabaseOperation; + @Mock private TableSchema mockTableSchema; diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicCrudTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicCrudTest.java index 84e6ef6a0ac4..a7e9bf6f87f5 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicCrudTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicCrudTest.java @@ -39,7 +39,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; @@ -210,14 +209,13 @@ public int hashCode() { @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.builder() - .provisionedThroughput(getDefaultProvisionedThroughput()) - .globalSecondaryIndices( - GlobalSecondaryIndex.create( - "gsi_1", - Projection.builder().projectionType(ProjectionType.ALL).build(), - getDefaultProvisionedThroughput())) - .build()).join(); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) + .globalSecondaryIndices( + GlobalSecondaryIndex.create( + "gsi_1", + Projection.builder().projectionType(ProjectionType.ALL).build(), + getDefaultProvisionedThroughput())) + .build()).join(); } @After @@ -237,10 +235,8 @@ public void putThenGetItemUsingKey() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))) - .join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(record)); } @@ -254,19 +250,15 @@ public void putThenGetItemUsingKeyItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(record)); } @Test public void getNonExistentItem() { - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(nullValue())); } @@ -279,7 +271,7 @@ public void putTwiceThenGetItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record record2 = new Record() .setId("id-value") .setSort("sort-value") @@ -287,10 +279,8 @@ public void putTwiceThenGetItem() { .setAttribute2("five") .setAttribute3("six"); - mappedTable.putItem(PutItemEnhancedRequest.create(record2)).join(); - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + mappedTable.putItem(Record.class, r -> r.item(record2)).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(record2)); } @@ -304,13 +294,11 @@ public void putThenDeleteItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record beforeDeleteResult = - mappedTable.deleteItem(DeleteItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + mappedTable.deleteItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); Record afterDeleteResult = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(beforeDeleteResult, is(record)); assertThat(afterDeleteResult, is(nullValue())); @@ -325,7 +313,7 @@ public void putWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -341,9 +329,7 @@ public void putWithConditionThatSucceeds() { .conditionExpression(conditionExpression) .build()).join(); - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(record)); } @@ -356,7 +342,7 @@ public void putWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -378,9 +364,7 @@ public void putWithConditionThatFails() { @Test public void deleteNonExistentItem() { - Record result = - mappedTable.deleteItem(DeleteItemEnhancedRequest.create(Key.create(stringValue("id-value"), - stringValue("sort-value")))).join(); + Record result = mappedTable.deleteItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(nullValue())); } @@ -393,7 +377,7 @@ public void deleteWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") @@ -404,9 +388,13 @@ public void deleteWithConditionThatSucceeds() { .build(); Key key = mappedTable.keyFrom(record); - mappedTable.deleteItem(DeleteItemEnhancedRequest.builder().key(key).conditionExpression(conditionExpression).build()).join(); + mappedTable.deleteItem(DeleteItemEnhancedRequest.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) + .join(); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(key)).join(); + Record result = mappedTable.getItem(r -> r.key(key)).join(); assertThat(result, is(nullValue())); } @@ -419,7 +407,7 @@ public void deleteWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") @@ -445,14 +433,14 @@ public void updateOverwriteCompleteRecord() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record record2 = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("four") .setAttribute2("five") .setAttribute3("six"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record2)).join(); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record2)).join(); assertThat(result, is(record2)); } @@ -464,7 +452,7 @@ public void updateCreatePartialRecord() { .setSort("sort-value") .setAttribute("one"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)).join(); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record)).join(); assertThat(result, is(record)); } @@ -475,7 +463,7 @@ public void updateCreateKeyOnlyRecord() { .setId("id-value") .setSort("sort-value"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)).join(); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record)).join(); assertThat(result, is(record)); } @@ -488,12 +476,12 @@ public void updateOverwriteModelledNulls() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record record2 = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("four"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record2)).join(); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record2)).join(); assertThat(result, is(record2)); } @@ -507,7 +495,7 @@ public void updateCanIgnoreNullsAndDoPartialUpdate() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record record2 = new Record() .setId("id-value") .setSort("sort-value") @@ -536,13 +524,13 @@ public void updateShortRecordDoesPartialUpdate() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); ShortRecord record2 = new ShortRecord() .setId("id-value") .setSort("sort-value") .setAttribute("four"); - ShortRecord shortResult = mappedShortTable.updateItem(UpdateItemEnhancedRequest.create(record2)).join(); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue(record.getId()), + ShortRecord shortResult = mappedShortTable.updateItem(ShortRecord.class, r -> r.item(record2)).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue(record.getId()), stringValue(record.getSort())))).join(); Record expectedResult = new Record() @@ -564,7 +552,7 @@ public void updateKeyOnlyExistingRecordDoesNothing() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); Record updateRecord = new Record().setId("id-value").setSort("sort-value"); Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.builder(Record.class) @@ -585,7 +573,7 @@ public void updateWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -602,9 +590,7 @@ public void updateWithConditionThatSucceeds() { .build()) .join(); - Record result = - mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(record)); } @@ -617,7 +603,7 @@ public void updateWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)).join(); + mappedTable.putItem(Record.class, r -> r.item(record)).join(); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -643,15 +629,13 @@ public void getAShortRecordWithNewModelledFields() { .setId("id-value") .setSort("sort-value") .setAttribute("one"); - mappedShortTable.putItem(PutItemEnhancedRequest.create(shortRecord)).join(); + mappedShortTable.putItem(ShortRecord.class, r -> r.item(shortRecord)).join(); Record expectedRecord = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("one"); - Record result = - mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))).join(); assertThat(result, is(expectedRecord)); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicQueryTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicQueryTest.java index ec9d31ce952b..02b78483ca8b 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicQueryTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicQueryTest.java @@ -46,8 +46,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -123,24 +121,12 @@ public int hashCode() { private DynamoDbAsyncTable mappedTable = enhancedAsyncClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record)).join()); - } - - private static List drainPublisher(SdkPublisher publisher, int expectedNumberOfResults) { - BufferingSubscriber subscriber = new BufferingSubscriber<>(); - publisher.subscribe(subscriber); - subscriber.waitForCompletion(1000L); - - assertThat(subscriber.isCompleted(), is(true)); - assertThat(subscriber.bufferedError(), is(nullValue())); - assertThat(subscriber.bufferedItems().size(), is(expectedNumberOfResults)); - - return subscriber.bufferedItems(); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record)).join()); } @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -156,7 +142,7 @@ public void queryAllRecordsDefaultSettings() { insertRecords(); SdkPublisher> publisher = - mappedTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("id-value"))))); + mappedTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("id-value"))))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -196,7 +182,7 @@ public void queryBetween() { insertRecords(); Key fromKey = Key.create(stringValue("id-value"), numberValue(3)); Key toKey = Key.create(stringValue("id-value"), numberValue(5)); - SdkPublisher> publisher = mappedTable.query(QueryEnhancedRequest.create(between(fromKey, toKey))); + SdkPublisher> publisher = mappedTable.query(r -> r.queryConditional(between(fromKey, toKey))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -237,7 +223,7 @@ public void queryLimit() { @Test public void queryEmpty() { SdkPublisher> publisher = - mappedTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("id-value"))))); + mappedTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("id-value"))))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicScanTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicScanTest.java index bc55f467e07c..926e1e24e855 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicScanTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBasicScanTest.java @@ -43,8 +43,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ScanEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -106,28 +104,15 @@ public int hashCode() { .dynamoDbClient(getDynamoDbAsyncClient()) .build(); - private DynamoDbAsyncTable mappedTable = enhancedAsyncClient.table(getConcreteTableName("table-name"), - TABLE_SCHEMA); + private DynamoDbAsyncTable mappedTable = enhancedAsyncClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record)).join()); - } - - private static List drainPublisher(SdkPublisher publisher, int expectedNumberOfResults) { - BufferingSubscriber subscriber = new BufferingSubscriber<>(); - publisher.subscribe(subscriber); - subscriber.waitForCompletion(1000L); - - assertThat(subscriber.isCompleted(), is(true)); - assertThat(subscriber.bufferedError(), is(nullValue())); - assertThat(subscriber.bufferedItems().size(), is(expectedNumberOfResults)); - - return subscriber.bufferedItems(); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record)).join()); } @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -141,7 +126,7 @@ public void deleteTable() { public void scanAllRecordsDefaultSettings() { insertRecords(); - SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.create()); + SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.builder().build()); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -160,9 +145,8 @@ public void scanAllRecordsWithFilter() { .expressionValues(expressionValues) .build(); - SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.builder() - .filterExpression(expression) - .build()); + SdkPublisher> publisher = + mappedTable.scan(ScanEnhancedRequest.builder().filterExpression(expression).build()); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -175,9 +159,8 @@ public void scanAllRecordsWithFilter() { @Test public void scanLimit() { insertRecords(); - SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.builder() - .limit(5) - .build()); + + SdkPublisher> publisher = mappedTable.scan(r -> r.limit(5)); List> results = drainPublisher(publisher, 3); @@ -195,7 +178,7 @@ public void scanLimit() { @Test public void scanEmpty() { - SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.create()); + SdkPublisher> publisher = mappedTable.scan(); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -206,9 +189,8 @@ public void scanEmpty() { @Test public void scanExclusiveStartKey() { insertRecords(); - SdkPublisher> publisher = mappedTable.scan(ScanEnhancedRequest.builder() - .exclusiveStartKey(getKeyMap(7)) - .build()); + SdkPublisher> publisher = + mappedTable.scan(ScanEnhancedRequest.builder().exclusiveStartKey(getKeyMap(7)).build()); List> results = drainPublisher(publisher, 1); Page page = results.get(0); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchGetItemTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchGetItemTest.java index 95b527bebb44..2cfe23189b8f 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchGetItemTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchGetItemTest.java @@ -38,9 +38,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchGetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchGetResultPage; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ReadBatch; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; @@ -132,22 +129,10 @@ public int hashCode() { .mapToObj(i -> new Record2().setId(i)) .collect(Collectors.toList()); - private static List drainPublisher(SdkPublisher publisher, int expectedNumberOfResults) { - BufferingSubscriber subscriber = new BufferingSubscriber<>(); - publisher.subscribe(subscriber); - subscriber.waitForCompletion(1000L); - - assertThat(subscriber.isCompleted(), is(true)); - assertThat(subscriber.bufferedError(), is(nullValue())); - assertThat(subscriber.bufferedItems().size(), is(expectedNumberOfResults)); - - return subscriber.bufferedItems(); - } - @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -161,36 +146,31 @@ public void deleteTable() { } private void insertRecords() { - RECORDS_1.forEach(record -> mappedTable1.putItem(PutItemEnhancedRequest.create(record)).join()); - RECORDS_2.forEach(record -> mappedTable2.putItem(PutItemEnhancedRequest.create(record)).join()); + RECORDS_1.forEach(record -> mappedTable1.putItem(Record1.class, r -> r.item(record)).join()); + RECORDS_2.forEach(record -> mappedTable2.putItem(Record2.class, r -> r.item(record)).join()); } @Test public void getRecordsFromMultipleTables() { insertRecords(); - BatchGetItemEnhancedRequest batchGetItemEnhancedRequest = - BatchGetItemEnhancedRequest.builder() - .readBatches( - ReadBatch.builder(Record1.class) - .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .build(), - ReadBatch.builder(Record2.class) - .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .build(), - ReadBatch.builder(Record2.class) - .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .build(), - ReadBatch.builder(Record1.class) - .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .build()) - .build(); - - SdkPublisher publisher = enhancedAsyncClient.batchGetItem(batchGetItemEnhancedRequest); + SdkPublisher publisher = enhancedAsyncClient.batchGetItem(r -> r.readBatches( + ReadBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addGetItem(i -> i.key(Key.create(numberValue(0)))) + .build(), + ReadBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addGetItem(i -> i.key(Key.create(numberValue(0)))) + .build(), + ReadBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addGetItem(i -> i.key(Key.create(numberValue(1)))) + .build(), + ReadBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addGetItem(i -> i.key(Key.create(numberValue(1)))) + .build())); List results = drainPublisher(publisher, 1); assertThat(results.size(), is(1)); @@ -213,19 +193,19 @@ public void notFoundRecordReturnsNull() { .readBatches( ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addGetItem(r -> r.key(Key.create(numberValue(0)))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addGetItem(r -> r.key(Key.create(numberValue(0)))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(r -> r.key(Key.create(numberValue(1)))) .build(), ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(5)))) + .addGetItem(r -> r.key(Key.create(numberValue(5)))) .build()) .build(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchWriteItemTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchWriteItemTest.java index 9bfd42e26415..fef5892f2038 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchWriteItemTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncBatchWriteItemTest.java @@ -38,10 +38,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchWriteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.WriteBatch; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; @@ -159,8 +156,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -178,12 +175,12 @@ public void singlePut() { List writeBatches = singletonList(WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(r -> r.item(RECORDS_1.get(0))) .build()); enhancedAsyncClient.batchWriteItem(BatchWriteItemEnhancedRequest.builder().writeBatches(writeBatches).build()).join(); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record, is(RECORDS_1.get(0))); } @@ -192,58 +189,78 @@ public void multiplePut() { List writeBatches = asList(WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(r -> r.item(RECORDS_1.get(0))) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))) + .addPutItem(r -> r.item(RECORDS_2.get(0))) .build()); enhancedAsyncClient.batchWriteItem(BatchWriteItemEnhancedRequest.builder().writeBatches(writeBatches).build()).join(); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @Test public void singleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); List writeBatches = singletonList(WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(r -> r.key(Key.create(numberValue(0)))) .build()); enhancedAsyncClient.batchWriteItem(BatchWriteItemEnhancedRequest.builder().writeBatches(writeBatches).build()).join(); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record, is(nullValue())); } @Test public void multipleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); List writeBatches = asList(WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(DeleteItemEnhancedRequest.builder().key(Key.create(numberValue(0))).build()) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(DeleteItemEnhancedRequest.builder().key(Key.create(numberValue(0))).build()) .build()); enhancedAsyncClient.batchWriteItem(BatchWriteItemEnhancedRequest.builder().writeBatches(writeBatches).build()).join(); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record1, is(nullValue())); assertThat(record2, is(nullValue())); } + @Test + public void mixedCommands() { + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); + + enhancedAsyncClient.batchWriteItem(r -> r.writeBatches( + WriteBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addPutItem(i -> i.item(RECORDS_1.get(1))) + .build(), + WriteBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addDeleteItem(i -> i.key(Key.create(numberValue(0)))) + .build())).join(); + + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(), is(RECORDS_1.get(0))); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))).join(), is(RECORDS_1.get(1))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(), is(nullValue())); + } + } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexQueryTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexQueryTest.java index 091e99d59935..f9de19e6d072 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexQueryTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexQueryTest.java @@ -48,9 +48,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -169,19 +167,7 @@ public int hashCode() { private DynamoDbAsyncIndex keysOnlyMappedIndex = mappedTable.index("gsi_keys_only"); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record)).join()); - } - - private static List drainPublisher(SdkPublisher publisher, int expectedNumberOfResults) { - BufferingSubscriber subscriber = new BufferingSubscriber<>(); - publisher.subscribe(subscriber); - subscriber.waitForCompletion(1000L); - - assertThat(subscriber.isCompleted(), is(true)); - assertThat(subscriber.bufferedError(), is(nullValue())); - assertThat(subscriber.bufferedItems().size(), is(expectedNumberOfResults)); - - return subscriber.bufferedItems(); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record)).join()); } @Before @@ -211,11 +197,8 @@ public void deleteTable() { public void queryAllRecordsDefaultSettings() { insertRecords(); - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), numberValue(3)))).join(); - SdkPublisher> publisher = - keysOnlyMappedIndex.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("gsi-id-value"))))); + keysOnlyMappedIndex.query(r -> r.queryConditional(equalTo(Key.create(stringValue("gsi-id-value"))))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -230,7 +213,7 @@ public void queryBetween() { Key fromKey = Key.create(stringValue("gsi-id-value"), numberValue(3)); Key toKey = Key.create(stringValue("gsi-id-value"), numberValue(5)); - SdkPublisher> publisher = keysOnlyMappedIndex.query(QueryEnhancedRequest.create(between(fromKey, toKey))); + SdkPublisher> publisher = keysOnlyMappedIndex.query(r -> r.queryConditional(between(fromKey, toKey))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); @@ -276,7 +259,7 @@ public void queryLimit() { @Test public void queryEmpty() { SdkPublisher> publisher = - keysOnlyMappedIndex.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("gsi-id-value"))))); + keysOnlyMappedIndex.query(r -> r.queryConditional(equalTo(Key.create(stringValue("gsi-id-value"))))); List> results = drainPublisher(publisher, 1); Page page = results.get(0); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexScanTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexScanTest.java new file mode 100644 index 000000000000..4bbcc9070d9c --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncIndexScanTest.java @@ -0,0 +1,274 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.functionaltests; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.numberValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.primaryPartitionKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.primarySortKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.secondaryPartitionKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.secondarySortKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.Attributes.integerNumberAttribute; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.Attributes.stringAttribute; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import software.amazon.awssdk.core.async.SdkPublisher; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbAsyncIndex; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbAsyncTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedAsyncClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ScanEnhancedRequest; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; +import software.amazon.awssdk.services.dynamodb.model.Projection; +import software.amazon.awssdk.services.dynamodb.model.ProjectionType; + +public class AsyncIndexScanTest extends LocalDynamoDbAsyncTestBase { + private static class Record { + private String id; + private Integer sort; + private Integer value; + private String gsiId; + private Integer gsiSort; + + private String getId() { + return id; + } + + private Record setId(String id) { + this.id = id; + return this; + } + + private Integer getSort() { + return sort; + } + + private Record setSort(Integer sort) { + this.sort = sort; + return this; + } + + private Integer getValue() { + return value; + } + + private Record setValue(Integer value) { + this.value = value; + return this; + } + + private String getGsiId() { + return gsiId; + } + + private Record setGsiId(String gsiId) { + this.gsiId = gsiId; + return this; + } + + private Integer getGsiSort() { + return gsiSort; + } + + private Record setGsiSort(Integer gsiSort) { + this.gsiSort = gsiSort; + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Record record = (Record) o; + return Objects.equals(id, record.id) && + Objects.equals(sort, record.sort) && + Objects.equals(value, record.value) && + Objects.equals(gsiId, record.gsiId) && + Objects.equals(gsiSort, record.gsiSort); + } + + @Override + public int hashCode() { + return Objects.hash(id, sort, value, gsiId, gsiSort); + } + } + + private static final TableSchema TABLE_SCHEMA = + StaticTableSchema.builder(Record.class) + .newItemSupplier(Record::new) + .attributes( + stringAttribute("id", Record::getId, Record::setId).as(primaryPartitionKey()), + integerNumberAttribute("sort", Record::getSort, Record::setSort).as(primarySortKey()), + integerNumberAttribute("value", Record::getValue, Record::setValue), + stringAttribute("gsi_id", Record::getGsiId, Record::setGsiId) + .as(secondaryPartitionKey("gsi_keys_only")), + integerNumberAttribute("gsi_sort", Record::getGsiSort, Record::setGsiSort) + .as(secondarySortKey("gsi_keys_only"))) + .build(); + + private static final List RECORDS = + IntStream.range(0, 10) + .mapToObj(i -> new Record() + .setId("id-value") + .setSort(i) + .setValue(i) + .setGsiId("gsi-id-value") + .setGsiSort(i)) + .collect(Collectors.toList()); + + private static final List KEYS_ONLY_RECORDS = + RECORDS.stream() + .map(record -> new Record() + .setId(record.id) + .setSort(record.sort) + .setGsiId(record.gsiId) + .setGsiSort(record.gsiSort)) + .collect(Collectors.toList()); + + private DynamoDbEnhancedAsyncClient enhancedAsyncClient = + DefaultDynamoDbEnhancedAsyncClient.builder() + .dynamoDbClient(getDynamoDbAsyncClient()) + .build(); + + private DynamoDbAsyncTable mappedTable = enhancedAsyncClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); + private DynamoDbAsyncIndex keysOnlyMappedIndex = mappedTable.index("gsi_keys_only"); + + private void insertRecords() { + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record)).join()); + } + + @Before + public void createTable() { + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) + .globalSecondaryIndices(GlobalSecondaryIndex.create( + "gsi_keys_only", + Projection.builder().projectionType(ProjectionType.KEYS_ONLY).build(), + getDefaultProvisionedThroughput()))).join(); + } + + @After + public void deleteTable() { + getDynamoDbAsyncClient().deleteTable(DeleteTableRequest.builder() + .tableName(getConcreteTableName("table-name")) + .build()).join(); + } + + @Test + public void scanAllRecordsDefaultSettings() { + insertRecords(); + + SdkPublisher> publisher = keysOnlyMappedIndex.scan(ScanEnhancedRequest.builder().build()); + List> results = drainPublisher(publisher, 1); + Page page = results.get(0); + + assertThat(page.items(), is(KEYS_ONLY_RECORDS)); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanAllRecordsWithFilter() { + insertRecords(); + Map expressionValues = new HashMap<>(); + expressionValues.put(":min_value", numberValue(3)); + expressionValues.put(":max_value", numberValue(5)); + Expression expression = Expression.builder() + .expression("sort >= :min_value AND sort <= :max_value") + .expressionValues(expressionValues) + .build(); + + SdkPublisher> publisher = keysOnlyMappedIndex.scan(ScanEnhancedRequest.builder() + .filterExpression(expression) + .build()); + + List> results = drainPublisher(publisher, 1); + Page page = results.get(0); + + assertThat(page.items(), + is(KEYS_ONLY_RECORDS.stream().filter(r -> r.sort >= 3 && r.sort <= 5).collect(Collectors.toList()))); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanLimit() { + insertRecords(); + + SdkPublisher> publisher = keysOnlyMappedIndex.scan(r -> r.limit(5)); + + List> results = drainPublisher(publisher, 3); + + Page page1 = results.get(0); + Page page2 = results.get(1); + Page page3 = results.get(2); + + assertThat(page1.items(), is(KEYS_ONLY_RECORDS.subList(0, 5))); + assertThat(page1.lastEvaluatedKey(), is(getKeyMap(4))); + assertThat(page2.items(), is(KEYS_ONLY_RECORDS.subList(5, 10))); + assertThat(page2.lastEvaluatedKey(), is(getKeyMap(9))); + assertThat(page3.items(), is(empty())); + assertThat(page3.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanEmpty() { + SdkPublisher> publisher = keysOnlyMappedIndex.scan(); + List> results = drainPublisher(publisher, 1); + Page page = results.get(0); + + assertThat(page.items(), is(empty())); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanExclusiveStartKey() { + insertRecords(); + SdkPublisher> publisher = + keysOnlyMappedIndex.scan(ScanEnhancedRequest.builder().exclusiveStartKey(getKeyMap(7)).build()); + + List> results = drainPublisher(publisher, 1); + Page page = results.get(0); + + assertThat(page.items(), is(KEYS_ONLY_RECORDS.subList(8, 10))); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + private Map getKeyMap(int sort) { + Map result = new HashMap<>(); + result.put("id", stringValue(KEYS_ONLY_RECORDS.get(sort).getId())); + result.put("sort", numberValue(KEYS_ONLY_RECORDS.get(sort).getSort())); + result.put("gsi_id", stringValue(KEYS_ONLY_RECORDS.get(sort).getGsiId())); + result.put("gsi_sort", numberValue(KEYS_ONLY_RECORDS.get(sort).getGsiSort())); + return Collections.unmodifiableMap(result); + } +} diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactGetItemsTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactGetItemsTest.java index cfc4acd186d5..4692fec0a839 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactGetItemsTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactGetItemsTest.java @@ -34,9 +34,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetItemsEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetResultPage; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; @@ -131,8 +128,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -146,8 +143,8 @@ public void deleteTable() { } private void insertRecords() { - RECORDS_1.forEach(record -> mappedTable1.putItem(PutItemEnhancedRequest.create(record)).join()); - RECORDS_2.forEach(record -> mappedTable2.putItem(PutItemEnhancedRequest.create(record)).join()); + RECORDS_1.forEach(record -> mappedTable1.putItem(Record1.class, r -> r.item(record)).join()); + RECORDS_2.forEach(record -> mappedTable2.putItem(Record2.class, r -> r.item(record)).join()); } @Test @@ -156,10 +153,10 @@ public void getRecordsFromMultipleTables() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(1)))) .build(); List results = enhancedAsyncClient.transactGetItems(transactGetItemsEnhancedRequest).join(); @@ -177,10 +174,10 @@ public void notFoundRecordReturnsNull() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(5)))) - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(5)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(1)))) .build(); List results = enhancedAsyncClient.transactGetItems(transactGetItemsEnhancedRequest).join(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactWriteItemsTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactWriteItemsTest.java index 37196f81afc0..9fe556453e78 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactWriteItemsTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/AsyncTransactWriteItemsTest.java @@ -42,12 +42,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.core.DefaultDynamoDbEnhancedAsyncClient; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ConditionCheck; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactWriteItemsEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.UpdateItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; import software.amazon.awssdk.services.dynamodb.model.TransactionCanceledException; @@ -165,8 +160,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())).join(); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())).join(); } @After @@ -183,10 +178,10 @@ public void deleteTable() { public void singlePut() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable1, PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) .build()).join(); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record, is(RECORDS_1.get(0))); } @@ -194,12 +189,12 @@ public void singlePut() { public void multiplePut() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable1, PutItemEnhancedRequest.create(RECORDS_1.get(0))) - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(0))) + .addPutItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(0))) .build()).join(); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @@ -208,10 +203,10 @@ public void multiplePut() { public void singleUpdate() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(0))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) .build()).join(); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record, is(RECORDS_1.get(0))); } @@ -219,52 +214,49 @@ public void singleUpdate() { public void multipleUpdate() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(0))) - .addUpdateItem(mappedTable2, UpdateItemEnhancedRequest.create(RECORDS_2.get(0))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) + .addUpdateItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(0))) .build()).join(); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @Test public void singleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addDeleteItem(mappedTable1, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) .build()).join(); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record, is(nullValue())); } @Test public void multipleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addDeleteItem(mappedTable1, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build()).join(); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))).join(); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(); assertThat(record1, is(nullValue())); assertThat(record2, is(nullValue())); } @Test public void singleConditionCheck() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -276,14 +268,17 @@ public void singleConditionCheck() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) .build()).join(); } @Test public void multiConditionCheck() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -296,15 +291,21 @@ public void multiConditionCheck() { enhancedAsyncClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key1, conditionExpression)) - .addConditionCheck(mappedTable2, ConditionCheck.create(key2, conditionExpression)) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key1) + .conditionExpression(conditionExpression) + .build()) + .addConditionCheck(mappedTable2, ConditionCheck.builder() + .key(key2) + .conditionExpression(conditionExpression) + .build()) .build()).join(); } @Test public void mixedCommands() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -316,23 +317,25 @@ public void mixedCommands() { TransactWriteItemsEnhancedRequest transactWriteItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(1))) - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(1))) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(1))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(1))) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build(); enhancedAsyncClient.transactWriteItems(transactWriteItemsEnhancedRequest).join(); - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))).join(), is(RECORDS_1.get(1))); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(), is(nullValue())); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))).join(), is(RECORDS_2.get(1))); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))).join(), is(RECORDS_1.get(1))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(), is(nullValue())); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(1)))).join(), is(RECORDS_2.get(1))); } @Test public void mixedCommands_conditionCheckFailsTransaction() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))).join(); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))).join(); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))).join(); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))).join(); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -344,11 +347,13 @@ public void mixedCommands_conditionCheckFailsTransaction() { TransactWriteItemsEnhancedRequest transactWriteItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(1))) - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(1))) - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(1))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(1))) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build(); try { @@ -358,9 +363,9 @@ public void mixedCommands_conditionCheckFailsTransaction() { assertThat(e.getCause(), instanceOf(TransactionCanceledException.class)); } - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))).join(), is(nullValue())); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))).join(), is(RECORDS_2.get(0))); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))).join(), is(nullValue())); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))).join(), is(nullValue())); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))).join(), is(RECORDS_2.get(0))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(1)))).join(), is(nullValue())); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicCrudTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicCrudTest.java index 6e07b14ea1a1..1d1ab9757e6e 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicCrudTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicCrudTest.java @@ -36,7 +36,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; @@ -205,14 +204,13 @@ public int hashCode() { @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.builder() - .provisionedThroughput(getDefaultProvisionedThroughput()) - .globalSecondaryIndices( - GlobalSecondaryIndex.create( - "gsi_1", - Projection.builder().projectionType(ProjectionType.ALL).build(), - getDefaultProvisionedThroughput())) - .build()); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) + .globalSecondaryIndices( + GlobalSecondaryIndex.create( + "gsi_1", + Projection.builder().projectionType(ProjectionType.ALL).build(), + getDefaultProvisionedThroughput())) + .build()); } @After @@ -231,9 +229,8 @@ public void putThenGetItemUsingKey() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + mappedTable.putItem(Record.class, r -> r.item(record)); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(record)); } @@ -247,17 +244,15 @@ public void putThenGetItemUsingKeyItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); - Record result = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + mappedTable.putItem(Record.class, r -> r.item(record)); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(record)); } @Test public void getNonExistentItem() { - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(nullValue())); } @@ -270,7 +265,7 @@ public void putTwiceThenGetItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record record2 = new Record() .setId("id-value") .setSort("sort-value") @@ -278,9 +273,8 @@ public void putTwiceThenGetItem() { .setAttribute2("five") .setAttribute3("six"); - mappedTable.putItem(PutItemEnhancedRequest.create(record2)); - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + mappedTable.putItem(Record.class, r -> r.item(record2)); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(record2)); } @@ -294,12 +288,11 @@ public void putThenDeleteItem() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record beforeDeleteResult = - mappedTable.deleteItem(DeleteItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + mappedTable.deleteItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); Record afterDeleteResult = - mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(beforeDeleteResult, is(record)); assertThat(afterDeleteResult, is(nullValue())); @@ -314,7 +307,7 @@ public void putWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -329,8 +322,7 @@ public void putWithConditionThatSucceeds() { .item(record) .conditionExpression(conditionExpression).build()); - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(record)); } @@ -343,7 +335,7 @@ public void putWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -362,8 +354,7 @@ public void putWithConditionThatFails() { @Test public void deleteNonExistentItem() { - Record result = mappedTable.deleteItem(DeleteItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + Record result = mappedTable.deleteItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(nullValue())); } @@ -376,7 +367,7 @@ public void deleteWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") @@ -389,7 +380,7 @@ public void deleteWithConditionThatSucceeds() { Key key = mappedTable.keyFrom(record); mappedTable.deleteItem(DeleteItemEnhancedRequest.builder().key(key).conditionExpression(conditionExpression).build()); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(key)); + Record result = mappedTable.getItem(r -> r.key(key)); assertThat(result, is(nullValue())); } @@ -402,7 +393,7 @@ public void deleteWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") @@ -427,14 +418,14 @@ public void updateOverwriteCompleteRecord() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record record2 = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("four") .setAttribute2("five") .setAttribute3("six"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record2)); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record2)); assertThat(result, is(record2)); } @@ -446,7 +437,7 @@ public void updateCreatePartialRecord() { .setSort("sort-value") .setAttribute("one"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record)); assertThat(result, is(record)); } @@ -457,7 +448,7 @@ public void updateCreateKeyOnlyRecord() { .setId("id-value") .setSort("sort-value"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record)); assertThat(result, is(record)); } @@ -470,12 +461,12 @@ public void updateOverwriteModelledNulls() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record record2 = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("four"); - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record2)); + Record result = mappedTable.updateItem(Record.class, r -> r.item(record2)); assertThat(result, is(record2)); } @@ -489,7 +480,7 @@ public void updateCanIgnoreNullsAndDoPartialUpdate() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record record2 = new Record() .setId("id-value") .setSort("sort-value") @@ -517,14 +508,13 @@ public void updateShortRecordDoesPartialUpdate() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); ShortRecord record2 = new ShortRecord() .setId("id-value") .setSort("sort-value") .setAttribute("four"); - ShortRecord shortResult = mappedShortTable.updateItem(UpdateItemEnhancedRequest.create(record2)); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue(record.getId()), - stringValue(record.getSort())))); + ShortRecord shortResult = mappedShortTable.updateItem(ShortRecord.class, r -> r.item(record2)); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue(record.getId()), stringValue(record.getSort())))); Record expectedResult = new Record() .setId("id-value") @@ -545,7 +535,7 @@ public void updateKeyOnlyExistingRecordDoesNothing() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); Record updateRecord = new Record().setId("id-value").setSort("sort-value"); Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.builder(Record.class) @@ -565,7 +555,7 @@ public void updateWithConditionThatSucceeds() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -581,8 +571,7 @@ public void updateWithConditionThatSucceeds() { .conditionExpression(conditionExpression) .build()); - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(record)); } @@ -595,7 +584,7 @@ public void updateWithConditionThatFails() { .setAttribute2("two") .setAttribute3("three"); - mappedTable.putItem(PutItemEnhancedRequest.create(record)); + mappedTable.putItem(Record.class, r -> r.item(record)); record.setAttribute("four"); Expression conditionExpression = Expression.builder() @@ -619,14 +608,13 @@ public void getAShortRecordWithNewModelledFields() { .setId("id-value") .setSort("sort-value") .setAttribute("one"); - mappedShortTable.putItem(PutItemEnhancedRequest.create(shortRecord)); + mappedShortTable.putItem(ShortRecord.class, r -> r.item(shortRecord)); Record expectedRecord = new Record() .setId("id-value") .setSort("sort-value") .setAttribute("one"); - Record result = mappedTable.getItem(GetItemEnhancedRequest - .create(Key.create(stringValue("id-value"), stringValue("sort-value")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value"), stringValue("sort-value")))); assertThat(result, is(expectedRecord)); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicQueryTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicQueryTest.java index b5aa88a7b536..cee9e7b2a811 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicQueryTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicQueryTest.java @@ -45,8 +45,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -122,12 +120,12 @@ public int hashCode() { private DynamoDbTable mappedTable = enhancedClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record))); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record))); } @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -142,7 +140,7 @@ public void queryAllRecordsDefaultSettings() { insertRecords(); Iterator> results = - mappedTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("id-value"))))).iterator(); + mappedTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("id-value"))))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); @@ -185,7 +183,7 @@ public void queryBetween() { insertRecords(); Key fromKey = Key.create(stringValue("id-value"), numberValue(3)); Key toKey = Key.create(stringValue("id-value"), numberValue(5)); - Iterator> results = mappedTable.query(QueryEnhancedRequest.create(between(fromKey, toKey))).iterator(); + Iterator> results = mappedTable.query(r -> r.queryConditional(between(fromKey, toKey))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); @@ -230,7 +228,7 @@ public void queryLimit() { @Test public void queryEmpty() { Iterator> results = - mappedTable.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("id-value"))))).iterator(); + mappedTable.query(r -> r.queryConditional(equalTo(Key.create(stringValue("id-value"))))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); assertThat(results.hasNext(), is(false)); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicScanTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicScanTest.java index 8a5cec29195d..0e64f317601f 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicScanTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BasicScanTest.java @@ -42,8 +42,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ScanEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -107,12 +105,12 @@ public int hashCode() { private DynamoDbTable mappedTable = enhancedClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record))); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record))); } @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -126,7 +124,7 @@ public void deleteTable() { public void scanAllRecordsDefaultSettings() { insertRecords(); - Iterator> results = mappedTable.scan(ScanEnhancedRequest.create()).iterator(); + Iterator> results = mappedTable.scan(ScanEnhancedRequest.builder().build()).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); @@ -162,7 +160,7 @@ public void scanAllRecordsWithFilter() { @Test public void scanLimit() { insertRecords(); - Iterator> results = mappedTable.scan(ScanEnhancedRequest.builder().limit(5).build()).iterator(); + Iterator> results = mappedTable.scan(r -> r.limit(5)).iterator(); assertThat(results.hasNext(), is(true)); Page page1 = results.next(); assertThat(results.hasNext(), is(true)); @@ -181,7 +179,7 @@ public void scanLimit() { @Test public void scanEmpty() { - Iterator> results = mappedTable.scan(ScanEnhancedRequest.create()).iterator(); + Iterator> results = mappedTable.scan().iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); assertThat(results.hasNext(), is(false)); @@ -193,7 +191,7 @@ public void scanEmpty() { public void scanExclusiveStartKey() { insertRecords(); Iterator> results = - mappedTable.scan(ScanEnhancedRequest.builder().exclusiveStartKey(getKeyMap(7)).build()).iterator(); + mappedTable.scan(r -> r.exclusiveStartKey(getKeyMap(7))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchGetItemTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchGetItemTest.java index d686855ab316..36df669dbbd7 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchGetItemTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchGetItemTest.java @@ -35,9 +35,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchGetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchGetResultPage; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ReadBatch; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; @@ -126,8 +123,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -141,36 +138,31 @@ public void deleteTable() { } private void insertRecords() { - RECORDS_1.forEach(record -> mappedTable1.putItem(PutItemEnhancedRequest.create(record))); - RECORDS_2.forEach(record -> mappedTable2.putItem(PutItemEnhancedRequest.create(record))); + RECORDS_1.forEach(record -> mappedTable1.putItem(Record1.class, r -> r.item(record))); + RECORDS_2.forEach(record -> mappedTable2.putItem(Record2.class, r-> r.item(record))); } @Test public void getRecordsFromMultipleTables() { insertRecords(); - BatchGetItemEnhancedRequest batchGetItemEnhancedRequest = - BatchGetItemEnhancedRequest.builder() - .readBatches( - ReadBatch.builder(Record1.class) - .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .build(), - ReadBatch.builder(Record2.class) - .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .build(), - ReadBatch.builder(Record2.class) - .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .build(), - ReadBatch.builder(Record1.class) - .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .build()) - .build(); - - SdkIterable results = enhancedClient.batchGetItem(batchGetItemEnhancedRequest); + SdkIterable results = enhancedClient.batchGetItem(r -> r.readBatches( + ReadBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addGetItem(i -> i.key(Key.create(numberValue(0)))) + .build(), + ReadBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addGetItem(i -> i.key(Key.create(numberValue(0)))) + .build(), + ReadBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addGetItem(i -> i.key(Key.create(numberValue(1)))) + .build(), + ReadBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addGetItem(i -> i.key(Key.create(numberValue(1)))) + .build())); assertThat(results.stream().count(), is(1L)); @@ -192,19 +184,19 @@ public void notFoundRecordIgnored() { .readBatches( ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addGetItem(r -> r.key(Key.create(numberValue(0)))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addGetItem(r -> r.key(Key.create(numberValue(0)))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(r -> r.key(Key.create(numberValue(1)))) .build(), ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addGetItem(GetItemEnhancedRequest.create(Key.create(numberValue(5)))) + .addGetItem(r -> r.key(Key.create(numberValue(5)))) .build()) .build(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchWriteItemTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchWriteItemTest.java index d45286063fcc..549cdcb289fa 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchWriteItemTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/BatchWriteItemTest.java @@ -35,14 +35,8 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchWriteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.WriteBatch; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.operations.DeleteItemOperation; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.operations.GetItemOperation; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.operations.PutItemOperation; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; @@ -156,8 +150,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -177,13 +171,13 @@ public void singlePut() { .addWriteBatch( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(r -> r.item(RECORDS_1.get(0))) .build()) .build(); enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record, is(RECORDS_1.get(0))); } @@ -194,29 +188,29 @@ public void multiplePut() { .writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(r -> r.item(RECORDS_1.get(0))) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))) + .addPutItem(r -> r.item(RECORDS_2.get(0))) .build()) .build(); enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @Test public void singleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); WriteBatch singleDeleteBatch = WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(r -> r.key(Key.create(numberValue(0)))) .build(); BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = @@ -226,60 +220,54 @@ public void singleDelete() { enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record, is(nullValue())); } @Test public void multipleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = BatchWriteItemEnhancedRequest.builder() .writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(r -> r.key(Key.create(numberValue(0)))) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(r -> r.key(Key.create(numberValue(0)))) .build()) .build(); enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record1, is(nullValue())); assertThat(record2, is(nullValue())); } - @Test public void mixedCommands() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); - - BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = - BatchWriteItemEnhancedRequest.builder() - .writeBatches( - WriteBatch.builder(Record1.class) - .mappedTableResource(mappedTable1) - .addPutItem(PutItemEnhancedRequest.create(RECORDS_1.get(1))) - .build(), - WriteBatch.builder(Record2.class) - .mappedTableResource(mappedTable2) - .addDeleteItem(DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) - .build()) - .build(); - - enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); - - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))), is(RECORDS_1.get(0))); - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))), is(RECORDS_1.get(1))); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))), is(nullValue())); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); + + enhancedClient.batchWriteItem(r -> r.writeBatches( + WriteBatch.builder(Record1.class) + .mappedTableResource(mappedTable1) + .addPutItem(i -> i.item(RECORDS_1.get(1))) + .build(), + WriteBatch.builder(Record2.class) + .mappedTableResource(mappedTable2) + .addDeleteItem(i -> i.key(Key.create(numberValue(0)))) + .build())); + + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))), is(RECORDS_1.get(0))); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))), is(RECORDS_1.get(1))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))), is(nullValue())); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/FlattenTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/FlattenTest.java index 924d28c2a258..880b7d1b6f79 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/FlattenTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/FlattenTest.java @@ -29,9 +29,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.UpdateItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; @@ -152,7 +149,7 @@ public int hashCode() { @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -172,8 +169,8 @@ public void update_allValues() { .setId("id-value") .setDocument(document); - Record updatedRecord = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)); - Record fetchedRecord = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value")))); + Record updatedRecord = mappedTable.updateItem(Record.class, r -> r.item(record)); + Record fetchedRecord = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value")))); assertThat(updatedRecord, is(record)); assertThat(fetchedRecord, is(record)); @@ -188,8 +185,8 @@ public void update_someValues() { .setId("id-value") .setDocument(document); - Record updatedRecord = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)); - Record fetchedRecord = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value")))); + Record updatedRecord = mappedTable.updateItem(Record.class, r -> r.item(record)); + Record fetchedRecord = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value")))); assertThat(updatedRecord, is(record)); assertThat(fetchedRecord, is(record)); @@ -200,8 +197,8 @@ public void update_nullDocument() { Record record = new Record() .setId("id-value"); - Record updatedRecord = mappedTable.updateItem(UpdateItemEnhancedRequest.create(record)); - Record fetchedRecord = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id-value")))); + Record updatedRecord = mappedTable.updateItem(Record.class, r -> r.item(record)); + Record fetchedRecord = mappedTable.getItem(r -> r.key(Key.create(stringValue("id-value")))); assertThat(updatedRecord, is(record)); assertThat(fetchedRecord, is(record)); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexQueryTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexQueryTest.java index 79832951d4f3..4cacc11f2cd7 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexQueryTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexQueryTest.java @@ -48,7 +48,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -167,7 +166,7 @@ public int hashCode() { private DynamoDbIndex keysOnlyMappedIndex = mappedTable.index("gsi_keys_only"); private void insertRecords() { - RECORDS.forEach(record -> mappedTable.putItem(PutItemEnhancedRequest.create(record))); + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record))); } @Before @@ -196,7 +195,7 @@ public void queryAllRecordsDefaultSettings() { insertRecords(); Iterator> results = - keysOnlyMappedIndex.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("gsi-id-value"))))).iterator(); + keysOnlyMappedIndex.query(r -> r.queryConditional(equalTo(Key.create(stringValue("gsi-id-value"))))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); @@ -212,7 +211,7 @@ public void queryBetween() { Key fromKey = Key.create(stringValue("gsi-id-value"), numberValue(3)); Key toKey = Key.create(stringValue("gsi-id-value"), numberValue(5)); Iterator> results = - keysOnlyMappedIndex.query(QueryEnhancedRequest.create(between(fromKey, toKey))).iterator(); + keysOnlyMappedIndex.query(r -> r.queryConditional(between(fromKey, toKey))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); @@ -263,7 +262,7 @@ public void queryLimit() { @Test public void queryEmpty() { Iterator> results = - keysOnlyMappedIndex.query(QueryEnhancedRequest.create(equalTo(Key.create(stringValue("gsi-id-value"))))).iterator(); + keysOnlyMappedIndex.query(r -> r.queryConditional(equalTo(Key.create(stringValue("gsi-id-value"))))).iterator(); assertThat(results.hasNext(), is(true)); Page page = results.next(); assertThat(results.hasNext(), is(false)); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexScanTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexScanTest.java new file mode 100644 index 000000000000..cb3e933df578 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/IndexScanTest.java @@ -0,0 +1,274 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.functionaltests; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.numberValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.primaryPartitionKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.primarySortKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.secondaryPartitionKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.AttributeTags.secondarySortKey; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.Attributes.integerNumberAttribute; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.Attributes.stringAttribute; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbIndex; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Page; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GlobalSecondaryIndex; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ScanEnhancedRequest; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; +import software.amazon.awssdk.services.dynamodb.model.Projection; +import software.amazon.awssdk.services.dynamodb.model.ProjectionType; + +public class IndexScanTest extends LocalDynamoDbSyncTestBase { + private static class Record { + private String id; + private Integer sort; + private Integer value; + private String gsiId; + private Integer gsiSort; + + private String getId() { + return id; + } + + private Record setId(String id) { + this.id = id; + return this; + } + + private Integer getSort() { + return sort; + } + + private Record setSort(Integer sort) { + this.sort = sort; + return this; + } + + private Integer getValue() { + return value; + } + + private Record setValue(Integer value) { + this.value = value; + return this; + } + + private String getGsiId() { + return gsiId; + } + + private Record setGsiId(String gsiId) { + this.gsiId = gsiId; + return this; + } + + private Integer getGsiSort() { + return gsiSort; + } + + private Record setGsiSort(Integer gsiSort) { + this.gsiSort = gsiSort; + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Record record = (Record) o; + return Objects.equals(id, record.id) && + Objects.equals(sort, record.sort) && + Objects.equals(value, record.value) && + Objects.equals(gsiId, record.gsiId) && + Objects.equals(gsiSort, record.gsiSort); + } + + @Override + public int hashCode() { + return Objects.hash(id, sort, value, gsiId, gsiSort); + } + } + + private static final TableSchema TABLE_SCHEMA = + StaticTableSchema.builder(Record.class) + .newItemSupplier(Record::new) + .attributes( + stringAttribute("id", Record::getId, Record::setId).as(primaryPartitionKey()), + integerNumberAttribute("sort", Record::getSort, Record::setSort).as(primarySortKey()), + integerNumberAttribute("value", Record::getValue, Record::setValue), + stringAttribute("gsi_id", Record::getGsiId, Record::setGsiId) + .as(secondaryPartitionKey("gsi_keys_only")), + integerNumberAttribute("gsi_sort", Record::getGsiSort, Record::setGsiSort) + .as(secondarySortKey("gsi_keys_only"))) + .build(); + + private static final List RECORDS = + IntStream.range(0, 10) + .mapToObj(i -> new Record() + .setId("id-value") + .setSort(i) + .setValue(i) + .setGsiId("gsi-id-value") + .setGsiSort(i)) + .collect(Collectors.toList()); + + private static final List KEYS_ONLY_RECORDS = + RECORDS.stream() + .map(record -> new Record() + .setId(record.id) + .setSort(record.sort) + .setGsiId(record.gsiId) + .setGsiSort(record.gsiSort)) + .collect(Collectors.toList()); + + private DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() + .dynamoDbClient(getDynamoDbClient()) + .build(); + + private DynamoDbTable mappedTable = enhancedClient.table(getConcreteTableName("table-name"), TABLE_SCHEMA); + private DynamoDbIndex keysOnlyMappedIndex = mappedTable.index("gsi_keys_only"); + + private void insertRecords() { + RECORDS.forEach(record -> mappedTable.putItem(Record.class, r -> r.item(record))); + } + + @Before + public void createTable() { + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) + .globalSecondaryIndices(GlobalSecondaryIndex.create( + "gsi_keys_only", + Projection.builder().projectionType(ProjectionType.KEYS_ONLY).build(), + getDefaultProvisionedThroughput()))); + } + + @After + public void deleteTable() { + getDynamoDbClient().deleteTable(DeleteTableRequest.builder() + .tableName(getConcreteTableName("table-name")) + .build()); + } + + @Test + public void scanAllRecordsDefaultSettings() { + insertRecords(); + + Iterator> results = keysOnlyMappedIndex.scan(ScanEnhancedRequest.builder().build()).iterator(); + + assertThat(results.hasNext(), is(true)); + Page page = results.next(); + assertThat(results.hasNext(), is(false)); + + assertThat(page.items(), is(KEYS_ONLY_RECORDS)); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanAllRecordsWithFilter() { + insertRecords(); + Map expressionValues = new HashMap<>(); + expressionValues.put(":min_value", numberValue(3)); + expressionValues.put(":max_value", numberValue(5)); + Expression expression = Expression.builder() + .expression("sort >= :min_value AND sort <= :max_value") + .expressionValues(expressionValues) + .build(); + + Iterator> results = + keysOnlyMappedIndex.scan(ScanEnhancedRequest.builder().filterExpression(expression).build()).iterator(); + + assertThat(results.hasNext(), is(true)); + Page page = results.next(); + assertThat(results.hasNext(), is(false)); + + assertThat(page.items(), + is(KEYS_ONLY_RECORDS.stream().filter(r -> r.sort >= 3 && r.sort <= 5).collect(Collectors.toList()))); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanLimit() { + insertRecords(); + Iterator> results = keysOnlyMappedIndex.scan(r -> r.limit(5)).iterator(); + assertThat(results.hasNext(), is(true)); + Page page1 = results.next(); + assertThat(results.hasNext(), is(true)); + Page page2 = results.next(); + assertThat(results.hasNext(), is(true)); + Page page3 = results.next(); + assertThat(results.hasNext(), is(false)); + + assertThat(page1.items(), is(KEYS_ONLY_RECORDS.subList(0, 5))); + assertThat(page1.lastEvaluatedKey(), is(getKeyMap(4))); + assertThat(page2.items(), is(KEYS_ONLY_RECORDS.subList(5, 10))); + assertThat(page2.lastEvaluatedKey(), is(getKeyMap(9))); + assertThat(page3.items(), is(empty())); + assertThat(page3.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanEmpty() { + Iterator> results = keysOnlyMappedIndex.scan().iterator(); + assertThat(results.hasNext(), is(true)); + Page page = results.next(); + assertThat(results.hasNext(), is(false)); + assertThat(page.items(), is(empty())); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + @Test + public void scanExclusiveStartKey() { + insertRecords(); + Iterator> results = + keysOnlyMappedIndex.scan(r -> r.exclusiveStartKey(getKeyMap(7))).iterator(); + + assertThat(results.hasNext(), is(true)); + Page page = results.next(); + assertThat(results.hasNext(), is(false)); + assertThat(page.items(), is(KEYS_ONLY_RECORDS.subList(8, 10))); + assertThat(page.lastEvaluatedKey(), is(nullValue())); + } + + private Map getKeyMap(int sort) { + Map result = new HashMap<>(); + result.put("id", stringValue(KEYS_ONLY_RECORDS.get(sort).getId())); + result.put("sort", numberValue(KEYS_ONLY_RECORDS.get(sort).getSort())); + result.put("gsi_id", stringValue(KEYS_ONLY_RECORDS.get(sort).getGsiId())); + result.put("gsi_sort", numberValue(KEYS_ONLY_RECORDS.get(sort).getGsiSort())); + return Collections.unmodifiableMap(result); + } +} diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/LocalDynamoDbAsyncTestBase.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/LocalDynamoDbAsyncTestBase.java index e066fbeb5c07..d565ebdd4606 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/LocalDynamoDbAsyncTestBase.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/LocalDynamoDbAsyncTestBase.java @@ -15,6 +15,12 @@ package software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +import java.util.List; +import software.amazon.awssdk.core.async.SdkPublisher; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; public class LocalDynamoDbAsyncTestBase extends LocalDynamoDbTestBase { @@ -23,4 +29,16 @@ public class LocalDynamoDbAsyncTestBase extends LocalDynamoDbTestBase { protected DynamoDbAsyncClient getDynamoDbAsyncClient() { return dynamoDbAsyncClient; } + + protected static List drainPublisher(SdkPublisher publisher, int expectedNumberOfResults) { + BufferingSubscriber subscriber = new BufferingSubscriber<>(); + publisher.subscribe(subscriber); + subscriber.waitForCompletion(1000L); + + assertThat(subscriber.isCompleted(), is(true)); + assertThat(subscriber.bufferedError(), is(nullValue())); + assertThat(subscriber.bufferedItems().size(), is(expectedNumberOfResults)); + + return subscriber.bufferedItems(); + } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactGetItemsTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactGetItemsTest.java index 455f460eb4cb..e29dfea4750b 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactGetItemsTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactGetItemsTest.java @@ -33,9 +33,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetItemsEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetResultPage; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; @@ -125,8 +122,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -140,8 +137,8 @@ public void deleteTable() { } private void insertRecords() { - RECORDS_1.forEach(record -> mappedTable1.putItem(PutItemEnhancedRequest.create(record))); - RECORDS_2.forEach(record -> mappedTable2.putItem(PutItemEnhancedRequest.create(record))); + RECORDS_1.forEach(record -> mappedTable1.putItem(Record1.class, r -> r.item(record))); + RECORDS_2.forEach(record -> mappedTable2.putItem(Record2.class, r -> r.item(record))); } @Test @@ -150,10 +147,10 @@ public void getRecordsFromMultipleTables() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(1)))) .build(); List results = enhancedClient.transactGetItems(transactGetItemsEnhancedRequest); @@ -171,10 +168,10 @@ public void notFoundRecordReturnsNull() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addGetItem(mappedTable2, GetItemEnhancedRequest.create(Key.create(numberValue(5)))) - .addGetItem(mappedTable1, GetItemEnhancedRequest.create(Key.create(numberValue(1)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) + .addGetItem(mappedTable2, r -> r.key(Key.create(numberValue(5)))) + .addGetItem(mappedTable1, r -> r.key(Key.create(numberValue(1)))) .build(); List results = enhancedClient.transactGetItems(transactGetItemsEnhancedRequest); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactWriteItemsTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactWriteItemsTest.java index 18acb2946cbd..c0245d6e3165 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactWriteItemsTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/TransactWriteItemsTest.java @@ -39,12 +39,7 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.ConditionCheck; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactWriteItemsEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.UpdateItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest; import software.amazon.awssdk.services.dynamodb.model.TransactionCanceledException; @@ -159,8 +154,8 @@ public int hashCode() { @Before public void createTable() { - mappedTable1.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); - mappedTable2.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable1.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); + mappedTable2.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -177,10 +172,10 @@ public void deleteTable() { public void singlePut() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable1, PutItemEnhancedRequest.create(RECORDS_1.get(0))) + .addPutItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) .build()); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record, is(RECORDS_1.get(0))); } @@ -188,12 +183,12 @@ public void singlePut() { public void multiplePut() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable1, PutItemEnhancedRequest.create(RECORDS_1.get(0))) - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(0))) + .addPutItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(0))) .build()); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @@ -202,10 +197,10 @@ public void multiplePut() { public void singleUpdate() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(0))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) .build()); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record, is(RECORDS_1.get(0))); } @@ -213,52 +208,49 @@ public void singleUpdate() { public void multipleUpdate() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(0))) - .addUpdateItem(mappedTable2, UpdateItemEnhancedRequest.create(RECORDS_2.get(0))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(0))) + .addUpdateItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(0))) .build()); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record1, is(RECORDS_1.get(0))); assertThat(record2, is(RECORDS_2.get(0))); } @Test public void singleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addDeleteItem(mappedTable1, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) .build()); - Record1 record = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record, is(nullValue())); } @Test public void multipleDelete() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addDeleteItem(mappedTable1, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable1, r -> r.key(Key.create(numberValue(0)))) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build()); - Record1 record1 = mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); - Record2 record2 = mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))); + Record1 record1 = mappedTable1.getItem(r -> r.key(Key.create(numberValue(0)))); + Record2 record2 = mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))); assertThat(record1, is(nullValue())); assertThat(record2, is(nullValue())); } @Test public void singleConditionCheck() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -269,14 +261,17 @@ public void singleConditionCheck() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) .build()); } @Test public void multiConditionCheck() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -289,15 +284,21 @@ public void multiConditionCheck() { enhancedClient.transactWriteItems( TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key1, conditionExpression)) - .addConditionCheck(mappedTable2, ConditionCheck.create(key2, conditionExpression)) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key1) + .conditionExpression(conditionExpression) + .build()) + .addConditionCheck(mappedTable2, ConditionCheck.builder() + .key(key2) + .conditionExpression(conditionExpression) + .build()) .build()); } @Test public void mixedCommands() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -309,24 +310,26 @@ public void mixedCommands() { TransactWriteItemsEnhancedRequest transactWriteItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(1))) - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(1))) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(1))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(1))) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build(); enhancedClient.transactWriteItems(transactWriteItemsEnhancedRequest); - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))), is(RECORDS_1.get(1))); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))), is(nullValue())); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))), is(RECORDS_2.get(1))); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))), is(RECORDS_1.get(1))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))), is(nullValue())); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(1)))), is(RECORDS_2.get(1))); } @Test public void mixedCommands_conditionCheckFailsTransaction() { - mappedTable1.putItem(PutItemEnhancedRequest.create(RECORDS_1.get(0))); - mappedTable2.putItem(PutItemEnhancedRequest.create(RECORDS_2.get(0))); + mappedTable1.putItem(Record1.class, r -> r.item(RECORDS_1.get(0))); + mappedTable2.putItem(Record2.class, r -> r.item(RECORDS_2.get(0))); Expression conditionExpression = Expression.builder() .expression("#attribute = :attribute") @@ -338,11 +341,13 @@ public void mixedCommands_conditionCheckFailsTransaction() { TransactWriteItemsEnhancedRequest transactWriteItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addPutItem(mappedTable2, PutItemEnhancedRequest.create(RECORDS_2.get(1))) - .addUpdateItem(mappedTable1, UpdateItemEnhancedRequest.create(RECORDS_1.get(1))) - .addConditionCheck(mappedTable1, ConditionCheck.create(key, conditionExpression)) - .addDeleteItem(mappedTable2, - DeleteItemEnhancedRequest.create(Key.create(numberValue(0)))) + .addPutItem(mappedTable2, Record2.class, r -> r.item(RECORDS_2.get(1))) + .addUpdateItem(mappedTable1, Record1.class, r -> r.item(RECORDS_1.get(1))) + .addConditionCheck(mappedTable1, ConditionCheck.builder() + .key(key) + .conditionExpression(conditionExpression) + .build()) + .addDeleteItem(mappedTable2, r -> r.key(Key.create(numberValue(0)))) .build(); try { @@ -351,9 +356,9 @@ public void mixedCommands_conditionCheckFailsTransaction() { } catch(TransactionCanceledException ignored) { } - assertThat(mappedTable1.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))), is(nullValue())); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(0)))), is(RECORDS_2.get(0))); - assertThat(mappedTable2.getItem(GetItemEnhancedRequest.create(Key.create(numberValue(1)))), is(nullValue())); + assertThat(mappedTable1.getItem(r -> r.key(Key.create(numberValue(1)))), is(nullValue())); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(0)))), is(RECORDS_2.get(0))); + assertThat(mappedTable2.getItem(r -> r.key(Key.create(numberValue(1)))), is(nullValue())); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/VersionedRecordTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/VersionedRecordTest.java index 521ca63f6f62..ac0c08053427 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/VersionedRecordTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/functionaltests/VersionedRecordTest.java @@ -35,8 +35,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; import software.amazon.awssdk.extensions.dynamodb.mappingclient.TableSchema; import software.amazon.awssdk.extensions.dynamodb.mappingclient.extensions.VersionedRecordExtension; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.CreateTableEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.UpdateItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.staticmapper.StaticTableSchema; @@ -113,7 +111,7 @@ public int hashCode() { @Before public void createTable() { - mappedTable.createTable(CreateTableEnhancedRequest.create(getDefaultProvisionedThroughput())); + mappedTable.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput())); } @After @@ -125,9 +123,9 @@ public void deleteTable() { @Test public void putNewRecordSetsInitialVersion() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id")))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(1); assertThat(result, is(expectedResult)); @@ -135,7 +133,7 @@ public void putNewRecordSetsInitialVersion() { @Test public void updateNewRecordSetsInitialVersion() { - Record result = mappedTable.updateItem(UpdateItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + Record result = mappedTable.updateItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(1); @@ -144,18 +142,18 @@ public void updateNewRecordSetsInitialVersion() { @Test public void putExistingRecordVersionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one").setVersion(1))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one").setVersion(1))); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id")))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(2); assertThat(result, is(expectedResult)); } @Test public void putExistingRecordVersionMatchesConditionExpressionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -168,14 +166,14 @@ public void putExistingRecordVersionMatchesConditionExpressionMatches() { .conditionExpression(conditionExpression) .build()); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id")))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(2); assertThat(result, is(expectedResult)); } @Test public void putExistingRecordVersionDoesNotMatchConditionExpressionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -192,7 +190,7 @@ public void putExistingRecordVersionDoesNotMatchConditionExpressionMatches() { @Test public void putExistingRecordVersionMatchesConditionExpressionDoesNotMatch() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -209,7 +207,7 @@ public void putExistingRecordVersionMatchesConditionExpressionDoesNotMatch() { @Test public void updateExistingRecordVersionMatchesConditionExpressionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -222,14 +220,14 @@ public void updateExistingRecordVersionMatchesConditionExpressionMatches() { .conditionExpression(conditionExpression) .build()); - Record result = mappedTable.getItem(GetItemEnhancedRequest.create(Key.create(stringValue("id")))); + Record result = mappedTable.getItem(r -> r.key(Key.create(stringValue("id")))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(2); assertThat(result, is(expectedResult)); } @Test public void updateExistingRecordVersionDoesNotMatchConditionExpressionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -246,7 +244,7 @@ public void updateExistingRecordVersionDoesNotMatchConditionExpressionMatches() @Test public void updateExistingRecordVersionMatchesConditionExpressionDoesNotMatch() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Expression conditionExpression = Expression.builder() .expression("#k = :v OR #k = :v1") .putExpressionName("#k", "attribute") @@ -263,10 +261,10 @@ public void updateExistingRecordVersionMatchesConditionExpressionDoesNotMatch() @Test public void updateExistingRecordVersionMatches() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); Record result = - mappedTable.updateItem(UpdateItemEnhancedRequest.create(new Record().setId("id").setAttribute("one").setVersion(1))); + mappedTable.updateItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one").setVersion(1))); Record expectedResult = new Record().setId("id").setAttribute("one").setVersion(2); assertThat(result, is(expectedResult)); @@ -274,19 +272,19 @@ public void updateExistingRecordVersionMatches() { @Test(expected = ConditionalCheckFailedException.class) public void putNewRecordTwice() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); } @Test(expected = ConditionalCheckFailedException.class) public void updateNewRecordTwice() { - mappedTable.updateItem(UpdateItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); - mappedTable.updateItem(UpdateItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); + mappedTable.updateItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); + mappedTable.updateItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); } @Test(expected = ConditionalCheckFailedException.class) public void putRecordWithWrongVersionNumber() { - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one"))); - mappedTable.putItem(PutItemEnhancedRequest.create(new Record().setId("id").setAttribute("one").setVersion(2))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one"))); + mappedTable.putItem(Record.class, r -> r.item(new Record().setId("id").setAttribute("one").setVersion(2))); } } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequestTest.java new file mode 100644 index 000000000000..168cf6981648 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchGetItemEnhancedRequestTest.java @@ -0,0 +1,97 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; + +import java.util.Collections; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; + +@RunWith(MockitoJUnitRunner.class) +public class BatchGetItemEnhancedRequestTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + @Test + public void builder_minimal() { + BatchGetItemEnhancedRequest builtObject = BatchGetItemEnhancedRequest.builder().build(); + + assertThat(builtObject.readBatches(), is(nullValue())); + } + + @Test + public void builder_maximal() { + ReadBatch readBatch = ReadBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addGetItem(r -> r.key(Key.create(stringValue("key")))) + .build(); + + BatchGetItemEnhancedRequest builtObject = BatchGetItemEnhancedRequest.builder() + .readBatches(readBatch) + .build(); + + assertThat(builtObject.readBatches(), is(Collections.singletonList(readBatch))); + } + + @Test + public void builder_add_single() { + ReadBatch readBatch = ReadBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addGetItem(r -> r.key(Key.create(stringValue("key")))) + .build(); + + BatchGetItemEnhancedRequest builtObject = BatchGetItemEnhancedRequest.builder() + .addReadBatch(readBatch) + .build(); + + assertThat(builtObject.readBatches(), is(Collections.singletonList(readBatch))); + } + + @Test + public void toBuilder() { + BatchGetItemEnhancedRequest builtObject = BatchGetItemEnhancedRequest.builder().build(); + + BatchGetItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequestTest.java new file mode 100644 index 000000000000..c2936af63cab --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/BatchWriteItemEnhancedRequestTest.java @@ -0,0 +1,98 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; + +import java.util.Collections; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; + +@RunWith(MockitoJUnitRunner.class) +public class BatchWriteItemEnhancedRequestTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + + @Test + public void builder_minimal() { + BatchWriteItemEnhancedRequest builtObject = BatchWriteItemEnhancedRequest.builder().build(); + + assertThat(builtObject.writeBatches(), is(nullValue())); + } + + @Test + public void builder_maximal() { + WriteBatch writeBatch = WriteBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addDeleteItem(r -> r.key(Key.create(stringValue("key")))) + .build(); + + BatchWriteItemEnhancedRequest builtObject = BatchWriteItemEnhancedRequest.builder() + .writeBatches(writeBatch) + .build(); + + assertThat(builtObject.writeBatches(), is(Collections.singletonList(writeBatch))); + } + + @Test + public void builder_add_single() { + WriteBatch writeBatch = WriteBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addDeleteItem(r -> r.key(Key.create(stringValue("key")))) + .build(); + + BatchWriteItemEnhancedRequest builtObject = BatchWriteItemEnhancedRequest.builder() + .addWriteBatch(writeBatch) + .build(); + + assertThat(builtObject.writeBatches(), is(Collections.singletonList(writeBatch))); + } + + @Test + public void toBuilder() { + BatchWriteItemEnhancedRequest builtObject = BatchWriteItemEnhancedRequest.builder().build(); + + BatchWriteItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequestTest.java new file mode 100644 index 000000000000..5a009bf57057 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/CreateTableEnhancedRequestTest.java @@ -0,0 +1,81 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +import java.util.Collections; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.services.dynamodb.model.Projection; +import software.amazon.awssdk.services.dynamodb.model.ProjectionType; +import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput; + +@RunWith(MockitoJUnitRunner.class) +public class CreateTableEnhancedRequestTest { + + @Test + public void builder_minimal() { + CreateTableEnhancedRequest builtObject = CreateTableEnhancedRequest.builder().build(); + + assertThat(builtObject.globalSecondaryIndices(), is(nullValue())); + assertThat(builtObject.localSecondaryIndices(), is(nullValue())); + assertThat(builtObject.provisionedThroughput(), is(nullValue())); + } + + @Test + public void builder_maximal() { + GlobalSecondaryIndex globalSecondaryIndex = GlobalSecondaryIndex.create( + "gsi_1", + Projection.builder().projectionType(ProjectionType.ALL).build(), + getDefaultProvisionedThroughput()); + + LocalSecondaryIndex localSecondaryIndex = LocalSecondaryIndex.create( + "lsi", Projection.builder().projectionType(ProjectionType.ALL).build()); + + CreateTableEnhancedRequest builtObject = CreateTableEnhancedRequest.builder() + .globalSecondaryIndices(globalSecondaryIndex) + .localSecondaryIndices(localSecondaryIndex) + .provisionedThroughput(getDefaultProvisionedThroughput()) + .build(); + + assertThat(builtObject.globalSecondaryIndices(), is(Collections.singletonList(globalSecondaryIndex))); + assertThat(builtObject.localSecondaryIndices(), is(Collections.singletonList(localSecondaryIndex))); + assertThat(builtObject.provisionedThroughput(), is(getDefaultProvisionedThroughput())); + } + + @Test + public void toBuilder() { + CreateTableEnhancedRequest builtObject = CreateTableEnhancedRequest.builder() + .provisionedThroughput(getDefaultProvisionedThroughput()) + .build(); + + CreateTableEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + + private ProvisionedThroughput getDefaultProvisionedThroughput() { + return ProvisionedThroughput.builder() + .writeCapacityUnits(1L) + .readCapacityUnits(2L) + .build(); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequestTest.java new file mode 100644 index 000000000000..afb0ac46daf7 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/DeleteItemEnhancedRequestTest.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; + +@RunWith(MockitoJUnitRunner.class) +public class DeleteItemEnhancedRequestTest { + + @Test + public void builder_minimal() { + DeleteItemEnhancedRequest builtObject = DeleteItemEnhancedRequest.builder().build(); + + assertThat(builtObject.key(), is(nullValue())); + assertThat(builtObject.conditionExpression(), is(nullValue())); + } + + @Test + public void builder_maximal() { + Key key = Key.create(stringValue("key")); + + Expression conditionExpression = Expression.builder() + .expression("#key = :value OR #key1 = :value1") + .putExpressionName("#key", "attribute") + .putExpressionName("#key1", "attribute3") + .putExpressionValue(":value", stringValue("wrong")) + .putExpressionValue(":value1", stringValue("three")) + .build(); + + DeleteItemEnhancedRequest builtObject = DeleteItemEnhancedRequest.builder() + .key(key) + .conditionExpression(conditionExpression) + .build(); + + assertThat(builtObject.key(), is(key)); + assertThat(builtObject.conditionExpression(), is(conditionExpression)); + } + + @Test + public void toBuilder() { + Key key = Key.create(stringValue("key")); + + DeleteItemEnhancedRequest builtObject = DeleteItemEnhancedRequest.builder().key(key).build(); + + DeleteItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequestTest.java new file mode 100644 index 000000000000..47802000cc9d --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/GetItemEnhancedRequestTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; + +@RunWith(MockitoJUnitRunner.class) +public class GetItemEnhancedRequestTest { + + @Test + public void builder_minimal() { + GetItemEnhancedRequest builtObject = GetItemEnhancedRequest.builder().build(); + + assertThat(builtObject.key(), is(nullValue())); + assertThat(builtObject.consistentRead(), is(nullValue())); + } + + @Test + public void builder_maximal() { + Key key = Key.create(stringValue("key")); + + GetItemEnhancedRequest builtObject = GetItemEnhancedRequest.builder() + .key(key) + .consistentRead(true) + .build(); + + assertThat(builtObject.key(), is(key)); + assertThat(builtObject.consistentRead(), is(true)); + } + + @Test + public void toBuilder() { + Key key = Key.create(stringValue("key")); + + GetItemEnhancedRequest builtObject = GetItemEnhancedRequest.builder() + .key(key) + .build(); + + GetItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequestTest.java new file mode 100644 index 000000000000..96f9115b953e --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/PutItemEnhancedRequestTest.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; + +@RunWith(MockitoJUnitRunner.class) +public class PutItemEnhancedRequestTest { + + @Test + public void builder_minimal() { + PutItemEnhancedRequest builtObject = PutItemEnhancedRequest.builder(FakeItem.class).build(); + + assertThat(builtObject.item(), is(nullValue())); + assertThat(builtObject.conditionExpression(), is(nullValue())); + } + + @Test + public void builder_maximal() { + FakeItem fakeItem = createUniqueFakeItem(); + + Expression conditionExpression = Expression.builder() + .expression("#key = :value OR #key1 = :value1") + .putExpressionName("#key", "attribute") + .putExpressionName("#key1", "attribute3") + .putExpressionValue(":value", stringValue("wrong")) + .putExpressionValue(":value1", stringValue("three")) + .build(); + + PutItemEnhancedRequest builtObject = PutItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem) + .conditionExpression(conditionExpression) + .build(); + + assertThat(builtObject.item(), is(fakeItem)); + assertThat(builtObject.conditionExpression(), is(conditionExpression)); + } + + @Test + public void toBuilder() { + PutItemEnhancedRequest builtObject = PutItemEnhancedRequest.builder(FakeItem.class).build(); + + PutItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequestTest.java new file mode 100644 index 000000000000..9a801af5a6ff --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/QueryEnhancedRequestTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static java.util.Collections.singletonMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.numberValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.model.QueryConditional.equalTo; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; + +@RunWith(MockitoJUnitRunner.class) +public class QueryEnhancedRequestTest { + + @Test + public void builder_minimal() { + QueryEnhancedRequest builtObject = QueryEnhancedRequest.builder().build(); + + assertThat(builtObject.exclusiveStartKey(), is(nullValue())); + assertThat(builtObject.consistentRead(), is(nullValue())); + assertThat(builtObject.filterExpression(), is(nullValue())); + assertThat(builtObject.limit(), is(nullValue())); + assertThat(builtObject.queryConditional(), is(nullValue())); + assertThat(builtObject.scanIndexForward(), is(nullValue())); + } + + @Test + public void builder_maximal() { + Map exclusiveStartKey = new HashMap<>(); + exclusiveStartKey.put("id", stringValue("id-value")); + exclusiveStartKey.put("sort", numberValue(7)); + + Map expressionValues = singletonMap(":test-key", stringValue("test-value")); + Expression filterExpression = Expression.builder() + .expression("test-expression") + .expressionValues(expressionValues) + .build(); + + QueryConditional queryConditional = equalTo(Key.create(stringValue("id-value"))); + + QueryEnhancedRequest builtObject = QueryEnhancedRequest.builder() + .exclusiveStartKey(exclusiveStartKey) + .consistentRead(false) + .filterExpression(filterExpression) + .limit(3) + .queryConditional(queryConditional) + .scanIndexForward(true) + .build(); + + assertThat(builtObject.exclusiveStartKey(), is(exclusiveStartKey)); + assertThat(builtObject.consistentRead(), is(false)); + assertThat(builtObject.filterExpression(), is(filterExpression)); + assertThat(builtObject.limit(), is(3)); + assertThat(builtObject.queryConditional(), is(queryConditional)); + assertThat(builtObject.scanIndexForward(), is(true)); + } + + @Test + public void toBuilder() { + QueryEnhancedRequest builtObject = QueryEnhancedRequest.builder().build(); + + QueryEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatchTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatchTest.java new file mode 100644 index 000000000000..f38c048b3721 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ReadBatchTest.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import java.util.Collections; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; + +@RunWith(MockitoJUnitRunner.class) +public class ReadBatchTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + @Test + public void builder_minimal() { + ReadBatch builtObject = ReadBatch.builder(FakeItem.class).build(); + + assertThat(builtObject.tableName(), is(nullValue())); + assertThat(builtObject.keysAndAttributes(), is(nullValue())); + } + + @Test + public void builder_maximal_consumer_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + ReadBatch builtObject = ReadBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addGetItem(r -> r.key(Key.create(stringValue(fakeItem.getId())))) + .build(); + + Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, + FakeItem.getTableMetadata().primaryKeys()); + + assertThat(builtObject.tableName(), is(TABLE_NAME)); + assertThat(builtObject.keysAndAttributes().keys(), containsInAnyOrder(Collections.singletonList(fakeItemMap).toArray())); + } + + @Test + public void builder_maximal_builder_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + GetItemEnhancedRequest getItem = GetItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build(); + + ReadBatch builtObject = ReadBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addGetItem(getItem) + .build(); + + Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, + FakeItem.getTableMetadata().primaryKeys()); + + assertThat(builtObject.tableName(), is(TABLE_NAME)); + assertThat(builtObject.keysAndAttributes().keys(), containsInAnyOrder(Collections.singletonList(fakeItemMap).toArray())); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequestTest.java new file mode 100644 index 000000000000..306198ec678d --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/ScanEnhancedRequestTest.java @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static java.util.Collections.singletonMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.numberValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; + +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; + +@RunWith(MockitoJUnitRunner.class) +public class ScanEnhancedRequestTest { + + @Test + public void builder_minimal() { + ScanEnhancedRequest builtObject = ScanEnhancedRequest.builder().build(); + + assertThat(builtObject.exclusiveStartKey(), is(nullValue())); + assertThat(builtObject.consistentRead(), is(nullValue())); + assertThat(builtObject.filterExpression(), is(nullValue())); + assertThat(builtObject.limit(), is(nullValue())); + } + + @Test + public void builder_maximal() { + Map exclusiveStartKey = new HashMap<>(); + exclusiveStartKey.put("id", stringValue("id-value")); + exclusiveStartKey.put("sort", numberValue(7)); + + Map expressionValues = singletonMap(":test-key", stringValue("test-value")); + Expression filterExpression = Expression.builder() + .expression("test-expression") + .expressionValues(expressionValues) + .build(); + + ScanEnhancedRequest builtObject = ScanEnhancedRequest.builder() + .exclusiveStartKey(exclusiveStartKey) + .consistentRead(false) + .filterExpression(filterExpression) + .limit(3) + .build(); + + assertThat(builtObject.exclusiveStartKey(), is(exclusiveStartKey)); + assertThat(builtObject.consistentRead(), is(false)); + assertThat(builtObject.filterExpression(), is(filterExpression)); + assertThat(builtObject.limit(), is(3)); + } + + @Test + public void toBuilder() { + ScanEnhancedRequest builtObject = ScanEnhancedRequest.builder().exclusiveStartKey(null).build(); + + ScanEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequestTest.java new file mode 100644 index 000000000000..33932ba0dc1a --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactGetItemsEnhancedRequestTest.java @@ -0,0 +1,111 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.Get; +import software.amazon.awssdk.services.dynamodb.model.TransactGetItem; + +@RunWith(MockitoJUnitRunner.class) +public class TransactGetItemsEnhancedRequestTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + + @Test + public void builder_minimal() { + TransactGetItemsEnhancedRequest builtObject = TransactGetItemsEnhancedRequest.builder().build(); + + assertThat(builtObject.transactGetItems(), is(nullValue())); + } + + @Test + public void builder_maximal_consumer_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + TransactGetItemsEnhancedRequest builtObject = + TransactGetItemsEnhancedRequest.builder() + .addGetItem(fakeItemMappedTable, r -> r.key(Key.create(stringValue(fakeItem.getId())))) + .addGetItem(fakeItemMappedTable, r -> r.key(Key.create(stringValue(fakeItem.getId())))) + .build(); + + assertThat(builtObject.transactGetItems(), is(getTransactGetItems(fakeItem))); + } + + @Test + public void builder_maximal_builder_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + GetItemEnhancedRequest getItem = GetItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build(); + + TransactGetItemsEnhancedRequest builtObject = + TransactGetItemsEnhancedRequest.builder() + .addGetItem(fakeItemMappedTable, getItem) + .addGetItem(fakeItemMappedTable, getItem) + .build(); + + assertThat(builtObject.transactGetItems(), is(getTransactGetItems(fakeItem))); + } + + + private List getTransactGetItems(FakeItem fakeItem) { + final Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); + + TransactGetItem getItem = TransactGetItem.builder() + .get(Get.builder() + .key(fakeItemMap) + .tableName(TABLE_NAME) + .build()) + .build(); + + return Arrays.asList(getItem, getItem); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequestTest.java new file mode 100644 index 000000000000..c0b3e9f8ae80 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/TransactWriteItemsEnhancedRequestTest.java @@ -0,0 +1,159 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static java.util.Collections.singletonMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.Delete; +import software.amazon.awssdk.services.dynamodb.model.Put; +import software.amazon.awssdk.services.dynamodb.model.TransactWriteItem; + +@RunWith(MockitoJUnitRunner.class) +public class TransactWriteItemsEnhancedRequestTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + + @Test + public void builder_minimal() { + TransactWriteItemsEnhancedRequest builtObject = TransactWriteItemsEnhancedRequest.builder().build(); + + assertThat(builtObject.transactWriteItems(), is(nullValue())); + } + + @Test + public void builder_maximal_consumer_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + Expression conditionExpression = Expression.builder() + .expression("#attribute = :attribute") + .expressionValues(singletonMap(":attribute", stringValue("0"))) + .expressionNames(singletonMap("#attribute", "attribute")) + .build(); + + TransactWriteItemsEnhancedRequest builtObject = + TransactWriteItemsEnhancedRequest.builder() + .addPutItem(fakeItemMappedTable, FakeItem.class, r -> r.item(fakeItem)) + .addDeleteItem(fakeItemMappedTable, r -> r.key(Key.create(stringValue(fakeItem.getId())))) + .addUpdateItem(fakeItemMappedTable, FakeItem.class, r -> r.item(fakeItem)) + .addConditionCheck(fakeItemMappedTable, r -> r.key(Key.create(stringValue(fakeItem.getId()))) + .conditionExpression(conditionExpression)) + .build(); + + assertThat(builtObject.transactWriteItems().size(), is(4)); + assertThat(builtObject.transactWriteItems().get(0), is(getTransactWriteItems(fakeItem).get(0))); + assertThat(builtObject.transactWriteItems().get(1), is(getTransactWriteItems(fakeItem).get(1))); + + assertThat(builtObject.transactWriteItems().get(2).update(), is(notNullValue())); + assertThat(builtObject.transactWriteItems().get(2).update().key().get("id").s(), is(fakeItem.getId())); + + assertThat(builtObject.transactWriteItems().get(3).conditionCheck(), is(notNullValue())); + assertThat(builtObject.transactWriteItems().get(3).conditionCheck().key().get("id").s(), is(fakeItem.getId())); + } + + @Test + public void builder_maximal_builder_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + PutItemEnhancedRequest putItem = PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build(); + DeleteItemEnhancedRequest deleteItem = DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build(); + UpdateItemEnhancedRequest updateItem = UpdateItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem).build(); + Expression conditionExpression = Expression.builder() + .expression("#attribute = :attribute") + .expressionValues(singletonMap(":attribute", stringValue("0"))) + .expressionNames(singletonMap("#attribute", "attribute")) + .build(); + ConditionCheck conditionCheck = ConditionCheck.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .conditionExpression(conditionExpression) + .build(); + + TransactWriteItemsEnhancedRequest builtObject = + TransactWriteItemsEnhancedRequest.builder() + .addPutItem(fakeItemMappedTable, putItem) + .addDeleteItem(fakeItemMappedTable, deleteItem) + .addUpdateItem(fakeItemMappedTable, updateItem) + .addConditionCheck(fakeItemMappedTable, conditionCheck) + .build(); + + assertThat(builtObject.transactWriteItems().size(), is(4)); + assertThat(builtObject.transactWriteItems().get(0), is(getTransactWriteItems(fakeItem).get(0))); + assertThat(builtObject.transactWriteItems().get(1), is(getTransactWriteItems(fakeItem).get(1))); + + assertThat(builtObject.transactWriteItems().get(2).update(), is(notNullValue())); + assertThat(builtObject.transactWriteItems().get(2).update().key().get("id").s(), is(fakeItem.getId())); + + assertThat(builtObject.transactWriteItems().get(3).conditionCheck(), is(notNullValue())); + assertThat(builtObject.transactWriteItems().get(3).conditionCheck().key().get("id").s(), is(fakeItem.getId())); + } + + private List getTransactWriteItems(FakeItem fakeItem) { + final Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); + + TransactWriteItem putWriteItem = TransactWriteItem.builder() + .put(Put.builder() + .item(fakeItemMap) + .tableName(TABLE_NAME) + .build()) + .build(); + TransactWriteItem deleteWriteItem = TransactWriteItem.builder() + .delete(Delete.builder() + .key(fakeItemMap) + .tableName(TABLE_NAME) + .build()) + .build(); + + return Arrays.asList(putWriteItem, deleteWriteItem); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequestTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequestTest.java new file mode 100644 index 000000000000..d9327088c12f --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/UpdateItemEnhancedRequestTest.java @@ -0,0 +1,74 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Expression; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; + +@RunWith(MockitoJUnitRunner.class) +public class UpdateItemEnhancedRequestTest { + + @Test + public void builder_minimal() { + UpdateItemEnhancedRequest builtObject = UpdateItemEnhancedRequest.builder(FakeItem.class).build(); + + assertThat(builtObject.item(), is(nullValue())); + assertThat(builtObject.ignoreNulls(), is(nullValue())); + assertThat(builtObject.conditionExpression(), is(nullValue())); + } + + @Test + public void builder_maximal() { + FakeItem fakeItem = createUniqueFakeItem(); + + Expression conditionExpression = Expression.builder() + .expression("#key = :value OR #key1 = :value1") + .putExpressionName("#key", "attribute") + .putExpressionName("#key1", "attribute3") + .putExpressionValue(":value", stringValue("wrong")) + .putExpressionValue(":value1", stringValue("three")) + .build(); + + UpdateItemEnhancedRequest builtObject = UpdateItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem) + .ignoreNulls(true) + .conditionExpression(conditionExpression) + .build(); + + assertThat(builtObject.item(), is(fakeItem)); + assertThat(builtObject.ignoreNulls(), is(true)); + assertThat(builtObject.conditionExpression(), is(conditionExpression)); + } + + @Test + public void toBuilder() { + UpdateItemEnhancedRequest builtObject = UpdateItemEnhancedRequest.builder(FakeItem.class).build(); + + UpdateItemEnhancedRequest copiedObject = builtObject.toBuilder().build(); + + assertThat(copiedObject, is(builtObject)); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatchTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatchTest.java new file mode 100644 index 000000000000..a7df60c20e58 --- /dev/null +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/model/WriteBatchTest.java @@ -0,0 +1,113 @@ +/* + * Copyright 2010-2020 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.extensions.dynamodb.mappingclient.model; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.AttributeValues.stringValue; +import static software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem.createUniqueFakeItem; + +import java.util.Map; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbEnhancedClient; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.DynamoDbTable; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.Key; +import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.DeleteRequest; +import software.amazon.awssdk.services.dynamodb.model.PutRequest; +import software.amazon.awssdk.services.dynamodb.model.WriteRequest; + +@RunWith(MockitoJUnitRunner.class) +public class WriteBatchTest { + + private static final String TABLE_NAME = "table-name"; + + @Mock + private DynamoDbClient mockDynamoDbClient; + + private DynamoDbEnhancedClient enhancedClient; + private DynamoDbTable fakeItemMappedTable; + + @Before + public void setupMappedTables() { + enhancedClient = DynamoDbEnhancedClient.builder().dynamoDbClient(mockDynamoDbClient).build(); + fakeItemMappedTable = enhancedClient.table(TABLE_NAME, FakeItem.getTableSchema()); + } + + @Test + public void builder_minimal() { + WriteBatch builtObject = WriteBatch.builder(FakeItem.class).build(); + + assertThat(builtObject.tableName(), is(nullValue())); + assertThat(builtObject.writeRequests(), is(nullValue())); + } + + @Test + public void builder_maximal_consumer_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + WriteBatch builtObject = WriteBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addPutItem(r -> r.item(fakeItem)) + .addDeleteItem(r -> r.key(Key.create(stringValue(fakeItem.getId())))) + .build(); + + Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, + FakeItem.getTableMetadata().primaryKeys()); + + assertThat(builtObject.tableName(), is(TABLE_NAME)); + assertThat(builtObject.writeRequests(), containsInAnyOrder(putRequest(fakeItemMap), deleteRequest(fakeItemMap))); + } + + @Test + public void builder_maximal_builder_style() { + FakeItem fakeItem = createUniqueFakeItem(); + + PutItemEnhancedRequest putItem = PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build(); + DeleteItemEnhancedRequest deleteItem = DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build(); + + WriteBatch builtObject = WriteBatch.builder(FakeItem.class) + .mappedTableResource(fakeItemMappedTable) + .addPutItem(putItem) + .addDeleteItem(deleteItem) + .build(); + + Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, + FakeItem.getTableMetadata().primaryKeys()); + + assertThat(builtObject.tableName(), is(TABLE_NAME)); + assertThat(builtObject.writeRequests(), containsInAnyOrder(putRequest(fakeItemMap), deleteRequest(fakeItemMap))); + } + + private static WriteRequest putRequest(Map itemMap) { + return WriteRequest.builder().putRequest(PutRequest.builder().item(itemMap).build()).build(); + } + + private static WriteRequest deleteRequest(Map itemMap) { + return WriteRequest.builder().deleteRequest(DeleteRequest.builder().key(itemMap).build()).build(); + } + +} \ No newline at end of file diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchGetItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchGetItemOperationTest.java index 564f4e9595b9..b8ff4ee66286 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchGetItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchGetItemOperationTest.java @@ -110,7 +110,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { BatchGetItemEnhancedRequest.builder() .readBatches(ReadBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTable) - .addGetItem(GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(0))) + .addGetItem(r -> r.key(FAKE_ITEM_KEYS.get(0))) .build()) .build(); @@ -141,15 +141,15 @@ public void generateRequest_multipleBatches_multipleTableSchemas() { .readBatches( ReadBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTable) - .addGetItem(GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(0))) - .addGetItem(GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(1))) - .addGetItem(GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(2))) + .addGetItem(r -> r.key(FAKE_ITEM_KEYS.get(0))) + .addGetItem(r -> r.key(FAKE_ITEM_KEYS.get(1))) + .addGetItem(r -> r.key(FAKE_ITEM_KEYS.get(2))) .build(), ReadBatch.builder(FakeItemWithSort.class) .mappedTableResource(fakeItemWithSortMappedTable) - .addGetItem(GetItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(0))) - .addGetItem(GetItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(1))) - .addGetItem(GetItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(2))) + .addGetItem(r -> r.key(FAKESORT_ITEM_KEYS.get(0))) + .addGetItem(r -> r.key(FAKESORT_ITEM_KEYS.get(1))) + .addGetItem(r -> r.key(FAKESORT_ITEM_KEYS.get(2))) .build()) .build(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchWriteItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchWriteItemOperationTest.java index ca114af39340..5659934e2ab0 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchWriteItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/BatchWriteItemOperationTest.java @@ -58,8 +58,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItemWithSort; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchWriteItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.BatchWriteResult; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.DeleteItemEnhancedRequest; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.WriteBatch; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -118,7 +116,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { WriteBatch batch = WriteBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTable) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(0))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(0))) .build(); BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = @@ -154,15 +152,15 @@ public void generateRequest_multipleTables_mixedCommands() { .writeBatches( WriteBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTable) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(0))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(1))) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(2))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(0))) + .addDeleteItem(r -> r.key(FAKE_ITEM_KEYS.get(1))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(2))) .build(), WriteBatch.builder(FakeItemWithSort.class) .mappedTableResource(fakeItemWithSortMappedTable) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(0))) - .addPutItem(PutItemEnhancedRequest.create(FAKESORT_ITEMS.get(1))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(2))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(0))) + .addPutItem(r -> r.item(FAKESORT_ITEMS.get(1))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(2))) .build()) .build(); @@ -202,15 +200,15 @@ public void generateRequest_multipleTables_extensionOnlyTransformsPutsAndNotDele .writeBatches( WriteBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTableWithExtension) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(0))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(1))) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(2))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(0))) + .addDeleteItem(r -> r.key(FAKE_ITEM_KEYS.get(1))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(2))) .build(), WriteBatch.builder(FakeItemWithSort.class) .mappedTableResource(fakeItemWithSortMappedTableWithExtension) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(0))) - .addPutItem(PutItemEnhancedRequest.create(FAKESORT_ITEMS.get(1))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(2))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(0))) + .addPutItem(r -> r.item(FAKESORT_ITEMS.get(1))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(2))) .build()) .build(); @@ -243,15 +241,15 @@ public void generateRequest_extensionTriesToAddConditionalToPutItem() { .writeBatches( WriteBatch.builder(FakeItem.class) .mappedTableResource(fakeItemMappedTableWithExtension) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(0))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(1))) - .addPutItem(PutItemEnhancedRequest.create(FAKE_ITEMS.get(2))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(0))) + .addDeleteItem(r -> r.key(FAKE_ITEM_KEYS.get(1))) + .addPutItem(r -> r.item(FAKE_ITEMS.get(2))) .build(), WriteBatch.builder(FakeItemWithSort.class) .mappedTableResource(fakeItemWithSortMappedTableWithExtension) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(0))) - .addPutItem(PutItemEnhancedRequest.create(FAKESORT_ITEMS.get(1))) - .addDeleteItem(DeleteItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(2))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(0))) + .addPutItem(r -> r.item(FAKESORT_ITEMS.get(1))) + .addDeleteItem(r -> r.key(FAKESORT_ITEM_KEYS.get(2))) .build()) .build(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ConditionCheckTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ConditionCheckTest.java index 211d3defcb1f..3cee9367cb97 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ConditionCheckTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ConditionCheckTest.java @@ -51,7 +51,10 @@ public void generateTransactWriteItem() { .expressionValues(singletonMap("key2", stringValue("value2"))) .build(); ConditionCheck operation = - ConditionCheck.create(Key.create(stringValue(fakeItem.getId())), conditionExpression); + ConditionCheck.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .conditionExpression(conditionExpression) + .build(); OperationContext context = OperationContext.create("table-name", TableMetadata.primaryIndexName()); TransactWriteItem result = operation.generateTransactWriteItem(FakeItem.getTableSchema(), context, diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/CreateTableOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/CreateTableOperationTest.java index 2d923a1ab895..92a4ce2a925c 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/CreateTableOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/CreateTableOperationTest.java @@ -259,7 +259,7 @@ public void generateRequest_validLsiAsGsiReference() { @Test public void generateRequest_nonReferencedIndicesDoNotCreateExtraAttributeDefinitions() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder().build()); CreateTableRequest request = operation.generateRequest(FakeItemWithIndices.getTableSchema(), PRIMARY_CONTEXT, null); @@ -294,7 +294,8 @@ public void generateRequest_withProvisionedThroughput() { .readCapacityUnits(2L) .build(); - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create(provisionedThroughput)); + CreateTableOperation operation = CreateTableOperation.create( + CreateTableEnhancedRequest.builder().provisionedThroughput(provisionedThroughput).build()); CreateTableRequest request = operation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -306,7 +307,7 @@ public void generateRequest_withProvisionedThroughput() { @Test public void generateRequest_withNoProvisionedThroughput() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder().build()); CreateTableRequest request = operation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -318,7 +319,8 @@ public void generateRequest_withNoProvisionedThroughput() { @Test public void generateRequest_withNumericKey() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder() + .build()); CreateTableRequest request = operation.generateRequest(FakeItemWithNumericSort.getTableSchema(), PRIMARY_CONTEXT, @@ -350,7 +352,8 @@ public void generateRequest_withNumericKey() { @Test public void generateRequest_withBinaryKey() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder() + .build()); CreateTableRequest request = operation.generateRequest(FakeItemWithBinaryKey.getTableSchema(), PRIMARY_CONTEXT, @@ -374,14 +377,15 @@ public void generateRequest_withBinaryKey() { @Test(expected = IllegalArgumentException.class) public void generateRequest_doesNotWorkForIndex() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder() + .build()); operation.generateRequest(FakeItemWithIndices.getTableSchema(), GSI_1_CONTEXT, null); } @Test public void getServiceCall_makesTheRightCallAndReturnsResponse() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder().build()); CreateTableRequest createTableRequest = CreateTableRequest.builder().build(); CreateTableResponse expectedResponse = CreateTableResponse.builder().build(); when(mockDynamoDbClient.createTable(any(CreateTableRequest.class))).thenReturn(expectedResponse); @@ -394,7 +398,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { @Test public void transformResults_doesNothing() { - CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.create()); + CreateTableOperation operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder().build()); CreateTableResponse response = CreateTableResponse.builder().build(); operation.transformResponse(response, FakeItem.getTableSchema(), PRIMARY_CONTEXT, null); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/DeleteItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/DeleteItemOperationTest.java index 35885fa88ee7..719492091ab0 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/DeleteItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/DeleteItemOperationTest.java @@ -90,7 +90,7 @@ public class DeleteItemOperationTest { public void getServiceCall_makesTheRightCallAndReturnsResponse() { FakeItem keyItem = createUniqueFakeItem(); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); DeleteItemRequest deleteItemRequest = DeleteItemRequest.builder().tableName(TABLE_NAME).build(); DeleteItemResponse expectedResponse = DeleteItemResponse.builder().build(); when(mockDynamoDbClient.deleteItem(any(DeleteItemRequest.class))).thenReturn(expectedResponse); @@ -105,7 +105,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { public void generateRequest_partitionKeyOnly() { FakeItem keyItem = createUniqueFakeItem(); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); DeleteItemRequest request = deleteItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -125,7 +125,9 @@ public void generateRequest_partitionKeyOnly() { public void generateRequest_partitionAndSortKey() { FakeItemWithSort keyItem = createUniqueFakeItemWithSort(); DeleteItemOperation deleteItemOperation = DeleteItemOperation.create( - DeleteItemEnhancedRequest.create((Key.create(stringValue(keyItem.getId()), stringValue(keyItem.getSort()))))); + DeleteItemEnhancedRequest.builder() + .key((Key.create(stringValue(keyItem.getId()), stringValue(keyItem.getSort())))) + .build()); DeleteItemRequest request = deleteItemOperation.generateRequest(FakeItemWithSort.getTableSchema(), PRIMARY_CONTEXT, @@ -163,7 +165,7 @@ public void generateRequest_withConditionExpression() { @Test(expected = IllegalArgumentException.class) public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue("whatever")))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue("whatever"))).build()); deleteItemOperation.generateRequest(FakeItemComposedClass.getTableSchema(), PRIMARY_CONTEXT, null); } @@ -171,7 +173,7 @@ public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { @Test(expected = IllegalArgumentException.class) public void generateRequest_withIndex_throwsIllegalArgumentException() { DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue("whatever")))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue("whatever"))).build()); deleteItemOperation.generateRequest(FakeItem.getTableSchema(), GSI_1_CONTEXT, null); } @@ -180,7 +182,7 @@ public void generateRequest_withIndex_throwsIllegalArgumentException() { public void transformResponse_correctlyTransformsIntoAnItem() { FakeItem keyItem = createUniqueFakeItem(); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); Map responseMap = new HashMap<>(); responseMap.put("id", AttributeValue.builder().s(keyItem.getId()).build()); responseMap.put("subclass_attribute", AttributeValue.builder().s("test-value").build()); @@ -201,7 +203,7 @@ public void transformResponse_correctlyTransformsIntoAnItem() { public void transformResponse_noResults_returnsNull() { FakeItem keyItem = createUniqueFakeItem(); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); DeleteItemResponse response = DeleteItemResponse.builder() .build(); @@ -218,7 +220,9 @@ public void generateRequest_withExtension_doesNotModifyKey() { FakeItem baseFakeItem = createUniqueFakeItem(); Map keyMap = FakeItem.getTableSchema().itemToMap(baseFakeItem, singletonList("id")); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(baseFakeItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(baseFakeItem.getId()))) + .build()); DeleteItemRequest request = deleteItemOperation.generateRequest(FakeItem.getTableSchema(), @@ -236,7 +240,9 @@ public void transformResponse_withExtension_appliesItemModification() { Map baseFakeItemMap = FakeItem.getTableSchema().itemToMap(baseFakeItem, false); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, false); DeleteItemOperation deleteItemOperation = - DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(baseFakeItem.getId())))); + DeleteItemOperation.create(DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(baseFakeItem.getId()))) + .build()); DeleteItemResponse response = DeleteItemResponse.builder() .attributes(baseFakeItemMap) @@ -258,7 +264,9 @@ public void generateTransactWriteItem_basicRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); DeleteItemOperation deleteItemOperation = - spy(DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(fakeItem.getId()))))); + spy(DeleteItemOperation.create(DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); DeleteItemRequest deleteItemRequest = DeleteItemRequest.builder() @@ -286,7 +294,9 @@ public void generateTransactWriteItem_conditionalRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); DeleteItemOperation deleteItemOperation = - spy(DeleteItemOperation.create(DeleteItemEnhancedRequest.create(Key.create(stringValue(fakeItem.getId()))))); + spy(DeleteItemOperation.create(DeleteItemEnhancedRequest.builder() + .key(Key.create(stringValue(fakeItem.getId()))) + .build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); String conditionExpression = "condition-expression"; diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/GetItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/GetItemOperationTest.java index 20c93999dfe8..c8773de8bec3 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/GetItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/GetItemOperationTest.java @@ -67,7 +67,7 @@ public class GetItemOperationTest { public void getServiceCall_makesTheRightCallAndReturnsResponse() { FakeItem keyItem = createUniqueFakeItem(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); GetItemRequest getItemRequest = GetItemRequest.builder().tableName(TABLE_NAME).build(); GetItemResponse expectedResponse = GetItemResponse.builder().build(); when(mockDynamoDbClient.getItem(any(GetItemRequest.class))).thenReturn(expectedResponse); @@ -82,7 +82,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { public void generateRequest_withIndex_throwsIllegalArgumentException() { FakeItem keyItem = createUniqueFakeItem(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); getItemOperation.generateRequest(FakeItem.getTableSchema(), GSI_1_CONTEXT, null); } @@ -113,7 +113,7 @@ public void generateRequest_consistentRead() { public void generateRequest_partitionKeyOnly() { FakeItem keyItem = createUniqueFakeItem(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); GetItemRequest request = getItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -132,8 +132,10 @@ public void generateRequest_partitionKeyOnly() { public void generateRequest_partitionAndSortKey() { FakeItemWithSort keyItem = createUniqueFakeItemWithSort(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId()), - stringValue(keyItem.getSort())))); + GetItemOperation.create(GetItemEnhancedRequest.builder() + .key(Key.create(stringValue(keyItem.getId()), + stringValue(keyItem.getSort()))) + .build()); GetItemRequest request = getItemOperation.generateRequest(FakeItemWithSort.getTableSchema(), PRIMARY_CONTEXT, @@ -152,7 +154,7 @@ public void generateRequest_partitionAndSortKey() { @Test(expected = IllegalArgumentException.class) public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue("whatever")))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue("whatever"))).build()); getItemOperation.generateRequest(FakeItemComposedClass.getTableSchema(), PRIMARY_CONTEXT, null); } @@ -161,7 +163,7 @@ public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { public void transformResponse_noItem() { FakeItem keyItem = createUniqueFakeItem(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); GetItemResponse response = GetItemResponse.builder().build(); FakeItem result = getItemOperation.transformResponse(response, FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -174,7 +176,7 @@ public void transformResponse_noItem() { public void transformResponse_correctlyTransformsIntoAnItem() { FakeItem keyItem = createUniqueFakeItem(); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(keyItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(keyItem.getId()))).build()); Map responseMap = new HashMap<>(); responseMap.put("id", AttributeValue.builder().s(keyItem.getId()).build()); responseMap.put("subclass_attribute", AttributeValue.builder().s("test-value").build()); @@ -194,7 +196,7 @@ public void generateRequest_withExtension_doesNotModifyKey() { FakeItem baseFakeItem = createUniqueFakeItem(); Map keyMap = FakeItem.getTableSchema().itemToMap(baseFakeItem, singletonList("id")); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(baseFakeItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(baseFakeItem.getId()))).build()); GetItemRequest request = getItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -211,7 +213,7 @@ public void transformResponse_withExtension_appliesItemModification() { Map baseFakeItemMap = FakeItem.getTableSchema().itemToMap(baseFakeItem, false); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, false); GetItemOperation getItemOperation = - GetItemOperation.create(GetItemEnhancedRequest.create(Key.create(stringValue(baseFakeItem.getId())))); + GetItemOperation.create(GetItemEnhancedRequest.builder().key(Key.create(stringValue(baseFakeItem.getId()))).build()); GetItemResponse response = GetItemResponse.builder() .item(baseFakeItemMap) .build(); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/PutItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/PutItemOperationTest.java index 330fe8166901..1ea18e8e6368 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/PutItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/PutItemOperationTest.java @@ -96,8 +96,8 @@ public class PutItemOperationTest { @Test public void getServiceCall_makesTheRightCallAndReturnsResponse() { - FakeItem keyItem = createUniqueFakeItem(); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(keyItem)); + FakeItem fakeItem = createUniqueFakeItem(); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build()); PutItemRequest getItemRequest = PutItemRequest.builder().tableName(TABLE_NAME).build(); PutItemResponse expectedResponse = PutItemResponse.builder().build(); when(mockDynamoDbClient.putItem(any(PutItemRequest.class))).thenReturn(expectedResponse); @@ -111,7 +111,7 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { @Test(expected = IllegalArgumentException.class) public void generateRequest_withIndex_throwsIllegalArgumentException() { FakeItem fakeItem = createUniqueFakeItem(); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(fakeItem)); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build()); putItemOperation.generateRequest(FakeItem.getTableSchema(), GSI_1_CONTEXT, null); } @@ -120,7 +120,7 @@ public void generateRequest_withIndex_throwsIllegalArgumentException() { public void generateRequest_generatesCorrectRequest() { FakeItem fakeItem = createUniqueFakeItem(); fakeItem.setSubclassAttribute("subclass-value"); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(fakeItem)); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build()); PutItemRequest request = putItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -188,9 +188,9 @@ public void generateRequest_withConditionExpression_andExtensionWithSingleCondit @Test(expected = IllegalArgumentException.class) public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { - FakeItemComposedClass keyItem = FakeItemComposedClass.builder().composedAttribute("whatever").build(); + FakeItemComposedClass fakeItem = FakeItemComposedClass.builder().composedAttribute("whatever").build(); PutItemOperation putItemOperation = - PutItemOperation.create(PutItemEnhancedRequest.create(keyItem)); + PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItemComposedClass.class).item(fakeItem).build()); putItemOperation.generateRequest(FakeItemComposedClass.getTableSchema(), PRIMARY_CONTEXT, null); } @@ -198,9 +198,10 @@ public void generateRequest_noPartitionKey_throwsIllegalArgumentException() { @Test public void transformResponse_doesNotBlowUp() { FakeItem fakeItem = createUniqueFakeItem(); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(fakeItem)); - PutItemResponse response = PutItemResponse.builder() - .build(); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem) + .build()); + PutItemResponse response = PutItemResponse.builder().build(); putItemOperation.transformResponse(response, FakeItem.getTableSchema(), PRIMARY_CONTEXT, null); } @@ -213,7 +214,9 @@ public void generateRequest_withExtension_modifiesItemToPut() { Map fakeMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); when(mockMapperExtension.beforeWrite(anyMap(), any(), any())) .thenReturn(WriteModification.builder().transformedItem(fakeMap).build()); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(baseFakeItem)); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(baseFakeItem) + .build()); PutItemRequest request = putItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -231,7 +234,9 @@ public void generateRequest_withExtension_singleCondition() { Expression condition = Expression.builder().expression("condition").expressionValues(fakeMap).build(); when(mockMapperExtension.beforeWrite(anyMap(), any(), any())) .thenReturn(WriteModification.builder().additionalConditionalExpression(condition).build()); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(baseFakeItem)); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(baseFakeItem) + .build()); PutItemRequest request = putItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -246,7 +251,9 @@ public void generateRequest_withExtension_noModifications() { FakeItem baseFakeItem = createUniqueFakeItem(); when(mockMapperExtension.beforeWrite(anyMap(), any(), any())) .thenReturn(WriteModification.builder().build()); - PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.create(baseFakeItem)); + PutItemOperation putItemOperation = PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(baseFakeItem) + .build()); PutItemRequest request = putItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -259,7 +266,9 @@ public void generateRequest_withExtension_noModifications() { public void generateTransactWriteItem_basicRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); - PutItemOperation putItemOperation = spy(PutItemOperation.create(PutItemEnhancedRequest.create(fakeItem))); + PutItemOperation putItemOperation = spy(PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem) + .build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); PutItemRequest putItemRequest = PutItemRequest.builder() @@ -286,7 +295,9 @@ public void generateTransactWriteItem_basicRequest() { public void generateTransactWriteItem_conditionalRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); - PutItemOperation putItemOperation = spy(PutItemOperation.create(PutItemEnhancedRequest.create(fakeItem))); + PutItemOperation putItemOperation = spy(PutItemOperation.create(PutItemEnhancedRequest.builder(FakeItem.class) + .item(fakeItem) + .build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); String conditionExpression = "condition-expression"; diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/QueryOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/QueryOperationTest.java index 57584eed73c7..28dafd0573fa 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/QueryOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/QueryOperationTest.java @@ -76,7 +76,9 @@ public class QueryOperationTest { private final FakeItem keyItem = createUniqueFakeItem(); private final QueryOperation queryOperation = - QueryOperation.create(QueryEnhancedRequest.create(QueryConditional.equalTo(Key.create(stringValue(keyItem.getId()))))); + QueryOperation.create(QueryEnhancedRequest.builder() + .queryConditional(QueryConditional.equalTo(Key.create(stringValue(keyItem.getId())))) + .build()); @Mock private DynamoDbClient mockDynamoDbClient; @@ -118,7 +120,9 @@ public void generateRequest_nonDefault_usesQueryConditional() { Expression expression = Expression.builder().expression("test-expression").expressionValues(keyItemMap).build(); when(mockQueryConditional.expression(any(), anyString())).thenReturn(expression); - QueryOperation query = QueryOperation.create(QueryEnhancedRequest.create(mockQueryConditional)); + QueryOperation query = QueryOperation.create(QueryEnhancedRequest.builder() + .queryConditional(mockQueryConditional) + .build()); QueryRequest queryRequest = query.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, null); QueryRequest expectedQueryRequest = QueryRequest.builder() @@ -150,8 +154,9 @@ public void generateRequest_defaultQuery_usesEqualTo() { public void generateRequest_knowsHowToUseAnIndex() { FakeItemWithIndices fakeItem = createUniqueFakeItemWithIndices(); QueryOperation queryToTest = - QueryOperation.create(QueryEnhancedRequest.create(QueryConditional - .equalTo(Key.create(stringValue(fakeItem.getGsiId()))))); + QueryOperation.create(QueryEnhancedRequest.builder() + .queryConditional(QueryConditional.equalTo(Key.create(stringValue(fakeItem.getGsiId())))) + .build()); QueryRequest queryRequest = queryToTest.generateRequest(FakeItemWithIndices.getTableSchema(), GSI_1_CONTEXT, null); assertThat(queryRequest.indexName(), is("gsi_1")); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ScanOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ScanOperationTest.java index c58870abf755..6542de47e540 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ScanOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/ScanOperationTest.java @@ -69,7 +69,7 @@ public class ScanOperationTest { private static final OperationContext GSI_1_CONTEXT = OperationContext.create(TABLE_NAME, "gsi_1"); - private final ScanOperation scanOperation = ScanOperation.create(ScanEnhancedRequest.create()); + private final ScanOperation scanOperation = ScanOperation.create(ScanEnhancedRequest.builder().build()); @Mock private DynamoDbClient mockDynamoDbClient; @@ -119,7 +119,7 @@ public void generateRequest_defaultScan() { @Test public void generateRequest_knowsHowToUseAnIndex() { - ScanOperation operation = ScanOperation.create(ScanEnhancedRequest.create()); + ScanOperation operation = ScanOperation.create(ScanEnhancedRequest.builder().build()); ScanRequest scanRequest = operation.generateRequest(FakeItemWithIndices.getTableSchema(), GSI_1_CONTEXT, null); assertThat(scanRequest.indexName(), is("gsi_1")); } diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactGetItemsOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactGetItemsOperationTest.java index d9d76117f7f5..7bd14ef608e1 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactGetItemsOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactGetItemsOperationTest.java @@ -45,7 +45,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.MapperExtension; import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItemWithSort; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.GetItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetItemsEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactGetResultPage; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; @@ -104,12 +103,10 @@ public void setupMappedTables() { public void generateRequest_getsFromMultipleTables() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(fakeItemMappedTable, GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(0))) - .addGetItem(fakeItemWithSortMappedTable, - GetItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(0))) - .addGetItem(fakeItemWithSortMappedTable, - GetItemEnhancedRequest.create(FAKESORT_ITEM_KEYS.get(1))) - .addGetItem(fakeItemMappedTable, GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(1))) + .addGetItem(fakeItemMappedTable, r -> r.key(FAKE_ITEM_KEYS.get(0))) + .addGetItem(fakeItemWithSortMappedTable, r -> r.key(FAKESORT_ITEM_KEYS.get(0))) + .addGetItem(fakeItemWithSortMappedTable, r -> r.key(FAKESORT_ITEM_KEYS.get(1))) + .addGetItem(fakeItemMappedTable, r -> r.key(FAKE_ITEM_KEYS.get(1))) .build(); TransactGetItemsOperation operation = TransactGetItemsOperation.create(transactGetItemsEnhancedRequest); @@ -133,7 +130,7 @@ public void generateRequest_getsFromMultipleTables() { public void getServiceCall_makesTheRightCallAndReturnsResponse() { TransactGetItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactGetItemsEnhancedRequest.builder() - .addGetItem(fakeItemMappedTable, GetItemEnhancedRequest.create(FAKE_ITEM_KEYS.get(0))) + .addGetItem(fakeItemMappedTable, r -> r.key(FAKE_ITEM_KEYS.get(0))) .build(); TransactGetItemsOperation operation = TransactGetItemsOperation.create(transactGetItemsEnhancedRequest); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactWriteItemsOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactWriteItemsOperationTest.java index fc3664040e47..7e97864d5570 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactWriteItemsOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/TransactWriteItemsOperationTest.java @@ -35,7 +35,6 @@ import software.amazon.awssdk.extensions.dynamodb.mappingclient.MapperExtension; import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItem; import software.amazon.awssdk.extensions.dynamodb.mappingclient.functionaltests.models.FakeItemWithSort; -import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.PutItemEnhancedRequest; import software.amazon.awssdk.extensions.dynamodb.mappingclient.model.TransactWriteItemsEnhancedRequest; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; @@ -86,7 +85,7 @@ public void setupMappedTables() { public void generateRequest_singleTransaction() { TransactWriteItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addPutItem(fakeItemMappedTable, PutItemEnhancedRequest.create(fakeItem1)) + .addPutItem(fakeItemMappedTable, FakeItem.class, r -> r.item(fakeItem1)) .build(); TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(transactGetItemsEnhancedRequest); @@ -103,8 +102,8 @@ public void generateRequest_singleTransaction() { public void generateRequest_multipleTransactions() { TransactWriteItemsEnhancedRequest transactGetItemsEnhancedRequest = TransactWriteItemsEnhancedRequest.builder() - .addPutItem(fakeItemMappedTable, PutItemEnhancedRequest.create(fakeItem1)) - .addPutItem(fakeItemMappedTable, PutItemEnhancedRequest.create(fakeItem2)) + .addPutItem(fakeItemMappedTable, FakeItem.class, r -> r.item(fakeItem1)) + .addPutItem(fakeItemMappedTable, FakeItem.class, r -> r.item(fakeItem2)) .build(); TransactWriteItemsOperation operation = TransactWriteItemsOperation.create(transactGetItemsEnhancedRequest); diff --git a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/UpdateItemOperationTest.java b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/UpdateItemOperationTest.java index e64509fcb853..e0fca87df73e 100644 --- a/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/UpdateItemOperationTest.java +++ b/services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/extensions/dynamodb/mappingclient/operations/UpdateItemOperationTest.java @@ -114,7 +114,8 @@ public class UpdateItemOperationTest { @Test public void getServiceCall_makesTheRightCallAndReturnsResponse() { FakeItem item = createUniqueFakeItem(); - UpdateItemOperation updateItemOperation = UpdateItemOperation.create(UpdateItemEnhancedRequest.create(item)); + UpdateItemOperation updateItemOperation = UpdateItemOperation.create( + UpdateItemEnhancedRequest.builder(FakeItem.class).item(item).build()); UpdateItemRequest updateItemRequest = UpdateItemRequest.builder().tableName(TABLE_NAME).build(); UpdateItemResponse expectedResponse = UpdateItemResponse.builder().build(); when(mockDynamoDbClient.updateItem(any(UpdateItemRequest.class))).thenReturn(expectedResponse); @@ -128,7 +129,8 @@ public void getServiceCall_makesTheRightCallAndReturnsResponse() { @Test(expected = IllegalArgumentException.class) public void generateRequest_withIndex_throwsIllegalArgumentException() { FakeItem item = createUniqueFakeItem(); - UpdateItemOperation updateItemOperation = UpdateItemOperation.create(UpdateItemEnhancedRequest.create(item)); + UpdateItemOperation updateItemOperation = UpdateItemOperation.create( + UpdateItemEnhancedRequest.builder(FakeItem.class).item(item).build()); updateItemOperation.generateRequest(FakeItem.getTableSchema(), GSI_1_CONTEXT, null); } @@ -137,7 +139,8 @@ public void generateRequest_withIndex_throwsIllegalArgumentException() { public void generateRequest_nullValuesNotIgnoredByDefault() { FakeItemWithSort item = createUniqueFakeItemWithSort(); item.setOtherAttribute1("value-1"); - UpdateItemOperation updateItemOperation = UpdateItemOperation.create(UpdateItemEnhancedRequest.create(item)); + UpdateItemOperation updateItemOperation = UpdateItemOperation.create( + UpdateItemEnhancedRequest.builder(FakeItemWithSort.class).item(item).build()); Map expectedKey = new HashMap<>(); expectedKey.put("id", AttributeValue.builder().s(item.getId()).build()); expectedKey.put("sort", AttributeValue.builder().s(item.getSort()).build()); @@ -380,7 +383,7 @@ public void generateRequest_withExtension_modifiesKeyPortionOfItem() { .thenReturn(WriteModification.builder().transformedItem(fakeMap).build()); UpdateItemOperation updateItemOperation = - UpdateItemOperation.create(UpdateItemEnhancedRequest.create(baseFakeItem)); + UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(baseFakeItem).build()); UpdateItemRequest request = updateItemOperation.generateRequest(FakeItem.getTableSchema(), PRIMARY_CONTEXT, @@ -425,7 +428,7 @@ public void transformResponse_mapsAttributesReturnedInResponse() { Map fakeItem2Attributes = FakeItem.getTableSchema().itemToMap(fakeItem2, true); UpdateItemOperation updateItemOperation = - UpdateItemOperation.create(UpdateItemEnhancedRequest.create(fakeItem1)); + UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(fakeItem1).build()); FakeItem result = updateItemOperation.transformResponse( UpdateItemResponse.builder().attributes(fakeItem2Attributes).build(), @@ -664,7 +667,7 @@ public void transformResponse_withNoOpExtension_returnsCorrectItem() { public void transformResponse_afterReadThrowsException_throwsIllegalStateException() { when(mockMapperExtension.afterRead(anyMap(), any(), any())).thenThrow(RuntimeException.class); UpdateItemOperation updateItemOperation = - UpdateItemOperation.create(UpdateItemEnhancedRequest.create(createUniqueFakeItem())); + UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(createUniqueFakeItem()).build()); UpdateItemResponse response = UpdateItemResponse.builder() @@ -679,7 +682,7 @@ public void generateTransactWriteItem_basicRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); UpdateItemOperation updateItemOperation = - spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.create(fakeItem))); + spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); String updateExpression = "update-expression"; Map attributeValues = Collections.singletonMap("key", stringValue("value1")); @@ -716,7 +719,7 @@ public void generateTransactWriteItem_conditionalRequest() { FakeItem fakeItem = createUniqueFakeItem(); Map fakeItemMap = FakeItem.getTableSchema().itemToMap(fakeItem, true); UpdateItemOperation updateItemOperation = - spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.create(fakeItem))); + spy(UpdateItemOperation.create(UpdateItemEnhancedRequest.builder(FakeItem.class).item(fakeItem).build())); OperationContext context = OperationContext.create(TABLE_NAME, TableMetadata.primaryIndexName()); String updateExpression = "update-expression"; String conditionExpression = "condition-expression";