You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2017/05/22 14:30:51 UTC
[2/2] calcite git commit: [CALCITE-1797] Support view partial
rewriting in aggregate materialized view rewriting
[CALCITE-1797] Support view partial rewriting in aggregate materialized view rewriting
PK-UK restriction lifted
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/99178497
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/99178497
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/99178497
Branch: refs/heads/master
Commit: 991784971006ede1caec5f8e8c2452a77dd485c9
Parents: e71157b
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Mon May 22 15:27:33 2017 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Mon May 22 15:27:33 2017 +0100
----------------------------------------------------------------------
.../rel/rules/AbstractMaterializedViewRule.java | 26 +++++++++-----------
1 file changed, 12 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/99178497/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
index 7d01288..bb352d2 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
@@ -295,7 +295,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
(RexTableInputRef) equiCond.getOperands().get(0),
(RexTableInputRef) equiCond.getOperands().get(1));
}
- if (!compensatePartial(viewTableRefs, vEC, queryTableRefs, false,
+ if (!compensatePartial(viewTableRefs, vEC, queryTableRefs,
compensationEquiColumns)) {
// Cannot rewrite, skip it
continue;
@@ -417,8 +417,9 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
// We trigger the unifying method. This method will either create a Project
// or an Aggregate operator on top of the view. It will also compute the
// output expressions for the query.
- final RelNode unionInputView = unify(call.builder(), rexBuilder, mq, view,
- topProject, node, topViewProject, viewNode, queryToViewTableMapping, currQEC);
+ final RelNode unionInputView = unify(call.builder(), rexBuilder, mq, matchModality,
+ view, topProject, node, topViewProject, viewNode,
+ queryToViewTableMapping, currQEC);
if (unionInputView == null) {
// Skip it
continue;
@@ -500,7 +501,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
if (!viewCompensationPred.isAlwaysTrue()) {
builder.filter(simplify.simplify(viewCompensationPred));
}
- RelNode result = unify(builder, rexBuilder, mq, builder.build(),
+ RelNode result = unify(builder, rexBuilder, mq, matchModality, builder.build(),
topProject, node, topViewProject, viewNode, queryToViewTableMapping, currQEC);
if (result == null) {
// Skip it
@@ -551,7 +552,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
* be produced, we will return null.
*/
protected abstract RelNode unify(RelBuilder relBuilder, RexBuilder rexBuilder,
- RelMetadataQuery mq, RelNode input,
+ RelMetadataQuery mq, MatchModality matchModality, RelNode input,
Project topProject, RelNode node,
Project topViewProject, RelNode viewNode,
BiMap<RelTableRef, RelTableRef> queryToViewTableMapping,
@@ -704,6 +705,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
RelBuilder relBuilder,
RexBuilder rexBuilder,
RelMetadataQuery mq,
+ MatchModality matchModality,
RelNode input,
Project topProject,
RelNode node,
@@ -848,11 +850,6 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
Project topViewProject,
RelNode viewNode,
Set<RelTableRef> viewTableRefs) {
- if (!compensatePartial(queryTableRefs, queryEC, viewTableRefs, true, null)) {
- // We cannot rewrite
- return null;
- }
-
// Modify view to join with missing tables and add Project on top to reorder columns.
// In turn, modify view plan to join with missing tables before Aggregate operator,
// change Aggregate operator to group by previous grouping columns and columns in
@@ -1005,6 +1002,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
RelBuilder relBuilder,
RexBuilder rexBuilder,
RelMetadataQuery mq,
+ MatchModality matchModality,
RelNode input,
Project topProject,
RelNode node,
@@ -1107,7 +1105,8 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
RelNode result = relBuilder
.push(input)
.build();
- if (queryAggregate.getGroupCount() != viewAggregate.getGroupCount()) {
+ if (queryAggregate.getGroupCount() != viewAggregate.getGroupCount()
+ || matchModality == MatchModality.VIEW_PARTIAL) {
// Target is coarser level of aggregation. Generate an aggregate.
rewritingMapping = Mappings.create(MappingType.FUNCTION,
topViewProject != null ? topViewProject.getRowType().getFieldCount()
@@ -1454,7 +1453,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
* <ul>
* <li> Equi-join </li>
* <li> Between all columns in the keys </li>
- * <li> Foreign-key columns do not allow NULL values (if {@code allowNullsFK} is false) </li>
+ * <li> Foreign-key columns do not allow NULL values </li>
* <li> Foreign-key </li>
* <li> Unique-key </li>
* </ul>
@@ -1467,7 +1466,6 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
Set<RelTableRef> sourceTableRefs,
EquivalenceClasses sourceEC,
Set<RelTableRef> targetTableRefs,
- boolean allowNullsFK,
Multimap<RexTableInputRef, RexTableInputRef> compensationEquiColumns) {
// Create UK-FK graph with view tables
final DirectedGraph<RelTableRef, Edge> graph =
@@ -1504,7 +1502,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
int uniqueKeyPos = constraint.getColumnPairs().get(pos).target;
RexTableInputRef uniqueKeyColumnRef = RexTableInputRef.of(parentTRef, uniqueKeyPos,
parentTRef.getTable().getRowType().getFieldList().get(uniqueKeyPos).getType());
- if ((allowNullsFK || !foreignKeyColumnType.isNullable())
+ if (!foreignKeyColumnType.isNullable()
&& sourceEC.getEquivalenceClassesMap().containsKey(uniqueKeyColumnRef)
&& sourceEC.getEquivalenceClassesMap().get(uniqueKeyColumnRef).contains(
foreignKeyColumnRef)) {