separated expression from output

This commit is contained in:
IrynaMatveieva 2024-11-21 17:39:16 +02:00
parent c75603f57c
commit 6ed4abb903
12 changed files with 54 additions and 23 deletions

View File

@ -253,9 +253,9 @@ public class DefaultCalculatedFieldExecutionService extends AbstractPartitionBas
CalculatedFieldConfiguration newConfig = newCalculatedField.getConfiguration();
boolean argumentsChanged = !oldConfig.getArguments().equals(newConfig.getArguments());
boolean outputTypeChanged = !oldConfig.getOutput().getType().equals(newConfig.getOutput().getType());
boolean outputExpressionChanged = !oldConfig.getOutput().getExpression().equals(newConfig.getOutput().getExpression());
boolean expressionChanged = !oldConfig.getExpression().equals(newConfig.getExpression());
return entityIdChanged || typeChanged || argumentsChanged || outputTypeChanged || outputExpressionChanged;
return entityIdChanged || typeChanged || argumentsChanged || outputTypeChanged || expressionChanged;
}
private void fetchCalculatedFields() {

View File

@ -96,7 +96,7 @@ public class ScriptCalculatedFieldState implements CalculatedFieldState {
calculatedFieldScriptEngine = new CalculatedFieldTbelScriptEngine(
tenantId,
tbelInvokeService,
calculatedFieldConfiguration.getOutput().getExpression(),
calculatedFieldConfiguration.getExpression(),
arguments.keySet().toArray(new String[0])
);
}

View File

@ -57,7 +57,7 @@ public class SimpleCalculatedFieldState implements CalculatedFieldState {
if (isValid(this.arguments, arguments)) {
CalculatedFieldResult result = new CalculatedFieldResult();
String expression = output.getExpression();
String expression = calculatedFieldConfiguration.getExpression();
ThreadLocal<Expression> customExpression = new ThreadLocal<>();
var expr = customExpression.get();
if (expr == null) {

View File

@ -21,10 +21,10 @@ import org.junit.Test;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.configuration.Output;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.DeviceId;
@ -145,9 +145,11 @@ public class CalculatedFieldControllerTest extends AbstractControllerTest {
config.setArguments(Map.of("T", argument));
config.setExpression("T - (100 - H) / 5");
Output output = new Output();
output.setName("output");
output.setType("TIME_SERIES");
output.setExpression("T - (100 - H) / 5");
config.setOutput(output);

View File

@ -40,6 +40,7 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
private final ObjectMapper mapper = new ObjectMapper();
protected Map<String, Argument> arguments;
protected String expression;
protected Output output;
public BaseCalculatedFieldConfiguration() {
@ -48,6 +49,7 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
public BaseCalculatedFieldConfiguration(JsonNode config, EntityType entityType, UUID entityId) {
BaseCalculatedFieldConfiguration calculatedFieldConfig = toCalculatedFieldConfig(config, entityType, entityId);
this.arguments = calculatedFieldConfig.getArguments();
this.expression = calculatedFieldConfig.getExpression();
this.output = calculatedFieldConfig.getOutput();
}
@ -101,12 +103,17 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
argumentNode.put("defaultValue", argument.getDefaultValue());
});
if (expression != null) {
configNode.put("expression", expression);
}
if (output != null) {
ObjectNode outputNode = configNode.putObject("output");
outputNode.put("name", output.getName());
outputNode.put("type", output.getType());
outputNode.put("scope", String.valueOf(output.getScope()));
outputNode.put("expression", output.getExpression());
if (output.getScope() != null) {
outputNode.put("scope", String.valueOf(output.getScope()));
}
}
return configNode;
@ -133,20 +140,30 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
}
argument.setKey(argumentNode.get("key").asText());
argument.setType(argumentNode.get("type").asText());
argument.setScope(AttributeScope.valueOf(argumentNode.get("scope").asText()));
JsonNode scope = argumentNode.get("scope");
if (scope != null && !scope.isNull() && !scope.asText().equals("null")) {
argument.setScope(AttributeScope.valueOf(scope.asText()));
}
argument.setDefaultValue(argumentNode.get("defaultValue").asText());
arguments.put(key, argument);
});
}
this.setArguments(arguments);
JsonNode expressionNode = config.get("expression");
if (expressionNode != null && expressionNode.isTextual()) {
this.setExpression(expressionNode.asText());
}
JsonNode outputNode = config.get("output");
if (outputNode != null) {
Output output = new Output();
output.setName(outputNode.get("name").asText());
output.setType(outputNode.get("type").asText());
output.setScope(AttributeScope.valueOf(outputNode.get("scope").asText()));
output.setExpression(outputNode.get("expression").asText());
JsonNode scope = outputNode.get("scope");
if (scope != null && !scope.isNull() && !scope.asText().equals("null")) {
output.setScope(AttributeScope.valueOf(scope.asText()));
}
this.setOutput(output);
}

View File

@ -44,6 +44,8 @@ public interface CalculatedFieldConfiguration {
Map<String, Argument> getArguments();
String getExpression();
Output getOutput();
@JsonIgnore

View File

@ -24,6 +24,5 @@ public class Output {
private String name;
private String type;
private AttributeScope scope;
private String expression;
}

View File

@ -25,10 +25,11 @@ import org.springframework.transaction.support.TransactionTemplate;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.CalculatedFieldLink;
import org.thingsboard.server.common.data.cf.CalculatedFieldLinkConfiguration;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.configuration.ScriptCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.CalculatedFieldId;
import org.thingsboard.server.common.data.id.CalculatedFieldLinkId;
@ -138,6 +139,8 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
switch (type) {
case SIMPLE:
return new SimpleCalculatedFieldConfiguration(config, entityType, entityId);
case SCRIPT:
return new ScriptCalculatedFieldConfiguration(config, entityType, entityId);
default:
throw new IllegalArgumentException("Unsupported calculated field type: " + type + "!");
}

View File

@ -30,9 +30,9 @@ import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetInfo;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.Output;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.CustomerId;
@ -889,9 +889,11 @@ public class AssetServiceTest extends AbstractServiceTest {
config.setArguments(Map.of("T", argument));
config.setExpression("T - (100 - H) / 5");
Output output = new Output();
output.setName("output");
output.setType("TIME_SERIES");
output.setExpression("T - (100 - H) / 5");
config.setOutput(output);

View File

@ -23,10 +23,10 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.CalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.configuration.Output;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.CalculatedFieldId;
@ -158,9 +158,11 @@ public class CalculatedFieldServiceTest extends AbstractServiceTest {
config.setArguments(Map.of("T", argument));
config.setExpression("T - (100 - H) / 5");
Output output = new Output();
output.setName("output");
output.setType("TIME_SERIES");
output.setExpression("T - (100 - H) / 5");
config.setOutput(output);

View File

@ -31,9 +31,9 @@ import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.Output;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.TenantId;
@ -384,9 +384,11 @@ public class CustomerServiceTest extends AbstractServiceTest {
config.setArguments(Map.of("T", argument));
config.setExpression("T - (100 - H) / 5");
Output output = new Output();
output.setName("output");
output.setType("TIME_SERIES");
output.setExpression("T - (100 - H) / 5");
config.setOutput(output);

View File

@ -39,9 +39,9 @@ import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.Output;
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.id.CustomerId;
@ -1227,9 +1227,11 @@ public class DeviceServiceTest extends AbstractServiceTest {
config.setArguments(Map.of("T", argument));
config.setExpression("T - (100 - H) / 5");
Output output = new Output();
output.setName("output");
output.setType("TIME_SERIES");
output.setExpression("T - (100 - H) / 5");
config.setOutput(output);