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/07/04 02:01:33 UTC

[3/8] git commit: [OPTIQ-324] Add ViewExpander for Planner in Frameworks. Expose additional properties of ViewTable to allow subclassing.

[OPTIQ-324] Add ViewExpander for Planner in Frameworks. Expose additional properties of ViewTable to allow subclassing.


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

Branch: refs/heads/master
Commit: ff40b4e095420add9b44c228958f51b4b00eb756
Parents: 3106270
Author: vkorukanti <ve...@gmail.com>
Authored: Tue Apr 29 04:53:32 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Thu Jul 3 12:21:28 2014 -0700

----------------------------------------------------------------------
 .../net/hydromatic/optiq/impl/ViewTable.java    | 10 +++++
 .../hydromatic/optiq/prepare/PlannerImpl.java   | 39 +++++++++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/ff40b4e0/core/src/main/java/net/hydromatic/optiq/impl/ViewTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/impl/ViewTable.java b/core/src/main/java/net/hydromatic/optiq/impl/ViewTable.java
index 5cdf16f..64d0190 100644
--- a/core/src/main/java/net/hydromatic/optiq/impl/ViewTable.java
+++ b/core/src/main/java/net/hydromatic/optiq/impl/ViewTable.java
@@ -134,6 +134,16 @@ public class ViewTable
           RelDataTypeImpl.proto(parsed.rowType), viewSql, schemaPath1);
     }
   }
+
+  /** Get the view's SQL definition. */
+  public String getViewSql() {
+    return viewSql;
+  }
+
+  /** Get the schemapath of the view */
+  public List<String> getSchemaPath() {
+    return schemaPath;
+  }
 }
 
 // End ViewTable.java

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/ff40b4e0/core/src/main/java/net/hydromatic/optiq/prepare/PlannerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/prepare/PlannerImpl.java b/core/src/main/java/net/hydromatic/optiq/prepare/PlannerImpl.java
index c36a65b..6bc8704 100644
--- a/core/src/main/java/net/hydromatic/optiq/prepare/PlannerImpl.java
+++ b/core/src/main/java/net/hydromatic/optiq/prepare/PlannerImpl.java
@@ -25,18 +25,23 @@ import net.hydromatic.optiq.tools.*;
 
 import org.eigenbase.rel.RelNode;
 import org.eigenbase.relopt.*;
+import org.eigenbase.relopt.RelOptTable.ViewExpander;
+import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.rex.RexBuilder;
 import org.eigenbase.sql.SqlNode;
 import org.eigenbase.sql.SqlOperatorTable;
 import org.eigenbase.sql.parser.SqlParseException;
 import org.eigenbase.sql.parser.SqlParser;
 import org.eigenbase.sql.parser.SqlParserImplFactory;
+import org.eigenbase.sql.validate.SqlValidator;
 import org.eigenbase.sql2rel.SqlRexConvertletTable;
 import org.eigenbase.sql2rel.SqlToRelConverter;
 import org.eigenbase.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
+import java.util.List;
+
 /** Implementation of {@link net.hydromatic.optiq.tools.Planner}. */
 public class PlannerImpl implements Planner {
   private final SqlOperatorTable operatorTable;
@@ -180,7 +185,7 @@ public class PlannerImpl implements Planner {
     assert validatedSqlNode != null;
     this.sqlToRelConverter =
         new SqlToRelConverter(
-            null, validator, createCatalogReader(), planner,
+            new ViewExpanderImpl(), validator, createCatalogReader(), planner,
             createRexBuilder(), convertletTable);
     sqlToRelConverter.setTrimUnusedFields(false);
     sqlToRelConverter.enableTableAccessConversion(false);
@@ -191,6 +196,38 @@ public class PlannerImpl implements Planner {
     return rel;
   }
 
+  /** Implements {@link org.eigenbase.relopt.RelOptTable.ViewExpander}
+   * interface for {@link net.hydromatic.optiq.tools.Planner} */
+  public class ViewExpanderImpl implements ViewExpander {
+    public RelNode expandView(RelDataType rowType, String queryString,
+        List<String> schemaPath) {
+      SqlParser parser = SqlParser.create(parserFactory, queryString,
+          lex.quoting, lex.unquotedCasing, lex.quotedCasing);
+      SqlNode sqlNode;
+      try {
+        sqlNode = parser.parseQuery();
+      } catch (SqlParseException e) {
+        throw new RuntimeException("parse failed", e);
+      }
+
+      final OptiqCatalogReader catalogReader =
+          createCatalogReader().withSchemaPath(schemaPath);
+      SqlValidator validator = new OptiqSqlValidator(
+          operatorTable, catalogReader, typeFactory);
+      SqlNode validatedSqlNode = validator.validate(sqlNode);
+
+      SqlToRelConverter sqlToRelConverter = new SqlToRelConverter(
+          null, validator, catalogReader, planner,
+          createRexBuilder(), convertletTable);
+      sqlToRelConverter.setTrimUnusedFields(false);
+
+      RelNode relNode = sqlToRelConverter.convertQuery(
+          validatedSqlNode, true, false);
+
+      return relNode;
+    }
+  }
+
   // OptiqCatalogReader is stateless; no need to store one
   private OptiqCatalogReader createCatalogReader() {
     SchemaPlus rootSchema = rootSchema(defaultSchema);