[enhance](mtmv) add baseTablesOneLevel for MTMVRelation and MTMVRelationManager (#34593)
baseTables in MTMVRelation stores all baseTables in the nested materialized view, now adding baseTablesOneLevel to only store the baseTables at the current level.
This commit is contained in:
@ -117,14 +117,14 @@ public class MTMVPlanUtil {
|
||||
}
|
||||
|
||||
public static MTMVRelation generateMTMVRelation(Plan plan) {
|
||||
return new MTMVRelation(getBaseTables(plan), getBaseViews(plan));
|
||||
return new MTMVRelation(getBaseTables(plan, true), getBaseTables(plan, false), getBaseViews(plan));
|
||||
}
|
||||
|
||||
private static Set<BaseTableInfo> getBaseTables(Plan plan) {
|
||||
private static Set<BaseTableInfo> getBaseTables(Plan plan, boolean expand) {
|
||||
TableCollectorContext collectorContext =
|
||||
new TableCollector.TableCollectorContext(
|
||||
com.google.common.collect.Sets
|
||||
.newHashSet(TableType.values()), true);
|
||||
.newHashSet(TableType.values()), expand);
|
||||
plan.accept(TableCollector.INSTANCE, collectorContext);
|
||||
Set<TableIf> collectedTables = collectorContext.getCollectedTables();
|
||||
return transferTableIfToInfo(collectedTables);
|
||||
|
||||
@ -30,9 +30,13 @@ public class MTMVRelation {
|
||||
private Set<BaseTableInfo> baseTables;
|
||||
@SerializedName("bv")
|
||||
private Set<BaseTableInfo> baseViews;
|
||||
@SerializedName("btol")
|
||||
private Set<BaseTableInfo> baseTablesOneLevel;
|
||||
|
||||
public MTMVRelation(Set<BaseTableInfo> baseTables, Set<BaseTableInfo> baseViews) {
|
||||
public MTMVRelation(Set<BaseTableInfo> baseTables, Set<BaseTableInfo> baseTablesOneLevel,
|
||||
Set<BaseTableInfo> baseViews) {
|
||||
this.baseTables = baseTables;
|
||||
this.baseTablesOneLevel = baseTablesOneLevel;
|
||||
this.baseViews = baseViews;
|
||||
}
|
||||
|
||||
@ -40,6 +44,11 @@ public class MTMVRelation {
|
||||
return baseTables;
|
||||
}
|
||||
|
||||
public Set<BaseTableInfo> getBaseTablesOneLevel() {
|
||||
// For compatibility, previously created MTMV may not have baseTablesOneLevel
|
||||
return baseTablesOneLevel == null ? baseTables : baseTablesOneLevel;
|
||||
}
|
||||
|
||||
public Set<BaseTableInfo> getBaseViews() {
|
||||
return baseViews;
|
||||
}
|
||||
@ -48,6 +57,7 @@ public class MTMVRelation {
|
||||
public String toInfoString() {
|
||||
return "MTMVRelation{"
|
||||
+ "baseTables=" + baseTables
|
||||
+ ", baseTablesOneLevel=" + baseTablesOneLevel
|
||||
+ ", baseViews=" + baseViews
|
||||
+ '}';
|
||||
}
|
||||
|
||||
@ -53,12 +53,22 @@ import java.util.Set;
|
||||
*/
|
||||
public class MTMVRelationManager implements MTMVHookService {
|
||||
private static final Logger LOG = LogManager.getLogger(MTMVRelationManager.class);
|
||||
// when
|
||||
// create mv1 as select * from table1;
|
||||
// create mv2 as select * from mv1;
|
||||
// `tableMTMVs` will have 3 pair: table1 ==> mv1,mv1==>mv2, table1 ==> mv2
|
||||
// `tableMTMVsOneLevel` will have 2 pair: table1 ==> mv1,mv1==>mv2
|
||||
private Map<BaseTableInfo, Set<BaseTableInfo>> tableMTMVs = Maps.newConcurrentMap();
|
||||
private Map<BaseTableInfo, Set<BaseTableInfo>> tableMTMVsOneLevel = Maps.newConcurrentMap();
|
||||
|
||||
private Set<BaseTableInfo> getMtmvsByBaseTable(BaseTableInfo table) {
|
||||
public Set<BaseTableInfo> getMtmvsByBaseTable(BaseTableInfo table) {
|
||||
return tableMTMVs.getOrDefault(table, ImmutableSet.of());
|
||||
}
|
||||
|
||||
public Set<BaseTableInfo> getMtmvsByBaseTableOneLevel(BaseTableInfo table) {
|
||||
return tableMTMVsOneLevel.getOrDefault(table, ImmutableSet.of());
|
||||
}
|
||||
|
||||
/**
|
||||
* if At least one partition is available, return this mtmv
|
||||
*
|
||||
@ -104,7 +114,14 @@ public class MTMVRelationManager implements MTMVHookService {
|
||||
return tableMTMVs.get(baseTableInfo);
|
||||
}
|
||||
|
||||
private void refreshMTMVCache(MTMVRelation relation, BaseTableInfo mtmvInfo) {
|
||||
private Set<BaseTableInfo> getOrCreateMTMVsOneLevel(BaseTableInfo baseTableInfo) {
|
||||
if (!tableMTMVsOneLevel.containsKey(baseTableInfo)) {
|
||||
tableMTMVsOneLevel.put(baseTableInfo, Sets.newConcurrentHashSet());
|
||||
}
|
||||
return tableMTMVsOneLevel.get(baseTableInfo);
|
||||
}
|
||||
|
||||
public void refreshMTMVCache(MTMVRelation relation, BaseTableInfo mtmvInfo) {
|
||||
LOG.info("refreshMTMVCache,relation: {}, mtmvInfo: {}", relation, mtmvInfo);
|
||||
removeMTMV(mtmvInfo);
|
||||
addMTMV(relation, mtmvInfo);
|
||||
@ -116,6 +133,7 @@ public class MTMVRelationManager implements MTMVHookService {
|
||||
}
|
||||
addMTMVTables(relation.getBaseTables(), mtmvInfo);
|
||||
addMTMVTables(relation.getBaseViews(), mtmvInfo);
|
||||
addMTMVTablesOneLevel(relation.getBaseTablesOneLevel(), mtmvInfo);
|
||||
}
|
||||
|
||||
private void addMTMVTables(Set<BaseTableInfo> baseTables, BaseTableInfo mtmvInfo) {
|
||||
@ -127,10 +145,22 @@ public class MTMVRelationManager implements MTMVHookService {
|
||||
}
|
||||
}
|
||||
|
||||
private void addMTMVTablesOneLevel(Set<BaseTableInfo> baseTables, BaseTableInfo mtmvInfo) {
|
||||
if (CollectionUtils.isEmpty(baseTables)) {
|
||||
return;
|
||||
}
|
||||
for (BaseTableInfo baseTableInfo : baseTables) {
|
||||
getOrCreateMTMVsOneLevel(baseTableInfo).add(mtmvInfo);
|
||||
}
|
||||
}
|
||||
|
||||
private void removeMTMV(BaseTableInfo mtmvInfo) {
|
||||
for (Set<BaseTableInfo> sets : tableMTMVs.values()) {
|
||||
sets.remove(mtmvInfo);
|
||||
}
|
||||
for (Set<BaseTableInfo> sets : tableMTMVsOneLevel.values()) {
|
||||
sets.remove(mtmvInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user