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

Reply via email to