This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit b2e847a0e3ba72b556546552a0c8523c120b8a3a Author: Guoliang Sun <guoliang....@kyligence.io> AuthorDate: Thu Oct 26 18:32:39 2023 +0800 KYLIN-5859 Add cache in ProjectBundle for effectiveRewriteMeasures of table --- .../kylin/metadata/project/NProjectLoader.java | 58 ++++++++++++++-------- .../kylin/metadata/project/NProjectManager.java | 2 +- .../kylin/metadata/project/NProjectLoaderTest.java | 24 +++++++-- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectLoader.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectLoader.java index 1b80aaf299..ddca82d024 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectLoader.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectLoader.java @@ -95,25 +95,10 @@ public class NProjectLoader { return Collections.unmodifiableSet(realizationsByTable); } - public List<MeasureDesc> listEffectiveRewriteMeasures(String project, String table, boolean onlyRewriteMeasure) { - Set<IRealization> realizations = getRealizationsByTable(project, table); - Set<String> modelIds = NDataModelManager.getInstance(KylinConfig.getInstanceFromEnv(), project) - .listAllModelIds(); - List<MeasureDesc> result = Lists.newArrayList(); - List<IRealization> existingRealizations = realizations.stream().filter(r -> modelIds.contains(r.getUuid())) - .collect(Collectors.toList()); - for (IRealization r : existingRealizations) { - if (!r.isOnline()) - continue; - NDataModel model = r.getModel(); - for (MeasureDesc m : r.getMeasures()) { - FunctionDesc func = m.getFunction(); - if (belongToFactTable(table, model) && (!onlyRewriteMeasure || func.needRewrite())) { - result.add(m); - } - } - } - return result; + public List<MeasureDesc> listEffectiveRewriteMeasures(String project, String table) { + List<MeasureDesc> effectiveRewriteMeasures = load(project).tableToMeasuresMap.get(StringUtils.upperCase(table)); + return effectiveRewriteMeasures == null ? Collections.emptyList() + : Collections.unmodifiableList(effectiveRewriteMeasures); } private boolean belongToFactTable(String table, NDataModel model) { @@ -173,7 +158,7 @@ public class NProjectLoader { mapTableToRealization(projectBundle, realization); } }); - + mapEffectiveRewriteMeasuresByTable(projectBundle, project, projectAllTables); return projectBundle; } @@ -217,9 +202,42 @@ public class NProjectLoader { } } + private void mapEffectiveRewriteMeasuresByTable(ProjectBundle prjCache, String project, + Map<String, TableDesc> projectAllTables) { + Set<String> modelIds = NDataModelManager.getInstance(KylinConfig.getInstanceFromEnv(), project) + .listAllModelIds(); + + projectAllTables.forEach((tableKey, tableDesc) -> { + Set<IRealization> realizations = prjCache.realizationsByTable.get(tableKey); + if (realizations == null) { + return; + } + List<IRealization> existingRealizations = realizations.stream() + .filter(realization -> modelIds.contains(realization.getUuid())).collect(Collectors.toList()); + List<MeasureDesc> measureDescs = Lists.newArrayList(); + for (IRealization realization : existingRealizations) { + if (!realization.isOnline()) { + continue; + } + NDataModel model = realization.getModel(); + if (model == null || model.isBroken()) { + continue; + } + for (MeasureDesc measureDesc : realization.getMeasures()) { + FunctionDesc func = measureDesc.getFunction(); + if (belongToFactTable(tableKey, model) && func.needRewrite()) { + measureDescs.add(measureDesc); + } + } + } + prjCache.tableToMeasuresMap.put(tableDesc.getIdentity(), measureDescs); + }); + } + private static class ProjectBundle { private String project; private final Map<String, Set<IRealization>> realizationsByTable = new ConcurrentHashMap<>(); + private final Map<String, List<MeasureDesc>> tableToMeasuresMap = new ConcurrentHashMap<>(); ProjectBundle(String project) { this.project = project; diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectManager.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectManager.java index a10b271b01..2319e5bccd 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectManager.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/project/NProjectManager.java @@ -210,7 +210,7 @@ public class NProjectManager { } public List<MeasureDesc> listEffectiveRewriteMeasures(String project, String factTable) { - return projectLoader.listEffectiveRewriteMeasures(project, factTable.toUpperCase(Locale.ROOT), true); + return projectLoader.listEffectiveRewriteMeasures(project, factTable); } KylinConfig getConfig() { diff --git a/src/core-metadata/src/test/java/org/apache/kylin/metadata/project/NProjectLoaderTest.java b/src/core-metadata/src/test/java/org/apache/kylin/metadata/project/NProjectLoaderTest.java index 72c6561fbe..a2c3bc7f92 100644 --- a/src/core-metadata/src/test/java/org/apache/kylin/metadata/project/NProjectLoaderTest.java +++ b/src/core-metadata/src/test/java/org/apache/kylin/metadata/project/NProjectLoaderTest.java @@ -20,13 +20,16 @@ package org.apache.kylin.metadata.project; import static org.apache.kylin.metadata.project.NProjectLoaderTest.PROJECT_NAME; +import java.util.List; import java.util.Set; import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.metadata.realization.IRealization; import org.apache.kylin.junit.annotation.MetadataInfo; +import org.apache.kylin.metadata.model.MeasureDesc; +import org.apache.kylin.metadata.realization.IRealization; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.Test; @MetadataInfo(overlay = "src/test/resources/ut_meta/project_loader", project = PROJECT_NAME) class NProjectLoaderTest { @@ -38,9 +41,24 @@ class NProjectLoaderTest { NProjectLoader.removeCache(); NProjectLoader.updateCache(PROJECT_NAME); Set<IRealization> realizations = new NProjectLoader( - NProjectManager.getInstance(KylinConfig.getInstanceFromEnv())).getRealizationsByTable(PROJECT_NAME, - "SSB.P_LINEORDER"); + NProjectManager.getInstance(KylinConfig.getInstanceFromEnv())) + .getRealizationsByTable(PROJECT_NAME, "SSB.P_LINEORDER"); Assertions.assertEquals(5, realizations.size()); NProjectLoader.removeCache(); } + + @Test + public void testGetEffectiveRewriteMeasures() { + NProjectLoader.removeCache(); + NProjectLoader.updateCache(PROJECT_NAME); + List<MeasureDesc> effectiveRewriteMeasures = new NProjectLoader( + NProjectManager.getInstance(KylinConfig.getInstanceFromEnv())) + .listEffectiveRewriteMeasures(PROJECT_NAME, "SSB.P_LINEORDER"); + + List<MeasureDesc> cacheEffectiveRewriteMeasures = new NProjectLoader( + NProjectManager.getInstance(KylinConfig.getInstanceFromEnv())) + .listEffectiveRewriteMeasures(PROJECT_NAME, "SSB.P_LINEORDER"); + Assertions.assertEquals(effectiveRewriteMeasures.size(), cacheEffectiveRewriteMeasures.size()); + NProjectLoader.removeCache(); + } }