You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2019/06/25 03:58:23 UTC

[kylin] branch 2.6.x updated: KYLIN-2620 TopN can't match when multi sort columns

This is an automated email from the ASF dual-hosted git repository.

nic pushed a commit to branch 2.6.x
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/2.6.x by this push:
     new 2bfda2d  KYLIN-2620 TopN can't match when multi sort columns
2bfda2d is described below

commit 2bfda2d6c2a19586d0854e487bd3ceb805922940
Author: chao long <wa...@qq.com>
AuthorDate: Sun May 19 18:45:37 2019 +0800

    KYLIN-2620 TopN can't match when multi sort columns
---
 .../apache/kylin/measure/topn/TopNMeasureType.java | 34 ++++++++++++++--------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNMeasureType.java b/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNMeasureType.java
index 194ba36..472de3c 100644
--- a/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNMeasureType.java
+++ b/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNMeasureType.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.util.ByteArray;
 import org.apache.kylin.common.util.Dictionary;
@@ -332,23 +333,32 @@ public class TopNMeasureType extends MeasureType<TopNCounter<ByteArray>> {
         return null;
     }
 
-    private boolean hasOneElement(List<? extends Object> list) {
-        return list != null && list.size() == 1;
+    private boolean checkSortAndOrder(List<TblColRef> sort, List<SQLDigest.OrderEnum> order) {
+        return CollectionUtils.isNotEmpty(sort) && CollectionUtils.isNotEmpty(order) && sort.size() == order.size();
     }
 
     private boolean totallyMatchTopN(SQLDigest digest) {
-        boolean sortColumnMatch = false;
-        if (hasOneElement(digest.sortColumns)) {
-            TblColRef sortColumn = digest.sortColumns.get(0);
-            if (!digest.groupbyColumns.contains(sortColumn)) {
-                // only have one aggregation
-                sortColumnMatch = sortColumn.getColumnDesc().getZeroBasedIndex() == 0;
-            }
+        if (!checkSortAndOrder(digest.sortColumns, digest.sortOrders)) {
+            return false;
         }
 
-        return sortColumnMatch
-                && hasOneElement(digest.sortOrders) && DESCENDING.equals(digest.sortOrders.get(0))
-                && digest.hasLimit;
+        TblColRef sortColumn = digest.sortColumns.get(0);
+
+        // first sort column must be sum()
+        if (digest.groupbyColumns.contains(sortColumn)) {
+            return false;
+        }
+
+        // first order must be desc
+        if (!DESCENDING.equals(digest.sortOrders.get(0))) {
+            return false;
+        }
+
+        if (!digest.hasLimit) {
+            return false;
+        }
+
+        return true;
     }
 
     private boolean isTopNCompatibleSum(FunctionDesc topN, FunctionDesc sum) {