Skip to content

Commit 0fec71c

Browse files
committed
Add core implementation for List<Integer> support
- Added NUMBER_LIST mapping strategy to FieldInfo.MappingStrategy enum - Updated TypeAnalyzer to detect numeric element types in lists - Implemented serialization and deserialization in FieldMappingCodeGenerator
1 parent a1b84d4 commit 0fec71c

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

src/main/java/com/github/wassertim/dynamodb/toolkit/analysis/FieldInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public enum MappingStrategy {
7272
INSTANT, // Instant timestamp mapping
7373
ENUM, // Enum name mapping
7474
STRING_LIST, // List<String> mapping
75+
NUMBER_LIST, // List<Integer>, List<Double>, etc. mapping
7576
NESTED_NUMBER_LIST, // List<List<Double>> mapping for coordinates
7677
COMPLEX_OBJECT, // Nested object requiring mapper
7778
COMPLEX_LIST, // List<ComplexObject> requiring mapper

src/main/java/com/github/wassertim/dynamodb/toolkit/analysis/TypeAnalyzer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,11 @@ private FieldInfo.MappingStrategy determineMappingStrategy(TypeMirror fieldType)
119119
if (isListType(fieldType)) {
120120
TypeMirror elementType = getListElementType(fieldType);
121121
if (elementType != null) {
122-
String elementTypeName = elementType.toString();
122+
String elementTypeName = getCleanTypeName(elementType);
123123
if (isStringType(elementTypeName)) {
124124
return FieldInfo.MappingStrategy.STRING_LIST;
125+
} else if (isNumberType(elementTypeName) || isNumericPrimitive(elementType)) {
126+
return FieldInfo.MappingStrategy.NUMBER_LIST;
125127
} else if (isNestedNumberList(elementType)) {
126128
return FieldInfo.MappingStrategy.NESTED_NUMBER_LIST;
127129
} else if (hasDynamoMappableAnnotation(elementType)) {

src/main/java/com/github/wassertim/dynamodb/toolkit/mapping/FieldMappingCodeGenerator.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public CodeBlock generateToAttributeValueMapping(FieldInfo field, String objectN
3838
case INSTANT -> generateInstantMapping(fieldName, getterCall);
3939
case ENUM -> generateEnumMapping(fieldName, getterCall);
4040
case STRING_LIST -> generateStringListMapping(fieldName, getterCall);
41+
case NUMBER_LIST -> generateNumberListMapping(fieldName, getterCall);
4142
case NESTED_NUMBER_LIST -> generateNestedNumberListMapping(fieldName, getterCall);
4243
case COMPLEX_OBJECT -> generateComplexObjectMapping(field, fieldName, getterCall);
4344
case COMPLEX_LIST -> generateComplexListMapping(field, fieldName, getterCall);
@@ -118,6 +119,21 @@ private CodeBlock generateStringListMapping(String fieldName, String getterCall)
118119
.build();
119120
}
120121

122+
private CodeBlock generateNumberListMapping(String fieldName, String getterCall) {
123+
ClassName attributeValue = ClassName.get(AttributeValue.class);
124+
ClassName list = ClassName.get(List.class);
125+
ClassName collectors = ClassName.get(Collectors.class);
126+
127+
return CodeBlock.builder()
128+
.beginControlFlow("if ($L)", utils.createNullCheck(getterCall))
129+
.add("$T<$T> $LList = $L.stream()\n", list, attributeValue, fieldName, getterCall)
130+
.add(" .map(val -> $T.builder().n($T.valueOf(val)).build())\n", attributeValue, String.class)
131+
.addStatement(" .collect($T.toList())", collectors)
132+
.addStatement("$L", utils.createAttributePut(fieldName, utils.createListAttribute(fieldName + "List")))
133+
.endControlFlow()
134+
.build();
135+
}
136+
121137
private CodeBlock generateNestedNumberListMapping(String fieldName, String getterCall) {
122138
ClassName attributeValue = ClassName.get(AttributeValue.class);
123139
ClassName list = ClassName.get(List.class);
@@ -193,6 +209,7 @@ public CodeBlock generateFromAttributeValueMapping(FieldInfo field) {
193209
case INSTANT -> generateInstantDeserialization(fieldName);
194210
case ENUM -> generateEnumDeserialization(field, fieldName);
195211
case STRING_LIST -> generateStringListDeserialization(fieldName);
212+
case NUMBER_LIST -> generateNumberListDeserialization(field, fieldName);
196213
case NESTED_NUMBER_LIST -> generateNestedNumberListDeserialization(fieldName);
197214
case COMPLEX_OBJECT -> generateComplexObjectDeserialization(field, fieldName);
198215
case COMPLEX_LIST -> generateComplexListDeserialization(field, fieldName);
@@ -280,6 +297,30 @@ private CodeBlock generateStringListDeserialization(String fieldName) {
280297
.build();
281298
}
282299

300+
private CodeBlock generateNumberListDeserialization(FieldInfo field, String fieldName) {
301+
ClassName mappingUtils = ClassName.get("com.github.wassertim.dynamodb.runtime", "MappingUtils");
302+
ClassName attributeValue = ClassName.get(AttributeValue.class);
303+
ClassName list = ClassName.get(List.class);
304+
ClassName objects = ClassName.get(Objects.class);
305+
ClassName collectors = ClassName.get(Collectors.class);
306+
307+
// Determine the element type from the field
308+
String elementTypeQualified = utils.extractListElementQualifiedType(field);
309+
String numericMethod = utils.getNumericMethodForType(elementTypeQualified);
310+
String javaType = utils.getJavaTypeForNumeric(elementTypeQualified);
311+
312+
return CodeBlock.builder()
313+
.addStatement("$T<$T> listValue = $T.getListSafely($LAttr)", list, attributeValue, mappingUtils, fieldName)
314+
.beginControlFlow("if (listValue != null)")
315+
.add("$T<$L> $LList = listValue.stream()\n", list, javaType, fieldName)
316+
.add(" .map($T::$L)\n", mappingUtils, numericMethod)
317+
.add(" .filter($T::nonNull)\n", objects)
318+
.addStatement(" .collect($T.toList())", collectors)
319+
.addStatement("builder.$L($LList)", fieldName, fieldName)
320+
.endControlFlow()
321+
.build();
322+
}
323+
283324
private CodeBlock generateNestedNumberListDeserialization(String fieldName) {
284325
ClassName mappingUtils = ClassName.get("com.github.wassertim.dynamodb.runtime", "MappingUtils");
285326
ClassName attributeValue = ClassName.get(AttributeValue.class);

0 commit comments

Comments
 (0)