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

commit 19e6ebd09cd7151031c0eefe87ee1eca081b8daf
Author: Pxl <pxl...@qq.com>
AuthorDate: Fri Mar 8 11:06:37 2024 +0800

    [Feature](materialized-view) support mv with 
bitmap_union(bitmap_from_array()) case (#31962)
    
    support mv with bitmap_union(bitmap_from_array()) case
---
 .../org/apache/doris/analysis/ArrayLiteral.java    |   4 +-
 .../mv/SelectMaterializedIndexWithAggregate.java   | 423 ++++++++-------------
 .../data/mv_p0/test_mv_dp/test_mv_dp.out           |   5 +
 .../suites/mv_p0/test_mv_dp/test_mv_dp.groovy      |  71 ++++
 4 files changed, 232 insertions(+), 271 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
index 4cc328309d8..770d826dd08 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
@@ -107,7 +107,7 @@ public class ArrayLiteral extends LiteralExpr {
         List<String> list = new ArrayList<>(children.size());
         children.forEach(v -> list.add(v.toSqlImpl()));
 
-        return "ARRAY(" + StringUtils.join(list, ", ") + ")";
+        return "[" + StringUtils.join(list, ", ") + "]";
     }
 
     @Override
@@ -115,7 +115,7 @@ public class ArrayLiteral extends LiteralExpr {
         List<String> list = new ArrayList<>(children.size());
         children.forEach(v -> list.add(v.toDigestImpl()));
 
-        return "ARRAY(" + StringUtils.join(list, ", ") + ")";
+        return "[" + StringUtils.join(list, ", ") + "]";
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
index cce0552b696..570404c6ea3 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
@@ -124,22 +124,17 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                     LogicalOlapScan mvPlan = createLogicalOlapScan(scan, 
result);
                     SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                    if (result.exprRewriteMap.isEmpty()) {
-                        return new ReplaceExpressions(slotContext)
-                            .replace(agg.withChildren(mvPlan), mvPlan);
-                    } else {
-                        return new LogicalProject<>(
-                            generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                new ReplaceExpressions(slotContext).replace(
-                                    new LogicalAggregate<>(
-                                        agg.getGroupByExpressions(),
-                                        replaceAggOutput(
-                                            agg, Optional.empty(), 
Optional.empty(), result.exprRewriteMap),
-                                        agg.isNormalized(),
-                                        agg.getSourceRepeat(),
-                                        mvPlan
-                                    ), mvPlan));
-                    }
+                    return new LogicalProject<>(
+                        generateProjectsAlias(agg.getOutputs(), slotContext),
+                            new ReplaceExpressions(slotContext).replace(
+                                new LogicalAggregate<>(
+                                    agg.getGroupByExpressions(),
+                                    replaceAggOutput(
+                                        agg, Optional.empty(), 
Optional.empty(), result.exprRewriteMap),
+                                    agg.isNormalized(),
+                                    agg.getSourceRepeat(),
+                                    mvPlan
+                                ), mvPlan));
                 }).toRule(RuleType.MATERIALIZED_INDEX_AGG_SCAN),
 
                 // filter could push down scan.
@@ -170,27 +165,20 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        
agg.withChildren(filter.withChildren(mvPlan)), mvPlan));
-                            } else {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.empty(), Optional.empty(),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                // Note that no need to 
replace slots in the filter,
-                                                // because the slots to
-                                                // replace are value columns, 
which shouldn't appear in filters.
-                                                filter.withChildren(mvPlan)
-                                            ), mvPlan));
-                            }
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.empty(), Optional.empty(),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
+                                            // Note that no need to replace 
slots in the filter,
+                                            // because the slots to
+                                            // replace are value columns, 
which shouldn't appear in filters.
+                                            filter.withChildren(mvPlan)
+                                        ), mvPlan));
                         }).toRule(RuleType.MATERIALIZED_INDEX_AGG_FILTER_SCAN),
 
                 // column pruning or other projections such as alias, etc.
@@ -214,32 +202,22 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
-                                            project.withProjectsAndChild(
-                                                
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                mvPlan)), mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<LogicalOlapScan> newProject = 
new LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList),
-                                        
scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId));
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                newProject
-                                            ), mvPlan));
-                            }
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<LogicalOlapScan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList),
+                                    
scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId));
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
+                                            newProject
+                                        ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_PROJECT_SCAN),
 
                 // filter could push down and project.
@@ -285,33 +263,23 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                                                 mvPlanWithoutAgg)));
                             }
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
-                                            project.withProjectsAndChild(
-                                                
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                filter.withChildren(mvPlan))), 
mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<Plan> newProject = new 
LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList),
-                                        filter.withChildren(mvPlan));
-
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                newProject
-                                            ), mvPlan));
-                            }
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<Plan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList),
+                                    filter.withChildren(mvPlan));
+
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
+                                            newProject
+                                        ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_PROJECT_FILTER_SCAN),
 
                 // filter can't push down
@@ -341,33 +309,22 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
-                                            filter.withChildren(
-                                                project.withProjectsAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                    mvPlan))), mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<Plan> newProject = new 
LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList), mvPlan);
-
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                filter.withChildren(newProject)
-                                            ), mvPlan));
-                            }
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<Plan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList), mvPlan);
+
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
+                                            filter.withChildren(newProject)
+                                        ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_FILTER_PROJECT_SCAN),
 
                 // only agg above scan
@@ -388,28 +345,18 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                         LogicalOlapScan mvPlan = createLogicalOlapScan(scan, 
result);
                         SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                        if (result.exprRewriteMap.isEmpty()) {
-                            return new LogicalProject<>(
-                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                    new 
ReplaceExpressions(slotContext).replace(
-                                    agg.withChildren(
+                        return new LogicalProject<>(
+                            generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                new ReplaceExpressions(slotContext).replace(
+                                    new LogicalAggregate<>(
+                                        agg.getGroupByExpressions(),
+                                        replaceAggOutput(
+                                            agg, Optional.empty(), 
Optional.empty(), result.exprRewriteMap),
+                                        agg.isNormalized(),
+                                        agg.getSourceRepeat(),
                                         repeat.withAggOutputAndChild(
                                             
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()), mvPlan)
                                     ), mvPlan));
-                        } else {
-                            return new LogicalProject<>(
-                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                    new 
ReplaceExpressions(slotContext).replace(
-                                        new LogicalAggregate<>(
-                                            agg.getGroupByExpressions(),
-                                            replaceAggOutput(
-                                                agg, Optional.empty(), 
Optional.empty(), result.exprRewriteMap),
-                                            agg.isNormalized(),
-                                            agg.getSourceRepeat(),
-                                            repeat.withAggOutputAndChild(
-                                                
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()), mvPlan)
-                                        ), mvPlan));
-                        }
                     }).toRule(RuleType.MATERIALIZED_INDEX_AGG_REPEAT_SCAN),
 
                 // filter could push down scan.
@@ -441,33 +388,22 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.empty(), Optional.empty(),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
+                                            // Not that no need to replace 
slots in the filter,
+                                            // because the slots to replace
+                                            // are value columns, which 
shouldn't appear in filters.
                                             repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                    filter.withChildren(mvPlan)
-                                            )), mvPlan));
-                            } else {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.empty(), Optional.empty(),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                // Not that no need to replace 
slots in the filter,
-                                                // because the slots to replace
-                                                // are value columns, which 
shouldn't appear in filters.
-                                                repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                    
filter.withChildren(mvPlan))
-                                            ), mvPlan));
-                            }
+                                                
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
+                                                filter.withChildren(mvPlan))
+                                        ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_REPEAT_FILTER_SCAN),
 
                 // column pruning or other projections such as alias, etc.
@@ -492,37 +428,24 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<LogicalOlapScan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList),
+                                    mvPlan);
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
                                             repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                    
project.withProjectsAndChild(
-                                                        
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                        mvPlan))
+                                                
generateNewOutputsWithMvOutputs(
+                                                    mvPlan, 
repeat.getOutputs()), newProject)
                                         ), mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<LogicalOlapScan> newProject = 
new LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList),
-                                        mvPlan);
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(
-                                                        mvPlan, 
repeat.getOutputs()), newProject)
-                                            ), mvPlan));
-                            }
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_REPEAT_PROJECT_SCAN),
 
                 // filter could push down and project.
@@ -556,40 +479,25 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<Plan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList),
+                                    filter.withChildren(mvPlan));
+
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
                                             repeat.withAggOutputAndChild(
-                                                
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                project.withProjectsAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                    filter.withChildren(
-                                                        mvPlan
-                                        )))),
-                                            mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<Plan> newProject = new 
LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList),
-                                        filter.withChildren(mvPlan));
-
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(
-                                                        mvPlan, 
repeat.getOutputs()), newProject)
-                                        ), mvPlan));
-                            }
+                                                
generateNewOutputsWithMvOutputs(
+                                                    mvPlan, 
repeat.getOutputs()), newProject)
+                                    ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_REPEAT_PROJECT_FILTER_SCAN),
 
                 // filter can't push down
@@ -621,40 +529,25 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                             LogicalOlapScan mvPlan = 
createLogicalOlapScan(scan, result);
                             SlotContext slotContext = 
generateBaseScanExprToMvExpr(mvPlan);
 
-                            if (result.exprRewriteMap.isEmpty()) {
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                        agg.withChildren(
+                            List<NamedExpression> newProjectList = 
replaceProjectList(project,
+                                    result.exprRewriteMap.projectExprMap);
+                            LogicalProject<Plan> newProject = new 
LogicalProject<>(
+                                    generateNewOutputsWithMvOutputs(mvPlan, 
newProjectList),
+                                    
scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId));
+
+                            return new LogicalProject<>(
+                                generateProjectsAlias(agg.getOutputs(), 
slotContext),
+                                    new 
ReplaceExpressions(slotContext).replace(
+                                        new LogicalAggregate<>(
+                                            agg.getGroupByExpressions(),
+                                            replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
+                                                    result.exprRewriteMap),
+                                            agg.isNormalized(),
+                                            agg.getSourceRepeat(),
                                             repeat.withAggOutputAndChild(
                                                 
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                filter.withChildren(
-                                                    
project.withProjectsAndChild(
-                                                        
generateNewOutputsWithMvOutputs(mvPlan, project.getProjects()),
-                                                        mvPlan
-                                        )))),
-                                            mvPlan));
-                            } else {
-                                List<NamedExpression> newProjectList = 
replaceProjectList(project,
-                                        result.exprRewriteMap.projectExprMap);
-                                LogicalProject<Plan> newProject = new 
LogicalProject<>(
-                                        
generateNewOutputsWithMvOutputs(mvPlan, newProjectList),
-                                        
scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId));
-
-                                return new LogicalProject<>(
-                                    generateProjectsAlias(agg.getOutputs(), 
slotContext),
-                                        new 
ReplaceExpressions(slotContext).replace(
-                                            new LogicalAggregate<>(
-                                                agg.getGroupByExpressions(),
-                                                replaceAggOutput(agg, 
Optional.of(project), Optional.of(newProject),
-                                                        result.exprRewriteMap),
-                                                agg.isNormalized(),
-                                                agg.getSourceRepeat(),
-                                                repeat.withAggOutputAndChild(
-                                                    
generateNewOutputsWithMvOutputs(mvPlan, repeat.getOutputs()),
-                                                    
filter.withChildren(newProject))
-                                            ), mvPlan));
-                            }
+                                                
filter.withChildren(newProject))
+                                        ), mvPlan));
                         
}).toRule(RuleType.MATERIALIZED_INDEX_AGG_REPEAT_FILTER_PROJECT_SCAN)
         );
     }
@@ -720,7 +613,7 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
                 .filter(aggRewriteResult -> checkPreAggStatus(scan, 
aggRewriteResult.index.getId(), predicates,
                         // check pre-agg status of aggregate function that 
couldn't rewrite.
                         aggFuncsDiff(aggregateFunctions, aggRewriteResult), 
groupingExprs).isOn())
-                .filter(result -> result.success).collect(Collectors.toList());
+                .collect(Collectors.toList());
 
         List<MaterializedIndex> haveAllRequiredColumns = Streams.concat(
                 candidatesWithoutRewriting.stream()
@@ -755,12 +648,8 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
 
     private List<AggregateFunction> aggFuncsDiff(List<AggregateFunction> 
aggregateFunctions,
             AggRewriteResult aggRewriteResult) {
-        if (aggRewriteResult.success) {
-            return 
ImmutableList.copyOf(Sets.difference(ImmutableSet.copyOf(aggregateFunctions),
-                    aggRewriteResult.exprRewriteMap.aggFuncMap.keySet()));
-        } else {
-            return aggregateFunctions;
-        }
+        return 
ImmutableList.copyOf(Sets.difference(ImmutableSet.copyOf(aggregateFunctions),
+                aggRewriteResult.exprRewriteMap.aggFuncMap.keySet()));
     }
 
     private static class SelectResult {
@@ -897,8 +786,7 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
             if (expr instanceof ToBitmap) {
                 expr = expr.child(0);
             }
-            Optional<Slot> slotOpt = 
ExpressionUtils.extractSlotOrCastOnSlot(expr);
-            if (slotOpt.isPresent() && 
context.valueNameToColumn.containsKey(normalizeName(slotOpt.get().toSql()))) {
+            if 
(context.valueNameToColumn.containsKey(normalizeName(expr.toSql()))) {
                 return PreAggStatus.on();
             } else {
                 return PreAggStatus.off("invalid bitmap_union_count: " + 
bitmapUnionCount.toSql());
@@ -1186,7 +1074,7 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
         ExprRewriteMap exprRewriteMap = new ExprRewriteMap();
         RewriteContext context = new RewriteContext(new CheckContext(scan, 
index.getId()), exprRewriteMap);
         aggregateFunctions.forEach(aggFun -> AggFuncRewriter.rewrite(aggFun, 
context));
-        return new AggRewriteResult(index, true, requiredScanOutput, 
exprRewriteMap);
+        return new AggRewriteResult(index, requiredScanOutput, exprRewriteMap);
     }
 
     private static class ExprRewriteMap {
@@ -1234,16 +1122,13 @@ public class SelectMaterializedIndexWithAggregate 
extends AbstractSelectMaterial
 
     private static class AggRewriteResult {
         public final MaterializedIndex index;
-        public final boolean success;
         public final Set<Slot> requiredScanOutput;
         public ExprRewriteMap exprRewriteMap;
 
         public AggRewriteResult(MaterializedIndex index,
-                boolean success,
                 Set<Slot> requiredScanOutput,
                 ExprRewriteMap exprRewriteMap) {
             this.index = index;
-            this.success = success;
             this.requiredScanOutput = requiredScanOutput;
             this.exprRewriteMap = exprRewriteMap;
         }
diff --git a/regression-test/data/mv_p0/test_mv_dp/test_mv_dp.out 
b/regression-test/data/mv_p0/test_mv_dp/test_mv_dp.out
new file mode 100644
index 00000000000..27c89880a79
--- /dev/null
+++ b/regression-test/data/mv_p0/test_mv_dp/test_mv_dp.out
@@ -0,0 +1,5 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !select_mv --
+1      4       4
+2      2       1
+
diff --git a/regression-test/suites/mv_p0/test_mv_dp/test_mv_dp.groovy 
b/regression-test/suites/mv_p0/test_mv_dp/test_mv_dp.groovy
new file mode 100644
index 00000000000..dffb0825c53
--- /dev/null
+++ b/regression-test/suites/mv_p0/test_mv_dp/test_mv_dp.groovy
@@ -0,0 +1,71 @@
+// 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.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite ("test_mv_dp") {
+
+    sql """ DROP TABLE IF EXISTS dp; """
+
+    sql """
+        CREATE TABLE dp (
+        `d` int NULL ,
+        `status` text NULL ,
+        `uid_list` array<text> NULL
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`d`)
+        DISTRIBUTED BY HASH(`d`) BUCKETS AUTO
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1"
+        );
+        """
+
+    sql """INSERT INTO `dp` VALUES (1,'success',["1","2"]),(2,'fail',["1"]);"""
+
+    createMV("""CREATE MATERIALIZED VIEW view_2 as
+                    select d,
+                        bitmap_union(bitmap_from_array(cast(uid_list as 
array<bigint>))),
+                        bitmap_union(bitmap_from_array(if(status='success', 
cast(uid_list as array<bigint>), array())))
+                    from dp
+                    group by d;""")
+
+    sql """INSERT INTO `dp` VALUES 
(1,'success',["3","4"]),(2,'success',["5"]);"""
+/*
+    streamLoad {
+        table "test"
+
+        set 'columns', 'date'
+
+        file './test'
+        time 10000 // limit inflight 10s
+    }
+*/
+    explain {
+        sql("""select d,
+                        bitmap_union_count(bitmap_from_array(cast(uid_list as 
array<bigint>))),
+                        
bitmap_union_count(bitmap_from_array(if(status='success', cast(uid_list as 
array<bigint>), array())))
+                    from dp
+                    group by d;""")
+        contains "(view_2)"
+    }
+
+    qt_select_mv """select d,
+                        bitmap_union_count(bitmap_from_array(cast(uid_list as 
array<bigint>))),
+                        
bitmap_union_count(bitmap_from_array(if(status='success', cast(uid_list as 
array<bigint>), array())))
+                    from dp
+                    group by d order by 1;"""
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to