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 bbb072049d..336985e0e9 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 @@ -41,6 +41,8 @@ import java.util.stream.Collectors; @Getter public abstract class BaseCalculatedFieldState implements CalculatedFieldState, Closeable { + protected static final long DEFAULT_LAST_UPDATE_TS = -1L; + protected final EntityId entityId; protected CalculatedFieldCtx ctx; protected TbActorRef actorCtx; @@ -48,7 +50,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, protected Map arguments = new HashMap<>(); protected boolean sizeExceedsLimit; - protected long latestTimestamp = -1; + protected long latestTimestamp = DEFAULT_LAST_UPDATE_TS; protected ReadinessStatus readinessStatus; @Setter @@ -119,7 +121,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, requiredArguments = null; arguments.clear(); sizeExceedsLimit = false; - latestTimestamp = -1; + latestTimestamp = DEFAULT_LAST_UPDATE_TS; } @Override @@ -147,7 +149,7 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, return valuesNode; } long latestTs = getLatestTimestamp(); - if (latestTs == -1) { + if (latestTs == DEFAULT_LAST_UPDATE_TS) { return valuesNode; } ObjectNode resultNode = JacksonUtil.newObjectNode(); @@ -165,12 +167,12 @@ public abstract class BaseCalculatedFieldState implements CalculatedFieldState, newTs = (lastEntry != null) ? lastEntry.getKey() : System.currentTimeMillis(); } else if (entry instanceof RelatedEntitiesArgumentEntry relatedEntitiesArgumentEntry) { newTs = relatedEntitiesArgumentEntry.getEntityInputs().values().stream() - .mapToLong(e -> (e instanceof SingleValueArgumentEntry s) ? s.getTs() : 0L) + .mapToLong(e -> (e instanceof SingleValueArgumentEntry s) ? s.getTs() : DEFAULT_LAST_UPDATE_TS) .max() - .orElse(0L); + .orElse(DEFAULT_LAST_UPDATE_TS); } else if (entry instanceof GeofencingArgumentEntry geofencingArgumentEntry) { newTs = geofencingArgumentEntry.getZoneStates().values().stream() - .mapToLong(GeofencingZoneState::getTs).max().orElse(0L); + .mapToLong(GeofencingZoneState::getTs).max().orElse(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/CalculatedFieldCtx.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java index f04f3b109a..d2002c707b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/CalculatedFieldCtx.java @@ -79,10 +79,14 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static org.thingsboard.server.service.cf.ctx.state.BaseCalculatedFieldState.DEFAULT_LAST_UPDATE_TS; + @Data @Slf4j public class CalculatedFieldCtx implements Closeable { + private static final long SCHEDULED_UPDATE_DISABLED_VALUE = -1L; + private CalculatedField calculatedField; private CalculatedFieldId cfId; @@ -197,7 +201,7 @@ public class CalculatedFieldCtx implements Closeable { } } if (calculatedField.getConfiguration() instanceof ScheduledUpdateSupportedCalculatedFieldConfiguration scheduledConfig) { - this.scheduledUpdateIntervalMillis = scheduledConfig.isScheduledUpdateEnabled() ? TimeUnit.SECONDS.toMillis(scheduledConfig.getScheduledUpdateInterval()) : -1L; + this.scheduledUpdateIntervalMillis = scheduledConfig.isScheduledUpdateEnabled() ? TimeUnit.SECONDS.toMillis(scheduledConfig.getScheduledUpdateInterval()) : SCHEDULED_UPDATE_DISABLED_VALUE; } if (calculatedField.getConfiguration() instanceof RelatedEntitiesAggregationCalculatedFieldConfiguration aggConfig) { this.useLatestTs = aggConfig.isUseLatestTs(); @@ -715,8 +719,8 @@ public class CalculatedFieldCtx implements Closeable { return false; } - private boolean isScheduledUpdateEnabled() { - return scheduledUpdateIntervalMillis != -1; + private boolean isScheduledUpdateDisabled() { + return scheduledUpdateIntervalMillis == SCHEDULED_UPDATE_DISABLED_VALUE; } public boolean shouldFetchRelationQueryDynamicArgumentsFromDb(CalculatedFieldState state) { @@ -726,11 +730,11 @@ public class CalculatedFieldCtx implements Closeable { return switch (cfType) { case PROPAGATION -> true; case GEOFENCING -> { - if (!isScheduledUpdateEnabled()) { + if (isScheduledUpdateDisabled()) { yield false; } var geofencingState = (GeofencingCalculatedFieldState) state; - if (geofencingState.getLastDynamicArgumentsRefreshTs() == -1L) { + if (geofencingState.getLastDynamicArgumentsRefreshTs() == DEFAULT_LAST_UPDATE_TS) { yield true; } yield geofencingState.getLastDynamicArgumentsRefreshTs() < @@ -744,10 +748,10 @@ public class CalculatedFieldCtx implements Closeable { if (!(state instanceof RelatedEntitiesAggregationCalculatedFieldState relatedEntitiesAggState)) { return false; } - if (!isScheduledUpdateEnabled()) { + if (isScheduledUpdateDisabled()) { return false; } - if (relatedEntitiesAggState.getLastRelatedEntitiesRefreshTs() == -1L) { + if (relatedEntitiesAggState.getLastRelatedEntitiesRefreshTs() == DEFAULT_LAST_UPDATE_TS) { return true; } return relatedEntitiesAggState.getLastRelatedEntitiesRefreshTs() < System.currentTimeMillis() - scheduledUpdateIntervalMillis; 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 d8e4fcf5d4..97916192b5 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 @@ -19,7 +19,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.core.type.TypeReference; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; import org.springframework.lang.Nullable; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.script.api.tbel.TbelCfArg; @@ -34,11 +33,14 @@ 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; + @Nullable protected EntityId entityId; @@ -48,7 +50,10 @@ public class SingleValueArgumentEntry implements ArgumentEntry { protected boolean forceResetPrevious; - public static final Long DEFAULT_VERSION = -1L; + public SingleValueArgumentEntry() { + this.ts = DEFAULT_LAST_UPDATE_TS; + this.version = DEFAULT_VERSION; + } public SingleValueArgumentEntry(EntityId entityId, ArgumentEntry entry) { this(entry); diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java index 264f651eb0..cdc256148c 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/aggregation/RelatedEntitiesAggregationCalculatedFieldState.java @@ -57,12 +57,12 @@ import static java.util.concurrent.TimeUnit.SECONDS; public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculatedFieldState { @Setter - private long lastArgsRefreshTs = -1; + private long lastArgsRefreshTs = DEFAULT_LAST_UPDATE_TS; @Setter - private long lastMetricsEvalTs = -1; + private long lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; @Setter - private long lastRelatedEntitiesRefreshTs = -1; - private long deduplicationIntervalMs = -1; + private long lastRelatedEntitiesRefreshTs = DEFAULT_LAST_UPDATE_TS; + private long deduplicationIntervalMs = DEFAULT_LAST_UPDATE_TS; private Map metrics; private ScheduledFuture reevaluationFuture; @@ -102,9 +102,9 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat @Override public void reset() { // must reset everything dependent on arguments super.reset(); - lastArgsRefreshTs = -1; - lastMetricsEvalTs = -1; - lastRelatedEntitiesRefreshTs = -1; + lastArgsRefreshTs = DEFAULT_LAST_UPDATE_TS; + lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; + lastRelatedEntitiesRefreshTs = DEFAULT_LAST_UPDATE_TS; metrics = null; } @@ -153,7 +153,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat } public Map updateEntityData(Map fetchedArgs) { - lastMetricsEvalTs = -1; + lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; return update(fetchedArgs, ctx); } @@ -162,7 +162,7 @@ public class RelatedEntitiesAggregationCalculatedFieldState extends BaseCalculat RelatedEntitiesArgumentEntry aggEntry = (RelatedEntitiesArgumentEntry) argEntry; aggEntry.getEntityInputs().remove(relatedEntityId); }); - lastMetricsEvalTs = -1; + lastMetricsEvalTs = DEFAULT_LAST_UPDATE_TS; lastArgsRefreshTs = System.currentTimeMillis(); } diff --git a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java index a9e8eb5731..ea47dafa59 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/ctx/state/geofencing/GeofencingCalculatedFieldState.java @@ -58,7 +58,7 @@ import static org.thingsboard.server.common.data.cf.configuration.geofencing.Geo @EqualsAndHashCode(callSuper = true) public class GeofencingCalculatedFieldState extends BaseCalculatedFieldState { - private long lastDynamicArgumentsRefreshTs = -1; + private long lastDynamicArgumentsRefreshTs = DEFAULT_LAST_UPDATE_TS; public GeofencingCalculatedFieldState(EntityId entityId) { super(entityId); @@ -147,7 +147,7 @@ public class GeofencingCalculatedFieldState extends BaseCalculatedFieldState { @Override public void reset() { super.reset(); - lastDynamicArgumentsRefreshTs = -1; + lastDynamicArgumentsRefreshTs = DEFAULT_LAST_UPDATE_TS; } public void updateLastDynamicArgumentsRefreshTs() {