diff --git a/application/src/main/data/upgrade/basic/schema_update.sql b/application/src/main/data/upgrade/basic/schema_update.sql index 565ac50afd..a7909a358a 100644 --- a/application/src/main/data/upgrade/basic/schema_update.sql +++ b/application/src/main/data/upgrade/basic/schema_update.sql @@ -70,7 +70,7 @@ ALTER TABLE calculated_field ADD CONSTRAINT calculated_field_unq_key UNIQUE (ent -- CALCULATED FIELD UNIQUE CONSTRAINT UPDATE END --- CALCULATED FIELD OUTPUT STRATEGY UPGRADE START +-- CALCULATED FIELD OUTPUT STRATEGY UPDATE START UPDATE calculated_field SET configuration = jsonb_set( @@ -91,4 +91,4 @@ SET configuration = jsonb_set( ) WHERE (configuration::jsonb -> 'output' -> 'strategy') IS NULL; --- CALCULATED FIELD OUTPUT STRATEGY UPGRADE END +-- CALCULATED FIELD OUTPUT STRATEGY UPDATE END diff --git a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java index 5ecbeeb496..8cec758f5b 100644 --- a/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldProcessingService.java @@ -398,6 +398,10 @@ public abstract class AbstractCalculatedFieldProcessingService { DonAsynchron.withCallback(findFuture, existingAttributes -> { List changed = filterChangedAttr(existingAttributes, newAttributes); + if (changed.isEmpty()) { + future.set(null); + return; + } saveAttributesInternal(tenantId, entityId, cfResult, cfIds, changed, strategy, future); }, future::setException, @@ -429,7 +433,8 @@ public abstract class AbstractCalculatedFieldProcessingService { JsonElement jsonResult = JsonParser.parseString(Objects.requireNonNull(cfResult.stringValue())); Map> tsKvMap = JsonConverter.convertToTelemetry(jsonResult, ts); if (tsKvMap.isEmpty()) { - future.setFuture(Futures.immediateFuture(null)); + future.set(null); + return; } List tsEntries = toTsKvEntryList(tsKvMap); TimeseriesSaveRequest.Strategy strategy = new TimeseriesSaveRequest.Strategy(outputStrategy.isSaveTimeSeries(), outputStrategy.isSaveLatest(), outputStrategy.isSendWsUpdate(), outputStrategy.isProcessCfs());