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