separated expression from output
This commit is contained in:
parent
c75603f57c
commit
6ed4abb903
@ -253,9 +253,9 @@ public class DefaultCalculatedFieldExecutionService extends AbstractPartitionBas
|
|||||||
CalculatedFieldConfiguration newConfig = newCalculatedField.getConfiguration();
|
CalculatedFieldConfiguration newConfig = newCalculatedField.getConfiguration();
|
||||||
boolean argumentsChanged = !oldConfig.getArguments().equals(newConfig.getArguments());
|
boolean argumentsChanged = !oldConfig.getArguments().equals(newConfig.getArguments());
|
||||||
boolean outputTypeChanged = !oldConfig.getOutput().getType().equals(newConfig.getOutput().getType());
|
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() {
|
private void fetchCalculatedFields() {
|
||||||
|
|||||||
@ -96,7 +96,7 @@ public class ScriptCalculatedFieldState implements CalculatedFieldState {
|
|||||||
calculatedFieldScriptEngine = new CalculatedFieldTbelScriptEngine(
|
calculatedFieldScriptEngine = new CalculatedFieldTbelScriptEngine(
|
||||||
tenantId,
|
tenantId,
|
||||||
tbelInvokeService,
|
tbelInvokeService,
|
||||||
calculatedFieldConfiguration.getOutput().getExpression(),
|
calculatedFieldConfiguration.getExpression(),
|
||||||
arguments.keySet().toArray(new String[0])
|
arguments.keySet().toArray(new String[0])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,7 @@ public class SimpleCalculatedFieldState implements CalculatedFieldState {
|
|||||||
|
|
||||||
if (isValid(this.arguments, arguments)) {
|
if (isValid(this.arguments, arguments)) {
|
||||||
CalculatedFieldResult result = new CalculatedFieldResult();
|
CalculatedFieldResult result = new CalculatedFieldResult();
|
||||||
String expression = output.getExpression();
|
String expression = calculatedFieldConfiguration.getExpression();
|
||||||
ThreadLocal<Expression> customExpression = new ThreadLocal<>();
|
ThreadLocal<Expression> customExpression = new ThreadLocal<>();
|
||||||
var expr = customExpression.get();
|
var expr = customExpression.get();
|
||||||
if (expr == null) {
|
if (expr == null) {
|
||||||
|
|||||||
@ -21,10 +21,10 @@ import org.junit.Test;
|
|||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.User;
|
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.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.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.Output;
|
||||||
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
@ -145,9 +145,11 @@ public class CalculatedFieldControllerTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
config.setArguments(Map.of("T", argument));
|
config.setArguments(Map.of("T", argument));
|
||||||
|
|
||||||
|
config.setExpression("T - (100 - H) / 5");
|
||||||
|
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
|
output.setName("output");
|
||||||
output.setType("TIME_SERIES");
|
output.setType("TIME_SERIES");
|
||||||
output.setExpression("T - (100 - H) / 5");
|
|
||||||
|
|
||||||
config.setOutput(output);
|
config.setOutput(output);
|
||||||
|
|
||||||
|
|||||||
@ -40,6 +40,7 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
|
|||||||
private final ObjectMapper mapper = new ObjectMapper();
|
private final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
protected Map<String, Argument> arguments;
|
protected Map<String, Argument> arguments;
|
||||||
|
protected String expression;
|
||||||
protected Output output;
|
protected Output output;
|
||||||
|
|
||||||
public BaseCalculatedFieldConfiguration() {
|
public BaseCalculatedFieldConfiguration() {
|
||||||
@ -48,6 +49,7 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
|
|||||||
public BaseCalculatedFieldConfiguration(JsonNode config, EntityType entityType, UUID entityId) {
|
public BaseCalculatedFieldConfiguration(JsonNode config, EntityType entityType, UUID entityId) {
|
||||||
BaseCalculatedFieldConfiguration calculatedFieldConfig = toCalculatedFieldConfig(config, entityType, entityId);
|
BaseCalculatedFieldConfiguration calculatedFieldConfig = toCalculatedFieldConfig(config, entityType, entityId);
|
||||||
this.arguments = calculatedFieldConfig.getArguments();
|
this.arguments = calculatedFieldConfig.getArguments();
|
||||||
|
this.expression = calculatedFieldConfig.getExpression();
|
||||||
this.output = calculatedFieldConfig.getOutput();
|
this.output = calculatedFieldConfig.getOutput();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,12 +103,17 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
|
|||||||
argumentNode.put("defaultValue", argument.getDefaultValue());
|
argumentNode.put("defaultValue", argument.getDefaultValue());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (expression != null) {
|
||||||
|
configNode.put("expression", expression);
|
||||||
|
}
|
||||||
|
|
||||||
if (output != null) {
|
if (output != null) {
|
||||||
ObjectNode outputNode = configNode.putObject("output");
|
ObjectNode outputNode = configNode.putObject("output");
|
||||||
outputNode.put("name", output.getName());
|
outputNode.put("name", output.getName());
|
||||||
outputNode.put("type", output.getType());
|
outputNode.put("type", output.getType());
|
||||||
|
if (output.getScope() != null) {
|
||||||
outputNode.put("scope", String.valueOf(output.getScope()));
|
outputNode.put("scope", String.valueOf(output.getScope()));
|
||||||
outputNode.put("expression", output.getExpression());
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return configNode;
|
return configNode;
|
||||||
@ -133,20 +140,30 @@ public abstract class BaseCalculatedFieldConfiguration implements CalculatedFiel
|
|||||||
}
|
}
|
||||||
argument.setKey(argumentNode.get("key").asText());
|
argument.setKey(argumentNode.get("key").asText());
|
||||||
argument.setType(argumentNode.get("type").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());
|
argument.setDefaultValue(argumentNode.get("defaultValue").asText());
|
||||||
arguments.put(key, argument);
|
arguments.put(key, argument);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.setArguments(arguments);
|
this.setArguments(arguments);
|
||||||
|
|
||||||
|
JsonNode expressionNode = config.get("expression");
|
||||||
|
if (expressionNode != null && expressionNode.isTextual()) {
|
||||||
|
this.setExpression(expressionNode.asText());
|
||||||
|
}
|
||||||
|
|
||||||
JsonNode outputNode = config.get("output");
|
JsonNode outputNode = config.get("output");
|
||||||
if (outputNode != null) {
|
if (outputNode != null) {
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
output.setName(outputNode.get("name").asText());
|
output.setName(outputNode.get("name").asText());
|
||||||
output.setType(outputNode.get("type").asText());
|
output.setType(outputNode.get("type").asText());
|
||||||
output.setScope(AttributeScope.valueOf(outputNode.get("scope").asText()));
|
JsonNode scope = outputNode.get("scope");
|
||||||
output.setExpression(outputNode.get("expression").asText());
|
if (scope != null && !scope.isNull() && !scope.asText().equals("null")) {
|
||||||
|
output.setScope(AttributeScope.valueOf(scope.asText()));
|
||||||
|
}
|
||||||
this.setOutput(output);
|
this.setOutput(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -44,6 +44,8 @@ public interface CalculatedFieldConfiguration {
|
|||||||
|
|
||||||
Map<String, Argument> getArguments();
|
Map<String, Argument> getArguments();
|
||||||
|
|
||||||
|
String getExpression();
|
||||||
|
|
||||||
Output getOutput();
|
Output getOutput();
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
|||||||
@ -24,6 +24,5 @@ public class Output {
|
|||||||
private String name;
|
private String name;
|
||||||
private String type;
|
private String type;
|
||||||
private AttributeScope scope;
|
private AttributeScope scope;
|
||||||
private String expression;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,10 +25,11 @@ import org.springframework.transaction.support.TransactionTemplate;
|
|||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedField;
|
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.CalculatedFieldLink;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldLinkConfiguration;
|
import org.thingsboard.server.common.data.cf.CalculatedFieldLinkConfiguration;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
|
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.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.CalculatedFieldId;
|
import org.thingsboard.server.common.data.id.CalculatedFieldId;
|
||||||
import org.thingsboard.server.common.data.id.CalculatedFieldLinkId;
|
import org.thingsboard.server.common.data.id.CalculatedFieldLinkId;
|
||||||
@ -138,6 +139,8 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case SIMPLE:
|
case SIMPLE:
|
||||||
return new SimpleCalculatedFieldConfiguration(config, entityType, entityId);
|
return new SimpleCalculatedFieldConfiguration(config, entityType, entityId);
|
||||||
|
case SCRIPT:
|
||||||
|
return new ScriptCalculatedFieldConfiguration(config, entityType, entityId);
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unsupported calculated field type: " + type + "!");
|
throw new IllegalArgumentException("Unsupported calculated field type: " + type + "!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.Asset;
|
||||||
import org.thingsboard.server.common.data.asset.AssetInfo;
|
import org.thingsboard.server.common.data.asset.AssetInfo;
|
||||||
import org.thingsboard.server.common.data.asset.AssetProfile;
|
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.CalculatedField;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
|
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.Output;
|
||||||
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
@ -889,9 +889,11 @@ public class AssetServiceTest extends AbstractServiceTest {
|
|||||||
|
|
||||||
config.setArguments(Map.of("T", argument));
|
config.setArguments(Map.of("T", argument));
|
||||||
|
|
||||||
|
config.setExpression("T - (100 - H) / 5");
|
||||||
|
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
|
output.setName("output");
|
||||||
output.setType("TIME_SERIES");
|
output.setType("TIME_SERIES");
|
||||||
output.setExpression("T - (100 - H) / 5");
|
|
||||||
|
|
||||||
config.setOutput(output);
|
config.setOutput(output);
|
||||||
|
|
||||||
|
|||||||
@ -23,10 +23,10 @@ import org.junit.Test;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.thingsboard.common.util.ThingsBoardExecutors;
|
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||||
import org.thingsboard.server.common.data.Device;
|
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.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.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.Output;
|
||||||
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.CalculatedFieldId;
|
import org.thingsboard.server.common.data.id.CalculatedFieldId;
|
||||||
@ -158,9 +158,11 @@ public class CalculatedFieldServiceTest extends AbstractServiceTest {
|
|||||||
|
|
||||||
config.setArguments(Map.of("T", argument));
|
config.setArguments(Map.of("T", argument));
|
||||||
|
|
||||||
|
config.setExpression("T - (100 - H) / 5");
|
||||||
|
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
|
output.setName("output");
|
||||||
output.setType("TIME_SERIES");
|
output.setType("TIME_SERIES");
|
||||||
output.setExpression("T - (100 - H) / 5");
|
|
||||||
|
|
||||||
config.setOutput(output);
|
config.setOutput(output);
|
||||||
|
|
||||||
|
|||||||
@ -31,9 +31,9 @@ import org.thingsboard.common.util.ThingsBoardExecutors;
|
|||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
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.CalculatedField;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
|
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.Output;
|
||||||
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
@ -384,9 +384,11 @@ public class CustomerServiceTest extends AbstractServiceTest {
|
|||||||
|
|
||||||
config.setArguments(Map.of("T", argument));
|
config.setArguments(Map.of("T", argument));
|
||||||
|
|
||||||
|
config.setExpression("T - (100 - H) / 5");
|
||||||
|
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
|
output.setName("output");
|
||||||
output.setType("TIME_SERIES");
|
output.setType("TIME_SERIES");
|
||||||
output.setExpression("T - (100 - H) / 5");
|
|
||||||
|
|
||||||
config.setOutput(output);
|
config.setOutput(output);
|
||||||
|
|
||||||
|
|||||||
@ -39,9 +39,9 @@ import org.thingsboard.server.common.data.OtaPackageInfo;
|
|||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.TenantProfile;
|
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.CalculatedField;
|
||||||
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
|
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.Output;
|
||||||
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration;
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
@ -1227,9 +1227,11 @@ public class DeviceServiceTest extends AbstractServiceTest {
|
|||||||
|
|
||||||
config.setArguments(Map.of("T", argument));
|
config.setArguments(Map.of("T", argument));
|
||||||
|
|
||||||
|
config.setExpression("T - (100 - H) / 5");
|
||||||
|
|
||||||
Output output = new Output();
|
Output output = new Output();
|
||||||
|
output.setName("output");
|
||||||
output.setType("TIME_SERIES");
|
output.setType("TIME_SERIES");
|
||||||
output.setExpression("T - (100 - H) / 5");
|
|
||||||
|
|
||||||
config.setOutput(output);
|
config.setOutput(output);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user