Repository: kylin
Updated Branches:
  refs/heads/master 714b22512 -> 659eeaedd


KYLIN-2706 Only compare with group columns in SortedIteratorMergerWithLimit


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/659eeaed
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/659eeaed
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/659eeaed

Branch: refs/heads/master
Commit: 659eeaedd571c837df3beae44456dadde3036c3d
Parents: 714b225
Author: kangkaisen <kangkai...@meituan.com>
Authored: Sat Jul 22 20:40:45 2017 +0800
Committer: kangkaisen <kangkai...@meituan.com>
Committed: Wed Aug 9 19:59:58 2017 +0800

----------------------------------------------------------------------
 .../gtrecord/GTCubeStorageQueryBase.java        |  2 +-
 .../gtrecord/SequentialCubeTupleIterator.java   | 17 ++++++++++++----
 .../test/resources/query/sql_limit/query05.sql  | 21 ++++++++++++++++++++
 3 files changed, 35 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/659eeaed/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/GTCubeStorageQueryBase.java
----------------------------------------------------------------------
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 f89fc47..3543c75 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
@@ -94,7 +94,7 @@ public abstract class GTCubeStorageQueryBase implements 
IStorageQuery {
             return ITupleIterator.EMPTY_TUPLE_ITERATOR;
 
         return new SequentialCubeTupleIterator(scanners, request.getCuboid(), 
request.getDimensions(),
-                request.getMetrics(), returnTupleInfo, request.getContext(), 
sqlDigest);
+                request.getGroups(), request.getMetrics(), returnTupleInfo, 
request.getContext(), sqlDigest);
     }
 
     protected GTCubeStorageQueryRequest getStorageQueryRequest(StorageContext 
context, SQLDigest sqlDigest, TupleInfo returnTupleInfo) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/659eeaed/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/SequentialCubeTupleIterator.java
----------------------------------------------------------------------
diff --git 
a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/SequentialCubeTupleIterator.java
 
b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/SequentialCubeTupleIterator.java
index f7cb1b9..3cbb538 100644
--- 
a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/SequentialCubeTupleIterator.java
+++ 
b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/SequentialCubeTupleIterator.java
@@ -23,6 +23,7 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 import org.apache.kylin.common.exceptions.KylinTimeoutException;
 import org.apache.kylin.cube.cuboid.Cuboid;
@@ -53,7 +54,7 @@ public class SequentialCubeTupleIterator implements 
ITupleIterator {
     private int scanCountDelta;
 
     public SequentialCubeTupleIterator(List<CubeSegmentScanner> scanners, 
Cuboid cuboid, Set<TblColRef> selectedDimensions, //
-            Set<FunctionDesc> selectedMetrics, TupleInfo returnTupleInfo, 
StorageContext context, SQLDigest sqlDigest) {
+            Set<TblColRef> groups, Set<FunctionDesc> selectedMetrics, 
TupleInfo returnTupleInfo, StorageContext context, SQLDigest sqlDigest) {
         this.context = context;
         this.scanners = scanners;
 
@@ -66,7 +67,7 @@ public class SequentialCubeTupleIterator implements 
ITupleIterator {
             //query with limit
             logger.info("Using SortedIteratorMergerWithLimit to merge segment 
results");
             Iterator<Iterator<ITuple>> transformed = 
(Iterator<Iterator<ITuple>>) (Iterator<?>) segmentCubeTupleIterators.iterator();
-            tupleIterator = new 
SortedIteratorMergerWithLimit<ITuple>(transformed, 
context.getFinalPushDownLimit(), getTupleDimensionComparator(cuboid, 
returnTupleInfo)).getIterator();
+            tupleIterator = new 
SortedIteratorMergerWithLimit<ITuple>(transformed, 
context.getFinalPushDownLimit(), getTupleDimensionComparator(cuboid, groups, 
returnTupleInfo)).getIterator();
         } else {
             //normal case
             logger.info("Using Iterators.concat to merge segment results");
@@ -74,10 +75,18 @@ public class SequentialCubeTupleIterator implements 
ITupleIterator {
         }
     }
 
-    public Comparator<ITuple> getTupleDimensionComparator(Cuboid cuboid, 
TupleInfo returnTupleInfo) {
+    public Comparator<ITuple> getTupleDimensionComparator(Cuboid cuboid, 
Set<TblColRef> groups, TupleInfo returnTupleInfo) {
         // dimensionIndexOnTuple is for SQL with limit
+        List<TblColRef> dimColumns = cuboid.getColumns();
+
+        TreeSet<Integer> groupIndexOnDim = new TreeSet<>();
+        for (TblColRef colRef: groups) {
+            groupIndexOnDim.add(dimColumns.indexOf(colRef));
+        }
+
         List<Integer> temp = Lists.newArrayList();
-        for (TblColRef dim : cuboid.getColumns()) {
+        for (Integer index: groupIndexOnDim) {
+            TblColRef dim = dimColumns.get(index);
             if (returnTupleInfo.hasColumn(dim)) {
                 temp.add(returnTupleInfo.getColumnIndex(dim));
             }

http://git-wip-us.apache.org/repos/asf/kylin/blob/659eeaed/kylin-it/src/test/resources/query/sql_limit/query05.sql
----------------------------------------------------------------------
diff --git a/kylin-it/src/test/resources/query/sql_limit/query05.sql 
b/kylin-it/src/test/resources/query/sql_limit/query05.sql
new file mode 100644
index 0000000..ba5523a
--- /dev/null
+++ b/kylin-it/src/test/resources/query/sql_limit/query05.sql
@@ -0,0 +1,21 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--     http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+select sum(price) from test_kylin_fact
+  where CAL_DT >= '2012-02-16' and CAL_DT <= '2012-03-16'
+  limit 1

Reply via email to