diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/cf/DefaultTbCalculatedFieldService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/cf/DefaultTbCalculatedFieldService.java
index 2fe1f65015..4c83fcf7b5 100644
--- a/application/src/main/java/org/thingsboard/server/service/entitiy/cf/DefaultTbCalculatedFieldService.java
+++ b/application/src/main/java/org/thingsboard/server/service/entitiy/cf/DefaultTbCalculatedFieldService.java
@@ -1,12 +1,12 @@
/**
* Copyright © 2016-2024 The Thingsboard Authors
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -128,10 +128,17 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
}
@Override
- public void onCalculatedFieldAdded(TransportProtos.CalculatedFieldAddMsgProto proto, TbCallback callback) {
+ public void onCalculatedFieldMsg(TransportProtos.CalculatedFieldMsgProto proto, TbCallback callback) {
try {
TenantId tenantId = TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB()));
CalculatedFieldId calculatedFieldId = new CalculatedFieldId(new UUID(proto.getCalculatedFieldIdMSB(), proto.getCalculatedFieldIdLSB()));
+ if (proto.getDeleted()) {
+ onCalculatedFieldDelete(calculatedFieldId, callback);
+ callback.onSuccess();
+ }
+ if (proto.getUpdated()) {
+ onCalculatedFieldDelete(calculatedFieldId, callback);
+ }
CalculatedField cf = calculatedFieldService.findById(tenantId, calculatedFieldId);
List links = calculatedFieldService.findAllCalculatedFieldLinksById(tenantId, calculatedFieldId);
if (cf != null) {
@@ -163,30 +170,6 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
}
}
- @Override
- public void onCalculatedFieldUpdated(TransportProtos.CalculatedFieldUpdateMsgProto proto, TbCallback callback) {
- try {
- TenantId tenantId = TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB()));
- CalculatedFieldId calculatedFieldId = new CalculatedFieldId(new UUID(proto.getCalculatedFieldIdMSB(), proto.getCalculatedFieldIdLSB()));
- } catch (Exception e) {
- log.trace("Failed to process calculated field update msg: [{}]", proto, e);
- callback.onFailure(e);
- }
- }
-
- @Override
- public void onCalculatedFieldDeleted(TransportProtos.CalculatedFieldDeleteMsgProto proto, TbCallback callback) {
- try {
- CalculatedFieldId calculatedFieldId = new CalculatedFieldId(new UUID(proto.getCalculatedFieldIdMSB(), proto.getCalculatedFieldIdLSB()));
- calculatedFieldLinks.remove(calculatedFieldId);
- calculatedFields.remove(calculatedFieldId);
- states.keySet().removeIf(ctxId -> ctxId.startsWith(calculatedFieldId.getId().toString()));
- } catch (Exception e) {
- log.trace("Failed to process calculated field delete msg: [{}]", proto, e);
- callback.onFailure(e);
- }
- }
-
@Override
public CalculatedField save(CalculatedField calculatedField, SecurityUser user) throws ThingsboardException {
ActionType actionType = calculatedField.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
@@ -223,13 +206,25 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
}
}
+
+ private void onCalculatedFieldDelete(CalculatedFieldId calculatedFieldId, TbCallback callback) {
+ try {
+ calculatedFieldLinks.remove(calculatedFieldId);
+ calculatedFields.remove(calculatedFieldId);
+ states.keySet().removeIf(ctxId -> ctxId.startsWith(calculatedFieldId.getId().toString()));
+ } catch (Exception e) {
+ log.trace("Failed to delete calculated field.", e);
+ callback.onFailure(e);
+ }
+ }
+
private void fetchCalculatedFields() {
PageDataIterable cfs = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFields, initFetchPackSize);
cfs.forEach(cf -> calculatedFields.putIfAbsent(cf.getId(), cf));
PageDataIterable cfls = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFieldLinks, initFetchPackSize);
cfls.forEach(link -> calculatedFieldLinks.computeIfAbsent(link.getCalculatedFieldId(), id -> new ArrayList<>()).add(link));
// TODO: read all states(CalculatedFieldCtx)
- states.keySet().removeIf(calculatedFieldId -> !calculatedFields.containsKey(calculatedFieldId));
+ states.keySet().removeIf(ctxId -> calculatedFields.keySet().stream().noneMatch(id -> ctxId.startsWith(id.toString())));
}
private void checkEntityExistence(TenantId tenantId, EntityId entityId) {
diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/cf/TbCalculatedFieldService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/cf/TbCalculatedFieldService.java
index 4f14270c3d..aa77d29702 100644
--- a/application/src/main/java/org/thingsboard/server/service/entitiy/cf/TbCalculatedFieldService.java
+++ b/application/src/main/java/org/thingsboard/server/service/entitiy/cf/TbCalculatedFieldService.java
@@ -24,11 +24,7 @@ import org.thingsboard.server.service.security.model.SecurityUser;
public interface TbCalculatedFieldService {
- void onCalculatedFieldAdded(TransportProtos.CalculatedFieldAddMsgProto proto, TbCallback callback);
-
- void onCalculatedFieldUpdated(TransportProtos.CalculatedFieldUpdateMsgProto proto, TbCallback callback);
-
- void onCalculatedFieldDeleted(TransportProtos.CalculatedFieldDeleteMsgProto proto, TbCallback callback);
+ void onCalculatedFieldMsg(TransportProtos.CalculatedFieldMsgProto proto, TbCallback callback);
CalculatedField save(CalculatedField calculatedField, SecurityUser user) throws ThingsboardException;
diff --git a/common/proto/src/main/proto/queue.proto b/common/proto/src/main/proto/queue.proto
index e1d6320779..b41e010a2d 100644
--- a/common/proto/src/main/proto/queue.proto
+++ b/common/proto/src/main/proto/queue.proto
@@ -1267,25 +1267,14 @@ message ToDeviceActorNotificationMsgProto {
DeviceDeleteMsgProto deviceDeleteMsg = 8;
}
-message CalculatedFieldAddMsgProto {
- int64 tenantIdMSB = 1;
- int64 tenantIdLSB = 2;
- int64 calculatedFieldIdMSB = 3;
- int64 calculatedFieldIdLSB = 4;
-}
-
-message CalculatedFieldUpdateMsgProto {
- int64 tenantIdMSB = 1;
- int64 tenantIdLSB = 2;
- int64 calculatedFieldIdMSB = 3;
- int64 calculatedFieldIdLSB = 4;
-}
-
-message CalculatedFieldDeleteMsgProto {
+message CalculatedFieldMsgProto {
int64 tenantIdMSB = 1;
int64 tenantIdLSB = 2;
int64 calculatedFieldIdMSB = 3;
int64 calculatedFieldIdLSB = 4;
+ bool added = 5;
+ bool updated = 6;
+ bool deleted = 7;
}
/**