This is an automated email from the ASF dual-hosted git repository. shaofengshi pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kylin.git
The following commit(s) were added to refs/heads/master by this push: new e3896af KYLIN-3628 The wrong result when a query with one lookup table e3896af is described below commit e3896af23471672ae0b1b4a5aa2053eda3079175 Author: GinaZhai <na.z...@kyligence.io> AuthorDate: Thu Nov 22 17:36:52 2018 +0800 KYLIN-3628 The wrong result when a query with one lookup table --- .../java/org/apache/kylin/cube/CubeInstance.java | 2 +- .../java/org/apache/kylin/cube/CubeManager.java | 26 ++++++++++++++++++++++ .../query/enumerator/LookupTableEnumerator.java | 12 ++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java index ff86e7d..4919215 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeInstance.java @@ -717,4 +717,4 @@ public class CubeInstance extends RootPersistentEntity implements IRealization, throw new IllegalStateException("No segment's last build job ID equals " + jobID); } -} +} \ No newline at end of file diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java index a022f1e..1062340 100755 --- a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java @@ -69,8 +69,10 @@ import org.apache.kylin.metadata.model.TableDesc; import org.apache.kylin.metadata.model.TblColRef; import org.apache.kylin.metadata.project.ProjectInstance; import org.apache.kylin.metadata.project.ProjectManager; +import org.apache.kylin.metadata.project.RealizationEntry; import org.apache.kylin.metadata.realization.IRealization; import org.apache.kylin.metadata.realization.IRealizationProvider; +import org.apache.kylin.metadata.realization.RealizationRegistry; import org.apache.kylin.metadata.realization.RealizationStatusEnum; import org.apache.kylin.metadata.realization.RealizationType; import org.apache.kylin.source.IReadableTable; @@ -1193,4 +1195,28 @@ public class CubeManager implements IRealizationProvider { } } + public CubeInstance findLatestSnapshot(List<RealizationEntry> realizationEntries, String lookupTableName) { + CubeInstance cube = null; + if (realizationEntries.size() > 0) { + long maxBuildTime = Long.MIN_VALUE; + RealizationRegistry registry = RealizationRegistry.getInstance(config); + for (RealizationEntry entry : realizationEntries) { + IRealization realization = registry.getRealization(entry.getType(), entry.getRealization()); + if (realization != null && realization.isReady() && realization instanceof CubeInstance) { + if (realization.getModel().isLookupTable(lookupTableName)) { + CubeInstance current = (CubeInstance) realization; + CubeSegment segment = current.getLatestReadySegment(); + if (segment != null) { + long latestBuildTime = segment.getLastBuildTime(); + if (latestBuildTime > maxBuildTime) { + maxBuildTime = latestBuildTime; + cube = current; + } + } + } + } + } + } + return cube; + } } diff --git a/query/src/main/java/org/apache/kylin/query/enumerator/LookupTableEnumerator.java b/query/src/main/java/org/apache/kylin/query/enumerator/LookupTableEnumerator.java index c3407bc..f8c7ad4 100644 --- a/query/src/main/java/org/apache/kylin/query/enumerator/LookupTableEnumerator.java +++ b/query/src/main/java/org/apache/kylin/query/enumerator/LookupTableEnumerator.java @@ -29,6 +29,8 @@ import org.apache.kylin.cube.CubeManager; import org.apache.kylin.cube.model.DimensionDesc; import org.apache.kylin.dict.lookup.ILookupTable; import org.apache.kylin.metadata.model.ColumnDesc; +import org.apache.kylin.metadata.project.ProjectInstance; +import org.apache.kylin.metadata.project.RealizationEntry; import org.apache.kylin.metadata.realization.IRealization; import org.apache.kylin.metadata.tuple.Tuple; import org.apache.kylin.query.relnode.OLAPContext; @@ -52,9 +54,15 @@ public class LookupTableEnumerator implements Enumerator<Object[]> { //TODO: assuming LookupTableEnumerator is handled by a cube CubeInstance cube = null; - if (olapContext.realization instanceof CubeInstance) + if (olapContext.realization instanceof CubeInstance) { cube = (CubeInstance) olapContext.realization; - else if (olapContext.realization instanceof HybridInstance) { + ProjectInstance project = cube.getProjectInstance(); + List<RealizationEntry> realizationEntries = project.getRealizationEntries(); + String lookupTableName = olapContext.firstTableScan.getTableName(); + CubeManager cubeMgr = CubeManager.getInstance(cube.getConfig()); + cube = cubeMgr.findLatestSnapshot(realizationEntries, lookupTableName); + olapContext.realization = cube; + } else if (olapContext.realization instanceof HybridInstance) { final HybridInstance hybridInstance = (HybridInstance) olapContext.realization; final IRealization latestRealization = hybridInstance.getLatestRealization(); if (latestRealization instanceof CubeInstance) {