This is an automated email from the ASF dual-hosted git repository.

hui pushed a commit to branch lmh/AggOpMemoryControl
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit fa13b911d579920aaa623e58e830f05aed1608f6
Author: Minghui Liu <[email protected]>
AuthorDate: Fri Aug 12 11:20:42 2022 +0800

    impl getTotalIntervalNum() for ITimeRangeIterator
---
 .../timerangeiterator/AggrWindowIterator.java      |  5 +++
 .../timerangeiterator/PreAggrWindowIterator.java   | 14 ++++++++-
 .../PreAggrWindowWithNaturalMonthIterator.java     | 36 +++++++---------------
 .../iotdb/db/utils/datastructure/TimeSelector.java |  5 +++
 .../mpp/execution/operator/OperatorMemoryTest.java |  2 +-
 5 files changed, 35 insertions(+), 27 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/AggrWindowIterator.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/AggrWindowIterator.java
index 9f2300f0ff..50f50e4175 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/AggrWindowIterator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/AggrWindowIterator.java
@@ -194,4 +194,9 @@ public class AggrWindowIterator implements 
ITimeRangeIterator {
     }
     return intervalNum;
   }
+
+  public void reset() {
+    curTimeRange = null;
+    hasCachedTimeRange = false;
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowIterator.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowIterator.java
index 223ae03d0d..c0b8c3b000 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowIterator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowIterator.java
@@ -176,6 +176,18 @@ public class PreAggrWindowIterator implements 
ITimeRangeIterator {
 
   @Override
   public long getTotalIntervalNum() {
-    return (long) Math.ceil((endTime - startTime) / (double) slidingStep);
+    long queryRange = endTime - startTime;
+    if (slidingStep >= interval || interval % slidingStep == 0) {
+      return (long) Math.ceil(queryRange / (double) slidingStep);
+    }
+
+    long interval1 = interval % slidingStep, interval2 = slidingStep - 
interval % slidingStep;
+    long intervalNum = Math.floorDiv(queryRange, interval1 + interval2);
+    long tmpStartTime = startTime + intervalNum * (interval1 + interval2);
+    if (tmpStartTime + interval1 > endTime) {
+      return intervalNum * 2 + 1;
+    } else {
+      return intervalNum * 2 + 2;
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
index f89c913f88..87f6cb8630 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/PreAggrWindowWithNaturalMonthIterator.java
@@ -19,21 +19,13 @@
 
 package org.apache.iotdb.db.mpp.aggregation.timerangeiterator;
 
-import org.apache.iotdb.db.qp.utils.DatetimeUtils;
 import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 
-import static org.apache.iotdb.db.qp.utils.DatetimeUtils.MS_TO_MONTH;
-
 public class PreAggrWindowWithNaturalMonthIterator implements 
ITimeRangeIterator {
 
   private static final int HEAP_MAX_SIZE = 100;
 
-  private final long startTime;
-  private final long endTime;
-  private final long slidingStep;
-  private final boolean isSlidingStepByMonth;
-
   private final boolean isAscending;
   private final boolean leftCRightO;
   private final TimeSelector timeBoundaryHeap;
@@ -54,10 +46,6 @@ public class PreAggrWindowWithNaturalMonthIterator 
implements ITimeRangeIterator
       boolean isSlidingStepByMonth,
       boolean isIntervalByMonth,
       boolean leftCRightO) {
-    this.startTime = startTime;
-    this.endTime = endTime;
-    this.slidingStep = slidingStep;
-    this.isSlidingStepByMonth = isSlidingStepByMonth;
     this.isAscending = isAscending;
     this.timeBoundaryHeap = new TimeSelector(HEAP_MAX_SIZE, isAscending);
     this.aggrWindowIterator =
@@ -162,19 +150,17 @@ public class PreAggrWindowWithNaturalMonthIterator 
implements ITimeRangeIterator
 
   @Override
   public long getTotalIntervalNum() {
-    long queryRange = endTime - startTime;
-
-    long intervalNum;
-    if (isSlidingStepByMonth) {
-      intervalNum = (long) Math.ceil(queryRange / (double) (slidingStep * 
MS_TO_MONTH));
-      long retStartTime = DatetimeUtils.calcIntervalByMonth(startTime, 
intervalNum * slidingStep);
-      while (retStartTime >= endTime) {
-        intervalNum -= 1;
-        retStartTime = DatetimeUtils.calcIntervalByMonth(startTime, 
intervalNum * slidingStep);
-      }
-    } else {
-      intervalNum = (long) Math.ceil(queryRange / (double) slidingStep);
+    long tmpInterval = 0;
+    while (hasNextTimeRange()) {
+      tmpInterval++;
+      nextTimeRange();
     }
-    return intervalNum;
+
+    curTimeRange = null;
+    timeBoundaryHeap.clear();
+    aggrWindowIterator.reset();
+    initHeap();
+
+    return tmpInterval;
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TimeSelector.java
 
b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TimeSelector.java
index 6233fa04ce..e25f592aa8 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TimeSelector.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/TimeSelector.java
@@ -166,6 +166,11 @@ public class TimeSelector {
     return smallerChildIndex;
   }
 
+  public void clear() {
+    heapSize = 0;
+    lastTime = Long.MIN_VALUE;
+  }
+
   @Override
   public String toString() {
     return Arrays.toString(this.timeHeap);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
 
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
index 8f2d891c95..5f1b019e89 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/OperatorMemoryTest.java
@@ -60,8 +60,8 @@ import 
org.apache.iotdb.db.mpp.transformation.dag.column.binary.ArithmeticAdditi
 import 
org.apache.iotdb.db.mpp.transformation.dag.column.binary.CompareLessEqualColumnTransformer;
 import 
org.apache.iotdb.db.mpp.transformation.dag.column.leaf.ConstantColumnTransformer;
 import 
org.apache.iotdb.db.mpp.transformation.dag.column.leaf.TimeColumnTransformer;
-import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.iotdb.db.query.aggregation.AggregationType;
+import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;

Reply via email to