You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2014/06/28 06:52:46 UTC

[2/8] git commit: Add tests that RelFieldTrimmer creates a ProjectRel, near the leaf of the tree, for just the fields used above it.

Add tests that RelFieldTrimmer creates a ProjectRel, near the leaf of the tree, for just the fields used above it.


Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/e0b2f834
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/e0b2f834
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/e0b2f834

Branch: refs/heads/master
Commit: e0b2f8348ac97a666004c10ab93e6143358aa5cc
Parents: 99f3968
Author: Julian Hyde <ju...@gmail.com>
Authored: Thu Jun 26 17:43:38 2014 -0600
Committer: Julian Hyde <ju...@gmail.com>
Committed: Fri Jun 27 15:46:20 2014 -0700

----------------------------------------------------------------------
 .../net/hydromatic/optiq/prepare/Prepare.java   |  2 +
 .../net/hydromatic/optiq/test/JdbcTest.java     | 40 +++++++++++++++
 .../net/hydromatic/optiq/test/OptiqAssert.java  | 54 ++++++++++++++++++++
 3 files changed, 96 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/e0b2f834/core/src/main/java/net/hydromatic/optiq/prepare/Prepare.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/prepare/Prepare.java b/core/src/main/java/net/hydromatic/optiq/prepare/Prepare.java
index 026f436..469339d 100644
--- a/core/src/main/java/net/hydromatic/optiq/prepare/Prepare.java
+++ b/core/src/main/java/net/hydromatic/optiq/prepare/Prepare.java
@@ -23,6 +23,7 @@ import net.hydromatic.optiq.jdbc.OptiqPrepare;
 import net.hydromatic.optiq.jdbc.OptiqSchema;
 import net.hydromatic.optiq.rules.java.JavaRules;
 import net.hydromatic.optiq.runtime.Bindable;
+import net.hydromatic.optiq.runtime.Hook;
 import net.hydromatic.optiq.runtime.Typed;
 import net.hydromatic.optiq.tools.Program;
 import net.hydromatic.optiq.tools.Programs;
@@ -215,6 +216,7 @@ public abstract class Prepare {
 
     RelNode rootRel =
         sqlToRelConverter.convertQuery(sqlQuery, needsValidation, true);
+    Hook.CONVERTED.run(rootRel);
 
     if (timingTracer != null) {
       timingTracer.traceTime("end sql2rel");

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/e0b2f834/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java b/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
index 76d54a2..51eb268 100644
--- a/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
+++ b/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
@@ -3656,6 +3656,46 @@ public class JdbcTest {
         "ENAME=Wilma; DEPTNO=null; GENDER=F; M1=1; M2=1; M3=9");
   }
 
+  /** Tests that field-trimming creates a project near the table scan. */
+  @Test public void testTrimFields() throws Exception {
+    try {
+      Prepare.trim = true;
+      OptiqAssert.that()
+          .with(OptiqAssert.Config.REGULAR)
+          .query(
+            "select \"name\", count(\"commission\") + 1\n"
+            + "from \"hr\".\"emps\"\n"
+            + "group by \"deptno\", \"name\"")
+          .convertContains(
+              "ProjectRel(name=[$1], EXPR$1=[+($2, 1)])\n"
+              + "  AggregateRel(group=[{0, 1}], agg#0=[COUNT($2)])\n"
+              + "    ProjectRel(deptno=[$1], name=[$2], commission=[$4])\n"
+              + "      EnumerableTableAccessRel(table=[[hr, emps]])\n");
+    } finally {
+      Prepare.trim = false;
+    }
+  }
+
+  /** Tests that field-trimming creates a project near the table scan, in a
+   * query with windowed-aggregation. */
+  @Test public void testTrimFieldsOver() throws Exception {
+    try {
+      Prepare.trim = true;
+      OptiqAssert.that()
+          .with(OptiqAssert.Config.REGULAR)
+          .query(
+            "select \"name\", count(\"commission\") over (partition by \"deptno\") + 1\n"
+            + "from \"hr\".\"emps\"\n"
+            + "where \"empid\" > 10")
+          .convertContains(
+              "ProjectRel(name=[$2], EXPR$1=[+(CAST(COUNT($4) OVER (PARTITION BY $1 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)):BIGINT, 1)])\n"
+              + "  FilterRel(condition=[>($0, 10)])\n"
+              + "    EnumerableTableAccessRel(table=[[hr, emps]])\n");
+    } finally {
+      Prepare.trim = false;
+    }
+  }
+
   /** Tests window aggregate whose argument is a constant. */
   @Test public void testWinAggConstant() {
     OptiqAssert.that()

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/e0b2f834/core/src/test/java/net/hydromatic/optiq/test/OptiqAssert.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/net/hydromatic/optiq/test/OptiqAssert.java b/core/src/test/java/net/hydromatic/optiq/test/OptiqAssert.java
index b3d08d7..16657b7 100644
--- a/core/src/test/java/net/hydromatic/optiq/test/OptiqAssert.java
+++ b/core/src/test/java/net/hydromatic/optiq/test/OptiqAssert.java
@@ -29,6 +29,8 @@ import net.hydromatic.optiq.jdbc.MetaImpl;
 import net.hydromatic.optiq.jdbc.OptiqConnection;
 import net.hydromatic.optiq.runtime.Hook;
 
+import org.eigenbase.rel.RelNode;
+import org.eigenbase.relopt.RelOptUtil;
 import org.eigenbase.util.*;
 
 import com.google.common.collect.ImmutableList;
@@ -352,6 +354,35 @@ public class OptiqAssert {
     }
   }
 
+  static void assertPrepare(
+      Connection connection,
+      String sql,
+      boolean materializationsEnabled,
+      Function1<RelNode, Void> convertChecker) throws Exception {
+    final String message =
+        "With materializationsEnabled=" + materializationsEnabled;
+    final RelNode[] s = {null};
+    Hook.Closeable closeable = Hook.CONVERTED.addThread(
+        new Function1<Object, Object>() {
+          public Object apply(Object rel) {
+            s[0] = (RelNode) rel;
+            return null;
+          }
+        });
+    try {
+      ((OptiqConnection) connection).getProperties().setProperty(
+          "materializationsEnabled", Boolean.toString(materializationsEnabled));
+      PreparedStatement statement = connection.prepareStatement(sql);
+      statement.close();
+      connection.close();
+    } catch (Throwable e) {
+      throw new RuntimeException(message, e);
+    } finally {
+      closeable.close();
+    }
+    convertChecker.apply(s[0]);
+  }
+
   static String toString(ResultSet resultSet) throws SQLException {
     final StringBuilder buf = new StringBuilder();
     final ResultSetMetaData metaData = resultSet.getMetaData();
@@ -855,6 +886,29 @@ public class OptiqAssert {
       }
     }
 
+    /** Checks that when the query (which was set using
+     * {@link AssertThat#query(String)}) is converted to a relational algrebra
+     * expression matching the given string. */
+    public AssertQuery convertContains(final String expected) {
+      try {
+        assertPrepare(
+            createConnection(),
+            sql,
+            false,
+            new Function1<RelNode, Void>() {
+              public Void apply(RelNode relNode) {
+                String s = RelOptUtil.toString(relNode);
+                assertThat(s, containsString(expected));
+                return null;
+              }
+            });
+        return this;
+      } catch (Exception e) {
+        throw new RuntimeException(
+            "exception while executing [" + sql + "]", e);
+      }
+    }
+
     public AssertQuery explainContains(String expected) {
       return explainMatches(checkResultContains(expected));
     }