You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2022/11/14 07:05:15 UTC

[iotdb] 02/05: add WindowConcatNode

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

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

commit 21df9f4ea8a1d2cdecb936e5fc9ad83c0ca28556
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Nov 14 10:21:25 2022 +0800

    add WindowConcatNode
---
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  |  16 +--
 .../iotdb/db/mpp/plan/constant/StatementType.java  |   2 +-
 .../db/mpp/plan/parser/StatementGenerator.java     |   4 +-
 .../db/mpp/plan/planner/LogicalPlanBuilder.java    |  16 +++
 .../db/mpp/plan/planner/LogicalPlanVisitor.java    |  13 +-
 .../planner/distribution/DistributionPlanner.java  |   4 +-
 .../SimpleFragmentParallelPlanner.java             |   4 +-
 .../mpp/plan/planner/plan/node/PlanNodeType.java   |   9 +-
 .../db/mpp/plan/planner/plan/node/PlanVisitor.java |   5 +
 .../plan/node/process/WindowConcatNode.java        | 140 +++++++++++++++++++++
 .../db/mpp/plan/statement/StatementVisitor.java    |   6 +-
 ...atement.java => FetchWindowBatchStatement.java} |  15 +--
 12 files changed, 200 insertions(+), 34 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index ad46dbdfb1..76beb5b7ca 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -68,7 +68,7 @@ import org.apache.iotdb.db.mpp.plan.statement.component.SortItem;
 import org.apache.iotdb.db.mpp.plan.statement.component.SortKey;
 import org.apache.iotdb.db.mpp.plan.statement.component.WhereCondition;
 import org.apache.iotdb.db.mpp.plan.statement.crud.DeleteDataStatement;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsOfOneDeviceStatement;
@@ -1208,17 +1208,17 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   }
 
   @Override
-  public Analysis visitFetchWindowSet(
-      FetchWindowSetStatement fetchWindowSetStatement, MPPQueryContext context) {
+  public Analysis visitFetchWindowBatch(
+      FetchWindowBatchStatement fetchWindowBatchStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(fetchWindowSetStatement);
+    analysis.setStatement(fetchWindowBatchStatement);
 
     // check for semantic errors
-    fetchWindowSetStatement.semanticCheck();
+    fetchWindowBatchStatement.semanticCheck();
 
     // concat path and construct path pattern tree
     PathPatternTree patternTree = new PathPatternTree();
-    for (PartialPath path : fetchWindowSetStatement.getQueryPaths()) {
+    for (PartialPath path : fetchWindowBatchStatement.getQueryPaths()) {
       patternTree.appendFullPath(path);
     }
 
@@ -1237,8 +1237,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     analysis.setSourceExpressions(sourceExpressions);
 
     // set transform
-    if (fetchWindowSetStatement.getFunctionName() != null) {
-      String functionName = fetchWindowSetStatement.getFunctionName();
+    if (fetchWindowBatchStatement.getFunctionName() != null) {
+      String functionName = fetchWindowBatchStatement.getFunctionName();
       Set<Expression> sourceTransformExpressions =
           sourceExpressions.stream()
               .map(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
index bb6f9d9d64..ee2eb65edc 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
@@ -153,5 +153,5 @@ public enum StatementType {
 
   DEACTIVATE_TEMPLATE,
 
-  FETCH_WINDOW_SET
+  FETCH_WINDOW_BATCH
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
index d0b5f5167b..3825bb2af2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java
@@ -37,7 +37,7 @@ import org.apache.iotdb.db.mpp.plan.statement.component.ResultColumn;
 import org.apache.iotdb.db.mpp.plan.statement.component.SelectComponent;
 import org.apache.iotdb.db.mpp.plan.statement.component.WhereCondition;
 import org.apache.iotdb.db.mpp.plan.statement.crud.DeleteDataStatement;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsOfOneDeviceStatement;
@@ -181,7 +181,7 @@ public class StatementGenerator {
 
   public static Statement createStatement(TSFetchWindowBatchReq fetchWindowSetReq)
       throws IllegalPathException {
-    FetchWindowSetStatement statement = new FetchWindowSetStatement();
+    FetchWindowBatchStatement statement = new FetchWindowBatchStatement();
 
     // set queryPaths
     List<PartialPath> queryPaths = new ArrayList<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
index a212cb6326..9d362fa306 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
@@ -64,6 +64,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.OffsetNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SlidingWindowAggregationNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TransformNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowConcatNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowSplitNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedLastQueryScanNode;
@@ -900,6 +901,21 @@ public class LogicalPlanBuilder {
     return this;
   }
 
+  public LogicalPlanBuilder planWindowConcat(
+      GroupByTimeParameter groupByTimeParameter, List<Integer> samplingIndexes) {
+    if (!groupByTimeParameter.hasOverlap()) {
+      return this;
+    }
+
+    this.root =
+        new WindowConcatNode(
+            context.getQueryId().genPlanNodeId(),
+            this.getRoot(),
+            groupByTimeParameter,
+            samplingIndexes);
+    return this;
+  }
+
   /** Meta Query* */
   public LogicalPlanBuilder planTimeSeriesSchemaSource(
       PartialPath pathPattern,
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
index ef1d9b8502..3d3c02b2e8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
@@ -43,7 +43,7 @@ import org.apache.iotdb.db.mpp.plan.statement.StatementNode;
 import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
 import org.apache.iotdb.db.mpp.plan.statement.component.Ordering;
 import org.apache.iotdb.db.mpp.plan.statement.crud.DeleteDataStatement;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsOfOneDeviceStatement;
@@ -291,16 +291,19 @@ public class LogicalPlanVisitor extends StatementVisitor<PlanNode, MPPQueryConte
   }
 
   @Override
-  public PlanNode visitFetchWindowSet(
-      FetchWindowSetStatement fetchWindowSetStatement, MPPQueryContext context) {
+  public PlanNode visitFetchWindowBatch(
+      FetchWindowBatchStatement fetchWindowBatchStatement, MPPQueryContext context) {
     LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(analysis, context);
     planBuilder
         .planRawDataSource(analysis.getSourceExpressions(), Ordering.ASC, null)
         .planTransform(
             analysis.getSourceTransformExpressions(), true, ZoneId.systemDefault(), Ordering.ASC)
         .planWindowSplit(
-            fetchWindowSetStatement.getGroupByTimeParameter(),
-            fetchWindowSetStatement.getSamplingIndexes());
+            fetchWindowBatchStatement.getGroupByTimeParameter(),
+            fetchWindowBatchStatement.getSamplingIndexes())
+        .planWindowConcat(
+            fetchWindowBatchStatement.getGroupByTimeParameter(),
+            fetchWindowBatchStatement.getSamplingIndexes());
 
     return planBuilder.getRoot();
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
index 8a6267353b..6307310f17 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
@@ -32,7 +32,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.WritePlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ExchangeNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 
 import java.util.List;
@@ -69,7 +69,7 @@ public class DistributionPlanner {
     PlanNode rootAfterRewrite = rewriteSource();
     PlanNode rootWithExchange = addExchangeNode(rootAfterRewrite);
     if (analysis.getStatement() instanceof QueryStatement
-        || analysis.getStatement() instanceof FetchWindowSetStatement) {
+        || analysis.getStatement() instanceof FetchWindowBatchStatement) {
       analysis
           .getRespDatasetHeader()
           .setColumnToTsBlockIndexMap(rootWithExchange.getOutputColumnNames());
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SimpleFragmentParallelPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SimpleFragmentParallelPlanner.java
index 03341cf2be..3b79ad4748 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SimpleFragmentParallelPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/SimpleFragmentParallelPlanner.java
@@ -34,7 +34,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeUtil;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ExchangeNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
@@ -116,7 +116,7 @@ public class SimpleFragmentParallelPlanner implements IFragmentParallelPlaner {
     fragmentInstance.setHostDataNode(selectTargetDataNode(regionReplicaSet));
 
     if (analysis.getStatement() instanceof QueryStatement
-        || analysis.getStatement() instanceof FetchWindowSetStatement) {
+        || analysis.getStatement() instanceof FetchWindowBatchStatement) {
       fragmentInstance.getFragment().generateTypeProvider(queryContext.getTypeProvider());
     }
     instanceMap.putIfAbsent(fragment.getId(), fragmentInstance);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
index 800459849b..7588c8f4e8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
@@ -64,6 +64,8 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SlidingWindowAggre
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SortNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TransformNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowConcatNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowSplitNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryCollectNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryMergeNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryNode;
@@ -151,7 +153,8 @@ public enum PlanNodeType {
   DEACTIVATE_TEMPLATE_NODE((short) 61),
   INTO((short) 62),
   DEVICE_VIEW_INTO((short) 63),
-  WINDOW_SPLIT((short) 64);
+  WINDOW_SPLIT((short) 64),
+  WINDOW_CONCAT((short) 65);
 
   public static final int BYTES = Short.BYTES;
 
@@ -328,6 +331,10 @@ public enum PlanNodeType {
         return IntoNode.deserialize(buffer);
       case 63:
         return DeviceViewIntoNode.deserialize(buffer);
+      case 64:
+        return WindowSplitNode.deserialize(buffer);
+      case 65:
+        return WindowConcatNode.deserialize(buffer);
       default:
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
index 6a064cd90d..7d3fa1dc19 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
@@ -62,6 +62,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SlidingWindowAggre
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SortNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TransformNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowConcatNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.WindowSplitNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryCollectNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.last.LastQueryMergeNode;
@@ -331,4 +332,8 @@ public abstract class PlanVisitor<R, C> {
   public R visitWindowSplit(WindowSplitNode node, C context) {
     return visitPlan(node, context);
   }
+
+  public R visitWindowConcat(WindowConcatNode node, C context) {
+    return visitPlan(node, context);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/WindowConcatNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/WindowConcatNode.java
new file mode 100644
index 0000000000..4cf16d88d0
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/WindowConcatNode.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.process;
+
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.GroupByTimeParameter;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class WindowConcatNode extends SingleChildProcessNode {
+
+  private final GroupByTimeParameter groupByTimeParameter;
+  private final List<Integer> samplingIndexes;
+
+  public WindowConcatNode(
+      PlanNodeId id,
+      PlanNode child,
+      GroupByTimeParameter groupByTimeParameter,
+      List<Integer> samplingIndexes) {
+    super(id, child);
+    this.groupByTimeParameter = groupByTimeParameter;
+    this.samplingIndexes = samplingIndexes;
+  }
+
+  public WindowConcatNode(
+      PlanNodeId id, GroupByTimeParameter groupByTimeParameter, List<Integer> samplingIndexes) {
+    super(id);
+    this.groupByTimeParameter = groupByTimeParameter;
+    this.samplingIndexes = samplingIndexes;
+  }
+
+  public GroupByTimeParameter getGroupByTimeParameter() {
+    return groupByTimeParameter;
+  }
+
+  public List<Integer> getSamplingIndexes() {
+    return samplingIndexes;
+  }
+
+  @Override
+  public PlanNode clone() {
+    return new WindowConcatNode(getPlanNodeId(), groupByTimeParameter, samplingIndexes);
+  }
+
+  @Override
+  public List<String> getOutputColumnNames() {
+    return child.getOutputColumnNames();
+  }
+
+  @Override
+  protected void serializeAttributes(ByteBuffer byteBuffer) {
+    PlanNodeType.WINDOW_CONCAT.serialize(byteBuffer);
+    groupByTimeParameter.serialize(byteBuffer);
+    ReadWriteIOUtils.write(samplingIndexes.size(), byteBuffer);
+    for (Integer index : samplingIndexes) {
+      ReadWriteIOUtils.write(index, byteBuffer);
+    }
+  }
+
+  @Override
+  protected void serializeAttributes(DataOutputStream stream) throws IOException {
+    PlanNodeType.WINDOW_CONCAT.serialize(stream);
+    groupByTimeParameter.serialize(stream);
+    ReadWriteIOUtils.write(samplingIndexes.size(), stream);
+    for (Integer index : samplingIndexes) {
+      ReadWriteIOUtils.write(index, stream);
+    }
+  }
+
+  public static WindowConcatNode deserialize(ByteBuffer byteBuffer) {
+    GroupByTimeParameter groupByTimeParameter = GroupByTimeParameter.deserialize(byteBuffer);
+
+    int listSize = ReadWriteIOUtils.readInt(byteBuffer);
+    List<Integer> samplingIndexes = new ArrayList<>(listSize);
+    while (listSize > 0) {
+      samplingIndexes.add(ReadWriteIOUtils.readInt(byteBuffer));
+      listSize--;
+    }
+
+    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
+    return new WindowConcatNode(planNodeId, groupByTimeParameter, samplingIndexes);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    if (!super.equals(o)) {
+      return false;
+    }
+    WindowConcatNode that = (WindowConcatNode) o;
+    return groupByTimeParameter.equals(that.groupByTimeParameter)
+        && samplingIndexes.equals(that.samplingIndexes);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), groupByTimeParameter, samplingIndexes);
+  }
+
+  @Override
+  public String toString() {
+    return String.format("WindowConcatNode-%s", getPlanNodeId());
+  }
+
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitWindowConcat(this, context);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index be03262f80..7d83e3fc01 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.db.mpp.plan.statement;
 
 import org.apache.iotdb.db.mpp.plan.statement.crud.DeleteDataStatement;
-import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowSetStatement;
+import org.apache.iotdb.db.mpp.plan.statement.crud.FetchWindowBatchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsOfOneDeviceStatement;
@@ -208,8 +208,8 @@ public abstract class StatementVisitor<R, C> {
     return visitStatement(queryStatement, context);
   }
 
-  public R visitFetchWindowSet(FetchWindowSetStatement fetchWindowSetStatement, C context) {
-    return visitStatement(fetchWindowSetStatement, context);
+  public R visitFetchWindowBatch(FetchWindowBatchStatement fetchWindowBatchStatement, C context) {
+    return visitStatement(fetchWindowBatchStatement, context);
   }
 
   // Insert Statement
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowSetStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowBatchStatement.java
similarity index 85%
rename from server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowSetStatement.java
rename to server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowBatchStatement.java
index fa1b815cda..756c5cc86d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowSetStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FetchWindowBatchStatement.java
@@ -20,7 +20,6 @@
 package org.apache.iotdb.db.mpp.plan.statement.crud;
 
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.mpp.plan.constant.StatementType;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.GroupByTimeParameter;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
@@ -28,16 +27,16 @@ import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
 
 import java.util.List;
 
-public class FetchWindowSetStatement extends Statement {
+public class FetchWindowBatchStatement extends Statement {
 
   private List<PartialPath> queryPaths;
   private String functionName;
   private GroupByTimeParameter groupByTimeParameter;
   private List<Integer> samplingIndexes;
 
-  public FetchWindowSetStatement() {
+  public FetchWindowBatchStatement() {
     super();
-    statementType = StatementType.FETCH_WINDOW_SET;
+    statementType = StatementType.FETCH_WINDOW_BATCH;
   }
 
   public List<PartialPath> getQueryPaths() {
@@ -79,12 +78,8 @@ public class FetchWindowSetStatement extends Statement {
 
   @Override
   public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
-    return visitor.visitFetchWindowSet(this, context);
+    return visitor.visitFetchWindowBatch(this, context);
   }
 
-  public void semanticCheck() {
-    if (groupByTimeParameter.hasOverlap()) {
-      throw new SemanticException("");
-    }
-  }
+  public void semanticCheck() {}
 }