You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ka...@apache.org on 2017/08/09 12:09:28 UTC

kylin git commit: KYLIN-2706 Only compare with group columns in SortedIteratorMergerWithLimit

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 <ka...@meituan.com>
Authored: Sat Jul 22 20:40:45 2017 +0800
Committer: kangkaisen <ka...@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