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..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 @@ -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,8 @@ 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 final ConcurrentHashMap> sortKeyCache = new ConcurrentHashMap<>(); private StaticTableMetadata(Builder builder) { this.customMetadata = Collections.unmodifiableMap(builder.customMetadata); @@ -84,6 +87,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(); @@ -98,21 +105,25 @@ public List indexPartitionKeys(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