Browse Source

Alarm rules CF: complex operation in alarm condition filter

pull/14276/head
Viacheslav Klimov 11 months ago
parent
commit
5515714fa7
  1. 35
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java
  2. 12
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  3. 4
      application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java
  4. 4
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java

35
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/alarm/AlarmCalculatedFieldState.java

@ -402,28 +402,27 @@ public class AlarmCalculatedFieldState extends BaseCalculatedFieldState {
operation = ComplexOperation.AND;
}
return switch (operation) {
case OR -> {
for (AlarmConditionFilter filter : simpleExpression.getFilters()) {
SingleValueArgumentEntry argument = getArgument(filter.getArgument());
if (eval(argument, filter.getPredicate())) {
yield true;
}
}
yield false;
}
case AND -> {
for (AlarmConditionFilter filter : simpleExpression.getFilters()) {
SingleValueArgumentEntry argument = getArgument(filter.getArgument());
if (!eval(argument, filter.getPredicate())) {
yield false;
}
}
yield true;
}
case AND -> simpleExpression.getFilters().stream()
.allMatch(filter -> eval(getArgument(filter.getArgument()), filter));
case OR -> simpleExpression.getFilters().stream()
.anyMatch(filter -> eval(getArgument(filter.getArgument()), filter));
};
}
}
private boolean eval(SingleValueArgumentEntry argument, AlarmConditionFilter filter) {
ComplexOperation operation = filter.getOperation();
if (operation == null) {
operation = ComplexOperation.AND;
}
return switch (operation) {
case AND -> filter.getPredicates().stream()
.allMatch(predicate -> eval(argument, predicate));
case OR -> filter.getPredicates().stream()
.anyMatch(predicate -> eval(argument, predicate));
};
}
private boolean eval(SingleValueArgumentEntry argument, KeyFilterPredicate predicate) {
return switch (predicate.getType()) {
case STRING -> evalStrPredicate(argument, (StringFilterPredicate) predicate);

12
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -461,7 +461,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
BooleanFilterPredicate temperatureAlarmFlagAttributePredicate = new BooleanFilterPredicate();
temperatureAlarmFlagAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
temperatureAlarmFlagAttributePredicate.setValue(new AlarmConditionValue<>(Boolean.TRUE, null));
temperatureAlarmFlagFilter.setPredicate(temperatureAlarmFlagAttributePredicate);
temperatureAlarmFlagFilter.setPredicates(List.of(temperatureAlarmFlagAttributePredicate));
AlarmConditionFilter temperatureFilter = new AlarmConditionFilter();
temperatureFilter.setArgument("temperature");
@ -469,7 +469,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
NumericFilterPredicate temperatureFilterPredicate = new NumericFilterPredicate();
temperatureFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
temperatureFilterPredicate.setValue(new AlarmConditionValue<>(null, "temperatureAlarmThreshold"));
temperatureFilter.setPredicate(temperatureFilterPredicate);
temperatureFilter.setPredicates(List.of(temperatureFilterPredicate));
temperatureCondition.setExpression(new SimpleAlarmConditionExpression(List.of(temperatureAlarmFlagFilter, temperatureFilter), ComplexOperation.AND));
temperatureRule.setCondition(temperatureCondition);
temperatureRule.setAlarmDetails("Current temperature = ${temperature}");
@ -486,7 +486,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
NumericFilterPredicate clearTemperatureFilterPredicate = new NumericFilterPredicate();
clearTemperatureFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS_OR_EQUAL);
clearTemperatureFilterPredicate.setValue(new AlarmConditionValue<>(null, "temperatureAlarmThreshold"));
clearTemperatureFilter.setPredicate(clearTemperatureFilterPredicate);
clearTemperatureFilter.setPredicates(List.of(clearTemperatureFilterPredicate));
clearTemperatureCondition.setExpression(new SimpleAlarmConditionExpression(List.of(clearTemperatureFilter), ComplexOperation.AND));
clearTemperatureRule.setCondition(clearTemperatureCondition);
clearTemperatureRule.setAlarmDetails("Current temperature = ${temperature}");
@ -525,7 +525,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
BooleanFilterPredicate humidityAlarmFlagPredicate = new BooleanFilterPredicate();
humidityAlarmFlagPredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
humidityAlarmFlagPredicate.setValue(new AlarmConditionValue<>(Boolean.TRUE, null));
humidityAlarmFlagAttributeFilter.setPredicate(humidityAlarmFlagPredicate);
humidityAlarmFlagAttributeFilter.setPredicates(List.of(humidityAlarmFlagPredicate));
AlarmConditionFilter humidityFilter = new AlarmConditionFilter();
humidityFilter.setArgument("humidity");
@ -533,7 +533,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
NumericFilterPredicate humidityFilterPredicate = new NumericFilterPredicate();
humidityFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS);
humidityFilterPredicate.setValue(new AlarmConditionValue<>(null, "humidityAlarmThreshold"));
humidityFilter.setPredicate(humidityFilterPredicate);
humidityFilter.setPredicates(List.of(humidityFilterPredicate));
humidityCondition.setExpression(new SimpleAlarmConditionExpression(List.of(humidityAlarmFlagAttributeFilter, humidityFilter), ComplexOperation.AND));
humidityRule.setCondition(humidityCondition);
humidityRule.setAlarmDetails("Current humidity = ${humidity}");
@ -550,7 +550,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
NumericFilterPredicate clearHumidityFilterPredicate = new NumericFilterPredicate();
clearHumidityFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER_OR_EQUAL);
clearHumidityFilterPredicate.setValue(new AlarmConditionValue<>(null, "humidityAlarmThreshold"));
clearHumidityFilter.setPredicate(clearHumidityFilterPredicate);
clearHumidityFilter.setPredicates(List.of(clearHumidityFilterPredicate));
clearHumidityCondition.setExpression(new SimpleAlarmConditionExpression(List.of(clearHumidityFilter), ComplexOperation.AND));
clearHumidityRule.setCondition(clearHumidityCondition);
clearHumidityRule.setAlarmDetails("Current humidity = ${humidity}");

4
application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java

@ -174,7 +174,7 @@ public class AlarmRulesTest extends AbstractControllerTest {
AlarmConditionValue<Double> thresholdValue = new AlarmConditionValue<>();
thresholdValue.setStaticValue(100.0);
predicate.setValue(thresholdValue);
filter.setPredicate(predicate);
filter.setPredicates(List.of(predicate));
simpleExpression.setFilters(List.of(filter));
simpleExpression.setOperation(ComplexOperation.AND);
Map<AlarmSeverity, Condition> createRules = Map.of(
@ -860,7 +860,7 @@ public class AlarmRulesTest extends AbstractControllerTest {
StringFilterPredicate predicate = new StringFilterPredicate();
predicate.setOperation(stringOperation);
predicate.setValue(conditionValue);
filter.setPredicate(predicate);
filter.setPredicates(List.of(predicate));
simpleExpression.setFilters(List.of(filter));
return simpleExpression;
}

4
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/AlarmConditionFilter.java

@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.alarm.rule.condition.expression.predic
import org.thingsboard.server.common.data.query.EntityKeyValueType;
import java.io.Serializable;
import java.util.List;
@Data
public class AlarmConditionFilter implements Serializable {
@ -31,8 +32,9 @@ public class AlarmConditionFilter implements Serializable {
private String argument;
@NotNull
private EntityKeyValueType valueType;
private ComplexOperation operation;
@Valid
@NotNull
private KeyFilterPredicate predicate;
private List<KeyFilterPredicate> predicates;
}

Loading…
Cancel
Save