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
parent
commit
4180b83bb0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java
  2. 4
      application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java
  3. 4
      common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
  4. 8
      common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java

4
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.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 {

4
application/src/test/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldStateTest.java

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

4
common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java

@ -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);
}

8
common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java

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

Loading…
Cancel
Save