This is an automated email from the ASF dual-hosted git repository.

danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new da1a2dd  [CALCITE-3798] Make RelBuilder view expander pluggable
da1a2dd is described below

commit da1a2dd81a3f681e932039aa0c8569661573e1e5
Author: yuzhao.cyz <[email protected]>
AuthorDate: Fri Feb 14 17:33:43 2020 +0800

    [CALCITE-3798] Make RelBuilder view expander pluggable
    
    User can config a view expander directly when constructing the
    RelBuilder.
    
    Deprecate RelFactories#expandingScanFactory, we already called
    TranslatableTable#toRel in RelOptTable#toRel.
---
 .../org/apache/calcite/adapter/jdbc/JdbcRules.java |  2 +-
 .../org/apache/calcite/rel/core/RelFactories.java  | 25 +++++++++++-------
 .../java/org/apache/calcite/tools/RelBuilder.java  | 30 +++++++++++++++++++---
 .../org/apache/calcite/test/RelBuilderTest.java    | 11 ++------
 .../calcite/adapter/pig/PigRelFactories.java       |  6 ++---
 .../org/apache/calcite/piglet/PigRelBuilder.java   |  4 ++-
 6 files changed, 51 insertions(+), 27 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java 
b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
index c8a3e64..0e46f95 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
@@ -187,7 +187,7 @@ public class JdbcRules {
       };
 
   public static final RelFactories.TableScanFactory TABLE_SCAN_FACTORY =
-      (cluster, table, hints) -> {
+      (toRelContext, table) -> {
         throw new UnsupportedOperationException();
       };
 
diff --git a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java 
b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
index 6c3ad69..55d3a9f 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
@@ -516,11 +516,11 @@ public class RelFactories {
     /**
      * Creates a {@link TableScan}.
      */
-    RelNode createScan(RelOptCluster cluster, RelOptTable table, List<RelHint> 
hints);
+    RelNode createScan(RelOptTable.ToRelContext toRelContext, RelOptTable 
table);
 
     @Deprecated // to be removed before 1.23
     default RelNode createScan(RelOptCluster cluster, RelOptTable table) {
-      return createScan(cluster, table, ImmutableList.of());
+      return createScan(ViewExpanders.simpleContext(cluster), table);
     }
   }
 
@@ -529,8 +529,8 @@ public class RelFactories {
    * {@link LogicalTableScan}.
    */
   private static class TableScanFactoryImpl implements TableScanFactory {
-    public RelNode createScan(RelOptCluster cluster, RelOptTable table, 
List<RelHint> hints) {
-      return table.toRel(ViewExpanders.simpleContext(cluster, hints));
+    public RelNode createScan(RelOptTable.ToRelContext toRelContext, 
RelOptTable table) {
+      return table.toRel(toRelContext);
     }
   }
 
@@ -543,19 +543,26 @@ public class RelFactories {
    * @param viewExpander View expander
    * @param tableScanFactory Factory for non-translatable tables
    * @return Table scan factory
+   *
+   * @deprecated Use the custom context {@code Contexts.of(viewExpander) } for 
RelBuilder.
+   *
    */
+  @Deprecated // to be removed before 1.23
   @Nonnull public static TableScanFactory expandingScanFactory(
       @Nonnull RelOptTable.ViewExpander viewExpander,
       @Nonnull TableScanFactory tableScanFactory) {
-    return (cluster, table, hints) -> {
+    return (toRelContext, table) -> {
       final TranslatableTable translatableTable =
           table.unwrap(TranslatableTable.class);
+      final RelOptTable.ToRelContext newToRelContext =
+          ViewExpanders.toRelContext(
+              viewExpander,
+              toRelContext.getCluster(),
+              toRelContext.getTableHints());
       if (translatableTable != null) {
-        final RelOptTable.ToRelContext toRelContext =
-            ViewExpanders.toRelContext(viewExpander, cluster, hints);
-        return translatableTable.toRel(toRelContext, table);
+        return translatableTable.toRel(newToRelContext, table);
       }
-      return tableScanFactory.createScan(cluster, table, hints);
+      return tableScanFactory.createScan(newToRelContext, table);
     };
   }
 
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java 
b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index eec1af1..c9725a3 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -25,6 +25,7 @@ import org.apache.calcite.plan.RelOptPredicateList;
 import org.apache.calcite.plan.RelOptSchema;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.plan.ViewExpanders;
 import org.apache.calcite.prepare.RelOptTableImpl;
 import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelCollations;
@@ -148,6 +149,7 @@ public class RelBuilder {
   private final Deque<Frame> stack = new ArrayDeque<>();
   private final RexSimplify simplifier;
   private final Config config;
+  private final RelOptTable.ViewExpander viewExpander;
   private final RelFactories.Struct struct;
 
   protected RelBuilder(Context context, RelOptCluster cluster,
@@ -158,6 +160,7 @@ public class RelBuilder {
       context = Contexts.EMPTY_CONTEXT;
     }
     this.config = getConfig(context);
+    this.viewExpander = getViewExpander(cluster, context);
     this.struct =
         Objects.requireNonNull(RelFactories.Struct.fromContext(context));
     final RexExecutor executor =
@@ -168,6 +171,23 @@ public class RelBuilder {
         new RexSimplify(cluster.getRexBuilder(), predicates, executor);
   }
 
+  /**
+   * Derives the view expander
+   * {@link org.apache.calcite.plan.RelOptTable.ViewExpander}
+   * to be used for this RelBuilder.
+   *
+   * <p>The ViewExpander instance is used for expanding views in the default
+   * table scan factory {@code RelFactories.TableScanFactoryImpl}.
+   * You can also define a new table scan factory in the {@code struct}
+   * to override the whole table scan creation.
+   *
+   * <p>The default view expander does not support expanding views.
+   */
+  private RelOptTable.ViewExpander getViewExpander(RelOptCluster cluster, 
Context context) {
+    return Util.first(context.unwrap(RelOptTable.ViewExpander.class),
+        ViewExpanders.simpleContext(cluster));
+  }
+
   /** Derives the Config to be used for this RelBuilder.
    *
    * <p>Overrides {@link RelBuilder.Config#simplify} if
@@ -1021,8 +1041,9 @@ public class RelBuilder {
       throw RESOURCE.tableNotFound(String.join(".", names)).ex();
     }
     final RelNode scan =
-        struct.scanFactory.createScan(cluster, relOptTable,
-            ImmutableList.of());
+        struct.scanFactory.createScan(
+            ViewExpanders.toRelContext(viewExpander, cluster),
+            relOptTable);
     push(scan);
     rename(relOptTable.getRowType().getFieldNames());
 
@@ -1920,8 +1941,9 @@ public class RelBuilder {
         transientTable,
         ImmutableList.of(tableName));
     RelNode scan =
-        struct.scanFactory.createScan(cluster, relOptTable,
-            ImmutableList.of());
+        struct.scanFactory.createScan(
+            ViewExpanders.toRelContext(viewExpander, cluster),
+            relOptTable);
     push(scan);
     rename(rowType.getFieldNames());
     return this;
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java 
b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index ae6a866..a6038f1 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -29,7 +29,6 @@ import org.apache.calcite.rel.core.CorrelationId;
 import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.TableFunctionScan;
 import org.apache.calcite.rel.core.TableModify;
 import org.apache.calcite.rel.core.Window;
@@ -3104,10 +3103,7 @@ public class RelBuilderTest {
           expandingConfig(connection);
       final RelOptTable.ViewExpander viewExpander =
           (RelOptTable.ViewExpander) 
Frameworks.getPlanner(configBuilder.build());
-      final RelFactories.TableScanFactory tableScanFactory =
-          RelFactories.expandingScanFactory(viewExpander,
-              RelFactories.DEFAULT_TABLE_SCAN_FACTORY);
-      configBuilder.context(Contexts.of(tableScanFactory));
+      configBuilder.context(Contexts.of(viewExpander));
       final RelBuilder builder = RelBuilder.create(configBuilder.build());
       RelNode node = builder.scan("MYVIEW").build();
 
@@ -3130,10 +3126,7 @@ public class RelBuilderTest {
           expandingConfig(connection);
       final RelOptTable.ViewExpander viewExpander =
           (RelOptTable.ViewExpander) 
Frameworks.getPlanner(configBuilder.build());
-      final RelFactories.TableScanFactory tableScanFactory =
-          RelFactories.expandingScanFactory(viewExpander,
-              RelFactories.DEFAULT_TABLE_SCAN_FACTORY);
-      configBuilder.context(Contexts.of(tableScanFactory));
+      configBuilder.context(Contexts.of(viewExpander));
       final RelBuilder builder = RelBuilder.create(configBuilder.build());
       RelNode node =
           builder.scan("MYVIEW")
diff --git 
a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java 
b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
index 6cccb6a..3e7a1ef 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
@@ -60,9 +60,9 @@ public class PigRelFactories {
 
     public static final PigTableScanFactory INSTANCE = new 
PigTableScanFactory();
 
-    @Override public RelNode createScan(RelOptCluster cluster,
-        RelOptTable table, List<RelHint> hints) {
-      Util.discard(hints);
+    @Override public RelNode createScan(RelOptTable.ToRelContext toRelContext,
+        RelOptTable table) {
+      final RelOptCluster cluster = toRelContext.getCluster();
       return new PigTableScan(cluster, cluster.traitSetOf(PigRel.CONVENTION), 
table);
     }
   }
diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java 
b/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java
index b8337eb..8a57028 100644
--- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java
+++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelBuilder.java
@@ -22,6 +22,7 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptSchema;
 import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.ViewExpanders;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.SingleRel;
 import org.apache.calcite.rel.core.CorrelationId;
@@ -260,7 +261,8 @@ public class PigRelBuilder extends RelBuilder {
    * @return This builder
    */
   private RelBuilder scan(RelOptTable tableSchema) {
-    final RelNode scan = getScanFactory().createScan(cluster, tableSchema, 
ImmutableList.of());
+    final RelNode scan = getScanFactory().createScan(
+        ViewExpanders.simpleContext(cluster), tableSchema);
     push(scan);
     return this;
   }

Reply via email to