[ 
https://issues.apache.org/jira/browse/CAMEL-22038?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrea Cosentino reassigned CAMEL-22038:
----------------------------------------

    Assignee: Andrea Cosentino

> aws-ddb: float/doubles are being set as ddb attribute type=S while using 
> transformer - Ddb2JsonDataTypeTransformer
> ------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-22038
>                 URL: https://issues.apache.org/jira/browse/CAMEL-22038
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-aws, camel-aws2
>    Affects Versions: 4.4.5
>            Reporter: Kumar Gaurav
>            Assignee: Andrea Cosentino
>            Priority: Major
>
> We are using Ddb2JsonDataTypeTransformer   to serialize the json input to 
> DynamoDB AttributeValue Map for all the attributes before sending the payload 
> (to create an item in dynamodb table) to DynamoDB put operation. 
> My input payload: 
> {quote}{
>   "operation": "PutItem",
>   "item": {
>     "Id": "1340",
>     "FirstName": "ChrisFloat",
>     "LastName": "Kotner",
>         "FloatTest": 45.25
>   }
> }
> {quote}
>  
> Route sink endpoint: 
> {quote}.to(aws2Ddb("tablename"))
> {quote}
>  
> +*Issue:*+ 
> We are seeing the floating-point value in above Json which are being saved to 
> dynamodb as type=S instead of N. 
>  
> *Why this problem?* 
> When I debugged this class 
> {*}org.apache.camel.component.aws2.ddb.transform.Ddb2JsonDataTypeTransformer{*},
>   I found that there is no condition in method (which checks and matches data 
> types to attribute value types) for float/double data type. Hence, all 
> float/default values are getting defaulted back to type=S. 
> {quote} private static AttributeValue getAttributeValue(Object value) {
>         if (value == null)
> Unknown macro: \{             return 
> AttributeValue.builder().nul(true).build();         }
>         if (value instanceof String)
> Unknown macro: \{             return 
> AttributeValue.builder().s(value.toString()).build();         }
>         if (value instanceof Integer)
> Unknown macro: \{             return 
> AttributeValue.builder().n(value.toString()).build();         }
>         if (value instanceof Boolean)
> Unknown macro: \{             return AttributeValue.builder().bool((Boolean) 
> value).build();         }
>         if (value instanceof String[])
> Unknown macro: \{             return AttributeValue.builder().ss((String[]) 
> value).build();         }
>         if (value instanceof int[])
> Unknown macro: \{             return 
> AttributeValue.builder().ns(Stream.of((int[]) value).map(Object}
>         if (value instanceof List) {
>             List<?> values = (List<?>) value;
>             if (values.isEmpty())
> Unknown macro: \{                 return 
> AttributeValue.builder().ss().build();             }
> else if (values.get(0) instanceof Integer)
> Unknown macro: \{                 return 
> AttributeValue.builder().ns(values.stream().map(Object}
> else
> Unknown macro: \{                 return 
> AttributeValue.builder().ss(values.stream().map(Object}
>         }
>         if (value instanceof Map) {
>             Map<String, AttributeValue> nestedAttributes = new 
> LinkedHashMap<>();
>             for (Map.Entry<?, ?> nested : ((Map<?, ?>) value).entrySet())
> Unknown macro: \{                 
> nestedAttributes.put(nested.getKey().toString(), 
> getAttributeValue(nested.getValue()));             }
>             return AttributeValue.builder().m(nestedAttributes).build();
>         }
>         *return AttributeValue.builder().s(value.toString()).build();*
>     }
> {quote}
> So - the current code in this class as below should have an if condition to 
> match the data type to float/double and set the attribute type for such 
> values as N: 
>   *if (value instanceof Double) {*
>            *return AttributeValue.builder().n(value.toString()).build();*
>         *}*
> The fix should be included is as follows: 
> {quote} private static AttributeValue getAttributeValue(Object value) {
>         if (value == null)
> Unknown macro: \{             return 
> AttributeValue.builder().nul(true).build();         }
>         if (value instanceof String)
> Unknown macro: \{             return 
> AttributeValue.builder().s(value.toString()).build();         }
>         if (value instanceof Integer)
> Unknown macro: \{             return 
> AttributeValue.builder().n(value.toString()).build();         }
>         *if (value instanceof Double) {*
>            *return AttributeValue.builder().n(value.toString()).build();*
>         *}*
>         if (value instanceof Boolean)
> Unknown macro: \{             return AttributeValue.builder().n((Boolean) 
> value).build();         }
>         if (value instanceof String[])
> Unknown macro: \{             return AttributeValue.builder().ss((String[]) 
> value).build();         }
>         if (value instanceof int[])
> Unknown macro: \{             return 
> AttributeValue.builder().ns(Stream.of((int[]) value).map(Object}
>         if (value instanceof List) {
>             List<?> values = (List<?>) value;
>             if (values.isEmpty())
> Unknown macro: \{                 return 
> AttributeValue.builder().ss().build();             }
> else if (values.get(0) instanceof Integer)
> Unknown macro: \{                 return 
> AttributeValue.builder().ns(values.stream().map(Object}
> else
> Unknown macro: \{                 return 
> AttributeValue.builder().ss(values.stream().map(Object}
>         }
>         if (value instanceof Map) {
>             Map<String, AttributeValue> nestedAttributes = new 
> LinkedHashMap<>();
>             for (Map.Entry<?, ?> nested : ((Map<?, ?>) value).entrySet())
> Unknown macro: \{                 
> nestedAttributes.put(nested.getKey().toString(), 
> getAttributeValue(nested.getValue()));             }
>             return AttributeValue.builder().m(nestedAttributes).build();
>         }
>         return AttributeValue.builder().s(value.toString()).build();
>     }
> {quote}
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to