From cdcb3798927923d5834d64f89efd91fa2401bc1e Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Sat, 22 Jul 2017 20:40:45 +0800 Subject: [PATCH] KYLIN-2706 Only compare with group columns in SortedIteratorMergerWithLimit --- .../storage/gtrecord/GTCubeStorageQueryBase.java | 2 +- .../gtrecord/SequentialCubeTupleIterator.java | 17 +++++++++++++---- .../src/test/resources/query/sql_limit/query05.sql | 21 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 kylin-it/src/test/resources/query/sql_limit/query05.sql 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 f89fc47ae..3543c7596 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) { 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 f7cb1b947..3cbb538cc 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 scanners, Cuboid cuboid, Set selectedDimensions, // - Set selectedMetrics, TupleInfo returnTupleInfo, StorageContext context, SQLDigest sqlDigest) { + Set groups, Set 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> transformed = (Iterator>) (Iterator) segmentCubeTupleIterators.iterator(); - tupleIterator = new SortedIteratorMergerWithLimit(transformed, context.getFinalPushDownLimit(), getTupleDimensionComparator(cuboid, returnTupleInfo)).getIterator(); + tupleIterator = new SortedIteratorMergerWithLimit(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 getTupleDimensionComparator(Cuboid cuboid, TupleInfo returnTupleInfo) { + public Comparator getTupleDimensionComparator(Cuboid cuboid, Set groups, TupleInfo returnTupleInfo) { // dimensionIndexOnTuple is for SQL with limit + List dimColumns = cuboid.getColumns(); + + TreeSet groupIndexOnDim = new TreeSet<>(); + for (TblColRef colRef: groups) { + groupIndexOnDim.add(dimColumns.indexOf(colRef)); + } + List 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)); } 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 000000000..ba5523a2f --- /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 -- 2.11.0 (Apple Git-81)