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 <wayn...@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) {