@@ -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