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));
+  }
 }