You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2018/12/26 06:50:03 UTC

[kylin] branch master updated: KYLIN-3628 The wrong result when a query with one lookup table

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...@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) {