Skip to content

Commit da40a16

Browse files
committed
Surface API Review comments from Matt
1 parent a9407dd commit da40a16

File tree

17 files changed

+1472
-517
lines changed

17 files changed

+1472
-517
lines changed

docs/design/services/dynamodb/high-level-library/DocumentAPI.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ providers.
4444

4545
// New API in TableSchema to create a DocumentTableSchema
4646
DocumentTableSchema documentTableSchema =
47-
TableSchema.fromDocumentSchemaBuilder()
47+
TableSchema.documentSchemaBuilder()
4848
.addIndexPartitionKey(primaryIndexName(), "sample_hash_name", AttributeValueType.S)
4949
.addIndexSortKey("gsi_index", "sample_sort_name", AttributeValueType.N)
5050
.addAttributeConverterProviders(cutomAttributeConverters)
@@ -78,7 +78,7 @@ EnhancedDocument documentTableItem = documentTable.getItem(
7878
Number sampleSortvalue = documentTableItem.get("sample_sort_name", EnhancedType.of(Number.class));
7979

8080
// Accessing an attribute from document using specific getters.
81-
sampleSortvalue = documentTableItem.getSdkNumber("sample_sort_name");
81+
sampleSortvalue = documentTableItem.getNumber("sample_sort_name");
8282

8383
// Accessing an attribute of custom class using custom converters.
8484
CustomClass customClass = documentTableItem.get("custom_nested_map", new CustomAttributeConverter()));

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/DefaultAttributeConverterProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.OptionalLongAttributeConverter;
6262
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.PeriodAttributeConverter;
6363
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.SdkBytesAttributeConverter;
64+
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.SdkNumberAttributeConverter;
6465
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.SetAttributeConverter;
6566
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.ShortAttributeConverter;
6667
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.StringAttributeConverter;
@@ -247,7 +248,8 @@ private static Builder getDefaultBuilder() {
247248
.addConverter(UuidAttributeConverter.create())
248249
.addConverter(ZonedDateTimeAsStringAttributeConverter.create())
249250
.addConverter(ZoneIdAttributeConverter.create())
250-
.addConverter(ZoneOffsetAttributeConverter.create());
251+
.addConverter(ZoneOffsetAttributeConverter.create())
252+
.addConverter(SdkNumberAttributeConverter.create());
251253
}
252254

253255
/**

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/TableSchema.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import java.util.Map;
2121
import software.amazon.awssdk.annotations.SdkPublicApi;
2222
import software.amazon.awssdk.annotations.ThreadSafe;
23+
import software.amazon.awssdk.enhanced.dynamodb.document.EnhancedDocument;
2324
import software.amazon.awssdk.enhanced.dynamodb.mapper.BeanTableSchema;
25+
import software.amazon.awssdk.enhanced.dynamodb.mapper.DocumentTableSchema;
2426
import software.amazon.awssdk.enhanced.dynamodb.mapper.ImmutableTableSchema;
2527
import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema;
2628
import software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema;
@@ -84,6 +86,17 @@ static <T> BeanTableSchema<T> fromBean(Class<T> beanClass) {
8486
return BeanTableSchema.create(beanClass);
8587
}
8688

89+
90+
/**
91+
* Provides interfaces to interact with DynamoDB tables as {@link EnhancedDocument} where the complete Schema of the table
92+
* is not required.
93+
* @return A {@link DocumentTableSchema.Builder} for instantiating DocumentTableSchema.
94+
*
95+
*/
96+
static DocumentTableSchema.Builder documentSchemaBuilder(){
97+
return DocumentTableSchema.builder();
98+
}
99+
87100
/**
88101
* Scans an immutable class that has been annotated with DynamoDb immutable annotations and then returns a
89102
* {@link ImmutableTableSchema} implementation of this interface that can map records to and from items of that

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.java

Lines changed: 93 additions & 113 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute;
17+
18+
import java.math.BigInteger;
19+
import software.amazon.awssdk.annotations.Immutable;
20+
import software.amazon.awssdk.annotations.SdkInternalApi;
21+
import software.amazon.awssdk.annotations.ThreadSafe;
22+
import software.amazon.awssdk.core.SdkNumber;
23+
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
24+
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
25+
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
26+
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.TypeConvertingVisitor;
27+
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.SdkNumberStringConverter;
28+
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
29+
30+
/**
31+
* A converter between {@link SdkNumber} and {@link AttributeValue}.
32+
*
33+
* <p>
34+
* This stores values in DynamoDB as a number.
35+
*
36+
* <p>
37+
* This supports reading the full range of integers supported by DynamoDB. For smaller numbers, consider using
38+
* {@link ShortAttributeConverter}, {@link IntegerAttributeConverter} or {@link LongAttributeConverter}.
39+
*
40+
* This can be created via {@link #create()}.
41+
*/
42+
@SdkInternalApi
43+
@ThreadSafe
44+
@Immutable
45+
public final class SdkNumberAttributeConverter implements AttributeConverter<SdkNumber> {
46+
private static final Visitor VISITOR = new Visitor();
47+
private static final SdkNumberStringConverter STRING_CONVERTER = SdkNumberStringConverter.create();
48+
49+
private SdkNumberAttributeConverter() {
50+
}
51+
52+
public static SdkNumberAttributeConverter create() {
53+
return new SdkNumberAttributeConverter();
54+
}
55+
56+
@Override
57+
public EnhancedType<SdkNumber> type() {
58+
return EnhancedType.of(SdkNumber.class);
59+
}
60+
61+
@Override
62+
public AttributeValueType attributeValueType() {
63+
return AttributeValueType.N;
64+
}
65+
66+
@Override
67+
public AttributeValue transformFrom(SdkNumber input) {
68+
return AttributeValue.builder().n(STRING_CONVERTER.toString(input)).build();
69+
}
70+
71+
@Override
72+
public SdkNumber transformTo(AttributeValue input) {
73+
if (input.n() != null) {
74+
return EnhancedAttributeValue.fromNumber(input.n()).convert(VISITOR);
75+
}
76+
return EnhancedAttributeValue.fromAttributeValue(input).convert(VISITOR);
77+
}
78+
79+
private static final class Visitor extends TypeConvertingVisitor<SdkNumber> {
80+
private Visitor() {
81+
super(SdkNumber.class, SdkNumberAttributeConverter.class);
82+
}
83+
84+
@Override
85+
public SdkNumber convertString(String value) {
86+
return STRING_CONVERTER.fromString(value);
87+
}
88+
89+
@Override
90+
public SdkNumber convertNumber(String value) {
91+
return STRING_CONVERTER.fromString(value);
92+
}
93+
}
94+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.enhanced.dynamodb.internal.converter.string;
17+
18+
import java.math.BigInteger;
19+
import software.amazon.awssdk.annotations.Immutable;
20+
import software.amazon.awssdk.annotations.SdkInternalApi;
21+
import software.amazon.awssdk.annotations.ThreadSafe;
22+
import software.amazon.awssdk.core.SdkNumber;
23+
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
24+
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.StringConverter;
25+
26+
/**
27+
* A converter between {@link SdkNumber} and {@link String}.
28+
*
29+
* <p>
30+
* This converts values using {@link SdkNumber#toString()} and {@link SdkNumber#fromString(String)}}.
31+
*/
32+
@SdkInternalApi
33+
@ThreadSafe
34+
@Immutable
35+
public class SdkNumberStringConverter implements StringConverter<SdkNumber> {
36+
private SdkNumberStringConverter() {
37+
}
38+
39+
public static SdkNumberStringConverter create() {
40+
return new SdkNumberStringConverter();
41+
}
42+
43+
@Override
44+
public EnhancedType<SdkNumber> type() {
45+
return EnhancedType.of(SdkNumber.class);
46+
}
47+
48+
@Override
49+
public SdkNumber fromString(String string) {
50+
return SdkNumber.fromString(string);
51+
}
52+
}

0 commit comments

Comments
 (0)