From 68a73caada309f8bb4a66a1b93c9cdc440b40551 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Tue, 30 Mar 2021 15:57:23 +0300 Subject: [PATCH] Ignore default value for filters with constant key type --- .../rule/engine/profile/AlarmRuleState.java | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java index ab0d9df7c2..928a403fc4 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java @@ -33,10 +33,7 @@ import org.thingsboard.server.common.data.device.profile.SimpleAlarmConditionSpe import org.thingsboard.server.common.data.device.profile.SpecificTimeSchedule; import org.thingsboard.server.common.data.query.BooleanFilterPredicate; import org.thingsboard.server.common.data.query.ComplexFilterPredicate; -import org.thingsboard.server.common.data.query.EntityKey; -import org.thingsboard.server.common.data.query.EntityKeyType; import org.thingsboard.server.common.data.query.FilterPredicateValue; -import org.thingsboard.server.common.data.query.KeyFilter; import org.thingsboard.server.common.data.query.KeyFilterPredicate; import org.thingsboard.server.common.data.query.NumericFilterPredicate; import org.thingsboard.server.common.data.query.StringFilterPredicate; @@ -275,7 +272,7 @@ class AlarmRuleState { if (value == null) { return false; } - eval = eval && eval(data, value, filter.getPredicate()); + eval = eval && eval(data, value, filter.getPredicate(), filter); } return eval; } @@ -300,33 +297,33 @@ class AlarmRuleState { return value; } - private boolean eval(DataSnapshot data, EntityKeyValue value, KeyFilterPredicate predicate) { + private boolean eval(DataSnapshot data, EntityKeyValue value, KeyFilterPredicate predicate, AlarmConditionFilter filter) { switch (predicate.getType()) { case STRING: - return evalStrPredicate(data, value, (StringFilterPredicate) predicate); + return evalStrPredicate(data, value, (StringFilterPredicate) predicate, filter); case NUMERIC: - return evalNumPredicate(data, value, (NumericFilterPredicate) predicate); + return evalNumPredicate(data, value, (NumericFilterPredicate) predicate, filter); case BOOLEAN: - return evalBoolPredicate(data, value, (BooleanFilterPredicate) predicate); + return evalBoolPredicate(data, value, (BooleanFilterPredicate) predicate, filter); case COMPLEX: - return evalComplexPredicate(data, value, (ComplexFilterPredicate) predicate); + return evalComplexPredicate(data, value, (ComplexFilterPredicate) predicate, filter); default: return false; } } - private boolean evalComplexPredicate(DataSnapshot data, EntityKeyValue ekv, ComplexFilterPredicate predicate) { + private boolean evalComplexPredicate(DataSnapshot data, EntityKeyValue ekv, ComplexFilterPredicate predicate, AlarmConditionFilter filter) { switch (predicate.getOperation()) { case OR: for (KeyFilterPredicate kfp : predicate.getPredicates()) { - if (eval(data, ekv, kfp)) { + if (eval(data, ekv, kfp, filter)) { return true; } } return false; case AND: for (KeyFilterPredicate kfp : predicate.getPredicates()) { - if (!eval(data, ekv, kfp)) { + if (!eval(data, ekv, kfp, filter)) { return false; } } @@ -336,12 +333,15 @@ class AlarmRuleState { } } - private boolean evalBoolPredicate(DataSnapshot data, EntityKeyValue ekv, BooleanFilterPredicate predicate) { + private boolean evalBoolPredicate(DataSnapshot data, EntityKeyValue ekv, BooleanFilterPredicate predicate, AlarmConditionFilter filter) { Boolean val = getBoolValue(ekv); if (val == null) { return false; } - Boolean predicateValue = getPredicateValue(data, predicate.getValue(), AlarmRuleState::getBoolValue); + Boolean predicateValue = getPredicateValue(data, predicate.getValue(), filter, AlarmRuleState::getBoolValue); + if (predicateValue == null) { + return false; + } switch (predicate.getOperation()) { case EQUAL: return val.equals(predicateValue); @@ -352,12 +352,15 @@ class AlarmRuleState { } } - private boolean evalNumPredicate(DataSnapshot data, EntityKeyValue ekv, NumericFilterPredicate predicate) { + private boolean evalNumPredicate(DataSnapshot data, EntityKeyValue ekv, NumericFilterPredicate predicate, AlarmConditionFilter filter) { Double val = getDblValue(ekv); if (val == null) { return false; } - Double predicateValue = getPredicateValue(data, predicate.getValue(), AlarmRuleState::getDblValue); + Double predicateValue = getPredicateValue(data, predicate.getValue(), filter, AlarmRuleState::getDblValue); + if (predicateValue == null) { + return false; + } switch (predicate.getOperation()) { case NOT_EQUAL: return !val.equals(predicateValue); @@ -376,12 +379,15 @@ class AlarmRuleState { } } - private boolean evalStrPredicate(DataSnapshot data, EntityKeyValue ekv, StringFilterPredicate predicate) { + private boolean evalStrPredicate(DataSnapshot data, EntityKeyValue ekv, StringFilterPredicate predicate, AlarmConditionFilter filter) { String val = getStrValue(ekv); if (val == null) { return false; } - String predicateValue = getPredicateValue(data, predicate.getValue(), AlarmRuleState::getStrValue); + String predicateValue = getPredicateValue(data, predicate.getValue(), filter, AlarmRuleState::getStrValue); + if (predicateValue == null) { + return false; + } if (predicate.isIgnoreCase()) { val = val.toLowerCase(); predicateValue = predicateValue.toLowerCase(); @@ -404,7 +410,7 @@ class AlarmRuleState { } } - private T getPredicateValue(DataSnapshot data, FilterPredicateValue value, Function transformFunction) { + private T getPredicateValue(DataSnapshot data, FilterPredicateValue value, AlarmConditionFilter filter, Function transformFunction) { EntityKeyValue ekv = getDynamicPredicateValue(data, value); if (ekv != null) { T result = transformFunction.apply(ekv); @@ -412,7 +418,11 @@ class AlarmRuleState { return result; } } - return value.getDefaultValue(); + if (filter.getKey().getType() != AlarmConditionKeyType.CONSTANT) { + return value.getDefaultValue(); + } else { + return null; + } } private EntityKeyValue getDynamicPredicateValue(DataSnapshot data, FilterPredicateValue value) {