This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git
The following commit(s) were added to refs/heads/develop by this push:
new 250e9367 add a new util method: applyFilterAndLimitOffsetToTsBlock
250e9367 is described below
commit 250e9367efc08c53d48eaf8ae6952e90c59b81e5
Author: liuminghui233 <[email protected]>
AuthorDate: Fri Feb 23 10:25:09 2024 +0800
add a new util method: applyFilterAndLimitOffsetToTsBlock
---
.../tsfile/read/common/block/TsBlockUtil.java | 55 ++++++++++++++++++++++
.../tsfile/read/reader/page/AlignedPageReader.java | 54 +++------------------
2 files changed, 61 insertions(+), 48 deletions(-)
diff --git
a/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockUtil.java
b/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockUtil.java
index 0f05afd5..f0dd1551 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockUtil.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockUtil.java
@@ -21,6 +21,8 @@ package org.apache.tsfile.read.common.block;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.read.common.block.column.TimeColumn;
+import org.apache.tsfile.read.filter.basic.Filter;
+import org.apache.tsfile.read.reader.series.PaginationController;
public class TsBlockUtil {
@@ -65,4 +67,57 @@ public class TsBlockUtil {
}
return left;
}
+
+ public static TsBlock applyFilterAndLimitOffsetToTsBlock(
+ TsBlock unFilteredBlock,
+ TsBlockBuilder builder,
+ Filter pushDownFilter,
+ PaginationController paginationController) {
+ boolean[] keepCurrentRow = pushDownFilter.satisfyTsBlock(unFilteredBlock);
+
+ // construct time column
+ int readEndIndex =
+ buildTimeColumnWithPagination(
+ unFilteredBlock, builder, keepCurrentRow, paginationController);
+
+ // construct value columns
+ for (int i = 0; i < builder.getValueColumnBuilders().length; i++) {
+ for (int rowIndex = 0; rowIndex < readEndIndex; rowIndex++) {
+ if (keepCurrentRow[rowIndex]) {
+ if (unFilteredBlock.getValueColumns()[i].isNull(rowIndex)) {
+ builder.getColumnBuilder(i).appendNull();
+ } else {
+ builder
+ .getColumnBuilder(i)
+
.writeObject(unFilteredBlock.getValueColumns()[i].getObject(rowIndex));
+ }
+ }
+ }
+ }
+ return builder.build();
+ }
+
+ private static int buildTimeColumnWithPagination(
+ TsBlock unFilteredBlock,
+ TsBlockBuilder builder,
+ boolean[] keepCurrentRow,
+ PaginationController paginationController) {
+ int readEndIndex = unFilteredBlock.getPositionCount();
+ for (int rowIndex = 0; rowIndex < readEndIndex; rowIndex++) {
+ if (keepCurrentRow[rowIndex]) {
+ if (paginationController.hasCurOffset()) {
+ paginationController.consumeOffset();
+ keepCurrentRow[rowIndex] = false;
+ } else if (paginationController.hasCurLimit()) {
+
builder.getTimeColumnBuilder().writeLong(unFilteredBlock.getTimeByIndex(rowIndex));
+ builder.declarePosition();
+ paginationController.consumeLimit();
+ } else {
+ readEndIndex = rowIndex;
+ break;
+ }
+ }
+ }
+ return readEndIndex;
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/tsfile/read/reader/page/AlignedPageReader.java
b/tsfile/src/main/java/org/apache/tsfile/read/reader/page/AlignedPageReader.java
index b60a0b8d..383f4195 100644
---
a/tsfile/src/main/java/org/apache/tsfile/read/reader/page/AlignedPageReader.java
+++
b/tsfile/src/main/java/org/apache/tsfile/read/reader/page/AlignedPageReader.java
@@ -28,6 +28,7 @@ import org.apache.tsfile.read.common.BatchDataFactory;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.read.common.block.TsBlock;
import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.TsBlockUtil;
import org.apache.tsfile.read.filter.basic.Filter;
import org.apache.tsfile.read.reader.IPageReader;
import org.apache.tsfile.read.reader.IPointReader;
@@ -205,11 +206,14 @@ public class AlignedPageReader implements IPageReader {
// construct value columns
buildValueColumns(readEndIndex, keepCurrentRow, isDeleted);
+ TsBlock unFilteredBlock = builder.build();
if (pushDownFilterAllSatisfy) {
// OFFSET & LIMIT has been consumed in buildTimeColumn
- return builder.build();
+ return unFilteredBlock;
}
- return applyPushDownFilter();
+ builder.reset();
+ return TsBlockUtil.applyFilterAndLimitOffsetToTsBlock(
+ unFilteredBlock, builder, pushDownFilter, paginationController);
}
private void buildResultWithoutAnyFilterAndDelete(long[] timeBatch) {
@@ -279,26 +283,6 @@ public class AlignedPageReader implements IPageReader {
return readEndIndex;
}
- private int buildTimeColumnWithPagination(TsBlock unFilteredBlock, boolean[]
keepCurrentRow) {
- int readEndIndex = unFilteredBlock.getPositionCount();
- for (int rowIndex = 0; rowIndex < readEndIndex; rowIndex++) {
- if (keepCurrentRow[rowIndex]) {
- if (paginationController.hasCurOffset()) {
- paginationController.consumeOffset();
- keepCurrentRow[rowIndex] = false;
- } else if (paginationController.hasCurLimit()) {
-
builder.getTimeColumnBuilder().writeLong(unFilteredBlock.getTimeByIndex(rowIndex));
- builder.declarePosition();
- paginationController.consumeLimit();
- } else {
- readEndIndex = rowIndex;
- break;
- }
- }
- }
- return readEndIndex;
- }
-
private int buildTimeColumnWithoutPagination(long[] timeBatch, boolean[]
keepCurrentRow) {
int readEndIndex = 0;
for (int i = 0; i < timeBatch.length; i++) {
@@ -386,32 +370,6 @@ public class AlignedPageReader implements IPageReader {
}
}
- private TsBlock applyPushDownFilter() {
- TsBlock unFilteredBlock = builder.build();
- builder.reset();
-
- boolean[] keepCurrentRow = pushDownFilter.satisfyTsBlock(unFilteredBlock);
-
- // construct time column
- int readEndIndex = buildTimeColumnWithPagination(unFilteredBlock,
keepCurrentRow);
-
- // construct value columns
- for (int i = 0; i < valueCount; i++) {
- for (int rowIndex = 0; rowIndex < readEndIndex; rowIndex++) {
- if (keepCurrentRow[rowIndex]) {
- if (unFilteredBlock.getValueColumns()[i].isNull(rowIndex)) {
- builder.getColumnBuilder(i).appendNull();
- } else {
- builder
- .getColumnBuilder(i)
-
.writeObject(unFilteredBlock.getValueColumns()[i].getObject(rowIndex));
- }
- }
- }
- }
- return builder.build();
- }
-
public void setDeleteIntervalList(List<List<TimeRange>> list) {
for (int i = 0; i < valueCount; i++) {
if (valuePageReaderList.get(i) != null) {