You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@storm.apache.org by sr...@apache.org on 2015/10/29 21:17:08 UTC
storm git commit: STORM-1130. Support AND, OR,
NOT operators in StormSQL.
Repository: storm
Updated Branches:
refs/heads/STORM-1040 2955a7893 -> 254e4cc1c
STORM-1130. Support AND, OR, NOT operators in StormSQL.
Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/254e4cc1
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/254e4cc1
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/254e4cc1
Branch: refs/heads/STORM-1040
Commit: 254e4cc1cf0c3710e45bef1e33798d7236398ae8
Parents: 2955a78
Author: Haohui Mai <wh...@apache.org>
Authored: Mon Oct 26 17:29:20 2015 -0700
Committer: Haohui Mai <wh...@apache.org>
Committed: Tue Oct 27 13:10:19 2015 -0700
----------------------------------------------------------------------
.../apache/storm/sql/compiler/ExprCompiler.java | 75 +++++++++++++++++---
.../storm/sql/compiler/TestExprCompiler.java | 1 -
.../storm/sql/compiler/TestPlanCompiler.java | 27 ++++++-
3 files changed, 91 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/254e4cc1/external/sql/storm-sql-core/src/jvm/org/apache/storm/sql/compiler/ExprCompiler.java
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-core/src/jvm/org/apache/storm/sql/compiler/ExprCompiler.java b/external/sql/storm-sql-core/src/jvm/org/apache/storm/sql/compiler/ExprCompiler.java
index b9d8f88..0d35593 100644
--- a/external/sql/storm-sql-core/src/jvm/org/apache/storm/sql/compiler/ExprCompiler.java
+++ b/external/sql/storm-sql-core/src/jvm/org/apache/storm/sql/compiler/ExprCompiler.java
@@ -42,6 +42,7 @@ import java.util.AbstractMap;
import java.util.IdentityHashMap;
import java.util.Map;
+import static org.apache.calcite.sql.fun.SqlStdOperatorTable.AND;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.DIVIDE;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.DIVIDE_INTEGER;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.GREATER_THAN;
@@ -50,6 +51,8 @@ import static org.apache.calcite.sql.fun.SqlStdOperatorTable.LESS_THAN;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.LESS_THAN_OR_EQUAL;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.MINUS;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.MULTIPLY;
+import static org.apache.calcite.sql.fun.SqlStdOperatorTable.NOT;
+import static org.apache.calcite.sql.fun.SqlStdOperatorTable.OR;
import static org.apache.calcite.sql.fun.SqlStdOperatorTable.PLUS;
/**
@@ -71,8 +74,10 @@ class ExprCompiler implements RexVisitor<String> {
if (expr.containsKey(rexInputRef)) {
return expr.get(rexInputRef);
}
- String name = printExpr(rexInputRef, String.format("_data.get(%d)",
- rexInputRef.getIndex()));
+ String name = reserveName(rexInputRef);
+ String typeName = javaTypeName(rexInputRef);
+ pw.print(String.format("%s %s = (%s)(_data.get(%d));\n", typeName, name,
+ typeName, rexInputRef.getIndex()));
expr.put(rexInputRef, name);
return name;
}
@@ -149,12 +154,14 @@ class ExprCompiler implements RexVisitor<String> {
throw new UnsupportedOperationException();
}
- private String printExpr(RexNode node, String definition) {
- String name = "t" + expr.size();
+ private String javaTypeName(RexNode node) {
Type ty = typeFactory.getJavaClass(node.getType());
- String typeName = ((Class<?>)ty).getCanonicalName();
- pw.append(
- String.format("%s %s = (%s)(%s);\n", typeName, name, typeName, definition));
+ return ((Class<?>)ty).getCanonicalName();
+ }
+
+ private String reserveName(RexNode node) {
+ String name = "t" + expr.size();
+ expr.put(node, name);
return name;
}
@@ -181,7 +188,10 @@ class ExprCompiler implements RexVisitor<String> {
.put(infixBinary(MINUS, "-"))
.put(infixBinary(MULTIPLY, "*"))
.put(infixBinary(DIVIDE, "/"))
- .put(infixBinary(DIVIDE_INTEGER, "/"));
+ .put(infixBinary(DIVIDE_INTEGER, "/"))
+ .put(AND, AND_EXPR)
+ .put(OR, OR_EXPR)
+ .put(NOT, NOT_EXPR);
this.translators = builder.build();
}
@@ -212,5 +222,54 @@ class ExprCompiler implements RexVisitor<String> {
};
return new AbstractMap.SimpleImmutableEntry<>(op, trans);
}
+
+ private static final CallExprPrinter AND_EXPR = new CallExprPrinter() {
+ @Override
+ public String translate(
+ ExprCompiler compiler, RexCall call) {
+ String val = compiler.reserveName(call);
+ PrintWriter pw = compiler.pw;
+ pw.print(String.format("final %s %s;\n", compiler.javaTypeName(call),
+ val));
+ String lhs = call.getOperands().get(0).accept(compiler);
+ pw.print(String.format("if (!(%2$s)) { %1$s = false; }\n", val, lhs));
+ pw.print("else {\n");
+ String rhs = call.getOperands().get(1).accept(compiler);
+ pw.print(String.format(" %1$s = %2$s;\n}\n", val, rhs));
+ return val;
+ }
+ };
+
+ private static final CallExprPrinter OR_EXPR = new CallExprPrinter() {
+ @Override
+ public String translate(
+ ExprCompiler compiler, RexCall call) {
+ String val = compiler.reserveName(call);
+ PrintWriter pw = compiler.pw;
+ pw.print(String.format("final %s %s;\n", compiler.javaTypeName(call),
+ val));
+ String lhs = call.getOperands().get(0).accept(compiler);
+ pw.print(String.format("if (%2$s) { %1$s = true; }\n", val, lhs));
+ pw.print("else {\n");
+ String rhs = call.getOperands().get(1).accept(compiler);
+ pw.print(String.format(" %1$s = %2$s;\n}\n", val, rhs));
+ return val;
+ }
+ };
+
+ private static final CallExprPrinter NOT_EXPR = new CallExprPrinter() {
+ @Override
+ public String translate(
+ ExprCompiler compiler, RexCall call) {
+ String val = compiler.reserveName(call);
+ PrintWriter pw = compiler.pw;
+ String lhs = call.getOperands().get(0).accept(compiler);
+ pw.print(String.format("final %s %s;\n", compiler.javaTypeName(call),
+ val));
+ pw.print(String.format("%1$s = !(%2$s);\n", val, lhs));
+ return val;
+ }
+ };
}
+
}
http://git-wip-us.apache.org/repos/asf/storm/blob/254e4cc1/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestExprCompiler.java
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestExprCompiler.java b/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestExprCompiler.java
index 6409d63..9f516d4 100644
--- a/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestExprCompiler.java
+++ b/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestExprCompiler.java
@@ -86,5 +86,4 @@ public class TestExprCompiler {
assertArrayEquals(new String[]{"1 > 2", "3 + 5", "1 - 1.0E0", "3 + t0"},
res);
}
-
}
http://git-wip-us.apache.org/repos/asf/storm/blob/254e4cc1/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestPlanCompiler.java
----------------------------------------------------------------------
diff --git a/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestPlanCompiler.java b/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestPlanCompiler.java
index 768a97e..791028c 100644
--- a/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestPlanCompiler.java
+++ b/external/sql/storm-sql-core/src/test/org/apache/storm/sql/compiler/TestPlanCompiler.java
@@ -30,6 +30,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import static org.junit.Assert.*;
+
public class TestPlanCompiler {
private static final List<Values> INPUTS;
@@ -55,8 +57,27 @@ public class TestPlanCompiler {
while(v.hasNext()) {
results.add((Integer) v.next().get(0));
}
- Assert.assertEquals(2, results.size());
- Assert.assertEquals(4, results.get(0).intValue());
- Assert.assertEquals(5, results.get(1).intValue());
+ assertEquals(2, results.size());
+ assertEquals(4, results.get(0).intValue());
+ assertEquals(5, results.get(1).intValue());
+ }
+
+ @Test
+ public void testLogicalExpr() throws Exception {
+ String sql = "SELECT ID > 0 OR ID < 1, ID > 0 AND ID < 1, " +
+ "NOT (ID > 0 AND ID < 1) FROM FOO WHERE ID > 0 AND ID < 2";
+ TestUtils.CalciteState state = TestUtils.sqlOverDummyTable(sql);
+ PlanCompiler compiler = new PlanCompiler();
+ AbstractValuesProcessor proc = compiler.compile(state.tree);
+ Map<String, Iterator<Values>> data = new HashMap<>();
+ data.put("FOO", INPUTS.iterator());
+ proc.initialize(data);
+ ValueIterator v = new ValueIterator(proc);
+ assertTrue(v.hasNext());
+ Values val = v.next();
+ assertEquals(true, val.get(0));
+ assertEquals(false, val.get(1));
+ assertEquals(true, val.get(2));
}
+
}