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