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