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 90eeac046ea6e4f933239cd94410c4e73a376c11 Author: liuminghui233 <[email protected]> AuthorDate: Thu Aug 11 23:52:34 2022 +0800 temp save --- .../timerangeiterator/AggrWindowIterator.java | 17 ++++++++++-- .../timerangeiterator/ITimeRangeIterator.java | 2 +- .../timerangeiterator/PreAggrWindowIterator.java | 5 ++++ .../PreAggrWindowWithNaturalMonthIterator.java | 30 ++++++++++++++++++++++ .../SingleTimeWindowIterator.java | 2 +- .../db/mpp/aggregation/TimeRangeIteratorTest.java | 2 ++ 6 files changed, 54 insertions(+), 4 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 98dd32abc0..9f2300f0ff 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 @@ -178,7 +178,20 @@ public class AggrWindowIterator implements ITimeRangeIterator { } @Override - public int getTotalTimeRangeNum() { - return 0; + 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); + } + return intervalNum; } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/ITimeRangeIterator.java b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/ITimeRangeIterator.java index 76161dd684..47a6961fd7 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/ITimeRangeIterator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/ITimeRangeIterator.java @@ -56,5 +56,5 @@ public interface ITimeRangeIterator { */ long currentOutputTime(); - int getTotalTimeRangeNum(); + long getTotalIntervalNum(); } 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 f7f6297ddb..223ae03d0d 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 @@ -173,4 +173,9 @@ public class PreAggrWindowIterator implements ITimeRangeIterator { public long currentOutputTime() { return leftCRightO ? curTimeRange.getMin() : curTimeRange.getMax(); } + + @Override + public long getTotalIntervalNum() { + return (long) Math.ceil((endTime - startTime) / (double) slidingStep); + } } 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 d8eede01ef..f89c913f88 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,13 +19,21 @@ 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; @@ -46,6 +54,10 @@ 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 = @@ -147,4 +159,22 @@ public class PreAggrWindowWithNaturalMonthIterator implements ITimeRangeIterator public long currentOutputTime() { return leftCRightO ? curTimeRange.getMin() : curTimeRange.getMax(); } + + @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); + } + return intervalNum; + } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/SingleTimeWindowIterator.java b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/SingleTimeWindowIterator.java index 291e4f3b4a..4802267afa 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/SingleTimeWindowIterator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/SingleTimeWindowIterator.java @@ -73,7 +73,7 @@ public class SingleTimeWindowIterator implements ITimeRangeIterator { } @Override - public int getTotalTimeRangeNum() { + public long getTotalIntervalNum() { return 1; } } diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/TimeRangeIteratorTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/TimeRangeIteratorTest.java index 88e4b6bf16..1d3f3ccf79 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/TimeRangeIteratorTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/TimeRangeIteratorTest.java @@ -295,6 +295,8 @@ public class TimeRangeIteratorTest { } private void checkRes(ITimeRangeIterator timeRangeIterator, String[] res) { + Assert.assertEquals(res.length, timeRangeIterator.getTotalIntervalNum()); + boolean isAscending = timeRangeIterator.isAscending(); int cnt = isAscending ? 0 : res.length - 1;
