You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2023/03/23 13:40:53 UTC
[iotdb] 01/06: fix order bug
This is an automated email from the ASF dual-hosted git repository.
hui pushed a commit to branch lmh/fixLimitPushDownBug1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 07f75817983ed9688ac653e22605a335fcf4a015
Author: Minghui Liu <li...@foxmail.com>
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);
+ }
}