summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author梁超 <[email protected]>2024-04-25 09:00:53 +0000
committer梁超 <[email protected]>2024-04-25 09:00:53 +0000
commite042742843484dbb76564a676c584b701c56d7c8 (patch)
tree3d1f6240ffb5386f41ad1bece5bf51c7c7197723
parentfe9780b220799ef4622dfc966579f89b3eea91d6 (diff)
parent58700b8af8969f3b2226e44973a923eb7d8b7bfd (diff)
Merge branch 'hotfix/arithmetic-operations' into 'release/1.2.4'v1.2.4release/1.2.4
[GAL-556] feat: Eval function impl addition and subtraction operations on reference fields See merge request galaxy/platform/groot-stream!39
-rw-r--r--groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java25
-rw-r--r--groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java19
-rw-r--r--pom.xml2
3 files changed, 39 insertions, 7 deletions
diff --git a/groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java b/groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java
index bb6b826..5bb924c 100644
--- a/groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java
+++ b/groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java
@@ -79,17 +79,36 @@ public class EvalCodeGenerator implements ExpressionVisitor<String> {
ArithmeticOperator operator = expression.getOperator();
String leftTerm = visit(expression.getLeft());
String rightTerm = visit(expression.getRight());
- String name = ctx.addLocalObjectVariable(true);
+
+ // Only Plus
+ String value1 = ctx.addLocalObjectVariable(true);
+ String value2 = ctx.addLocalObjectVariable(true);
+
+ String name = ctx.addLocalObjectVariable(false);
String code = name + " = ";
switch (operator) {
case PLUS:
- code += String.format("%s + %s", leftTerm, rightTerm);
+ code += "null;\n";
+
+ code += String.format("%s = %s;", value1, leftTerm);
+ code += String.format("%s = %s;", value2, rightTerm);
+
+ code += String.format("if ( (%s instanceof java.lang.String) || (%s instanceof java.lang.String) ) {\n" +
+ "%s = %s.toString() + %s.toString();\n" +
+ "}", value1, value2, name, value1, value2);
+ code += String.format("else if ( (%s instanceof java.lang.Number) && (%s instanceof java.lang.Number) ) {\n" +
+ "%s = ((java.lang.Number)%s).intValue() + ((java.lang.Number)%s).intValue();\n" +
+ "}", value1, value2, name, value1, value2);
+ code += String.format("else {" +
+ "throw new com.geedgenetworks.core.expressions.InvalidProgramException(" +
+ "\"Addition operation is not supported, values: [\" + %s + \", \" + %s + \"]\");\n" +
+ "}\n", value1, value2);
break;
case ASTERISK:
code += String.format("%s * %s", leftTerm, rightTerm);
break;
case MINUS:
- code += String.format("%s - %s", leftTerm, rightTerm);
+ code += String.format("((java.lang.Number)%s).intValue() - ((java.lang.Number)%s).intValue()", leftTerm, rightTerm);
break;
case PERCENT:
code += leftTerm + " % " + rightTerm;
diff --git a/groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java b/groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java
index 8572db2..01ef9db 100644
--- a/groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java
+++ b/groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java
@@ -1,6 +1,6 @@
package com.geedgenetworks.core.udf.test.eval.codegen;
-
+import com.geedgenetworks.core.expressions.Calc;
import com.geedgenetworks.core.expressions.InvalidProgramException;
import com.geedgenetworks.core.expressions.SyntaxErrorException;
import com.geedgenetworks.core.expressions.codegen.CalcCodeConvertor;
@@ -81,6 +81,7 @@ class CalcCodeConvertorTest {
commonC2sPktNum > commonS2cPktNum
&& commonC2sByteNum > commonS2cByteNum ? commonClientPort : commonServerPort
);
+
}
@Test
@@ -116,12 +117,24 @@ class CalcCodeConvertorTest {
}
@Test
+ public void testFieldArithmeticExpression() throws Exception {
+ assertEquals(1,
+ CalcCodeConvertor.convert("common_c2s_pkt_num - common_s2c_pkt_num").eval(origin));
+
+ assertEquals(17, CalcCodeConvertor.convert("common_c2s_pkt_num + 10 + 1D").eval(origin));
+
+ }
+
+ @Test
public void testError() {
assertThrows(SyntaxErrorException.class,
() -> CalcCodeConvertor.convert("common_c2s_pkt_num > common_s2c_pkt_num"));
assertThrows(SyntaxErrorException.class,
() -> CalcCodeConvertor.convert("2 = 3"));
- assertThrows(InvalidProgramException.class,
- () -> CalcCodeConvertor.convert("common_client_ip - 10"));
+
+ final Map<String, Object> map = new HashMap<>(origin);
+ map.put("has_address", true);
+ Calc convert = CalcCodeConvertor.convert("common_c2s_pkt_num + has_address");
+ assertThrows(InvalidProgramException.class, () -> convert.eval(map));
}
} \ No newline at end of file
diff --git a/pom.xml b/pom.xml
index da0426e..abac934 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
</modules>
<properties>
- <revision>1.2.3</revision>
+ <revision>1.2.4</revision>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>