Browse Source
Merge pull request #15620 from volodymyr-babak/fix-sum-overflow
Prevented integer overflow in calculated field SUM output
pull/15743/head
Viacheslav Klimov
4 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with
17 additions and
3 deletions
-
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java
-
application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java
-
common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
-
common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java
|
|
|
@ -85,7 +85,7 @@ public class SimpleCalculatedFieldState extends BaseCalculatedFieldState { |
|
|
|
return expressionResult; |
|
|
|
} |
|
|
|
if (decimals.equals(0)) { |
|
|
|
return TbUtils.toInt(expressionResult); |
|
|
|
return TbUtils.toLong(expressionResult); |
|
|
|
} |
|
|
|
return TbUtils.toFixed(expressionResult, decimals); |
|
|
|
} |
|
|
|
@ -96,6 +96,8 @@ public class SimpleCalculatedFieldState extends BaseCalculatedFieldState { |
|
|
|
ObjectNode valuesNode = JacksonUtil.newObjectNode(); |
|
|
|
if (result instanceof Double doubleValue) { |
|
|
|
valuesNode.put(outputName, doubleValue); |
|
|
|
} else if (result instanceof Long longValue) { |
|
|
|
valuesNode.put(outputName, longValue); |
|
|
|
} else if (result instanceof Integer integerValue) { |
|
|
|
valuesNode.put(outputName, integerValue); |
|
|
|
} else { |
|
|
|
|
|
|
|
@ -140,7 +140,7 @@ public class SimpleCalculatedFieldStateTest { |
|
|
|
Output output = getCalculatedFieldConfig().getOutput(); |
|
|
|
assertThat(result.getType()).isEqualTo(output.getType()); |
|
|
|
assertThat(result.getScope()).isEqualTo(output.getScope()); |
|
|
|
assertThat(result.getResult()).isEqualTo(JacksonUtil.valueToTree(Map.of("output", 49))); |
|
|
|
assertThat(result.getResult()).isEqualTo(JacksonUtil.valueToTree(Map.of("output", 49L))); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -170,7 +170,7 @@ public class SimpleCalculatedFieldStateTest { |
|
|
|
Output output = getCalculatedFieldConfig().getOutput(); |
|
|
|
assertThat(result.getType()).isEqualTo(output.getType()); |
|
|
|
assertThat(result.getScope()).isEqualTo(output.getScope()); |
|
|
|
assertThat(result.getResult()).isEqualTo(JacksonUtil.valueToTree(Map.of("output", 35))); |
|
|
|
assertThat(result.getResult()).isEqualTo(JacksonUtil.valueToTree(Map.of("output", 35L))); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
@ -1186,6 +1186,10 @@ public class TbUtils { |
|
|
|
return BigDecimal.valueOf(value).setScale(0, RoundingMode.HALF_UP).intValue(); |
|
|
|
} |
|
|
|
|
|
|
|
public static long toLong(double value) { |
|
|
|
return BigDecimal.valueOf(value).setScale(0, RoundingMode.HALF_UP).longValue(); |
|
|
|
} |
|
|
|
|
|
|
|
public static boolean isNaN(double value) { |
|
|
|
return Double.isNaN(value); |
|
|
|
} |
|
|
|
|
|
|
|
@ -1249,6 +1249,14 @@ public class TbUtilsTest { |
|
|
|
Assertions.assertEquals(28, TbUtils.toInt(28.0)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void toLong() { |
|
|
|
Assertions.assertEquals(1729L, TbUtils.toLong(doubleVal)); |
|
|
|
Assertions.assertEquals(13L, TbUtils.toLong(12.8)); |
|
|
|
Assertions.assertEquals(28L, TbUtils.toLong(28.0)); |
|
|
|
Assertions.assertEquals(3_980_173_734L, TbUtils.toLong(3_980_173_734.0)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void isNaN() { |
|
|
|
assertFalse(TbUtils.isNaN(doubleVal)); |
|
|
|
|