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;
