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);

Reply via email to