From 8538b7cc022feb0029dc8b35c0adeec5aa5a3b8f Mon Sep 17 00:00:00 2001 From: dshvaika Date: Wed, 8 Jul 2026 17:48:12 +0300 Subject: [PATCH] Fix ENTITY_AGGREGATION CF storing numeric results as strings EntityAggregationCalculatedFieldState.toResult() serialized every metric result via ObjectNode.put(name, JacksonUtil.toString(value)), which produces a JSON *string* node even for numeric aggregation results (SUM/AVG/COUNT/...). When persisted (in particular with transport.json.type_cast_enabled=false, or for non-parsable values) the result lands in ts_kv.str_v, so server-side AVG/SUM aggregation returns no data in widgets/queries while COUNT/MIN/MAX still return. Serialize with JacksonUtil.valueToTree(...) so numeric results are emitted as numeric JSON nodes (-> dbl_v/long_v), mirroring RelatedEntitiesAggregationCalculatedFieldState. Genuine string MIN/MAX results over string telemetry are preserved as string nodes. The instanceof Number guard is retained (it only governs rounding). --- .../single/EntityAggregationCalculatedFieldState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java index c945868576..f50bc602ce 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/single/EntityAggregationCalculatedFieldState.java @@ -293,7 +293,7 @@ public class EntityAggregationCalculatedFieldState extends BaseCalculatedFieldSt Object resultValue = argumentEntry.getValue() instanceof Number number ? NumberUtils.roundResult(number.doubleValue(), precision) : argumentEntry.getValue(); - metricsNode.put(metricName, JacksonUtil.toString(resultValue)); + metricsNode.set(metricName, JacksonUtil.valueToTree(resultValue)); } } if (!metricsNode.isEmpty()) {