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();
 | 
			
		||||
        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() {
 | 
			
		||||
 | 
			
		||||
@ -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])
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -44,6 +44,8 @@ public interface CalculatedFieldConfiguration {
 | 
			
		||||
 | 
			
		||||
    Map<String, Argument> getArguments();
 | 
			
		||||
 | 
			
		||||
    String getExpression();
 | 
			
		||||
 | 
			
		||||
    Output getOutput();
 | 
			
		||||
 | 
			
		||||
    @JsonIgnore
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,5 @@ public class Output {
 | 
			
		||||
    private String name;
 | 
			
		||||
    private String type;
 | 
			
		||||
    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.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 + "!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user