From fbd5fd9c719f7289c29c8d689ba04e23d3d7066c Mon Sep 17 00:00:00 2001 From: dshvaika Date: Thu, 4 Dec 2025 12:14:57 +0200 Subject: [PATCH 1/2] fixed last update ts handling for lts --- .../service/cf/ctx/state/BaseCalculatedFieldState.java | 8 +++++--- .../service/cf/ctx/state/SingleValueArgumentEntry.java | 10 +++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java index e21d56b6d2..94a18256a3 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/BaseCalculatedFieldState.java @@ -31,11 +31,13 @@ import static org.thingsboard.server.utils.CalculatedFieldUtils.toSingleValueArg @AllArgsConstructor public abstract class BaseCalculatedFieldState implements CalculatedFieldState { + static final long DEFAULT_LAST_UPDATE_TS = -1L; + protected List requiredArguments; protected Map arguments; protected boolean sizeExceedsLimit; - protected long latestTimestamp = -1; + protected long latestTimestamp = DEFAULT_LAST_UPDATE_TS; public BaseCalculatedFieldState(List requiredArguments) { this.requiredArguments = requiredArguments; @@ -43,7 +45,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState { } public BaseCalculatedFieldState() { - this(new ArrayList<>(), new HashMap<>(), false, -1); + this(new ArrayList<>(), new HashMap<>(), false, DEFAULT_LAST_UPDATE_TS); } @Override @@ -115,7 +117,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState { newTs = singleValueArgumentEntry.getTs(); } else if (entry instanceof TsRollingArgumentEntry tsRollingArgumentEntry) { Map.Entry lastEntry = tsRollingArgumentEntry.getTsRecords().lastEntry(); - newTs = (lastEntry != null) ? lastEntry.getKey() : System.currentTimeMillis(); + newTs = (lastEntry != null) ? lastEntry.getKey() : DEFAULT_LAST_UPDATE_TS; } this.latestTimestamp = Math.max(this.latestTimestamp, newTs); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java index 1ceea2c621..0997fd6cbb 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SingleValueArgumentEntry.java @@ -32,17 +32,25 @@ import org.thingsboard.server.common.util.ProtoUtils; import org.thingsboard.server.gen.transport.TransportProtos.AttributeValueProto; import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; +import static org.thingsboard.server.service.cf.ctx.state.BaseCalculatedFieldState.DEFAULT_LAST_UPDATE_TS; + @Data -@NoArgsConstructor @AllArgsConstructor public class SingleValueArgumentEntry implements ArgumentEntry { + public static final Long DEFAULT_VERSION = -1L; + private long ts; private BasicKvEntry kvEntryValue; private Long version; private boolean forceResetPrevious; + public SingleValueArgumentEntry() { + this.ts = DEFAULT_LAST_UPDATE_TS; + this.version = DEFAULT_VERSION; + } + public SingleValueArgumentEntry(TsKvProto entry) { this.ts = entry.getTs(); if (entry.hasVersion()) { From 1ae4fd05b46505a7be3d032ac6fb36511a0dd8b3 Mon Sep 17 00:00:00 2001 From: dshvaika Date: Thu, 4 Dec 2025 12:19:56 +0200 Subject: [PATCH 2/2] Updated SimpleCalculatedFieldState to use constant instead of raw value --- .../server/service/cf/ctx/state/SimpleCalculatedFieldState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java index 577ff80219..80f5964582 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/SimpleCalculatedFieldState.java @@ -100,7 +100,7 @@ public class SimpleCalculatedFieldState extends BaseCalculatedFieldState { } long latestTs = getLatestTimestamp(); - if (useLatestTs && latestTs != -1) { + if (useLatestTs && latestTs != DEFAULT_LAST_UPDATE_TS) { ObjectNode resultNode = JacksonUtil.newObjectNode(); resultNode.put("ts", latestTs); resultNode.set("values", valuesNode);