Improvements to data converter

This commit is contained in:
Andrii Shvaika 2021-05-12 18:38:12 +03:00
parent 4ec25beeb3
commit b59c846885
2 changed files with 30 additions and 10 deletions

View File

@ -226,19 +226,29 @@ public class JsonConverter {
} }
private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) { private static KeyValueProto buildNumericKeyValueProto(JsonPrimitive value, String key) {
if (value.getAsString().contains(".")) { String valueAsString = value.getAsString();
return KeyValueProto.newBuilder() KeyValueProto.Builder builder = KeyValueProto.newBuilder().setKey(key);
.setKey(key) if (valueAsString.contains("e") || valueAsString.contains("E")) {
.setType(KeyValueType.DOUBLE_V) //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
.setDoubleV(value.getAsDouble()) var bd = new BigDecimal(valueAsString);
.build(); if (bd.stripTrailingZeros().scale() <= 0) {
try {
return builder.setType(KeyValueType.LONG_V).setLongV(bd.longValueExact()).build();
} catch (ArithmeticException e) {
return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
}
} else {
return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(bd.doubleValue()).build();
}
} else if (valueAsString.contains(".")) {
return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(value.getAsDouble()).build();
} else { } else {
try { try {
long longValue = Long.parseLong(value.getAsString()); long longValue = Long.parseLong(value.getAsString());
return KeyValueProto.newBuilder().setKey(key).setType(KeyValueType.LONG_V) return builder.setType(KeyValueType.LONG_V).setLongV(longValue).build();
.setLongV(longValue).build();
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throw new JsonSyntaxException("Big integer values are not supported!"); //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
return builder.setType(KeyValueType.DOUBLE_V).setDoubleV(new BigDecimal(valueAsString).doubleValue()).build();
} }
} }
} }
@ -252,6 +262,7 @@ public class JsonConverter {
String valueAsString = value.getAsString(); String valueAsString = value.getAsString();
String key = valueEntry.getKey(); String key = valueEntry.getKey();
if (valueAsString.contains("e") || valueAsString.contains("E")) { if (valueAsString.contains("e") || valueAsString.contains("E")) {
//TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
var bd = new BigDecimal(valueAsString); var bd = new BigDecimal(valueAsString);
if (bd.stripTrailingZeros().scale() <= 0) { if (bd.stripTrailingZeros().scale() <= 0) {
try { try {
@ -269,7 +280,8 @@ public class JsonConverter {
long longValue = Long.parseLong(value.getAsString()); long longValue = Long.parseLong(value.getAsString());
result.add(new LongDataEntry(key, longValue)); result.add(new LongDataEntry(key, longValue));
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throw new JsonSyntaxException("Big integer values are not supported!"); //TODO: correct value conversion. We should make sure that if the value can't fit into Long or Double, we should send String
result.add(new DoubleDataEntry(key, new BigDecimal(valueAsString).doubleValue()));
} }
} }
} }

View File

@ -21,6 +21,8 @@ import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.server.common.transport.adaptor.JsonConverter; import org.thingsboard.server.common.transport.adaptor.JsonConverter;
import java.util.ArrayList;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class JsonConverterTest { public class JsonConverterTest {
@ -38,6 +40,12 @@ public class JsonConverterTest {
Assert.assertEquals(10.1, result.get(0L).get(0).getDoubleValue().get(), 0.0); Assert.assertEquals(10.1, result.get(0L).get(0).getDoubleValue().get(), 0.0);
} }
@Test
public void testParseAttributesBigDecimalAsLong() {
var result = new ArrayList<>(JsonConverter.convertToAttributes(JSON_PARSER.parse("{\"meterReadingDelta\": 1E1}")));
Assert.assertEquals(10L, result.get(0).getLongValue().get().longValue());
}
@Test @Test
public void testParseAsDouble() { public void testParseAsDouble() {
var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L); var result = JsonConverter.convertToTelemetry(JSON_PARSER.parse("{\"meterReadingDelta\": 1.1}"), 0L);