From 334b56ef1ed7fdc18606742c8a38f39bee792e56 Mon Sep 17 00:00:00 2001 From: hahayuan Date: Sat, 29 Dec 2018 14:59:51 +0800 Subject: [PATCH 1/1] storageLimitLevel set to NO_LIMIT when the query has subquery --- .../src/main/java/org/apache/kylin/storage/StorageContext.java | 9 +++++++++ .../apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java | 5 +++++ .../main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java | 1 + 3 files changed, 15 insertions(+) diff --git a/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java b/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java index 5d2d06fb0..4a8c98ea4 100644 --- a/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java +++ b/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java @@ -63,6 +63,7 @@ public class StorageContext { private Range reusedPeriod; private long filterMask; + private boolean hasSubQuery; public StorageContext() { this(0); @@ -144,6 +145,14 @@ public class StorageContext { return storageLimitLevel; } + public boolean hasSubQuery() { + return hasSubQuery; + } + + public void setHasSubQuery(boolean hasSubQuery) { + this.hasSubQuery = hasSubQuery; + } + public void applyLimitPushDown(IRealization realization, StorageLimitLevel storageLimitLevel) { if (storageLimitLevel == StorageLimitLevel.NO_LIMIT) { diff --git a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java index 8d82873e0..0535b4c9d 100644 --- a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java +++ b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java @@ -461,6 +461,11 @@ public abstract class GTCubeStorageQueryBase implements IStorageQuery { logger.debug("storageLimitLevel set to NO_LIMIT because the query has order by"); } + if (context.hasSubQuery()){ + storageLimitLevel = StorageLimitLevel.NO_LIMIT; + logger.debug("storageLimitLevel set to NO_LIMIT because the query has subquery"); + } + //if exists measures like max(cal_dt), then it's not a perfect cuboid match, cannot apply limit for (FunctionDesc functionDesc : functionDescs) { if (functionDesc.isDimensionAsMetric()) { diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java index 479c8ca00..9993360c6 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java @@ -193,6 +193,7 @@ public class OLAPJoinRel extends EnumerableJoin implements OLAPRel { this.context.joins.add(join); } else { + this.context.storageContext.setHasSubQuery(true); //When join contains subquery, the join-condition fields of fact_table will add into context. Map joinCol = new HashMap(); translateJoinColumn(this.getCondition(), joinCol); -- 2.11.0.windows.1