This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch accelerateCount in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit bcfbea543d86aa91ed70b307630e584fb4c3a794 Author: Alima777 <[email protected]> AuthorDate: Tue Jun 21 22:56:38 2022 +0800 use binary search in skipOutOfTimeRangePoints --- .../process/RawDataAggregationOperator.java | 32 ++++++++++++++++------ .../read/common/block/column/TimeColumn.java | 4 +++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/RawDataAggregationOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/RawDataAggregationOperator.java index 9581975616..95c25d03b0 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/RawDataAggregationOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/RawDataAggregationOperator.java @@ -29,6 +29,7 @@ import org.apache.iotdb.tsfile.read.common.TimeRange; import org.apache.iotdb.tsfile.read.common.block.TsBlock; import org.apache.iotdb.tsfile.read.common.block.TsBlock.TsBlockSingleColumnIterator; import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder; +import org.apache.iotdb.tsfile.read.common.block.column.TimeColumn; import com.google.common.util.concurrent.ListenableFuture; @@ -167,17 +168,30 @@ public class RawDataAggregationOperator implements ProcessOperator { // skip points that cannot be calculated public static TsBlock skipOutOfTimeRangePoints( TsBlock tsBlock, TimeRange curTimeRange, boolean ascending) { - TsBlockSingleColumnIterator tsBlockIterator = tsBlock.getTsBlockSingleColumnIterator(); - if (ascending) { - while (tsBlockIterator.hasNext() && tsBlockIterator.currentTime() < curTimeRange.getMin()) { - tsBlockIterator.next(); - } - } else { - while (tsBlockIterator.hasNext() && tsBlockIterator.currentTime() > curTimeRange.getMax()) { - tsBlockIterator.next(); + TimeColumn timeColumn = tsBlock.getTimeColumn(); + long targetTime = ascending ? curTimeRange.getMin() : curTimeRange.getMax(); + int left = 0, right = timeColumn.getPositionCount(), mid; + // if ascending, find the first greater than or equal to targetTime + // else, find the first less than or equal to targetTime + while (left < right) { + mid = (left + right) >> 1; + if (timeColumn.getLongWithoutCheck(mid) < targetTime) { + if (ascending) { + left = mid + 1; + } else { + right = mid; + } + } else if (timeColumn.getLongWithoutCheck(mid) > targetTime) { + if (ascending) { + right = mid; + } else { + left = mid + 1; + } + } else if (timeColumn.getLongWithoutCheck(mid) == targetTime) { + return tsBlock.subTsBlock(mid); } } - return tsBlock.subTsBlock(tsBlockIterator.getRowIndex()); + return tsBlock.subTsBlock(left); } public static boolean satisfied(TsBlock tsBlock, TimeRange timeRange, boolean ascending) { diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TimeColumn.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TimeColumn.java index 3f8db4f31d..5913a74547 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TimeColumn.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/block/column/TimeColumn.java @@ -74,6 +74,10 @@ public class TimeColumn implements Column { return values[position + arrayOffset]; } + public long getLongWithoutCheck(int position) { + return values[position + arrayOffset]; + } + @Override public Object getObject(int position) { return getLong(position);
