summaryrefslogtreecommitdiff
path: root/groot-api/src/main/java
diff options
context:
space:
mode:
authorwangkuan <[email protected]>2024-11-18 14:07:29 +0800
committerwangkuan <[email protected]>2024-11-18 14:07:29 +0800
commit85f95e2c20ad76d9a00b188aa41ce6fef9a2ac99 (patch)
tree1b6d8a67a5672f516aa8764a4669b3efbd680f2b /groot-api/src/main/java
parent7d6c1eb13837931b4b526f05adb550a58fec1aea (diff)
[fix][core][api]统一Aviator表达式语法和调用方式,所有processor和函数使用表达式不需要使用event.字段名。
Diffstat (limited to 'groot-api/src/main/java')
-rw-r--r--groot-api/src/main/java/com/geedgenetworks/api/common/udf/UdfEntity.java3
-rw-r--r--groot-api/src/main/java/com/geedgenetworks/api/expressions/AviatorExecutor.java55
-rw-r--r--groot-api/src/main/java/com/geedgenetworks/api/expressions/Calc.java24
-rw-r--r--groot-api/src/main/java/com/geedgenetworks/api/expressions/SyntaxErrorException.java20
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);
+ }
+}