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