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

xiangweiwei pushed a commit to branch addIT
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 184b046f1a926d141b734d1018398975850afff6
Author: Alima777 <[email protected]>
AuthorDate: Tue Jun 7 16:59:21 2022 +0800

    Fix group by month bug
---
 .../TimeRangeIteratorFactory.java                  | 12 ++++++----
 .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java | 28 +++++++++++++++++-----
 .../plan/parameter/GroupByTimeParameter.java       | 13 +++++-----
 3 files changed, 36 insertions(+), 17 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
index 1dbe7a04f8..5351eb66ad 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/timerangeiterator/TimeRangeIteratorFactory.java
@@ -28,8 +28,7 @@ public class TimeRangeIteratorFactory {
   /**
    * The method returns different implements of ITimeRangeIterator depending 
on the parameters.
    *
-   * <p>Note: interval and slidingStep stand for the milliseconds if not 
grouped by month, or the
-   * month count if grouped by month.
+   * <p>Note: interval and slidingStep is always stand for the milliseconds in 
this method.
    */
   public static ITimeRangeIterator getTimeRangeIterator(
       long startTime,
@@ -41,9 +40,12 @@ public class TimeRangeIteratorFactory {
       boolean isSlidingStepByMonth,
       boolean leftCRightO,
       boolean outputPartialTimeWindow) {
-    long tmpInterval = isIntervalByMonth ? interval * MS_TO_MONTH : interval;
-    long tmpSlidingStep = isSlidingStepByMonth ? slidingStep * MS_TO_MONTH : 
slidingStep;
-    if (outputPartialTimeWindow && tmpInterval > tmpSlidingStep) {
+    long originInterval = interval;
+    long originSlidingStep = slidingStep;
+    interval = isIntervalByMonth ? interval / MS_TO_MONTH : interval;
+    slidingStep = isSlidingStepByMonth ? slidingStep / MS_TO_MONTH : 
slidingStep;
+
+    if (outputPartialTimeWindow && originInterval > originSlidingStep) {
       if (!isIntervalByMonth && !isSlidingStepByMonth) {
         return new PreAggrWindowIterator(
             startTime, endTime, interval, slidingStep, isAscending, 
leftCRightO);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
index 2e8ac3a942..08f88c3ff2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
@@ -80,6 +80,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.filter.GroupByFilter;
+import org.apache.iotdb.tsfile.read.filter.GroupByMonthFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
 import org.apache.iotdb.tsfile.utils.Pair;
@@ -97,6 +98,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.TimeZone;
 import java.util.stream.Collectors;
 
 /** Analyze the statement and generate Analysis. */
@@ -581,12 +583,7 @@ public class Analyzer {
       }
       if (queryStatement.isGroupByTime()) {
         GroupByTimeComponent groupByTimeComponent = 
queryStatement.getGroupByTimeComponent();
-        Filter groupByFilter =
-            new GroupByFilter(
-                groupByTimeComponent.getInterval(),
-                groupByTimeComponent.getSlidingStep(),
-                groupByTimeComponent.getStartTime(),
-                groupByTimeComponent.getEndTime());
+        Filter groupByFilter = initGroupByFilter(groupByTimeComponent);
         if (globalTimeFilter == null) {
           globalTimeFilter = groupByFilter;
         } else {
@@ -1390,4 +1387,23 @@ public class Analyzer {
       return analysis;
     }
   }
+
+  private GroupByFilter initGroupByFilter(GroupByTimeComponent 
groupByTimeComponent) {
+    if (groupByTimeComponent.isIntervalByMonth() || 
groupByTimeComponent.isSlidingStepByMonth()) {
+      return new GroupByMonthFilter(
+          groupByTimeComponent.getInterval(),
+          groupByTimeComponent.getSlidingStep(),
+          groupByTimeComponent.getStartTime(),
+          groupByTimeComponent.getEndTime(),
+          groupByTimeComponent.isSlidingStepByMonth(),
+          groupByTimeComponent.isIntervalByMonth(),
+          TimeZone.getTimeZone("+00:00"));
+    } else {
+      return new GroupByFilter(
+          groupByTimeComponent.getInterval(),
+          groupByTimeComponent.getSlidingStep(),
+          groupByTimeComponent.getStartTime(),
+          groupByTimeComponent.getEndTime());
+    }
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/parameter/GroupByTimeParameter.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/parameter/GroupByTimeParameter.java
index 1210bc55ce..20d728fa6d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/parameter/GroupByTimeParameter.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/parameter/GroupByTimeParameter.java
@@ -25,9 +25,12 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
-import static org.apache.iotdb.db.qp.utils.DatetimeUtils.MS_TO_MONTH;
-
-/** The parameter of `GROUP BY TIME` */
+/**
+ * The parameter of `GROUP BY TIME`.
+ *
+ * <p>Remember: interval and slidingStep is always in timestamp unit before 
transforming to
+ * timeRangeIterator even if it's by month unit.
+ */
 public class GroupByTimeParameter {
 
   // [startTime, endTime)
@@ -138,9 +141,7 @@ public class GroupByTimeParameter {
   }
 
   public boolean hasOverlap() {
-    long tmpInterval = isIntervalByMonth ? interval * MS_TO_MONTH : interval;
-    long tmpSlidingStep = isSlidingStepByMonth ? slidingStep * MS_TO_MONTH : 
slidingStep;
-    return tmpInterval > tmpSlidingStep;
+    return interval > slidingStep;
   }
 
   public void serialize(ByteBuffer buffer) {

Reply via email to