From 67c026bb3cdff2c23074b64091cedd88261adcaf Mon Sep 17 00:00:00 2001 From: chaochaoc <13051077615@126.com> Date: Thu, 25 Apr 2024 15:21:38 +0800 Subject: [GAL-556] feat: Eval function impl addition and subtraction operations on reference fields --- .../core/expressions/codegen/EvalCodeGenerator.java | 4 ++-- .../core/udf/test/eval/codegen/CalcCodeConvertorTest.java | 9 +++++++++ 2 files changed, 11 insertions(+), 2 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..69325ef 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 @@ -83,13 +83,13 @@ public class EvalCodeGenerator implements ExpressionVisitor { String code = name + " = "; switch (operator) { case PLUS: - code += String.format("%s + %s", leftTerm, rightTerm); + code += String.format("((java.lang.Number)%s).intValue() + ((java.lang.Number)%s).intValue()", leftTerm, rightTerm); 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..835ab8d 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 @@ -115,6 +115,15 @@ class CalcCodeConvertorTest { CalcCodeConvertor.convert(" 5 | flags == 13 ? 'A' : 'B'").eval(map1)); } + @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, -- cgit v1.2.3 From 7224656b121b39c28703772f43994a44e72c5960 Mon Sep 17 00:00:00 2001 From: chaochaoc <13051077615@126.com> Date: Thu, 25 Apr 2024 15:51:33 +0800 Subject: chore: update versions --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index da0426e..abac934 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ - 1.2.3 + 1.2.4 11 UTF-8 ${java.version} -- cgit v1.2.3 From 58700b8af8969f3b2226e44973a923eb7d8b7bfd Mon Sep 17 00:00:00 2001 From: chaochaoc <13051077615@126.com> Date: Thu, 25 Apr 2024 16:55:31 +0800 Subject: [GAL-556] feat: support string add operation --- .../expressions/codegen/EvalCodeGenerator.java | 23 ++++++++++++++++++++-- .../test/eval/codegen/CalcCodeConvertorTest.java | 10 +++++++--- 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 { 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 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 -- cgit v1.2.3