summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchaochaoc <[email protected]>2024-04-25 16:55:31 +0800
committerchaochaoc <[email protected]>2024-04-25 16:55:31 +0800
commit58700b8af8969f3b2226e44973a923eb7d8b7bfd (patch)
tree3d1f6240ffb5386f41ad1bece5bf51c7c7197723
parent7224656b121b39c28703772f43994a44e72c5960 (diff)
[GAL-556] feat: support string add operation
-rw-r--r--groot-core/src/main/java/com/geedgenetworks/core/expressions/codegen/EvalCodeGenerator.java23
-rw-r--r--groot-core/src/test/java/com/geedgenetworks/core/udf/test/eval/codegen/CalcCodeConvertorTest.java10
2 files changed, 28 insertions, 5 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 69325ef..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,11 +79,30 @@ 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("((java.lang.Number)%s).intValue() + ((java.lang.Number)%s).intValue()", 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);
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 835ab8d..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
@@ -130,7 +131,10 @@ class CalcCodeConvertorTest {
() -> 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