summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author窦凤虎 <[email protected]>2024-04-26 10:38:10 +0000
committer窦凤虎 <[email protected]>2024-04-26 10:38:10 +0000
commite2dc8c277af7b60c7ff76047c58266ef816469e7 (patch)
tree1d0d4e68e3b3f1a4841691910452f1dcb2fe016d
parent61d3a6b07058e12934eb1e1ba848489a8e2736df (diff)
parent879bd0ead3a6c886e1f1cc3047518c4c06a69466 (diff)
Merge branch 'hotfix/arithmetic-operations' into 'develop'
[GAL-556] hotfix: Eval function supports addition and subtraction operations. See merge request galaxy/platform/groot-stream!41
-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--groot-formats/pom.xml88
-rw-r--r--pom.xml2
4 files changed, 83 insertions, 51 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/groot-formats/pom.xml b/groot-formats/pom.xml
index 3b38eac..7a6295e 100644
--- a/groot-formats/pom.xml
+++ b/groot-formats/pom.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.geedgenetworks</groupId>
- <artifactId>groot-stream</artifactId>
- <version>${revision}</version>
- </parent>
-
- <artifactId>groot-formats</artifactId>
- <packaging>pom</packaging>
- <name>Groot : Formats :</name>
- <modules>
- <module>format-json</module>
- <module>format-protobuf</module>
- <module>format-msgpack</module>
- <module>format-raw</module>
- </modules>
-
- <dependencies>
- <dependency>
- <groupId>com.geedgenetworks</groupId>
- <artifactId>groot-common</artifactId>
- <version>${revision}</version>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>com.geedgenetworks</groupId>
- <artifactId>groot-core</artifactId>
- <version>${revision}</version>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.apache.flink</groupId>
- <artifactId>flink-table-api-java-bridge_${scala.version}</artifactId>
- </dependency>
-
- </dependencies>
-
-
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.geedgenetworks</groupId>
+ <artifactId>groot-stream</artifactId>
+ <version>${revision}</version>
+ </parent>
+
+ <artifactId>groot-formats</artifactId>
+ <packaging>pom</packaging>
+ <name>Groot : Formats :</name>
+ <modules>
+ <module>format-json</module>
+ <module>format-protobuf</module>
+ <module>format-msgpack</module>
+ <module>format-raw</module>
+ </modules>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.geedgenetworks</groupId>
+ <artifactId>groot-common</artifactId>
+ <version>${revision}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.geedgenetworks</groupId>
+ <artifactId>groot-core</artifactId>
+ <version>${revision}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.flink</groupId>
+ <artifactId>flink-table-api-java-bridge_${scala.version}</artifactId>
+ </dependency>
+
+ </dependencies>
+
+
</project> \ 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>