From 4e9e1de4b2146675b4f3ffe52fbdc389ba6c5733 Mon Sep 17 00:00:00 2001 From: RanVaknin <50976344+RanVaknin@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:39:32 -0800 Subject: [PATCH 1/2] Added cache for computation of partition keys --- .../enhanced/dynamodb/mapper/StaticTableMetadata.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java index 2126f25dec51..4bdb79d378e6 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; import software.amazon.awssdk.annotations.NotThreadSafe; @@ -47,6 +48,7 @@ public final class StaticTableMetadata implements TableMetadata { private final Map customMetadata; private final Map indexByNameMap; private final Map keyAttributes; + private final ConcurrentHashMap> partitionKeyCache = new ConcurrentHashMap<>(); private StaticTableMetadata(Builder builder) { this.customMetadata = Collections.unmodifiableMap(builder.customMetadata); @@ -84,6 +86,10 @@ public Optional customMetadataObject(String key, Class objec @Override public List indexPartitionKeys(String indexName) { + return partitionKeyCache.computeIfAbsent(indexName, this::computePartitionKeys); + } + + private List computePartitionKeys(String indexName) { IndexMetadata index = getIndex(indexName); List partitionKeys = index.partitionKeys(); From 3ea4dad6e5b71f6966c93ce4def1e221820a852b Mon Sep 17 00:00:00 2001 From: RanVaknin <50976344+RanVaknin@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:02:05 -0800 Subject: [PATCH 2/2] Add cache for sort key, wrap in unmodifiable list for thread safety --- .../dynamodb/mapper/StaticTableMetadata.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java index 4bdb79d378e6..9f5d985fc8a8 100644 --- a/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java +++ b/services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableMetadata.java @@ -49,6 +49,7 @@ public final class StaticTableMetadata implements TableMetadata { private final Map indexByNameMap; private final Map keyAttributes; private final ConcurrentHashMap> partitionKeyCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> sortKeyCache = new ConcurrentHashMap<>(); private StaticTableMetadata(Builder builder) { this.customMetadata = Collections.unmodifiableMap(builder.customMetadata); @@ -104,21 +105,25 @@ private List computePartitionKeys(String indexName) { + "Index name: " + indexName); } - return partitionKeys.stream() + return Collections.unmodifiableList(partitionKeys.stream() .filter(Objects::nonNull) .map(KeyAttributeMetadata::name) - .collect(Collectors.toList()); + .collect(Collectors.toList())); } @Override public List indexSortKeys(String indexName) { + return sortKeyCache.computeIfAbsent(indexName, this::computeSortKeys); + } + + private List computeSortKeys(String indexName) { IndexMetadata index = getIndex(indexName); - + List sortKeys = index.sortKeys(); - return sortKeys.stream() - .filter(Objects::nonNull) - .map(KeyAttributeMetadata::name) - .collect(Collectors.toList()); + return Collections.unmodifiableList(sortKeys.stream() + .filter(Objects::nonNull) + .map(KeyAttributeMetadata::name) + .collect(Collectors.toList())); } @Override