This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 856b64e9747 [opt](mtmv) Support single mv rewrite when query is select
star (#48742)
856b64e9747 is described below
commit 856b64e974795a191de4505f00a97cf5dd77132b
Author: seawinde <[email protected]>
AuthorDate: Sat Mar 8 16:25:57 2025 +0800
[opt](mtmv) Support single mv rewrite when query is select star (#48742)
---
.../org/apache/doris/nereids/rules/RuleSet.java | 2 +
.../org/apache/doris/nereids/rules/RuleType.java | 1 +
.../mv/AbstractMaterializedViewScanRule.java | 84 +++++++++++++++++++++
.../mv/MaterializedViewOnlyScanRule.java | 42 +++++++++++
.../data/nereids_rules_p0/mv/scan/scan_table.out | Bin 1263 -> 2100 bytes
.../nereids_rules_p0/mv/scan/scan_table.groovy | 22 +++++-
6 files changed, 147 insertions(+), 4 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
index 0c84cf4015b..06f95814007 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
@@ -49,6 +49,7 @@ import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewFilterProje
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewFilterProjectScanRule;
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewFilterScanRule;
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewOnlyJoinRule;
+import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewOnlyScanRule;
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewProjectAggregateRule;
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewProjectFilterAggregateRule;
import
org.apache.doris.nereids.rules.exploration.mv.MaterializedViewProjectFilterJoinRule;
@@ -270,6 +271,7 @@ public class RuleSet {
.add(MaterializedViewProjectScanRule.INSTANCE)
.add(MaterializedViewProjectFilterScanRule.INSTANCE)
.add(MaterializedViewAggregateOnNoneAggregateRule.INSTANCE)
+ .add(MaterializedViewOnlyScanRule.INSTANCE)
.build();
public static final List<Rule> DPHYP_REORDER_RULES =
ImmutableList.<Rule>builder()
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 6e9bf6f118d..776681fd889 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -406,6 +406,7 @@ public enum RuleType {
MATERIALIZED_VIEW_PROJECT_SCAN(RuleTypeClass.EXPLORATION),
MATERIALIZED_VIEW_FILTER_PROJECT_SCAN(RuleTypeClass.EXPLORATION),
MATERIALIZED_VIEW_PROJECT_FILTER_SCAN(RuleTypeClass.EXPLORATION),
+ MATERIALIZED_VIEW_ONLY_SCAN(RuleTypeClass.EXPLORATION),
// implementation rules
LOGICAL_ONE_ROW_RELATION_TO_PHYSICAL_ONE_ROW_RELATION(RuleTypeClass.IMPLEMENTATION),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewScanRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewScanRule.java
new file mode 100644
index 00000000000..7cd49c94b09
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewScanRule.java
@@ -0,0 +1,84 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.exploration.mv;
+
+import org.apache.doris.nereids.CascadesContext;
+import
org.apache.doris.nereids.rules.exploration.mv.StructInfo.PlanCheckContext;
+import org.apache.doris.nereids.rules.exploration.mv.mapping.SlotMapping;
+import org.apache.doris.nereids.trees.expressions.Alias;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * This is responsible for single table rewriting according to different
pattern
+ * */
+public abstract class AbstractMaterializedViewScanRule extends
AbstractMaterializedViewRule {
+
+ @Override
+ protected Plan rewriteQueryByView(MatchMode matchMode,
+ StructInfo queryStructInfo,
+ StructInfo viewStructInfo,
+ SlotMapping targetToSourceMapping,
+ Plan tempRewritedPlan,
+ MaterializationContext materializationContext,
+ CascadesContext cascadesContext) {
+ // Rewrite top projects, represent the query projects by view
+ List<Expression> expressionsRewritten = rewriteExpression(
+ queryStructInfo.getExpressions(),
+ queryStructInfo.getTopPlan(),
+ materializationContext.getShuttledExprToScanExprMapping(),
+ targetToSourceMapping,
+ queryStructInfo.getTableBitSet()
+ );
+ // Can not rewrite, bail out
+ if (expressionsRewritten.isEmpty()) {
+ materializationContext.recordFailReason(queryStructInfo,
+ "Rewrite expressions by view in scan fail",
+ () -> String.format("expressionToRewritten is %s,\n
mvExprToMvScanExprMapping is %s,\n"
+ + "targetToSourceMapping = %s",
queryStructInfo.getExpressions(),
+
materializationContext.getShuttledExprToScanExprMapping(),
+ targetToSourceMapping));
+ return null;
+ }
+ return new LogicalProject<>(
+ expressionsRewritten.stream()
+ .map(expression -> expression instanceof
NamedExpression ? expression : new Alias(expression))
+ .map(NamedExpression.class::cast)
+ .collect(Collectors.toList()),
+ tempRewritedPlan);
+ }
+
+ /**
+ * Check scan is whether valid or not. Support join's input only support
project, filter, join,
+ * logical relation, simple aggregate node. Con not have aggregate above
on join.
+ * Join condition should be slot reference equals currently.
+ */
+ @Override
+ protected boolean checkQueryPattern(StructInfo structInfo, CascadesContext
cascadesContext) {
+ PlanCheckContext checkContext = PlanCheckContext.of(ImmutableSet.of());
+ return
structInfo.getTopPlan().accept(StructInfo.SCAN_PLAN_PATTERN_CHECKER,
checkContext)
+ && !checkContext.isContainsTopAggregate();
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewOnlyScanRule.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewOnlyScanRule.java
new file mode 100644
index 00000000000..24211ac8b08
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewOnlyScanRule.java
@@ -0,0 +1,42 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.exploration.mv;
+
+import org.apache.doris.nereids.rules.Rule;
+import org.apache.doris.nereids.rules.RuleType;
+import org.apache.doris.nereids.trees.plans.logical.LogicalCatalogRelation;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * MaterializedViewOnlyScanRule
+ */
+public class MaterializedViewOnlyScanRule extends
AbstractMaterializedViewScanRule {
+
+ public static final MaterializedViewOnlyScanRule INSTANCE = new
MaterializedViewOnlyScanRule();
+
+ @Override
+ public List<Rule> buildRules() {
+ return ImmutableList.of(
+
any().when(LogicalCatalogRelation.class::isInstance).thenApplyMultiNoThrow(ctx
-> {
+ return rewrite(ctx.root, ctx.cascadesContext);
+ }).toRule(RuleType.MATERIALIZED_VIEW_ONLY_SCAN));
+ }
+}
diff --git a/regression-test/data/nereids_rules_p0/mv/scan/scan_table.out
b/regression-test/data/nereids_rules_p0/mv/scan/scan_table.out
index 9af8d1bfb63..cc7aa623aa8 100644
Binary files a/regression-test/data/nereids_rules_p0/mv/scan/scan_table.out and
b/regression-test/data/nereids_rules_p0/mv/scan/scan_table.out differ
diff --git a/regression-test/suites/nereids_rules_p0/mv/scan/scan_table.groovy
b/regression-test/suites/nereids_rules_p0/mv/scan/scan_table.groovy
index c42888e35ab..4e40d1854d5 100644
--- a/regression-test/suites/nereids_rules_p0/mv/scan/scan_table.groovy
+++ b/regression-test/suites/nereids_rules_p0/mv/scan/scan_table.groovy
@@ -116,7 +116,7 @@ suite("mv_scan_table") {
insert into partsupp values
(2, 3, 9, 10.01, 'supply1'),
(2, 3, 10, 11.01, 'supply2');
-
+
"""
sql """analyze table orders with sync;"""
@@ -124,8 +124,8 @@ suite("mv_scan_table") {
sql """analyze table partsupp with sync;"""
sql """alter table orders modify column o_comment set stats
('row_count'='8');"""
- sql """alter table lineitem modify column l_comment set stats
('row_count'='5');"""
-sql """alter table partsupp modify column ps_comment set stats
('row_count'='2');"""
+ sql """alter table lineitem modify column l_comment set stats
('row_count'='5');"""
+ sql """alter table partsupp modify column ps_comment set stats
('row_count'='2');"""
// with filter
def mv1_0 =
@@ -186,4 +186,18 @@ sql """alter table partsupp modify column ps_comment set
stats ('row_count'='2')
async_mv_rewrite_success(db, mv1_3, query1_3, "mv1_3")
order_qt_query1_3_after "${query1_3}"
sql """ DROP MATERIALIZED VIEW IF EXISTS mv1_3"""
-}
+
+ def mv1_4 =
+ """
+ select *
+ from lineitem
+ """
+ def query1_4 = """
+ select *
+ from lineitem
+ """
+ order_qt_query1_4_before "${query1_4}"
+ async_mv_rewrite_success_without_check_chosen(db, mv1_4, query1_4, "mv1_4")
+ order_qt_query1_4_after "${query1_4}"
+ sql """ DROP MATERIALIZED VIEW IF EXISTS mv1_4"""
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]