From 536253f526eb50b92a12c1bed9ea155c6b2dfe5d Mon Sep 17 00:00:00 2001 From: Lee Hannigan Date: Wed, 17 Dec 2025 12:53:03 +0000 Subject: [PATCH] Update LSI code to Javav2 --- ...DocumentAPILocalSecondaryIndexExample.java | 2 +- ...DocumentAPILocalSecondaryIndexExample.java | 241 ++++++++++++++++++ 2 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/DocumentAPILocalSecondaryIndexExample.java diff --git a/java/example_code/dynamodb/src/main/java/com/amazonaws/codesamples/document/DocumentAPILocalSecondaryIndexExample.java b/java/example_code/dynamodb/src/main/java/com/amazonaws/codesamples/document/DocumentAPILocalSecondaryIndexExample.java index 3cdd68aa713..6ebe410bfc9 100644 --- a/java/example_code/dynamodb/src/main/java/com/amazonaws/codesamples/document/DocumentAPILocalSecondaryIndexExample.java +++ b/java/example_code/dynamodb/src/main/java/com/amazonaws/codesamples/document/DocumentAPILocalSecondaryIndexExample.java @@ -1,7 +1,7 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -// snippet-start:[dynamodb.java.codeexample.DocumentAPILocalSecondaryIndexExample] +// snippet-start:[dynamodb.java.codeexample.DocumentAPILocalSecondaryIndexExampleV1] package com.amazonaws.codesamples.document; diff --git a/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/DocumentAPILocalSecondaryIndexExample.java b/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/DocumentAPILocalSecondaryIndexExample.java new file mode 100644 index 00000000000..f3dbd9f9447 --- /dev/null +++ b/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/DocumentAPILocalSecondaryIndexExample.java @@ -0,0 +1,241 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// snippet-start:[dynamodb.java.codeexample.DocumentAPILocalSecondaryIndexExample] + +package com.example.dynamodb; + +import software.amazon.awssdk.core.waiters.WaiterResponse; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.*; +import software.amazon.awssdk.services.dynamodb.waiters.DynamoDbWaiter; + +import java.util.HashMap; +import java.util.Map; + +public class DocumentAPILocalSecondaryIndexExample { + + static DynamoDbClient client = DynamoDbClient.create(); + public static String tableName = "CustomerOrders"; + + public static void main(String[] args) { + createTable(); + loadData(); + query(null); + query("IsOpenIndex"); + query("OrderCreationDateIndex"); + deleteTable(tableName); + } + + public static void createTable() { + CreateTableRequest request = CreateTableRequest.builder() + .tableName(tableName) + .provisionedThroughput(ProvisionedThroughput.builder() + .readCapacityUnits(1L) + .writeCapacityUnits(1L) + .build()) + .attributeDefinitions( + AttributeDefinition.builder().attributeName("CustomerId").attributeType(ScalarAttributeType.S).build(), + AttributeDefinition.builder().attributeName("OrderId").attributeType(ScalarAttributeType.N).build(), + AttributeDefinition.builder().attributeName("OrderCreationDate").attributeType(ScalarAttributeType.N).build(), + AttributeDefinition.builder().attributeName("IsOpen").attributeType(ScalarAttributeType.N).build()) + .keySchema( + KeySchemaElement.builder().attributeName("CustomerId").keyType(KeyType.HASH).build(), + KeySchemaElement.builder().attributeName("OrderId").keyType(KeyType.RANGE).build()) + .localSecondaryIndexes( + LocalSecondaryIndex.builder() + .indexName("OrderCreationDateIndex") + .keySchema( + KeySchemaElement.builder().attributeName("CustomerId").keyType(KeyType.HASH).build(), + KeySchemaElement.builder().attributeName("OrderCreationDate").keyType(KeyType.RANGE).build()) + .projection(Projection.builder() + .projectionType(ProjectionType.INCLUDE) + .nonKeyAttributes("ProductCategory", "ProductName") + .build()) + .build(), + LocalSecondaryIndex.builder() + .indexName("IsOpenIndex") + .keySchema( + KeySchemaElement.builder().attributeName("CustomerId").keyType(KeyType.HASH).build(), + KeySchemaElement.builder().attributeName("IsOpen").keyType(KeyType.RANGE).build()) + .projection(Projection.builder() + .projectionType(ProjectionType.ALL) + .build()) + .build()) + .build(); + + System.out.println("Creating table " + tableName + "..."); + client.createTable(request); + + try (DynamoDbWaiter waiter = client.waiter()) { + WaiterResponse response = waiter.waitUntilTableExists(r -> r.tableName(tableName)); + response.matched().response().ifPresent(System.out::println); + } + } + + public static void query(String indexName) { + System.out.println("\n***********************************************************\n"); + System.out.println("Querying table " + tableName + "..."); + + if ("IsOpenIndex".equals(indexName)) { + System.out.println("\nUsing index: '" + indexName + "': Bob's orders that are open."); + System.out.println("Only a user-specified list of attributes are returned\n"); + + Map values = new HashMap<>(); + values.put(":v_custid", AttributeValue.builder().s("bob@example.com").build()); + values.put(":v_isopen", AttributeValue.builder().n("1").build()); + + QueryRequest request = QueryRequest.builder() + .tableName(tableName) + .indexName(indexName) + .keyConditionExpression("CustomerId = :v_custid and IsOpen = :v_isopen") + .expressionAttributeValues(values) + .projectionExpression("OrderCreationDate, ProductCategory, ProductName, OrderStatus") + .build(); + + System.out.println("Query: printing results..."); + client.query(request).items().forEach(System.out::println); + + } else if ("OrderCreationDateIndex".equals(indexName)) { + System.out.println("\nUsing index: '" + indexName + "': Bob's orders that were placed after 01/31/2015."); + System.out.println("Only the projected attributes are returned\n"); + + Map values = new HashMap<>(); + values.put(":v_custid", AttributeValue.builder().s("bob@example.com").build()); + values.put(":v_orddate", AttributeValue.builder().n("20150131").build()); + + QueryRequest request = QueryRequest.builder() + .tableName(tableName) + .indexName(indexName) + .keyConditionExpression("CustomerId = :v_custid and OrderCreationDate >= :v_orddate") + .expressionAttributeValues(values) + .select(Select.ALL_PROJECTED_ATTRIBUTES) + .build(); + + System.out.println("Query: printing results..."); + client.query(request).items().forEach(System.out::println); + + } else { + System.out.println("\nNo index: All of Bob's orders, by OrderId:\n"); + + Map values = new HashMap<>(); + values.put(":v_custid", AttributeValue.builder().s("bob@example.com").build()); + + QueryRequest request = QueryRequest.builder() + .tableName(tableName) + .keyConditionExpression("CustomerId = :v_custid") + .expressionAttributeValues(values) + .build(); + + System.out.println("Query: printing results..."); + client.query(request).items().forEach(System.out::println); + } + } + + public static void deleteTable(String tableName) { + System.out.println("Deleting table " + tableName + "..."); + client.deleteTable(DeleteTableRequest.builder().tableName(tableName).build()); + + try (DynamoDbWaiter waiter = client.waiter()) { + waiter.waitUntilTableNotExists(r -> r.tableName(tableName)); + } + } + + public static void loadData() { + System.out.println("Loading data into table " + tableName + "..."); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("alice@example.com").build(), + "OrderId", AttributeValue.builder().n("1").build(), + "IsOpen", AttributeValue.builder().n("1").build(), + "OrderCreationDate", AttributeValue.builder().n("20150101").build(), + "ProductCategory", AttributeValue.builder().s("Book").build(), + "ProductName", AttributeValue.builder().s("The Great Outdoors").build(), + "OrderStatus", AttributeValue.builder().s("PACKING ITEMS").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("alice@example.com").build(), + "OrderId", AttributeValue.builder().n("2").build(), + "IsOpen", AttributeValue.builder().n("1").build(), + "OrderCreationDate", AttributeValue.builder().n("20150221").build(), + "ProductCategory", AttributeValue.builder().s("Bike").build(), + "ProductName", AttributeValue.builder().s("Super Mountain").build(), + "OrderStatus", AttributeValue.builder().s("ORDER RECEIVED").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("alice@example.com").build(), + "OrderId", AttributeValue.builder().n("3").build(), + "OrderCreationDate", AttributeValue.builder().n("20150304").build(), + "ProductCategory", AttributeValue.builder().s("Music").build(), + "ProductName", AttributeValue.builder().s("A Quiet Interlude").build(), + "OrderStatus", AttributeValue.builder().s("IN TRANSIT").build(), + "ShipmentTrackingId", AttributeValue.builder().s("176493").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("1").build(), + "OrderCreationDate", AttributeValue.builder().n("20150111").build(), + "ProductCategory", AttributeValue.builder().s("Movie").build(), + "ProductName", AttributeValue.builder().s("Calm Before The Storm").build(), + "OrderStatus", AttributeValue.builder().s("SHIPPING DELAY").build(), + "ShipmentTrackingId", AttributeValue.builder().s("859323").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("2").build(), + "OrderCreationDate", AttributeValue.builder().n("20150124").build(), + "ProductCategory", AttributeValue.builder().s("Music").build(), + "ProductName", AttributeValue.builder().s("E-Z Listening").build(), + "OrderStatus", AttributeValue.builder().s("DELIVERED").build(), + "ShipmentTrackingId", AttributeValue.builder().s("756943").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("3").build(), + "OrderCreationDate", AttributeValue.builder().n("20150221").build(), + "ProductCategory", AttributeValue.builder().s("Music").build(), + "ProductName", AttributeValue.builder().s("Symphony 9").build(), + "OrderStatus", AttributeValue.builder().s("DELIVERED").build(), + "ShipmentTrackingId", AttributeValue.builder().s("645193").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("4").build(), + "IsOpen", AttributeValue.builder().n("1").build(), + "OrderCreationDate", AttributeValue.builder().n("20150222").build(), + "ProductCategory", AttributeValue.builder().s("Hardware").build(), + "ProductName", AttributeValue.builder().s("Extra Heavy Hammer").build(), + "OrderStatus", AttributeValue.builder().s("PACKING ITEMS").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("5").build(), + "OrderCreationDate", AttributeValue.builder().n("20150309").build(), + "ProductCategory", AttributeValue.builder().s("Book").build(), + "ProductName", AttributeValue.builder().s("How To Cook").build(), + "OrderStatus", AttributeValue.builder().s("IN TRANSIT").build(), + "ShipmentTrackingId", AttributeValue.builder().s("440185").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("6").build(), + "OrderCreationDate", AttributeValue.builder().n("20150318").build(), + "ProductCategory", AttributeValue.builder().s("Luggage").build(), + "ProductName", AttributeValue.builder().s("Really Big Suitcase").build(), + "OrderStatus", AttributeValue.builder().s("DELIVERED").build(), + "ShipmentTrackingId", AttributeValue.builder().s("893927").build())); + + putItem(Map.of( + "CustomerId", AttributeValue.builder().s("bob@example.com").build(), + "OrderId", AttributeValue.builder().n("7").build(), + "OrderCreationDate", AttributeValue.builder().n("20150324").build(), + "ProductCategory", AttributeValue.builder().s("Golf").build(), + "ProductName", AttributeValue.builder().s("PGA Pro II").build(), + "OrderStatus", AttributeValue.builder().s("OUT FOR DELIVERY").build(), + "ShipmentTrackingId", AttributeValue.builder().s("383283").build())); + } + + private static void putItem(Map item) { + client.putItem(PutItemRequest.builder().tableName(tableName).item(item).build()); + } +}