Ignore default value for filters with constant key type
This commit is contained in:
parent
fa462467fb
commit
68a73caada
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user