diff options
| author | wangkuan <[email protected]> | 2024-11-18 14:07:29 +0800 |
|---|---|---|
| committer | wangkuan <[email protected]> | 2024-11-18 14:07:29 +0800 |
| commit | 85f95e2c20ad76d9a00b188aa41ce6fef9a2ac99 (patch) | |
| tree | 1b6d8a67a5672f516aa8764a4669b3efbd680f2b /groot-api/src/main/java/com | |
| parent | 7d6c1eb13837931b4b526f05adb550a58fec1aea (diff) | |
[fix][core][api]统一Aviator表达式语法和调用方式,所有processor和函数使用表达式不需要使用event.字段名。
Diffstat (limited to 'groot-api/src/main/java/com')
4 files changed, 101 insertions, 1 deletions
diff --git a/groot-api/src/main/java/com/geedgenetworks/api/common/udf/UdfEntity.java b/groot-api/src/main/java/com/geedgenetworks/api/common/udf/UdfEntity.java index d8434d6..771bc66 100644 --- a/groot-api/src/main/java/com/geedgenetworks/api/common/udf/UdfEntity.java +++ b/groot-api/src/main/java/com/geedgenetworks/api/common/udf/UdfEntity.java @@ -1,4 +1,5 @@ package com.geedgenetworks.api.common.udf; +import com.geedgenetworks.api.expressions.AviatorExecutor; import com.googlecode.aviator.Expression; import lombok.Data; @@ -9,7 +10,7 @@ public class UdfEntity implements Serializable { private ScalarFunction scalarFunction; private AggregateFunction aggregateFunction; private TableFunction tableFunction; - private Expression filterExpression; + private AviatorExecutor aviatorExecutor; private String name; private String className; private UDFContext udfContext; diff --git a/groot-api/src/main/java/com/geedgenetworks/api/expressions/AviatorExecutor.java b/groot-api/src/main/java/com/geedgenetworks/api/expressions/AviatorExecutor.java new file mode 100644 index 0000000..8052e12 --- /dev/null +++ b/groot-api/src/main/java/com/geedgenetworks/api/expressions/AviatorExecutor.java @@ -0,0 +1,55 @@ +package com.geedgenetworks.api.expressions; + +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.AviatorEvaluatorInstance; +import com.googlecode.aviator.Expression; +import com.googlecode.aviator.Options; +import com.googlecode.aviator.exception.ExpressionRuntimeException; +import com.googlecode.aviator.exception.ExpressionSyntaxErrorException; + +import java.util.Map; + +/** + * Eval Function Executor. + * + * @author chaoc + * @since 1.5 + */ +public final class AviatorExecutor implements Calc { + + private final Expression script; + + public AviatorExecutor(String script) { + try { + AviatorEvaluator.validate(script); + AviatorEvaluatorInstance instance = AviatorEvaluator.getInstance(); + instance.setCachedExpressionByDefault(true); + instance.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); + instance.setFunctionMissing(null); + this.script = instance.compile(script,true); + } catch (ExpressionSyntaxErrorException + | ExpressionRuntimeException e) { + throw new SyntaxErrorException("Eval script syntax error. ", e); + } + } + + @Override + public Object eval(final Map<String, Object> data) { + return script.execute(data); + } + + @Override + public Boolean filter(Map<String, Object> data) { + + boolean result; + Object object = script.execute(data); + if (object != null) { + result = (Boolean) object; + } else { + throw new ExpressionRuntimeException(); + } + return result; + } + + +} diff --git a/groot-api/src/main/java/com/geedgenetworks/api/expressions/Calc.java b/groot-api/src/main/java/com/geedgenetworks/api/expressions/Calc.java new file mode 100644 index 0000000..418ab8b --- /dev/null +++ b/groot-api/src/main/java/com/geedgenetworks/api/expressions/Calc.java @@ -0,0 +1,24 @@ +package com.geedgenetworks.api.expressions; + +import java.io.Serializable; +import java.util.Map; + +/** + * The Calc interface represents a calculation operation that can be evaluated with input data + * provided as a map. + * + * @author chaoc + * @since 1.0 + */ +public interface Calc extends Serializable { + + /** + * Evaluates the calculation operation with the given input data. + * + * @param data A map containing input data for the calculation. + * @return The result of the calculation operation. + */ + Object eval(final Map<String, Object> data); + Boolean filter(final Map<String, Object> data); + +} diff --git a/groot-api/src/main/java/com/geedgenetworks/api/expressions/SyntaxErrorException.java b/groot-api/src/main/java/com/geedgenetworks/api/expressions/SyntaxErrorException.java new file mode 100644 index 0000000..72e3e49 --- /dev/null +++ b/groot-api/src/main/java/com/geedgenetworks/api/expressions/SyntaxErrorException.java @@ -0,0 +1,20 @@ +package com.geedgenetworks.api.expressions; + +/** + * Exception class representing a syntax error that may occur during program execution. + * + * @author chaoc + * @since 1.0 + */ +public class SyntaxErrorException extends RuntimeException { + + public SyntaxErrorException() {} + + public SyntaxErrorException(String message) { + super(message); + } + + public SyntaxErrorException(String message, Throwable cause) { + super(message, cause); + } +} |
