diff options
| author | chaochaoc <[email protected]> | 2024-04-25 16:55:31 +0800 |
|---|---|---|
| committer | chaochaoc <[email protected]> | 2024-04-25 16:55:31 +0800 |
| commit | 58700b8af8969f3b2226e44973a923eb7d8b7bfd (patch) | |
| tree | 3d1f6240ffb5386f41ad1bece5bf51c7c7197723 | |
| parent | 7224656b121b39c28703772f43994a44e72c5960 (diff) | |
[GAL-556] feat: support string add operation
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 |
