From 510d88f31505e964a49b7701358fa0302fb78cf3 Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Mon, 22 Jan 2024 20:42:25 +0800 Subject: [PATCH] [fix](mtmv)return MTMV with at least one available partition #30156 --- .../doris/mtmv/MTMVRelationManager.java | 21 ++++++++++++++----- .../mv/InitMaterializationContextHook.java | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java index 35bf777acb..77414e4fc8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java @@ -33,6 +33,7 @@ import org.apache.doris.nereids.trees.plans.commands.info.RefreshMTMVInfo; import org.apache.doris.nereids.trees.plans.commands.info.ResumeMTMVInfo; import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo; import org.apache.doris.persist.AlterMTMV; +import org.apache.doris.qe.ConnectContext; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; @@ -53,16 +54,26 @@ public class MTMVRelationManager implements MTMVHookService { private static final Logger LOG = LogManager.getLogger(MTMVRelationManager.class); private Map> tableMTMVs = Maps.newConcurrentMap(); - public Set getMtmvsByBaseTable(BaseTableInfo table) { + private Set getMtmvsByBaseTable(BaseTableInfo table) { return tableMTMVs.getOrDefault(table, ImmutableSet.of()); } - public Set getAvailableMTMVs(List tableInfos) { + /** + * if At least one partition is available, return this mtmv + * + * @param tableInfos + * @param ctx + * @return + */ + public Set getAvailableMTMVs(List tableInfos, ConnectContext ctx) { Set res = Sets.newHashSet(); - Set mvInfos = getAvailableMTMVInfos(tableInfos); + Set mvInfos = getMTMVInfos(tableInfos); for (BaseTableInfo tableInfo : mvInfos) { try { - res.add((MTMV) MTMVUtil.getTable(tableInfo)); + MTMV mtmv = (MTMV) MTMVUtil.getTable(tableInfo); + if (!CollectionUtils.isEmpty(MTMVUtil.getMTMVCanRewritePartitions(mtmv, ctx))) { + res.add(mtmv); + } } catch (AnalysisException e) { // not throw exception to client, just ignore it LOG.warn("getTable failed: {}", tableInfo.toString(), e); @@ -71,7 +82,7 @@ public class MTMVRelationManager implements MTMVHookService { return res; } - public Set getAvailableMTMVInfos(List tableInfos) { + private Set getMTMVInfos(List tableInfos) { Set mvInfos = Sets.newHashSet(); for (BaseTableInfo tableInfo : tableInfos) { mvInfos.addAll(getMtmvsByBaseTable(tableInfo)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/InitMaterializationContextHook.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/InitMaterializationContextHook.java index 07a4ff208b..baf714fe28 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/InitMaterializationContextHook.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/InitMaterializationContextHook.java @@ -70,7 +70,7 @@ public class InitMaterializationContextHook implements PlannerHook { List usedBaseTables = collectedTables.stream().map(BaseTableInfo::new).collect(Collectors.toList()); Set availableMTMVs = Env.getCurrentEnv().getMtmvService().getRelationManager() - .getAvailableMTMVs(usedBaseTables); + .getAvailableMTMVs(usedBaseTables, cascadesContext.getConnectContext()); if (availableMTMVs.isEmpty()) { return; }