|
15 | 15 |
|
16 | 16 | package software.amazon.awssdk.enhanced.dynamodb.internal.client;
|
17 | 17 |
|
| 18 | +import static java.util.Collections.emptyList; |
18 | 19 | import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.createKeyFromItem;
|
19 | 20 |
|
| 21 | +import java.util.Collection; |
| 22 | +import java.util.List; |
| 23 | +import java.util.Map; |
20 | 24 | import java.util.function.Consumer;
|
| 25 | +import java.util.stream.Collectors; |
21 | 26 | import software.amazon.awssdk.annotations.SdkInternalApi;
|
22 | 27 | import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClientExtension;
|
23 | 28 | import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
|
| 29 | +import software.amazon.awssdk.enhanced.dynamodb.IndexMetadata; |
24 | 30 | import software.amazon.awssdk.enhanced.dynamodb.Key;
|
| 31 | +import software.amazon.awssdk.enhanced.dynamodb.KeyAttributeMetadata; |
25 | 32 | import software.amazon.awssdk.enhanced.dynamodb.TableMetadata;
|
26 | 33 | import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
|
27 | 34 | import software.amazon.awssdk.enhanced.dynamodb.internal.operations.CreateTableOperation;
|
|
39 | 46 | import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedRequest;
|
40 | 47 | import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedResponse;
|
41 | 48 | import software.amazon.awssdk.enhanced.dynamodb.model.DescribeTableEnhancedResponse;
|
| 49 | +import software.amazon.awssdk.enhanced.dynamodb.model.EnhancedGlobalSecondaryIndex; |
| 50 | +import software.amazon.awssdk.enhanced.dynamodb.model.EnhancedLocalSecondaryIndex; |
42 | 51 | import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
|
43 | 52 | import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
|
44 | 53 | import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest;
|
|
51 | 60 | import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
|
52 | 61 | import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;
|
53 | 62 | import software.amazon.awssdk.services.dynamodb.model.DescribeTableResponse;
|
| 63 | +import software.amazon.awssdk.services.dynamodb.model.ProjectionType; |
54 | 64 |
|
55 | 65 | @SdkInternalApi
|
56 | 66 | public class DefaultDynamoDbTable<T> implements DynamoDbTable<T> {
|
@@ -115,7 +125,52 @@ public void createTable(Consumer<CreateTableEnhancedRequest.Builder> requestCons
|
115 | 125 |
|
116 | 126 | @Override
|
117 | 127 | public void createTable() {
|
118 |
| - createTable(CreateTableEnhancedRequest.builder().build()); |
| 128 | + Map<IndexType, List<IndexMetadata>> indexGroups = splitSecondaryIndicesToLocalAndGlobalOnes(); |
| 129 | + createTable(CreateTableEnhancedRequest.builder() |
| 130 | + .localSecondaryIndices(extractLocalSecondaryIndices(indexGroups)) |
| 131 | + .globalSecondaryIndices(extractGlobalSecondaryIndices(indexGroups)) |
| 132 | + .build()); |
| 133 | + } |
| 134 | + |
| 135 | + private Map<IndexType, List<IndexMetadata>> splitSecondaryIndicesToLocalAndGlobalOnes() { |
| 136 | + String primaryPartitionKeyName = tableSchema.tableMetadata().primaryPartitionKey(); |
| 137 | + Collection<IndexMetadata> indices = tableSchema.tableMetadata().indices(); |
| 138 | + return indices.stream() |
| 139 | + .filter(index -> !TableMetadata.primaryIndexName().equals(index.name())) |
| 140 | + .collect(Collectors.groupingBy(metadata -> { |
| 141 | + String partitionKeyName = metadata.partitionKey().map(KeyAttributeMetadata::name).orElse(null); |
| 142 | + if (partitionKeyName == null || primaryPartitionKeyName.equals(partitionKeyName)) { |
| 143 | + return IndexType.LSI; |
| 144 | + } |
| 145 | + return IndexType.GSI; |
| 146 | + })); |
| 147 | + } |
| 148 | + |
| 149 | + private List<EnhancedLocalSecondaryIndex> extractLocalSecondaryIndices(Map<IndexType, List<IndexMetadata>> indicesGroups) { |
| 150 | + return indicesGroups.getOrDefault(IndexType.LSI, emptyList()).stream() |
| 151 | + .map(this::mapIndexMetadataToEnhancedLocalSecondaryIndex) |
| 152 | + .collect(Collectors.toList()); |
| 153 | + } |
| 154 | + |
| 155 | + private EnhancedLocalSecondaryIndex mapIndexMetadataToEnhancedLocalSecondaryIndex(IndexMetadata indexMetadata) { |
| 156 | + return EnhancedLocalSecondaryIndex.builder() |
| 157 | + .indexName(indexMetadata.name()) |
| 158 | + .projection(pb -> pb.projectionType(ProjectionType.ALL)) |
| 159 | + .build(); |
| 160 | + } |
| 161 | + |
| 162 | + private List<EnhancedGlobalSecondaryIndex> extractGlobalSecondaryIndices(Map<IndexType, List<IndexMetadata>> indicesGroups) { |
| 163 | + return indicesGroups.getOrDefault(IndexType.GSI, emptyList()).stream() |
| 164 | + .map(this::mapIndexMetadataToEnhancedGlobalSecondaryIndex) |
| 165 | + .collect(Collectors.toList()); |
| 166 | + } |
| 167 | + |
| 168 | + private EnhancedGlobalSecondaryIndex mapIndexMetadataToEnhancedGlobalSecondaryIndex(IndexMetadata indexMetadata) { |
| 169 | + return EnhancedGlobalSecondaryIndex.builder() |
| 170 | + .indexName(indexMetadata.name()) |
| 171 | + .projection(pb -> pb.projectionType(ProjectionType.ALL)) |
| 172 | + .provisionedThroughput(ptb -> ptb.readCapacityUnits(20L).writeCapacityUnits(20L)) |
| 173 | + .build(); |
119 | 174 | }
|
120 | 175 |
|
121 | 176 | @Override
|
|
0 commit comments