From ad3e4849989c95a4ecc187a8215a6fd74a37ef2f Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 19 Aug 2022 16:56:36 +0300 Subject: [PATCH 01/14] set default for destroy method in TbNode interface --- .../main/java/org/thingsboard/rule/engine/api/TbNode.java | 2 +- .../rule/engine/action/TbAbstractCustomerActionNode.java | 3 +++ .../rule/engine/action/TbAbstractRelationActionNode.java | 3 +++ .../rule/engine/action/TbCopyAttributesToEntityViewNode.java | 3 --- .../org/thingsboard/rule/engine/action/TbMsgCountNode.java | 3 --- .../thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java | 4 ---- .../rule/engine/filter/TbCheckAlarmStatusNode.java | 3 --- .../thingsboard/rule/engine/filter/TbCheckMessageNode.java | 4 ---- .../thingsboard/rule/engine/filter/TbCheckRelationNode.java | 4 ---- .../thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java | 4 ---- .../thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java | 4 ---- .../rule/engine/filter/TbOriginatorTypeFilterNode.java | 4 ---- .../rule/engine/filter/TbOriginatorTypeSwitchNode.java | 4 ---- .../java/org/thingsboard/rule/engine/flow/TbAckNode.java | 3 --- .../org/thingsboard/rule/engine/flow/TbCheckpointNode.java | 3 --- .../thingsboard/rule/engine/flow/TbRuleChainInputNode.java | 3 --- .../thingsboard/rule/engine/flow/TbRuleChainOutputNode.java | 3 --- .../thingsboard/rule/engine/geo/AbstractGeofencingNode.java | 5 ----- .../org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java | 4 ---- .../org/thingsboard/rule/engine/mail/TbSendEmailNode.java | 4 ---- .../rule/engine/metadata/TbAbstractGetAttributesNode.java | 4 ---- .../rule/engine/metadata/TbAbstractGetEntityDetailsNode.java | 4 ---- .../rule/engine/metadata/TbEntityGetAttrNode.java | 5 ----- .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 4 ---- .../thingsboard/rule/engine/metadata/TbGetTelemetryNode.java | 4 ---- .../org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java | 4 ---- .../rule/engine/telemetry/TbMsgAttributesNode.java | 4 ---- .../rule/engine/transaction/TbSynchronizationBeginNode.java | 4 ---- .../rule/engine/transaction/TbSynchronizationEndNode.java | 3 --- .../rule/engine/transform/TbChangeOriginatorNode.java | 4 ---- 30 files changed, 7 insertions(+), 103 deletions(-) diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbNode.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbNode.java index 8780833a5e..1516b6957c 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbNode.java +++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbNode.java @@ -29,7 +29,7 @@ public interface TbNode { void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException; - void destroy(); + default void destroy() {} default void onPartitionChangeMsg(TbContext ctx, PartitionChangeMsg msg) {} diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java index 0cd637c01c..efff637e57 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractCustomerActionNode.java @@ -92,6 +92,9 @@ public abstract class TbAbstractCustomerActionNode processEntityRelationAction(TbContext ctx, TbMsg msg, String relationType) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java index 73e03892c9..fd69303501 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java @@ -158,7 +158,4 @@ public class TbCopyAttributesToEntityViewNode implements TbNode { return CollectionsUtil.contains(keys, attrKey); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java index 22bed5b4e4..2d34972bfa 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbMsgCountNode.java @@ -98,7 +98,4 @@ public class TbMsgCountNode implements TbNode { ctx.tellSelf(tickMsg, curDelay); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java index eb30a236af..28dc64c068 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/edge/AbstractTbMsgPushNode.java @@ -71,10 +71,6 @@ public abstract class AbstractTbMsgPushNode dataMap = dataToMap(msg); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java index c4bc9641a4..4832a0af35 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckRelationNode.java @@ -103,8 +103,4 @@ public class TbCheckRelationNode implements TbNode { } } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java index fd292be43e..aeddcd18d3 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeFilterNode.java @@ -52,8 +52,4 @@ public class TbMsgTypeFilterNode implements TbNode { ctx.tellNext(msg, config.getMessageTypes().contains(msg.getType()) ? "True" : "False"); } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java index 696212c9cb..62e44bb50e 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbMsgTypeSwitchNode.java @@ -117,8 +117,4 @@ public class TbMsgTypeSwitchNode implements TbNode { ctx.tellNext(msg, relationType); } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNode.java index 8b893c0396..10ccc77dc1 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeFilterNode.java @@ -51,8 +51,4 @@ public class TbOriginatorTypeFilterNode implements TbNode { ctx.tellNext(msg, config.getOriginatorTypes().contains(originatorType) ? "True" : "False"); } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNode.java index d44c555f8c..e5c06c3878 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbOriginatorTypeSwitchNode.java @@ -90,8 +90,4 @@ public class TbOriginatorTypeSwitchNode implements TbNode { ctx.tellNext(msg, relationType); } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbAckNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbAckNode.java index 801a31fbb6..64938092f6 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbAckNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbAckNode.java @@ -51,7 +51,4 @@ public class TbAckNode implements TbNode { ctx.tellSuccess(msg); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbCheckpointNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbCheckpointNode.java index 3fa2b5d64e..ececf96303 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbCheckpointNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbCheckpointNode.java @@ -54,7 +54,4 @@ public class TbCheckpointNode implements TbNode { ctx.enqueueForTellNext(msg, queueName, TbRelationTypes.SUCCESS, () -> ctx.ack(msg), error -> ctx.tellFailure(msg, error)); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNode.java index eb2e6bb249..fc4a1edfc9 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainInputNode.java @@ -63,7 +63,4 @@ public class TbRuleChainInputNode implements TbNode { ctx.input(msg, ruleChainId); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNode.java index 5b014d8bc4..bc701dd56a 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/flow/TbRuleChainOutputNode.java @@ -51,7 +51,4 @@ public class TbRuleChainOutputNode implements TbNode { ctx.output(msg, ctx.getSelf().getName()); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/AbstractGeofencingNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/AbstractGeofencingNode.java index 40bbd6f506..af35e88b81 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/AbstractGeofencingNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/geo/AbstractGeofencingNode.java @@ -148,9 +148,4 @@ public abstract class AbstractGeofencingNode findEntityIdAsync(TbContext ctx, TbMsg msg); private void safePutAttributes(TbContext ctx, TbMsg msg, T entityId) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDetailsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDetailsNode.java index 75d1869e6d..490a42a72c 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDetailsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbAbstractGetEntityDetailsNode.java @@ -63,10 +63,6 @@ public abstract class TbAbstractGetEntityDetailsNode ctx.tellFailure(msg, t), ctx.getDbCallbackExecutor()); } - @Override - public void destroy() { - } - protected abstract C loadGetEntityDetailsNodeConfiguration(TbNodeConfiguration configuration) throws TbNodeException; protected abstract ListenableFuture getDetails(TbContext ctx, TbMsg msg); diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbEntityGetAttrNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbEntityGetAttrNode.java index b1eaea0bbd..28fd920264 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbEntityGetAttrNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbEntityGetAttrNode.java @@ -100,11 +100,6 @@ public abstract class TbEntityGetAttrNode implements TbNode ctx.tellSuccess(msg); } - @Override - public void destroy() { - - } - protected abstract ListenableFuture findEntityAsync(TbContext ctx, EntityId originator); public void setConfig(TbGetEntityAttrNodeConfiguration config) { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java index f5d52c96ea..25579d81ed 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java @@ -80,8 +80,4 @@ public class TbGetOriginatorFieldsNode implements TbNode { } } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index 320502005b..71d0e18549 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -125,10 +125,6 @@ public class TbGetTelemetryNode implements TbNode { } } - @Override - public void destroy() { - } - private List buildQueries(TbMsg msg, List keys) { final Interval interval = getInterval(msg); final long aggIntervalStep = Aggregation.NONE.equals(aggregation) ? 1 : diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java index 36497df564..85acf4c5ea 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java @@ -70,8 +70,4 @@ public class TbSendRPCReplyNode implements TbNode { } } - @Override - public void destroy() { - } - } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java index 56e1ca8577..ae569de2af 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java @@ -75,8 +75,4 @@ public class TbMsgAttributesNode implements TbNode { ); } - @Override - public void destroy() { - } - } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationBeginNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationBeginNode.java index ad846b6a29..21f1a9d82f 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationBeginNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationBeginNode.java @@ -49,8 +49,4 @@ public class TbSynchronizationBeginNode implements TbNode { ctx.tellSuccess(msg); } - @Override - public void destroy() { - - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationEndNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationEndNode.java index f346fcf497..5cb81399c6 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationEndNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transaction/TbSynchronizationEndNode.java @@ -48,7 +48,4 @@ public class TbSynchronizationEndNode implements TbNode { ctx.tellSuccess(msg); } - @Override - public void destroy() { - } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java index a59980849d..b48f666184 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNode.java @@ -108,8 +108,4 @@ public class TbChangeOriginatorNode extends TbAbstractTransformNode { } - @Override - public void destroy() { - - } } From ddd8f3c18b423e83727a41140e82f58c79ae2197 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 19 Aug 2022 17:30:53 +0300 Subject: [PATCH 02/14] remove destroy method impl for TbSendRPCRequestNode --- .../org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java index 45b45e91f9..27e83a2614 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCRequestNode.java @@ -127,10 +127,6 @@ public class TbSendRPCRequestNode implements TbNode { } } - @Override - public void destroy() { - } - private String wrap(String name, String body) { JsonObject json = new JsonObject(); json.addProperty(name, body); From 5c9e9c54334de8ab2842c3769a4b0b4082450271 Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Thu, 1 Sep 2022 16:14:44 +0300 Subject: [PATCH 03/14] bugfix: check value "null" --- .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java index f5d52c96ea..b21d35aa71 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsNode.java @@ -70,7 +70,7 @@ public class TbGetOriginatorFieldsNode implements TbNode { data -> { config.getFieldsMapping().forEach((field, metaKey) -> { String val = data.getFieldValue(field); - if (val != null) { + if (val != null && !val.equals("null")) { msg.getMetaData().putValue(metaKey, val); } }); From 238099689695c2fc139c6935b7203c1172d74488 Mon Sep 17 00:00:00 2001 From: Kalutka Zhenya Date: Thu, 8 Sep 2022 15:59:05 +0300 Subject: [PATCH 04/14] Add msg types --- .../src/app/shared/models/rule-node.models.ts | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/ui-ngx/src/app/shared/models/rule-node.models.ts b/ui-ngx/src/app/shared/models/rule-node.models.ts index d4273c9911..6ff3b707de 100644 --- a/ui-ngx/src/app/shared/models/rule-node.models.ts +++ b/ui-ngx/src/app/shared/models/rule-node.models.ts @@ -347,6 +347,14 @@ export enum MessageType { POST_TELEMETRY_REQUEST = 'POST_TELEMETRY_REQUEST', TO_SERVER_RPC_REQUEST = 'TO_SERVER_RPC_REQUEST', RPC_CALL_FROM_SERVER_TO_DEVICE = 'RPC_CALL_FROM_SERVER_TO_DEVICE', + RPC_QUEUED = 'RPC_QUEUED', + RPC_SENT = 'RPC_SENT', + RPC_DELIVERED = 'RPC_DELIVERED', + RPC_SUCCESSFUL = 'RPC_SUCCESSFUL', + RPC_TIMEOUT = 'RPC_TIMEOUT', + RPC_EXPIRED = 'RPC_EXPIRED', + RPC_FAILED = 'RPC_FAILED', + RPC_DELETED = 'RPC_DELETED', ACTIVITY_EVENT = 'ACTIVITY_EVENT', INACTIVITY_EVENT = 'INACTIVITY_EVENT', CONNECT_EVENT = 'CONNECT_EVENT', @@ -358,13 +366,13 @@ export enum MessageType { ENTITY_UNASSIGNED = 'ENTITY_UNASSIGNED', ATTRIBUTES_UPDATED = 'ATTRIBUTES_UPDATED', ATTRIBUTES_DELETED = 'ATTRIBUTES_DELETED', + ALARM_ACKNOWLEDGED = 'ALARM_ACKNOWLEDGED', + ALARM_CLEARED = 'ALARM_CLEARED', + ENTITY_ASSIGNED_FROM_TENANT = 'ENTITY_ASSIGNED_FROM_TENANT', + ENTITY_ASSIGNED_TO_TENANT = 'ENTITY_ASSIGNED_TO_TENANT', TIMESERIES_UPDATED = 'TIMESERIES_UPDATED', TIMESERIES_DELETED = 'TIMESERIES_DELETED', - RPC_QUEUED = 'RPC_QUEUED', - RPC_DELIVERED = 'RPC_DELIVERED', - RPC_SUCCESSFUL = 'RPC_SUCCESSFUL', - RPC_TIMEOUT = 'RPC_TIMEOUT', - RPC_FAILED = 'RPC_FAILED' + FAILURE = 'FAILURE' } export const messageTypeNames = new Map( @@ -373,6 +381,14 @@ export const messageTypeNames = new Map( [MessageType.POST_TELEMETRY_REQUEST, 'Post telemetry'], [MessageType.TO_SERVER_RPC_REQUEST, 'RPC Request from Device'], [MessageType.RPC_CALL_FROM_SERVER_TO_DEVICE, 'RPC Request to Device'], + [MessageType.RPC_QUEUED, 'RPC Queued'], + [MessageType.RPC_SENT, 'RPC Sent'], + [MessageType.RPC_DELIVERED, 'RPC Delivered'], + [MessageType.RPC_SUCCESSFUL, 'RPC Successful'], + [MessageType.RPC_TIMEOUT, 'RPC Timeout'], + [MessageType.RPC_EXPIRED, 'RPC Expired'], + [MessageType.RPC_FAILED, 'RPC Failed'], + [MessageType.RPC_DELETED, 'RPC Deleted'], [MessageType.ACTIVITY_EVENT, 'Activity Event'], [MessageType.INACTIVITY_EVENT, 'Inactivity Event'], [MessageType.CONNECT_EVENT, 'Connect Event'], @@ -384,13 +400,13 @@ export const messageTypeNames = new Map( [MessageType.ENTITY_UNASSIGNED, 'Entity Unassigned'], [MessageType.ATTRIBUTES_UPDATED, 'Attributes Updated'], [MessageType.ATTRIBUTES_DELETED, 'Attributes Deleted'], + [MessageType.ALARM_ACKNOWLEDGED, 'Alarm Acknowledged'], + [MessageType.ALARM_CLEARED, 'Alarm Cleared'], + [MessageType.ENTITY_ASSIGNED_FROM_TENANT, 'Entity Assigned From Tenant'], + [MessageType.ENTITY_ASSIGNED_TO_TENANT, 'Entity Assigned To Tenant'], [MessageType.TIMESERIES_UPDATED, 'Timeseries Updated'], [MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'], - [MessageType.RPC_QUEUED, 'RPC Queued'], - [MessageType.RPC_DELIVERED, 'RPC Delivered'], - [MessageType.RPC_SUCCESSFUL, 'RPC Successful'], - [MessageType.RPC_TIMEOUT, 'RPC Timeout'], - [MessageType.RPC_FAILED, 'RPC Failed'] + [MessageType.FAILURE, 'Failure'] ] ); From 13130ff25770b5af1c546d8ac232e79dfed28219 Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Mon, 12 Sep 2022 17:05:58 +0300 Subject: [PATCH 05/14] add ignoreStringNull --- .../engine/metadata/TbGetOriginatorFieldsConfiguration.java | 2 ++ .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java index be8e356b59..0648b81588 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java @@ -25,6 +25,7 @@ import java.util.Map; public class TbGetOriginatorFieldsConfiguration implements NodeConfiguration { private Map fieldsMapping; + private boolean ignoreStringNull; @Override public TbGetOriginatorFieldsConfiguration defaultConfiguration() { @@ -33,6 +34,7 @@ public class TbGetOriginatorFieldsConfiguration implements NodeConfiguration { config.getFieldsMapping().forEach((field, metaKey) -> { String val = data.getFieldValue(field); - if (val != null && !val.equals("null")) { + if (val != null && (!val.equals("null") || !ignoreStringNull)) { msg.getMetaData().putValue(metaKey, val); } }); From 369af93e51b6e7cb6480af13ce7c0515629541de Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Tue, 13 Sep 2022 17:09:04 +0300 Subject: [PATCH 06/14] fixbug --- .../rule/engine/metadata/TbGetTelemetryNode.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index 320502005b..914eb4cddd 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -91,7 +91,9 @@ public class TbGetTelemetryNode implements TbNode { orderByFetchAll = ASC_ORDER; } aggregation = parseAggregationConfig(config.getAggregation()); - + if (!fetchMode.equals(FETCH_MODE_ALL)) { + aggregation = Aggregation.NONE; + } mapper = new ObjectMapper(); mapper.configure(JsonWriteFeature.QUOTE_FIELD_NAMES.mappedFeature(), false); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); @@ -236,16 +238,16 @@ public class TbGetTelemetryNode implements TbNode { } private void isUndefined(TbMsg msg, String startIntervalPattern, String endIntervalPattern) { - if (getMetadataValue(msg, startIntervalPattern) == null && getMetadataValue(msg, endIntervalPattern) == null) { + if (getValuePattern(msg, startIntervalPattern) == null && getValuePattern(msg, endIntervalPattern) == null) { throw new IllegalArgumentException("Message metadata values: '" + replaceRegex(startIntervalPattern) + "' and '" + replaceRegex(endIntervalPattern) + "' are undefined"); } else { - if (getMetadataValue(msg, startIntervalPattern) == null) { + if (getValuePattern(msg, startIntervalPattern) == null) { throw new IllegalArgumentException("Message metadata value: '" + replaceRegex(startIntervalPattern) + "' is undefined"); } - if (getMetadataValue(msg, endIntervalPattern) == null) { + if (getValuePattern(msg, endIntervalPattern) == null) { throw new IllegalArgumentException("Message metadata value: '" + replaceRegex(endIntervalPattern) + "' is undefined"); } @@ -269,8 +271,9 @@ public class TbGetTelemetryNode implements TbNode { } } - private String getMetadataValue(TbMsg msg, String pattern) { - return msg.getMetaData().getValue(replaceRegex(pattern)); + private String getValuePattern(TbMsg msg, String pattern) { + String valuePattern = TbNodeUtils.processPattern(pattern, msg); + return valuePattern.equals(pattern) ? null : valuePattern; } private String replaceRegex(String pattern) { From 189c1afb01b69faca09b6a05a8c1859005c1a7a3 Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Fri, 16 Sep 2022 10:12:08 +0300 Subject: [PATCH 07/14] refactor code --- .../engine/metadata/TbGetTelemetryNode.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index 914eb4cddd..f95909e813 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -91,16 +91,14 @@ public class TbGetTelemetryNode implements TbNode { orderByFetchAll = ASC_ORDER; } aggregation = parseAggregationConfig(config.getAggregation()); - if (!fetchMode.equals(FETCH_MODE_ALL)) { - aggregation = Aggregation.NONE; - } + mapper = new ObjectMapper(); mapper.configure(JsonWriteFeature.QUOTE_FIELD_NAMES.mappedFeature(), false); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); } Aggregation parseAggregationConfig(String aggName) { - if (StringUtils.isEmpty(aggName)) { + if (StringUtils.isEmpty(aggName) || !fetchMode.equals(FETCH_MODE_ALL)) { return Aggregation.NONE; } return Aggregation.valueOf(aggName); @@ -113,7 +111,7 @@ public class TbGetTelemetryNode implements TbNode { } else { try { if (config.isUseMetadataIntervalPatterns()) { - checkMetadataKeyPatterns(msg); + checkKeyPatterns(msg); } List keys = TbNodeUtils.processPatterns(tsKeyNames, msg); ListenableFuture> list = ctx.getTimeseriesService().findAll(ctx.getTenantId(), msg.getOriginator(), buildQueries(msg, keys)); @@ -232,23 +230,23 @@ public class TbGetTelemetryNode implements TbNode { return NumberUtils.isParsable(TbNodeUtils.processPattern(pattern, msg)); } - private void checkMetadataKeyPatterns(TbMsg msg) { + private void checkKeyPatterns(TbMsg msg) { isUndefined(msg, config.getStartIntervalPattern(), config.getEndIntervalPattern()); isInvalid(msg, config.getStartIntervalPattern(), config.getEndIntervalPattern()); } private void isUndefined(TbMsg msg, String startIntervalPattern, String endIntervalPattern) { if (getValuePattern(msg, startIntervalPattern) == null && getValuePattern(msg, endIntervalPattern) == null) { - throw new IllegalArgumentException("Message metadata values: '" + + throw new IllegalArgumentException("Message values: '" + replaceRegex(startIntervalPattern) + "' and '" + replaceRegex(endIntervalPattern) + "' are undefined"); } else { if (getValuePattern(msg, startIntervalPattern) == null) { - throw new IllegalArgumentException("Message metadata value: '" + + throw new IllegalArgumentException("Message value: '" + replaceRegex(startIntervalPattern) + "' is undefined"); } if (getValuePattern(msg, endIntervalPattern) == null) { - throw new IllegalArgumentException("Message metadata value: '" + + throw new IllegalArgumentException("Message value: '" + replaceRegex(endIntervalPattern) + "' is undefined"); } } @@ -256,16 +254,16 @@ public class TbGetTelemetryNode implements TbNode { private void isInvalid(TbMsg msg, String startIntervalPattern, String endIntervalPattern) { if (getInterval(msg).getStartTs() == null && getInterval(msg).getEndTs() == null) { - throw new IllegalArgumentException("Message metadata values: '" + + throw new IllegalArgumentException("Message values: '" + replaceRegex(startIntervalPattern) + "' and '" + replaceRegex(endIntervalPattern) + "' have invalid format"); } else { if (getInterval(msg).getStartTs() == null) { - throw new IllegalArgumentException("Message metadata value: '" + + throw new IllegalArgumentException("Message value: '" + replaceRegex(startIntervalPattern) + "' has invalid format"); } if (getInterval(msg).getEndTs() == null) { - throw new IllegalArgumentException("Message metadata value: '" + + throw new IllegalArgumentException("Message value: '" + replaceRegex(endIntervalPattern) + "' has invalid format"); } } From 5816923b85b703924fbc1b0c3de99f94e023166a Mon Sep 17 00:00:00 2001 From: Kalutka Zhenya Date: Fri, 16 Sep 2022 12:50:10 +0300 Subject: [PATCH 08/14] delete "failure" type --- ui-ngx/src/app/shared/models/rule-node.models.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/shared/models/rule-node.models.ts b/ui-ngx/src/app/shared/models/rule-node.models.ts index 6ff3b707de..c6549f5b39 100644 --- a/ui-ngx/src/app/shared/models/rule-node.models.ts +++ b/ui-ngx/src/app/shared/models/rule-node.models.ts @@ -371,8 +371,7 @@ export enum MessageType { ENTITY_ASSIGNED_FROM_TENANT = 'ENTITY_ASSIGNED_FROM_TENANT', ENTITY_ASSIGNED_TO_TENANT = 'ENTITY_ASSIGNED_TO_TENANT', TIMESERIES_UPDATED = 'TIMESERIES_UPDATED', - TIMESERIES_DELETED = 'TIMESERIES_DELETED', - FAILURE = 'FAILURE' + TIMESERIES_DELETED = 'TIMESERIES_DELETED' } export const messageTypeNames = new Map( @@ -405,8 +404,7 @@ export const messageTypeNames = new Map( [MessageType.ENTITY_ASSIGNED_FROM_TENANT, 'Entity Assigned From Tenant'], [MessageType.ENTITY_ASSIGNED_TO_TENANT, 'Entity Assigned To Tenant'], [MessageType.TIMESERIES_UPDATED, 'Timeseries Updated'], - [MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'], - [MessageType.FAILURE, 'Failure'] + [MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'] ] ); From d8135f0782b811fb391dee392b8af976a1b0211d Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 16 Sep 2022 16:11:25 +0300 Subject: [PATCH 09/14] refactor getInterval logic --- .../engine/metadata/TbGetTelemetryNode.java | 86 ++++++------------- 1 file changed, 28 insertions(+), 58 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index f95909e813..478e49f004 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2022 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. @@ -110,11 +110,9 @@ public class TbGetTelemetryNode implements TbNode { ctx.tellFailure(msg, new IllegalStateException("Telemetry is not selected!")); } else { try { - if (config.isUseMetadataIntervalPatterns()) { - checkKeyPatterns(msg); - } + Interval interval = getInterval(msg); List keys = TbNodeUtils.processPatterns(tsKeyNames, msg); - ListenableFuture> list = ctx.getTimeseriesService().findAll(ctx.getTenantId(), msg.getOriginator(), buildQueries(msg, keys)); + ListenableFuture> list = ctx.getTimeseriesService().findAll(ctx.getTenantId(), msg.getOriginator(), buildQueries(interval, keys)); DonAsynchron.withCallback(list, data -> { process(data, msg, keys); ctx.tellSuccess(ctx.transformMsg(msg, msg.getType(), msg.getOriginator(), msg.getMetaData(), msg.getData())); @@ -129,8 +127,7 @@ public class TbGetTelemetryNode implements TbNode { public void destroy() { } - private List buildQueries(TbMsg msg, List keys) { - final Interval interval = getInterval(msg); + private List buildQueries(Interval interval, List keys) { final long aggIntervalStep = Aggregation.NONE.equals(aggregation) ? 1 : // exact how it validates on BaseTimeseriesService.validate() // see CassandraBaseTimeseriesDao.findAllAsync() @@ -210,72 +207,45 @@ public class TbGetTelemetryNode implements TbNode { } private Interval getInterval(TbMsg msg) { - Interval interval = new Interval(); if (config.isUseMetadataIntervalPatterns()) { - if (isParsable(msg, config.getStartIntervalPattern())) { - interval.setStartTs(Long.parseLong(TbNodeUtils.processPattern(config.getStartIntervalPattern(), msg))); - } - if (isParsable(msg, config.getEndIntervalPattern())) { - interval.setEndTs(Long.parseLong(TbNodeUtils.processPattern(config.getEndIntervalPattern(), msg))); - } + return getIntervalFromPatterns(msg); } else { + Interval interval = new Interval(); long ts = System.currentTimeMillis(); interval.setStartTs(ts - TimeUnit.valueOf(config.getStartIntervalTimeUnit()).toMillis(config.getStartInterval())); interval.setEndTs(ts - TimeUnit.valueOf(config.getEndIntervalTimeUnit()).toMillis(config.getEndInterval())); + return interval; } - return interval; } - private boolean isParsable(TbMsg msg, String pattern) { - return NumberUtils.isParsable(TbNodeUtils.processPattern(pattern, msg)); - } - - private void checkKeyPatterns(TbMsg msg) { - isUndefined(msg, config.getStartIntervalPattern(), config.getEndIntervalPattern()); - isInvalid(msg, config.getStartIntervalPattern(), config.getEndIntervalPattern()); + private Interval getIntervalFromPatterns(TbMsg msg) { + Interval interval = new Interval(); + interval.setStartTs(checkPattern(msg, config.getStartIntervalPattern())); + interval.setEndTs(checkPattern(msg, config.getEndIntervalPattern())); + return interval; } - private void isUndefined(TbMsg msg, String startIntervalPattern, String endIntervalPattern) { - if (getValuePattern(msg, startIntervalPattern) == null && getValuePattern(msg, endIntervalPattern) == null) { - throw new IllegalArgumentException("Message values: '" + - replaceRegex(startIntervalPattern) + "' and '" + - replaceRegex(endIntervalPattern) + "' are undefined"); - } else { - if (getValuePattern(msg, startIntervalPattern) == null) { - throw new IllegalArgumentException("Message value: '" + - replaceRegex(startIntervalPattern) + "' is undefined"); - } - if (getValuePattern(msg, endIntervalPattern) == null) { - throw new IllegalArgumentException("Message value: '" + - replaceRegex(endIntervalPattern) + "' is undefined"); - } + private long checkPattern(TbMsg msg, String pattern) { + String value = getValuePattern(msg, pattern); + if (value == null) { + throw new IllegalArgumentException("Message value: '" + + replaceRegex(pattern) + "' is undefined"); } - } - - private void isInvalid(TbMsg msg, String startIntervalPattern, String endIntervalPattern) { - if (getInterval(msg).getStartTs() == null && getInterval(msg).getEndTs() == null) { - throw new IllegalArgumentException("Message values: '" + - replaceRegex(startIntervalPattern) + "' and '" + - replaceRegex(endIntervalPattern) + "' have invalid format"); - } else { - if (getInterval(msg).getStartTs() == null) { - throw new IllegalArgumentException("Message value: '" + - replaceRegex(startIntervalPattern) + "' has invalid format"); - } - if (getInterval(msg).getEndTs() == null) { - throw new IllegalArgumentException("Message value: '" + - replaceRegex(endIntervalPattern) + "' has invalid format"); - } + boolean parsable = NumberUtils.isParsable(value); + if (!parsable) { + throw new IllegalArgumentException("Message value: '" + + replaceRegex(pattern) + "' has invalid format"); } + return Long.parseLong(value); } private String getValuePattern(TbMsg msg, String pattern) { - String valuePattern = TbNodeUtils.processPattern(pattern, msg); - return valuePattern.equals(pattern) ? null : valuePattern; + String value = TbNodeUtils.processPattern(pattern, msg); + return value.equals(pattern) ? null : value; } private String replaceRegex(String pattern) { - return pattern.replaceAll("[${}]", ""); + return pattern.replaceAll("[$\\[{}\\]]", ""); } private int validateLimit(int limit) { From 225f572b7aec3a40634b12fdb911280812505eda Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 16 Sep 2022 16:15:08 +0300 Subject: [PATCH 10/14] license:format --- .../rule/engine/metadata/TbGetTelemetryNode.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java index 478e49f004..e3f4613d33 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNode.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2022 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. From 14898ef7b3204015883d44e6024d229410239052 Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Wed, 21 Sep 2022 12:53:30 +0300 Subject: [PATCH 11/14] update test --- .../engine/metadata/TbGetTelemetryNodeTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java index bb086af15a..9c97f6f85b 100644 --- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java +++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java @@ -15,8 +15,12 @@ */ package org.thingsboard.rule.engine.metadata; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Before; import org.junit.Test; +import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.rule.engine.api.TbContext; +import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.server.common.data.kv.Aggregation; import static org.hamcrest.CoreMatchers.is; @@ -24,14 +28,25 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.willCallRealMethod; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; public class TbGetTelemetryNodeTest { TbGetTelemetryNode node; + TbGetTelemetryNodeConfiguration config; + TbNodeConfiguration nodeConfiguration; + TbContext ctx; @Before public void setUp() throws Exception { - node = mock(TbGetTelemetryNode.class); + ctx = mock(TbContext.class); + node = spy(new TbGetTelemetryNode()); + config = new TbGetTelemetryNodeConfiguration(); + config.setFetchMode("ALL"); + ObjectMapper mapper = JacksonUtil.OBJECT_MAPPER; + nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); + node.init(ctx, nodeConfiguration); + willCallRealMethod().given(node).parseAggregationConfig(any()); } From baf17c6488090a9aea8527be1c03fafc7e90968d Mon Sep 17 00:00:00 2001 From: Yuriy Lytvynchuk Date: Wed, 21 Sep 2022 16:57:22 +0300 Subject: [PATCH 12/14] code review --- .../thingsboard/server/common/data/EntityFieldsData.java | 7 +++++++ .../metadata/TbGetOriginatorFieldsConfiguration.java | 4 ++-- .../rule/engine/metadata/TbGetOriginatorFieldsNode.java | 8 ++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java b/common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java index c3cd2b12b4..04c526b6fe 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/EntityFieldsData.java @@ -50,6 +50,10 @@ public class EntityFieldsData { } public String getFieldValue(String field) { + return getFieldValue(field, false); + } + + public String getFieldValue(String field, boolean ignoreNullStrings) { String[] fieldsTree = field.split("\\."); JsonNode current = fieldsData; for (String key : fieldsTree) { @@ -61,6 +65,9 @@ public class EntityFieldsData { } } if (current != null) { + if(current.isNull() && ignoreNullStrings){ + return null; + } if (current.isValueNode()) { return current.asText(); } else { diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java index 0648b81588..b0e9bf39e5 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/metadata/TbGetOriginatorFieldsConfiguration.java @@ -25,7 +25,7 @@ import java.util.Map; public class TbGetOriginatorFieldsConfiguration implements NodeConfiguration { private Map fieldsMapping; - private boolean ignoreStringNull; + private boolean ignoreNullStrings; @Override public TbGetOriginatorFieldsConfiguration defaultConfiguration() { @@ -34,7 +34,7 @@ public class TbGetOriginatorFieldsConfiguration implements NodeConfiguration { config.getFieldsMapping().forEach((field, metaKey) -> { - String val = data.getFieldValue(field); - if (val != null && (!val.equals("null") || !ignoreStringNull)) { + String val = data.getFieldValue(field, ignoreNullStrings); + if (val != null) { msg.getMetaData().putValue(metaKey, val); } }); From b1a234eba2f8dfada8ef08c6f05039f772523128 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Fri, 23 Sep 2022 13:10:38 +0300 Subject: [PATCH 13/14] Add clear of agg data before subscription update --- .../DefaultTbEntityDataSubscriptionService.java | 4 ++-- .../server/common/data/query/EntityData.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java index b583446f17..4a9dba3264 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java @@ -343,7 +343,7 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc ctx.createTimeSeriesSubscriptions(lastTsEntityMap, startTs, endTs, true); } ctx.sendWsMsg(update); - entityDataList.forEach(ed -> ed.getTimeseries().clear()); + entityDataList.forEach(EntityData::clearTsAndAggData); } finally { ctx.getWsLock().unlock(); } @@ -594,7 +594,7 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc ctx.createTimeSeriesSubscriptions(lastTsEntityMap, cmd.getStartTs(), cmd.getEndTs()); } ctx.sendWsMsg(update); - entityDataList.forEach(ed -> ed.getTimeseries().clear()); + entityDataList.forEach(EntityData::clearTsAndAggData); } finally { ctx.getWsLock().unlock(); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityData.java b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityData.java index 2b24866ac4..e5ae5a757a 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityData.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/query/EntityData.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.common.data.query; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.RequiredArgsConstructor; import org.thingsboard.server.common.data.id.EntityId; @@ -33,4 +34,14 @@ public class EntityData { public EntityData(EntityId entityId, Map> latest, Map timeseries) { this(entityId, latest, timeseries, null); } + + @JsonIgnore + public void clearTsAndAggData() { + if (timeseries != null) { + timeseries.clear(); + } + if (aggLatest != null) { + aggLatest.clear(); + } + } } From 6674c457f6eeee70ae7e17d6a2cd6e434b5c6361 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Fri, 23 Sep 2022 13:45:34 +0300 Subject: [PATCH 14/14] Fix issue with delta calculation when previous interval has no telemetry --- .../DefaultTbEntityDataSubscriptionService.java | 4 ++-- .../server/common/data/kv/ReadTsKvQueryResult.java | 9 +++++++-- ui-ngx/src/app/core/api/entity-data-subscription.ts | 6 +++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java index 4a9dba3264..a5a45be5b2 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java @@ -314,9 +314,9 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc ReadTsKvQueryInfo queryInfo = queries.get(queryResult.getQueryId()); ComparisonTsValue comparisonTsValue = entityData.getAggLatest().computeIfAbsent(queryInfo.getKey().getId(), agg -> new ComparisonTsValue()); if (queryInfo.isPrevious()) { - comparisonTsValue.setPrevious(queryResult.toTsValue()); + comparisonTsValue.setPrevious(queryResult.toTsValue(queryInfo.getQuery())); } else { - comparisonTsValue.setCurrent(queryResult.toTsValue()); + comparisonTsValue.setCurrent(queryResult.toTsValue(queryInfo.getQuery())); lastTsMap.put(queryInfo.getQuery().getKey(), queryResult.getLastEntryTs()); } } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/kv/ReadTsKvQueryResult.java b/common/data/src/main/java/org/thingsboard/server/common/data/kv/ReadTsKvQueryResult.java index 9c7a2f1754..8991127c78 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/kv/ReadTsKvQueryResult.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/kv/ReadTsKvQueryResult.java @@ -42,9 +42,14 @@ public class ReadTsKvQueryResult { } } - public TsValue toTsValue() { + public TsValue toTsValue(ReadTsKvQuery query) { if (data == null || data.isEmpty()) { - return TsValue.EMPTY; + if (Aggregation.SUM.equals(query.getAggregation()) || Aggregation.COUNT.equals(query.getAggregation())) { + long ts = query.getStartTs() + (query.getEndTs() - query.getStartTs()) / 2; + return new TsValue(ts, "0"); + } else { + return TsValue.EMPTY; + } } if (data.size() > 1) { throw new RuntimeException("Query Result has multiple data points!"); diff --git a/ui-ngx/src/app/core/api/entity-data-subscription.ts b/ui-ngx/src/app/core/api/entity-data-subscription.ts index 4dc0e7c4e1..3d176fc841 100644 --- a/ui-ngx/src/app/core/api/entity-data-subscription.ts +++ b/ui-ngx/src/app/core/api/entity-data-subscription.ts @@ -165,7 +165,11 @@ export class EntityDataSubscription { if (key.comparisonResultType === ComparisonResultType.DELTA_ABSOLUTE) { value = currentVal - prevVal; } else { - value = (currentVal - prevVal) / prevVal * 100; + if(prevVal === 0){ + value = 100; + } else { + value = (currentVal - prevVal) / prevVal * 100; + } } } else { value = '';