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/12/08 19:09:52 UTC
[06/20] storm git commit: [StormSQL] STORM-1130. Support AND, OR,
NOT operators in StormSQL.
[StormSQL] 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/915f1354
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/915f1354
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/915f1354
Branch: refs/heads/master
Commit: 915f135438c08a58bbca6d4ff27386b05254e27f
Parents: 0a257f1
Author: Haohui Mai <wh...@apache.org>
Authored: Mon Oct 26 17:29:20 2015 -0700
Committer: Haohui Mai <wh...@apache.org>
Committed: Fri Dec 4 11:09:02 2015 -0800
----------------------------------------------------------------------
.../apache/storm/sql/compiler/ExprCompiler.java | 75 +++++++++++++++++---
.../storm/sql/compiler/TestExprCompiler.java | 1 -
.../storm/sql/compiler/TestPlanCompiler.java | 14 ++++
3 files changed, 81 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/storm/blob/915f1354/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/915f1354/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/915f1354/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 8d22a53..30df0f3 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
@@ -50,4 +50,18 @@ public class TestPlanCompiler {
Assert.assertArrayEquals(new Values[] { new Values(4), new Values(5)},
values.toArray());
}
+
+ @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(typeFactory);
+ AbstractValuesProcessor proc = compiler.compile(state.tree);
+ Map<String, DataSource> data = new HashMap<>();
+ data.put("FOO", new TestUtils.MockDataSource());
+ List<Values> values = new ArrayList<>();
+ ChannelHandler h = new TestUtils.CollectDataChannelHandler(values);
+ proc.initialize(data, h);
+ Assert.assertEquals(new Values(true, false, true), values.get(0));
+ }
}