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