This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/fixLimitBug1.1 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6feaabca2c1e6da10583a0ed0cc307c03a2bf095 Author: Minghui Liu <[email protected]> AuthorDate: Wed Mar 22 16:52:44 2023 +0800 fix order bug --- .../execution/operator/source/SeriesScanUtil.java | 11 ++++-- .../read/reader/series/PaginationController.java | 44 +++++++++++++++++++--- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/source/SeriesScanUtil.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/source/SeriesScanUtil.java index 755795447f..0dbd911adf 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/source/SeriesScanUtil.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/source/SeriesScanUtil.java @@ -1112,7 +1112,7 @@ public class SeriesScanUtil { return scanOptions.getGlobalTimeFilter(); } - protected static class VersionPageReader { + protected class VersionPageReader { private final PriorityMergeReader.MergeReaderPriority version; private final IPageReader data; @@ -1150,11 +1150,16 @@ public class SeriesScanUtil { TsBlock getAllSatisfiedPageData(boolean ascending) throws IOException { long startTime = System.nanoTime(); try { + paginationController.setEnable(ascending); TsBlock tsBlock = data.getAllSatisfiedData(); - if (!ascending) { + paginationController.setEnable(true); + + if (ascending) { + return tsBlock; + } else { tsBlock.reverse(); + return paginationController.applyTsBlock(tsBlock); } - return tsBlock; } finally { QUERY_METRICS.recordSeriesScanCost( isAligned diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/PaginationController.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/PaginationController.java index a35867645a..5d0f41b970 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/PaginationController.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/PaginationController.java @@ -19,6 +19,8 @@ package org.apache.iotdb.tsfile.read.reader.series; +import org.apache.iotdb.tsfile.read.common.block.TsBlock; + public class PaginationController { public static final PaginationController UNLIMITED_PAGINATION_CONTROLLER = @@ -29,6 +31,8 @@ public class PaginationController { private long curLimit; private long curOffset; + private boolean enable = true; + public PaginationController(long limit, long offset) { // row limit for result set. The default value is 0, which means no limit this.curLimit = limit; @@ -38,29 +42,57 @@ public class PaginationController { this.curOffset = offset; } + public void setEnable(boolean enable) { + this.enable = enable; + } + public boolean hasCurOffset() { - return curOffset > 0; + return enable && curOffset > 0; } public boolean hasCurOffset(long rowCount) { - return curOffset >= rowCount; + return enable && curOffset >= rowCount; } public boolean hasCurLimit() { - return !hasLimit || curLimit > 0; + return !enable || (!hasLimit || curLimit > 0); } public void consumeOffset(long rowCount) { - curOffset -= rowCount; + if (enable) { + curOffset -= rowCount; + } } public void consumeOffset() { - curOffset--; + if (enable) { + curOffset--; + } } public void consumeLimit() { - if (hasLimit) { + if (enable && hasLimit) { curLimit--; } } + + public void consumeLimit(long rowCount) { + if (enable && hasLimit) { + curLimit -= rowCount; + } + } + + public TsBlock applyTsBlock(TsBlock resultTsBlock) { + int fromIndex = 0, length = resultTsBlock.getPositionCount(); + if (hasCurOffset()) { + fromIndex = (int) Math.min(curOffset, length); + length -= fromIndex; + consumeOffset(fromIndex); + } + if (hasCurLimit()) { + length = (int) Math.min(curLimit, length); + consumeLimit(length); + } + return resultTsBlock.getRegion(fromIndex, length); + } }
