Commit b59c846885764bded676deab7949365728ad74c4

Authored by Andrii Shvaika
1 parent 4ec25bee

Improvements to data converter

@@ -226,19 +226,29 @@ public class JsonConverter { @@ -226,19 +226,29 @@ public class JsonConverter {
226 } 226 }
227 227
228 private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) { 228 private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) {
229 - if (value.getAsString().contains(".")) {  
230 - return KeyValueProto.newBuilder()  
231 - .setKey(key)  
232 - .setType(KeyValueType.DOUBLE_V)  
233 - .setDoubleV(value.getAsDouble())  
234 - .build(); 229 + String valueAsString = value.getAsString();
  230 + KeyValueProto.Builder builder = KeyValueProto.newBuilder().setKey(key);
  231 + if (valueAsString.contains("e") || valueAsString.contains("E")) {
  232 + //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
  233 + var bd = new BigDecimal(valueAsString);
  234 + if (bd.stripTrailingZeros().scale() <= 0) {
  235 + try {
  236 + return builder.setType(KeyValueType.LONG_V).setLongV(bd.longValueExact()).build();
  237 + } catch (ArithmeticException e) {
  238 + return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
  239 + }
  240 + } else {
  241 + return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
  242 + }
  243 + } else if (valueAsString.contains(".")) {
  244 + return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(value.getAsDouble()).build();
235 } else { 245 } else {
236 try { 246 try {
237 long longValue = Long.parseLong(value.getAsString()); 247 long longValue = Long.parseLong(value.getAsString());
238 - return KeyValueProto.newBuilder().setKey(key).setType(KeyValueType.LONG_V)  
239 - .setLongV(longValue).build(); 248 + return builder.setType(KeyValueType.LONG_V).setLongV(longValue).build();
240 } catch (NumberFormatException e) { 249 } catch (NumberFormatException e) {
241 - throw new JsonSyntaxException("Big integer values are not supported!"); 250 + //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
  251 + return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(new BigDecimal(valueAsString).doubleValue()).build();
242 } 252 }
243 } 253 }
244 } 254 }
@@ -252,6 +262,7 @@ public class JsonConverter { @@ -252,6 +262,7 @@ public class JsonConverter {
252 String valueAsString = value.getAsString(); 262 String valueAsString = value.getAsString();
253 String key = valueEntry.getKey(); 263 String key = valueEntry.getKey();
254 if (valueAsString.contains("e") || valueAsString.contains("E")) { 264 if (valueAsString.contains("e") || valueAsString.contains("E")) {
  265 + //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
255 var bd = new BigDecimal(valueAsString); 266 var bd = new BigDecimal(valueAsString);
256 if (bd.stripTrailingZeros().scale() <= 0) { 267 if (bd.stripTrailingZeros().scale() <= 0) {
257 try { 268 try {
@@ -269,7 +280,8 @@ public class JsonConverter { @@ -269,7 +280,8 @@ public class JsonConverter {
269 long longValue = Long.parseLong(value.getAsString()); 280 long longValue = Long.parseLong(value.getAsString());
270 result.add(new LongDataEntry(key, longValue)); 281 result.add(new LongDataEntry(key, longValue));
271 } catch (NumberFormatException e) { 282 } catch (NumberFormatException e) {
272 - throw new JsonSyntaxException("Big integer values are not supported!"); 283 + //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
  284 + result.add(new DoubleDataEntry(key, new BigDecimal(valueAsString).doubleValue()));
273 } 285 }
274 } 286 }
275 } 287 }
@@ -21,6 +21,8 @@ import org.junit.runner.RunWith; @@ -21,6 +21,8 @@ import org.junit.runner.RunWith;
21 import org.mockito.junit.MockitoJUnitRunner; 21 import org.mockito.junit.MockitoJUnitRunner;
22 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 22 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
23 23
  24 +import java.util.ArrayList;
  25 +
24 @RunWith(MockitoJUnitRunner.class) 26 @RunWith(MockitoJUnitRunner.class)
25 public class JsonConverterTest { 27 public class JsonConverterTest {
26 28
@@ -39,6 +41,12 @@ public class JsonConverterTest { @@ -39,6 +41,12 @@ public class JsonConverterTest {
39 } 41 }
40 42
41 @Test 43 @Test
  44 + public void testParseAttributesBigDecimalAsLong() {
  45 + var result = new ArrayList<>(JsonConverter.convertToAttributes(JSON_PARSER.parse("{\"meterReadingDelta\": 1E1}")));
  46 + Assert.assertEquals(10L, result.get(0).getLongValue().get().longValue());
  47 + }
  48 +
  49 + @Test
42 public void testParseAsDouble() { 50 public void testParseAsDouble() {
43 var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L); 51 var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L);
44 Assert.assertEquals(1.1, result.get(0L).get(0).getDoubleValue().get(), 0.0); 52 Assert.assertEquals(1.1, result.get(0L).get(0).getDoubleValue().get(), 0.0);