Ignore default value for filters with constant key type

This commit is contained in:
Viacheslav Klimov 2021-03-30 15:57:23 +03:00 committed by Andrew Shvayka
parent fa462467fb
commit 68a73caada

View File

@ -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.device.profile.SpecificTimeSchedule;
import org.thingsboard.server.common.data.query.BooleanFilterPredicate; import org.thingsboard.server.common.data.query.BooleanFilterPredicate;
import org.thingsboard.server.common.data.query.ComplexFilterPredicate; 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.FilterPredicateValue;
import org.thingsboard.server.common.data.query.KeyFilter;
import org.thingsboard.server.common.data.query.KeyFilterPredicate; import org.thingsboard.server.common.data.query.KeyFilterPredicate;
import org.thingsboard.server.common.data.query.NumericFilterPredicate; import org.thingsboard.server.common.data.query.NumericFilterPredicate;
import org.thingsboard.server.common.data.query.StringFilterPredicate; import org.thingsboard.server.common.data.query.StringFilterPredicate;
@ -275,7 +272,7 @@ class AlarmRuleState {
if (value == null) { if (value == null) {
return false; return false;
} }
eval = eval && eval(data, value, filter.getPredicate()); eval = eval && eval(data, value, filter.getPredicate(), filter);
} }
return eval; return eval;
} }
@ -300,33 +297,33 @@ class AlarmRuleState {
return value; 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()) { switch (predicate.getType()) {
case STRING: case STRING:
return evalStrPredicate(data, value, (StringFilterPredicate) predicate); return evalStrPredicate(data, value, (StringFilterPredicate) predicate, filter);
case NUMERIC: case NUMERIC:
return evalNumPredicate(data, value, (NumericFilterPredicate) predicate); return evalNumPredicate(data, value, (NumericFilterPredicate) predicate, filter);
case BOOLEAN: case BOOLEAN:
return evalBoolPredicate(data, value, (BooleanFilterPredicate) predicate); return evalBoolPredicate(data, value, (BooleanFilterPredicate) predicate, filter);
case COMPLEX: case COMPLEX:
return evalComplexPredicate(data, value, (ComplexFilterPredicate) predicate); return evalComplexPredicate(data, value, (ComplexFilterPredicate) predicate, filter);
default: default:
return false; 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()) { switch (predicate.getOperation()) {
case OR: case OR:
for (KeyFilterPredicate kfp : predicate.getPredicates()) { for (KeyFilterPredicate kfp : predicate.getPredicates()) {
if (eval(data, ekv, kfp)) { if (eval(data, ekv, kfp, filter)) {
return true; return true;
} }
} }
return false; return false;
case AND: case AND:
for (KeyFilterPredicate kfp : predicate.getPredicates()) { for (KeyFilterPredicate kfp : predicate.getPredicates()) {
if (!eval(data, ekv, kfp)) { if (!eval(data, ekv, kfp, filter)) {
return false; 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); Boolean val = getBoolValue(ekv);
if (val == null) { if (val == null) {
return false; 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()) { switch (predicate.getOperation()) {
case EQUAL: case EQUAL:
return val.equals(predicateValue); 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); Double val = getDblValue(ekv);
if (val == null) { if (val == null) {
return false; 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()) { switch (predicate.getOperation()) {
case NOT_EQUAL: case NOT_EQUAL:
return !val.equals(predicateValue); 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); String val = getStrValue(ekv);
if (val == null) { if (val == null) {
return false; 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()) { if (predicate.isIgnoreCase()) {
val = val.toLowerCase(); val = val.toLowerCase();
predicateValue = predicateValue.toLowerCase(); predicateValue = predicateValue.toLowerCase();
@ -404,7 +410,7 @@ class AlarmRuleState {
} }
} }
private <T> T getPredicateValue(DataSnapshot data, FilterPredicateValue<T> value, Function<EntityKeyValue, T> transformFunction) { private <T> T getPredicateValue(DataSnapshot data, FilterPredicateValue<T> value, AlarmConditionFilter filter, Function<EntityKeyValue, T> transformFunction) {
EntityKeyValue ekv = getDynamicPredicateValue(data, value); EntityKeyValue ekv = getDynamicPredicateValue(data, value);
if (ekv != null) { if (ekv != null) {
T result = transformFunction.apply(ekv); T result = transformFunction.apply(ekv);
@ -412,7 +418,11 @@ class AlarmRuleState {
return result; return result;
} }
} }
return value.getDefaultValue(); if (filter.getKey().getType() != AlarmConditionKeyType.CONSTANT) {
return value.getDefaultValue();
} else {
return null;
}
} }
private <T> EntityKeyValue getDynamicPredicateValue(DataSnapshot data, FilterPredicateValue<T> value) { private <T> EntityKeyValue getDynamicPredicateValue(DataSnapshot data, FilterPredicateValue<T> value) {