This is an automated email from the ASF dual-hosted git repository. nju_yaho pushed a commit to tag ebay-3.1.0-release-20200701 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit d0e352bb729cfac4ed1371eb50e84dbea34b19f1 Author: Zhong, Yanghong <nju_y...@apache.org> AuthorDate: Mon Jun 22 14:16:48 2020 +0800 EBAY-KYLIN-2371 Don't use DictionaryEnumerator for foreign key only query for old cubes whose dictionaries were built from lookup tables --- .../java/org/apache/kylin/common/KylinConfigBase.java | 4 ++++ .../org/apache/kylin/metadata/model/DataModelDesc.java | 15 +++++++++++++++ .../kylin/query/enumerator/DictionaryEnumerator.java | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java index 2ac703d..f9bafee 100644 --- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java +++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java @@ -1838,6 +1838,10 @@ public abstract class KylinConfigBase implements Serializable { return Lists.newArrayList(rules.split(",")); } + public boolean isDictionaryEnumeratorEnabledForForeignKey() { + return Boolean.valueOf(getOptional("kylin.query.enable-dict-enumerator-for-foreign-key", "false")); + } + // check KYLIN-3358, need deploy coprocessor if enabled // finally should be deprecated public boolean isDynamicColumnEnabled() { diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java index d126d3d..9a3e0e9 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java @@ -225,6 +225,21 @@ public class DataModelDesc extends RootPersistentEntity { return result; } + // check whether a col in fact table is part of FK + public boolean isBelongToFK(TblColRef col) { + if (!isFactTable(col.getTableRef())) { + return false; + } + for (TableRef lookup : getLookupTables()) { + JoinDesc lookupJoin = getJoinByPKSide(lookup); + int find = ArrayUtils.indexOf(lookupJoin.getForeignKeyColumns(), col); + if (find < 0) + continue; + return true; + } + return false; + } + public boolean isLookupTable(TableRef t) { if (t == null) return false; diff --git a/query/src/main/java/org/apache/kylin/query/enumerator/DictionaryEnumerator.java b/query/src/main/java/org/apache/kylin/query/enumerator/DictionaryEnumerator.java index 6af65ee..4725ec7 100644 --- a/query/src/main/java/org/apache/kylin/query/enumerator/DictionaryEnumerator.java +++ b/query/src/main/java/org/apache/kylin/query/enumerator/DictionaryEnumerator.java @@ -70,8 +70,15 @@ public class DictionaryEnumerator implements Enumerator<Object[]> { return false; } + IRealization realization = olapContext.realization; TblColRef dictCol = olapContext.allColumns.iterator().next(); + if (!realization.getConfig().isDictionaryEnumeratorEnabledForForeignKey() + && realization.getModel().isBelongToFK(dictCol)) { + logger.info("DictionaryEnumerator not enabled due to col {} belongs to FK", dictCol); + return false; + } if (!ifColumnHaveDictionary(dictCol, olapContext.realization, true)) { + logger.info("DictionaryEnumerator not enabled due to col {} is not dictionary encoded", dictCol); return false; } return true; @@ -138,5 +145,6 @@ public class DictionaryEnumerator implements Enumerator<Object[]> { @Override public void close() { + logger.info("DictionaryEnumerator closed"); } } \ No newline at end of file