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