You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/06/06 07:08:33 UTC

[iotdb] 02/04: move part1

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

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

commit bbb8bc082dec73126e057943fe909dee89e728c8
Author: Alima777 <wx...@gmail.com>
AuthorDate: Fri Jun 4 17:16:26 2021 +0800

    move part1
---
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   6 +
 .../qp/logical/crud/AggregationQueryOperator.java  |  58 +++++
 .../db/qp/logical/crud/DeleteDataOperator.java     |  10 +
 .../db/qp/logical/crud/FillQueryOperator.java      |  21 ++
 .../qp/logical/crud/GroupByFillQueryOperator.java  |  33 ++-
 .../db/qp/logical/crud/GroupByQueryOperator.java   |  30 ++-
 .../iotdb/db/qp/logical/crud/InsertOperator.java   |  41 ++++
 .../db/qp/logical/crud/SpecialClauseComponent.java |   4 +
 .../db/qp/logical/sys/AlterTimeSeriesOperator.java |  11 +
 .../iotdb/db/qp/logical/sys/AuthorOperator.java    |  22 ++
 .../db/qp/logical/sys/CreateIndexOperator.java     |  10 +
 .../qp/logical/sys/CreateTimeSeriesOperator.java   |  29 +++
 .../iotdb/db/qp/logical/sys/DataAuthOperator.java  |   8 +
 .../qp/logical/sys/DeleteStorageGroupOperator.java |   8 +
 .../qp/logical/sys/DeleteTimeSeriesOperator.java   |   8 +
 .../iotdb/db/qp/logical/sys/DropIndexOperator.java |  10 +
 .../iotdb/db/qp/logical/sys/FlushOperator.java     |  10 +
 .../iotdb/db/qp/logical/sys/LoadDataOperator.java  |   8 +
 .../iotdb/db/qp/logical/sys/MergeOperator.java     |  15 ++
 .../db/qp/logical/sys/SetStorageGroupOperator.java |   8 +
 .../iotdb/db/qp/logical/sys/SetTTLOperator.java    |  10 +
 .../iotdb/db/qp/logical/sys/ShowTTLOperator.java   |   8 +
 .../iotdb/db/qp/logical/sys/TracingOperator.java   |  10 +
 .../{SetTTLOperator.java => UnSetTTLOperator.java} |  19 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |   3 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    | 268 +--------------------
 26 files changed, 390 insertions(+), 278 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
index ba9b7bb..9cb15a1 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
@@ -18,7 +18,10 @@
  */
 package org.apache.iotdb.db.qp.logical;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 /** This class is a superclass of all operator. */
 public abstract class Operator {
@@ -64,6 +67,9 @@ public abstract class Operator {
     return SQLConstant.tokenNames.get(tokenIntType);
   }
 
+  public abstract PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException;
+
   /** If you want to add new OperatorType, you must add it in the last. */
   public enum OperatorType {
     NULL,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
index bc7efb5..6a9ab43 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/AggregationQueryOperator.java
@@ -19,10 +19,21 @@
 
 package org.apache.iotdb.db.qp.logical.crud;
 
+import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOperatorException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.metadata.PartialPath;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ResultColumn;
 import org.apache.iotdb.db.query.expression.unary.TimeSeriesOperand;
+import org.apache.iotdb.db.utils.SchemaUtils;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.util.List;
 
 public class AggregationQueryOperator extends QueryOperator {
 
@@ -45,11 +56,58 @@ public class AggregationQueryOperator extends QueryOperator {
       throw new LogicalOperatorException("AGGREGATION doesn't support disable align clause.");
     }
 
+    if (hasTimeSeriesGeneratingFunction()) {
+      throw new LogicalOperatorException(
+          "User-defined and built-in hybrid aggregation is not supported together.");
+    }
+
     for (ResultColumn resultColumn : selectComponent.getResultColumns()) {
       Expression expression = resultColumn.getExpression();
       if (expression instanceof TimeSeriesOperand) {
         throw new LogicalOperatorException(ERROR_MESSAGE1);
       }
     }
+
+    if (specialClauseComponent.isGroupByLevel()) {
+      try {
+        if (!verifyAllAggregationDataTypesEqual()) {
+          throw new LogicalOperatorException("Aggregate among unmatched data types");
+        }
+      } catch (MetadataException e) {
+        throw new LogicalOperatorException(e);
+      }
+    }
+  }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    AggregationPlan queryPlan = new AggregationPlan();
+
+    queryPlan.setPaths(selectComponent.getPaths());
+    queryPlan.setAggregations(selectComponent.getAggregationFunctions());
+    queryPlan.setLevel(specialClauseComponent.getLevel());
+
+    return queryPlan;
+  }
+
+  private boolean verifyAllAggregationDataTypesEqual() throws MetadataException {
+    List<String> aggregations = selectComponent.getAggregationFunctions();
+    if (aggregations.isEmpty()) {
+      return true;
+    }
+
+    List<PartialPath> paths = selectComponent.getPaths();
+    List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(paths);
+    String aggType = aggregations.get(0);
+    switch (aggType) {
+      case SQLConstant.MIN_VALUE:
+      case SQLConstant.MAX_VALUE:
+      case SQLConstant.AVG:
+      case SQLConstant.SUM:
+        return dataTypes.stream().allMatch(dataTypes.get(0)::equals);
+      default:
+        return true;
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java
index e7a0619..3e9512d 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/DeleteDataOperator.java
@@ -18,8 +18,12 @@
  */
 package org.apache.iotdb.db.qp.logical.crud;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -61,4 +65,10 @@ public class DeleteDataOperator extends Operator {
   public void setEndTime(long time) {
     this.endTime = time;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new DeletePlan(getStartTime(), getEndTime(), getPaths());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java
index 2a707f4..6deb3ad 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/FillQueryOperator.java
@@ -20,7 +20,11 @@
 package org.apache.iotdb.db.qp.logical.crud;
 
 import org.apache.iotdb.db.exception.query.LogicalOperatorException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.constant.FilterConstant.FilterType;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 public class FillQueryOperator extends QueryOperator {
 
@@ -32,9 +36,26 @@ public class FillQueryOperator extends QueryOperator {
       throw new LogicalOperatorException("FILL doesn't support disable align clause.");
     }
 
+    if (hasTimeSeriesGeneratingFunction()) {
+      throw new LogicalOperatorException("Fill functions are not supported in UDF queries.");
+    }
+
     FilterOperator filterOperator = whereComponent.getFilterOperator();
     if (!filterOperator.isLeaf() || filterOperator.getFilterType() != FilterType.EQUAL) {
       throw new LogicalOperatorException("Only \"=\" can be used in fill function");
+    } else if (!filterOperator.isSingle()) {
+      throw new LogicalOperatorException("Slice query must select a single time point");
     }
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    FillQueryPlan queryPlan = new FillQueryPlan();
+    FilterOperator timeFilter = whereComponent.getFilterOperator();
+    long time = Long.parseLong(((BasicFunctionOperator) timeFilter).getValue());
+    queryPlan.setQueryTime(time);
+    queryPlan.setFillType(((FillClauseComponent) specialClauseComponent).getFillTypes());
+    return queryPlan;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
index b28b031..5829ff1 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByFillQueryOperator.java
@@ -19,4 +19,35 @@
 
 package org.apache.iotdb.db.qp.logical.crud;
 
-public class GroupByFillQueryOperator extends GroupByQueryOperator {}
+import org.apache.iotdb.db.exception.query.LogicalOperatorException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
+
+public class GroupByFillQueryOperator extends GroupByQueryOperator {
+
+  @Override
+  public void check() throws LogicalOperatorException {
+    super.check();
+
+    for (String aggregation : selectComponent.getAggregationFunctions()) {
+      if (!SQLConstant.LAST_VALUE.equals(aggregation)) {
+        throw new LogicalOperatorException("Group By Fill only support last_value function");
+      }
+    }
+  }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    GroupByTimeFillPlan queryPlan = new GroupByTimeFillPlan();
+
+    GroupByFillClauseComponent groupByFillClauseComponent =
+        (GroupByFillClauseComponent) specialClauseComponent;
+    queryPlan.setFillType(groupByFillClauseComponent.getFillTypes());
+
+    return queryPlan;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
index 363eb90..0da70d0 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/GroupByQueryOperator.java
@@ -19,4 +19,32 @@
 
 package org.apache.iotdb.db.qp.logical.crud;
 
-public class GroupByQueryOperator extends AggregationQueryOperator {}
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
+
+public class GroupByQueryOperator extends AggregationQueryOperator {
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    GroupByTimePlan queryPlan = new GroupByTimePlan();
+
+    GroupByClauseComponent groupByClauseComponent = (GroupByClauseComponent) specialClauseComponent;
+    queryPlan.setInterval(groupByClauseComponent.getUnit());
+    queryPlan.setIntervalByMonth(groupByClauseComponent.isIntervalByMonth());
+    queryPlan.setSlidingStep(groupByClauseComponent.getSlidingStep());
+    queryPlan.setSlidingStepByMonth(groupByClauseComponent.isSlidingStepByMonth());
+    queryPlan.setLeftCRightO(groupByClauseComponent.isLeftCRightO());
+    if (!groupByClauseComponent.isLeftCRightO()) {
+      queryPlan.setStartTime(groupByClauseComponent.getStartTime() + 1);
+      queryPlan.setEndTime(groupByClauseComponent.getEndTime() + 1);
+    } else {
+      queryPlan.setStartTime(groupByClauseComponent.getStartTime());
+      queryPlan.setEndTime(groupByClauseComponent.getEndTime());
+    }
+
+    return queryPlan;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java
index e8c3f42..cabbd00 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/InsertOperator.java
@@ -18,8 +18,16 @@
  */
 package org.apache.iotdb.db.qp.logical.crud;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.exception.runtime.SQLParserException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
+
+import java.util.Arrays;
 
 /** this class extends {@code RootOperator} and process insert statement. */
 public class InsertOperator extends Operator {
@@ -66,4 +74,37 @@ public class InsertOperator extends Operator {
   public void setTimes(long[] times) {
     this.times = times;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    int measurementsNum = 0;
+    for (String measurement : measurementList) {
+      if (measurement.startsWith("(") && measurement.endsWith(")")) {
+        measurementsNum += measurement.replace("(", "").replace(")", "").split(",").length;
+      } else {
+        measurementsNum++;
+      }
+    }
+    if (measurementsNum == 0 || (valueList.length % measurementsNum != 0)) {
+      throw new SQLParserException(
+          String.format(
+              "the measurementList's size %d is not consistent with the valueList's size %d",
+              measurementsNum, valueList.length));
+    }
+    if (measurementsNum == valueList.length) {
+      return new InsertRowPlan(device, times[0], measurementList, valueList);
+    }
+    InsertRowsPlan insertRowsPlan = new InsertRowsPlan();
+    for (int i = 0; i < times.length; i++) {
+      insertRowsPlan.addOneInsertRowPlan(
+          new InsertRowPlan(
+              device,
+              times[0],
+              measurementList,
+              Arrays.copyOfRange(valueList, i * measurementsNum, (i + 1) * measurementsNum)),
+          i);
+    }
+    return insertRowsPlan;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java
index f935433..5b63bd9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SpecialClauseComponent.java
@@ -111,6 +111,10 @@ public class SpecialClauseComponent {
     this.level = level;
   }
 
+  public boolean isGroupByLevel() {
+    return level != -1;
+  }
+
   public boolean isAlignByDevice() {
     return isAlignByDevice;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java
index 173ec20..3cfcdda 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AlterTimeSeriesOperator.java
@@ -19,8 +19,12 @@
 
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.Map;
 
@@ -95,6 +99,13 @@ public class AlterTimeSeriesOperator extends Operator {
     this.alias = alias;
   }
 
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new AlterTimeSeriesPlan(
+        getPath(), getAlterType(), getAlterMap(), getAlias(), getTagsMap(), getAttributesMap());
+  }
+
   public enum AlterType {
     RENAME,
     SET,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java
index a82ac00..8629d4c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/AuthorOperator.java
@@ -18,8 +18,13 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.auth.AuthException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 /**
  * this class maintains information in Author statement, including CREATE, DROP, GRANT and REVOKE.
@@ -110,6 +115,23 @@ public class AuthorOperator extends Operator {
     this.nodeName = nodePath;
   }
 
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    try {
+      return new AuthorPlan(
+          getAuthorType(),
+          getUserName(),
+          getRoleName(),
+          getPassWord(),
+          getNewPassword(),
+          getPrivilegeList(),
+          getNodeName());
+    } catch (AuthException e) {
+      throw new QueryProcessException(e.getMessage());
+    }
+  }
+
   public enum AuthorType {
     CREATE_USER,
     CREATE_ROLE,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java
index 8934bee..14137ee 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateIndexOperator.java
@@ -18,9 +18,13 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.index.common.IndexType;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.CreateIndexPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -71,4 +75,10 @@ public class CreateIndexOperator extends Operator {
   public void setIndexType(IndexType indexType) {
     this.indexType = indexType;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new CreateIndexPlan(getPaths(), getProps(), getTime(), getIndexType());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java
index 95d173f..5c78597 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/CreateTimeSeriesOperator.java
@@ -18,8 +18,12 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -105,4 +109,29 @@ public class CreateTimeSeriesOperator extends Operator {
   public void setTags(Map<String, String> tags) {
     this.tags = tags;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    if (getTags() != null
+        && !getTags().isEmpty()
+        && getAttributes() != null
+        && !getAttributes().isEmpty()) {
+      for (String tagKey : getTags().keySet()) {
+        if (getAttributes().containsKey(tagKey)) {
+          throw new QueryProcessException(
+              String.format("Tag and attribute shouldn't have the same property key [%s]", tagKey));
+        }
+      }
+    }
+    return new CreateTimeSeriesPlan(
+        getPath(),
+        getDataType(),
+        getEncoding(),
+        getCompressor(),
+        getProps(),
+        getTags(),
+        getAttributes(),
+        getAlias());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
index 635e85d..b12f943 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DataAuthOperator.java
@@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.List;
 
@@ -40,4 +43,9 @@ public class DataAuthOperator extends Operator {
   public List<String> getUsers() {
     return users;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new DataAuthPlan(getType(), getUsers());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java
index 2540899..cc67ea2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteStorageGroupOperator.java
@@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.List;
 
@@ -39,4 +42,9 @@ public class DeleteStorageGroupOperator extends Operator {
   public void setDeletePathList(List<PartialPath> deletePathList) {
     this.deletePathList = deletePathList;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new DeleteStorageGroupPlan(getDeletePathList());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java
index c3d2fe9..49a13ee 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DeleteTimeSeriesOperator.java
@@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.DeleteTimeSeriesPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.List;
 
@@ -40,4 +43,9 @@ public class DeleteTimeSeriesOperator extends Operator {
   public void setDeletePathList(List<PartialPath> deletePathList) {
     this.deletePathList = deletePathList;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new DeleteTimeSeriesPlan(getDeletePathList());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java
index e538311..22793aa 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/DropIndexOperator.java
@@ -18,9 +18,13 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.index.common.IndexType;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.DropIndexPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -52,4 +56,10 @@ public class DropIndexOperator extends Operator {
   public void setIndexType(IndexType indexType) {
     this.indexType = indexType;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new DropIndexPlan(getPaths(), getIndexType());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java
index 2cbed7a..a52b4ce 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/FlushOperator.java
@@ -18,8 +18,12 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.FlushPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.List;
 
@@ -49,4 +53,10 @@ public class FlushOperator extends Operator {
     super(tokenIntType);
     operatorType = OperatorType.FLUSH;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new FlushPlan(isSeq(), getStorageGroupList());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java
index 7142e04..48845a3 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/LoadDataOperator.java
@@ -19,6 +19,9 @@
 package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 /**
  * this class maintains information in Author statement, including CREATE, DROP, GRANT and REVOKE.
@@ -43,4 +46,9 @@ public class LoadDataOperator extends Operator {
   public String getMeasureType() {
     return measureType;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new LoadDataPlan(getInputFilePath(), getMeasureType());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
index 3660db8..a66b45e 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/MergeOperator.java
@@ -18,7 +18,12 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.MergePlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 public class MergeOperator extends Operator {
 
@@ -26,4 +31,14 @@ public class MergeOperator extends Operator {
     super(tokenIntType);
     operatorType = OperatorType.MERGE;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    if (tokenIntType == SQLConstant.TOK_FULL_MERGE) {
+      return new MergePlan(OperatorType.FULL_MERGE);
+    } else {
+      return new MergePlan();
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java
index d14624f..dca8f99 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetStorageGroupOperator.java
@@ -20,6 +20,9 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 public class SetStorageGroupOperator extends Operator {
 
@@ -37,4 +40,9 @@ public class SetStorageGroupOperator extends Operator {
   public void setPath(PartialPath path) {
     this.path = path;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new SetStorageGroupPlan(getPath());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
index 1fdcde2..f81f503 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
@@ -20,8 +20,12 @@
 
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 public class SetTTLOperator extends Operator {
 
@@ -48,4 +52,10 @@ public class SetTTLOperator extends Operator {
   public void setDataTTL(long dataTTL) {
     this.dataTTL = dataTTL;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new SetTTLPlan(storageGroup, dataTTL);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
index 063b4cd..9e806b3 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/ShowTTLOperator.java
@@ -22,6 +22,9 @@ package org.apache.iotdb.db.qp.logical.sys;
 
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 import java.util.List;
 
@@ -37,4 +40,9 @@ public class ShowTTLOperator extends ShowOperator {
   public List<PartialPath> getStorageGroups() {
     return storageGroups;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator) {
+    return new ShowTTLPlan(storageGroups);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java
index 359ff9a..e156350 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/TracingOperator.java
@@ -18,7 +18,11 @@
  */
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.TracingPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
 public class TracingOperator extends Operator {
 
@@ -33,4 +37,10 @@ public class TracingOperator extends Operator {
   public boolean isTracingOn() {
     return isTracingOn;
   }
+
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new TracingPlan(isTracingOn);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java
similarity index 71%
copy from server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
copy to server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java
index 1fdcde2..1c4641c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/SetTTLOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/sys/UnSetTTLOperator.java
@@ -20,15 +20,18 @@
 
 package org.apache.iotdb.db.qp.logical.sys;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
+import org.apache.iotdb.db.qp.strategy.PhysicalGenerator;
 
-public class SetTTLOperator extends Operator {
+public class UnSetTTLOperator extends Operator {
 
   private PartialPath storageGroup;
-  private long dataTTL;
 
-  public SetTTLOperator(int tokenIntType) {
+  public UnSetTTLOperator(int tokenIntType) {
     super(tokenIntType);
     this.operatorType = OperatorType.TTL;
   }
@@ -41,11 +44,9 @@ public class SetTTLOperator extends Operator {
     this.storageGroup = storageGroup;
   }
 
-  public long getDataTTL() {
-    return dataTTL;
-  }
-
-  public void setDataTTL(long dataTTL) {
-    this.dataTTL = dataTTL;
+  @Override
+  public PhysicalPlan transform2PhysicalPlan(int fetchSize, PhysicalGenerator generator)
+      throws QueryProcessException {
+    return new SetTTLPlan(storageGroup);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index d33f774..bffb037 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -91,6 +91,7 @@ import org.apache.iotdb.db.qp.logical.sys.ShowTriggersOperator;
 import org.apache.iotdb.db.qp.logical.sys.StartTriggerOperator;
 import org.apache.iotdb.db.qp.logical.sys.StopTriggerOperator;
 import org.apache.iotdb.db.qp.logical.sys.TracingOperator;
+import org.apache.iotdb.db.qp.logical.sys.UnSetTTLOperator;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.AliasClauseContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.AlignByDeviceClauseOrDisableAlignContext;
 import org.apache.iotdb.db.qp.sql.SqlBaseParser.AlignByDeviceClauseOrDisableAlignStatementContext;
@@ -758,7 +759,7 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> {
 
   @Override
   public Operator visitUnsetTTLStatement(UnsetTTLStatementContext ctx) {
-    SetTTLOperator operator = new SetTTLOperator(SQLConstant.TOK_UNSET);
+    UnSetTTLOperator operator = new UnSetTTLOperator(SQLConstant.TOK_UNSET);
     operator.setStorageGroup(parsePrefixPath(ctx.prefixPath()));
     return operator;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index f920018..2c647a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -18,104 +18,66 @@
  */
 package org.apache.iotdb.db.qp.strategy;
 
-import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.query.LogicalOperatorException;
 import org.apache.iotdb.db.exception.query.LogicalOptimizeException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
-import org.apache.iotdb.db.exception.runtime.SQLParserException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
 import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
-import org.apache.iotdb.db.qp.logical.crud.DeleteDataOperator;
-import org.apache.iotdb.db.qp.logical.crud.FillClauseComponent;
 import org.apache.iotdb.db.qp.logical.crud.FillQueryOperator;
 import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
-import org.apache.iotdb.db.qp.logical.crud.GroupByClauseComponent;
-import org.apache.iotdb.db.qp.logical.crud.GroupByFillClauseComponent;
 import org.apache.iotdb.db.qp.logical.crud.GroupByFillQueryOperator;
 import org.apache.iotdb.db.qp.logical.crud.GroupByQueryOperator;
-import org.apache.iotdb.db.qp.logical.crud.InsertOperator;
 import org.apache.iotdb.db.qp.logical.crud.LastQueryOperator;
 import org.apache.iotdb.db.qp.logical.crud.QueryOperator;
 import org.apache.iotdb.db.qp.logical.crud.SpecialClauseComponent;
 import org.apache.iotdb.db.qp.logical.crud.WhereComponent;
-import org.apache.iotdb.db.qp.logical.sys.AlterTimeSeriesOperator;
-import org.apache.iotdb.db.qp.logical.sys.AuthorOperator;
 import org.apache.iotdb.db.qp.logical.sys.CountOperator;
 import org.apache.iotdb.db.qp.logical.sys.CreateFunctionOperator;
-import org.apache.iotdb.db.qp.logical.sys.CreateIndexOperator;
-import org.apache.iotdb.db.qp.logical.sys.CreateTimeSeriesOperator;
 import org.apache.iotdb.db.qp.logical.sys.CreateTriggerOperator;
-import org.apache.iotdb.db.qp.logical.sys.DataAuthOperator;
 import org.apache.iotdb.db.qp.logical.sys.DeletePartitionOperator;
-import org.apache.iotdb.db.qp.logical.sys.DeleteStorageGroupOperator;
-import org.apache.iotdb.db.qp.logical.sys.DeleteTimeSeriesOperator;
 import org.apache.iotdb.db.qp.logical.sys.DropFunctionOperator;
-import org.apache.iotdb.db.qp.logical.sys.DropIndexOperator;
 import org.apache.iotdb.db.qp.logical.sys.DropTriggerOperator;
-import org.apache.iotdb.db.qp.logical.sys.FlushOperator;
 import org.apache.iotdb.db.qp.logical.sys.KillQueryOperator;
 import org.apache.iotdb.db.qp.logical.sys.LoadConfigurationOperator;
 import org.apache.iotdb.db.qp.logical.sys.LoadConfigurationOperator.LoadConfigurationOperatorType;
-import org.apache.iotdb.db.qp.logical.sys.LoadDataOperator;
 import org.apache.iotdb.db.qp.logical.sys.LoadFilesOperator;
 import org.apache.iotdb.db.qp.logical.sys.MoveFileOperator;
 import org.apache.iotdb.db.qp.logical.sys.RemoveFileOperator;
-import org.apache.iotdb.db.qp.logical.sys.SetStorageGroupOperator;
-import org.apache.iotdb.db.qp.logical.sys.SetTTLOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowChildNodesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowChildPathsOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowDevicesOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowFunctionsOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowStorageGroupOperator;
-import org.apache.iotdb.db.qp.logical.sys.ShowTTLOperator;
 import org.apache.iotdb.db.qp.logical.sys.ShowTimeSeriesOperator;
 import org.apache.iotdb.db.qp.logical.sys.StartTriggerOperator;
 import org.apache.iotdb.db.qp.logical.sys.StopTriggerOperator;
-import org.apache.iotdb.db.qp.logical.sys.TracingOperator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.qp.physical.crud.AggregationPlan;
 import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan;
 import org.apache.iotdb.db.qp.physical.crud.AlignByDevicePlan.MeasurementType;
 import org.apache.iotdb.db.qp.physical.crud.DeletePartitionPlan;
-import org.apache.iotdb.db.qp.physical.crud.DeletePlan;
 import org.apache.iotdb.db.qp.physical.crud.FillQueryPlan;
-import org.apache.iotdb.db.qp.physical.crud.GroupByTimeFillPlan;
 import org.apache.iotdb.db.qp.physical.crud.GroupByTimePlan;
-import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
-import org.apache.iotdb.db.qp.physical.crud.InsertRowsPlan;
 import org.apache.iotdb.db.qp.physical.crud.LastQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryIndexPlan;
 import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.RawDataQueryPlan;
 import org.apache.iotdb.db.qp.physical.crud.UDTFPlan;
-import org.apache.iotdb.db.qp.physical.sys.AlterTimeSeriesPlan;
-import org.apache.iotdb.db.qp.physical.sys.AuthorPlan;
 import org.apache.iotdb.db.qp.physical.sys.ClearCachePlan;
 import org.apache.iotdb.db.qp.physical.sys.CountPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateFunctionPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateIndexPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateSnapshotPlan;
-import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.DataAuthPlan;
-import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan;
-import org.apache.iotdb.db.qp.physical.sys.DeleteTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.DropFunctionPlan;
-import org.apache.iotdb.db.qp.physical.sys.DropIndexPlan;
 import org.apache.iotdb.db.qp.physical.sys.DropTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.FlushPlan;
 import org.apache.iotdb.db.qp.physical.sys.KillQueryPlan;
 import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan;
 import org.apache.iotdb.db.qp.physical.sys.LoadConfigurationPlan.LoadConfigurationPlanType;
-import org.apache.iotdb.db.qp.physical.sys.LoadDataPlan;
-import org.apache.iotdb.db.qp.physical.sys.MergePlan;
 import org.apache.iotdb.db.qp.physical.sys.OperateFilePlan;
-import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
-import org.apache.iotdb.db.qp.physical.sys.SetTTLPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowChildNodesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowChildPathsPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
@@ -125,12 +87,10 @@ import org.apache.iotdb.db.qp.physical.sys.ShowPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowPlan.ShowContentType;
 import org.apache.iotdb.db.qp.physical.sys.ShowQueryProcesslistPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowStorageGroupPlan;
-import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTriggersPlan;
 import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
 import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.TracingPlan;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ResultColumn;
 import org.apache.iotdb.db.query.expression.unary.FunctionExpression;
@@ -142,7 +102,6 @@ import org.apache.iotdb.tsfile.read.expression.IExpression;
 import org.apache.iotdb.tsfile.utils.Pair;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -155,7 +114,7 @@ public class PhysicalGenerator {
 
   public PhysicalPlan transformToPhysicalPlan(Operator operator, int fetchSize)
       throws QueryProcessException {
-    PhysicalPlan physicalPlan = doTransformation(operator, fetchSize);
+    PhysicalPlan physicalPlan = operator.transform2PhysicalPlan(fetchSize, this);
     physicalPlan.setDebug(operator.isDebug());
     return physicalPlan;
   }
@@ -164,146 +123,8 @@ public class PhysicalGenerator {
   private PhysicalPlan doTransformation(Operator operator, int fetchSize)
       throws QueryProcessException {
     switch (operator.getType()) {
-      case AUTHOR:
-        AuthorOperator author = (AuthorOperator) operator;
-        try {
-          return new AuthorPlan(
-              author.getAuthorType(),
-              author.getUserName(),
-              author.getRoleName(),
-              author.getPassWord(),
-              author.getNewPassword(),
-              author.getPrivilegeList(),
-              author.getNodeName());
-        } catch (AuthException e) {
-          throw new QueryProcessException(e.getMessage());
-        }
-      case GRANT_WATERMARK_EMBEDDING:
-      case REVOKE_WATERMARK_EMBEDDING:
-        DataAuthOperator dataAuthOperator = (DataAuthOperator) operator;
-        return new DataAuthPlan(dataAuthOperator.getType(), dataAuthOperator.getUsers());
-      case LOAD_DATA:
-        LoadDataOperator loadData = (LoadDataOperator) operator;
-        return new LoadDataPlan(loadData.getInputFilePath(), loadData.getMeasureType());
-      case SET_STORAGE_GROUP:
-        SetStorageGroupOperator setStorageGroup = (SetStorageGroupOperator) operator;
-        return new SetStorageGroupPlan(setStorageGroup.getPath());
-      case DELETE_STORAGE_GROUP:
-        DeleteStorageGroupOperator deleteStorageGroup = (DeleteStorageGroupOperator) operator;
-        return new DeleteStorageGroupPlan(deleteStorageGroup.getDeletePathList());
-      case CREATE_TIMESERIES:
-        CreateTimeSeriesOperator createOperator = (CreateTimeSeriesOperator) operator;
-        if (createOperator.getTags() != null
-            && !createOperator.getTags().isEmpty()
-            && createOperator.getAttributes() != null
-            && !createOperator.getAttributes().isEmpty()) {
-          for (String tagKey : createOperator.getTags().keySet()) {
-            if (createOperator.getAttributes().containsKey(tagKey)) {
-              throw new QueryProcessException(
-                  String.format(
-                      "Tag and attribute shouldn't have the same property key [%s]", tagKey));
-            }
-          }
-        }
-        return new CreateTimeSeriesPlan(
-            createOperator.getPath(),
-            createOperator.getDataType(),
-            createOperator.getEncoding(),
-            createOperator.getCompressor(),
-            createOperator.getProps(),
-            createOperator.getTags(),
-            createOperator.getAttributes(),
-            createOperator.getAlias());
-      case DELETE_TIMESERIES:
-        DeleteTimeSeriesOperator deletePath = (DeleteTimeSeriesOperator) operator;
-        return new DeleteTimeSeriesPlan(deletePath.getDeletePathList());
-      case CREATE_INDEX:
-        CreateIndexOperator createIndexOp = (CreateIndexOperator) operator;
-        return new CreateIndexPlan(
-            createIndexOp.getPaths(),
-            createIndexOp.getProps(),
-            createIndexOp.getTime(),
-            createIndexOp.getIndexType());
-      case DROP_INDEX:
-        DropIndexOperator dropIndexOp = (DropIndexOperator) operator;
-        return new DropIndexPlan(dropIndexOp.getPaths(), dropIndexOp.getIndexType());
-      case ALTER_TIMESERIES:
-        AlterTimeSeriesOperator alterTimeSeriesOperator = (AlterTimeSeriesOperator) operator;
-        return new AlterTimeSeriesPlan(
-            alterTimeSeriesOperator.getPath(),
-            alterTimeSeriesOperator.getAlterType(),
-            alterTimeSeriesOperator.getAlterMap(),
-            alterTimeSeriesOperator.getAlias(),
-            alterTimeSeriesOperator.getTagsMap(),
-            alterTimeSeriesOperator.getAttributesMap());
-      case DELETE:
-        DeleteDataOperator delete = (DeleteDataOperator) operator;
-        return new DeletePlan(delete.getStartTime(), delete.getEndTime(), delete.getPaths());
-      case INSERT:
-        InsertOperator insert = (InsertOperator) operator;
-        int measurementsNum = 0;
-        for (String measurement : insert.getMeasurementList()) {
-          if (measurement.startsWith("(") && measurement.endsWith(")")) {
-            measurementsNum += measurement.replace("(", "").replace(")", "").split(",").length;
-          } else {
-            measurementsNum++;
-          }
-        }
-        if (measurementsNum == 0 || (insert.getValueList().length % measurementsNum != 0)) {
-          throw new SQLParserException(
-              String.format(
-                  "the measurementList's size %d is not consistent with the valueList's size %d",
-                  measurementsNum, insert.getValueList().length));
-        }
-        if (measurementsNum == insert.getValueList().length) {
-          return new InsertRowPlan(
-              insert.getDevice(),
-              insert.getTimes()[0],
-              insert.getMeasurementList(),
-              insert.getValueList());
-        }
-        InsertRowsPlan insertRowsPlan = new InsertRowsPlan();
-        for (int i = 0; i < insert.getTimes().length; i++) {
-          insertRowsPlan.addOneInsertRowPlan(
-              new InsertRowPlan(
-                  insert.getDevice(),
-                  insert.getTimes()[i],
-                  insert.getMeasurementList(),
-                  Arrays.copyOfRange(
-                      insert.getValueList(), i * measurementsNum, (i + 1) * measurementsNum)),
-              i);
-        }
-        return insertRowsPlan;
-      case MERGE:
-        if (operator.getTokenIntType() == SQLConstant.TOK_FULL_MERGE) {
-          return new MergePlan(OperatorType.FULL_MERGE);
-        } else {
-          return new MergePlan();
-        }
-      case FLUSH:
-        FlushOperator flushOperator = (FlushOperator) operator;
-        return new FlushPlan(flushOperator.isSeq(), flushOperator.getStorageGroupList());
-      case TRACING:
-        TracingOperator tracingOperator = (TracingOperator) operator;
-        return new TracingPlan(tracingOperator.isTracingOn());
       case QUERY:
         return transformQuery((QueryOperator) operator);
-      case TTL:
-        switch (operator.getTokenIntType()) {
-          case SQLConstant.TOK_SET:
-            SetTTLOperator setTTLOperator = (SetTTLOperator) operator;
-            return new SetTTLPlan(setTTLOperator.getStorageGroup(), setTTLOperator.getDataTTL());
-          case SQLConstant.TOK_UNSET:
-            SetTTLOperator unsetTTLOperator = (SetTTLOperator) operator;
-            return new SetTTLPlan(unsetTTLOperator.getStorageGroup());
-          case SQLConstant.TOK_SHOW:
-            ShowTTLOperator showTTLOperator = (ShowTTLOperator) operator;
-            return new ShowTTLPlan(showTTLOperator.getStorageGroups());
-          default:
-            throw new LogicalOperatorException(
-                String.format(
-                    "not supported operator type %s in ttl operation.", operator.getType()));
-        }
       case LOAD_CONFIGURATION:
         LoadConfigurationOperatorType type =
             ((LoadConfigurationOperator) operator).getLoadConfigurationOperatorType();
@@ -475,79 +296,15 @@ public class PhysicalGenerator {
     @Override
     public QueryPlan transform(QueryOperator queryOperator) throws QueryProcessException {
       AggregationPlan queryPlan;
-      if (queryOperator.hasTimeSeriesGeneratingFunction()) {
-        throw new QueryProcessException(
-            "User-defined and built-in hybrid aggregation is not supported.");
-      }
-      if (queryOperator instanceof GroupByFillQueryOperator) {
-        queryPlan = new GroupByTimeFillPlan();
-      } else if (queryOperator instanceof GroupByQueryOperator) {
-        queryPlan = new GroupByTimePlan();
-      } else {
-        queryPlan = new AggregationPlan();
-      }
-
-      queryPlan.setPaths(queryOperator.getSelectComponent().getPaths());
-      queryPlan.setAggregations(queryOperator.getSelectComponent().getAggregationFunctions());
 
       if (queryOperator instanceof GroupByQueryOperator) {
         GroupByTimePlan groupByTimePlan = (GroupByTimePlan) queryPlan;
-        GroupByClauseComponent groupByClauseComponent =
-            (GroupByClauseComponent) queryOperator.getSpecialClauseComponent();
-        groupByTimePlan.setInterval(groupByClauseComponent.getUnit());
-        groupByTimePlan.setIntervalByMonth(groupByClauseComponent.isIntervalByMonth());
-        groupByTimePlan.setSlidingStep(groupByClauseComponent.getSlidingStep());
-        groupByTimePlan.setSlidingStepByMonth(groupByClauseComponent.isSlidingStepByMonth());
-        groupByTimePlan.setLeftCRightO(groupByClauseComponent.isLeftCRightO());
-        if (!groupByClauseComponent.isLeftCRightO()) {
-          groupByTimePlan.setStartTime(groupByClauseComponent.getStartTime() + 1);
-          groupByTimePlan.setEndTime(groupByClauseComponent.getEndTime() + 1);
-        } else {
-          groupByTimePlan.setStartTime(groupByClauseComponent.getStartTime());
-          groupByTimePlan.setEndTime(groupByClauseComponent.getEndTime());
-        }
       }
       if (queryOperator instanceof GroupByFillQueryOperator) {
-        GroupByFillClauseComponent groupByFillClauseComponent =
-            (GroupByFillClauseComponent) queryOperator.getSpecialClauseComponent();
-        ((GroupByTimeFillPlan) queryPlan).setFillType(groupByFillClauseComponent.getFillTypes());
-        for (String aggregation : queryPlan.getAggregations()) {
-          if (!SQLConstant.LAST_VALUE.equals(aggregation)) {
-            throw new QueryProcessException("Group By Fill only support last_value function");
-          }
-        }
-      } else if (queryOperator.isGroupByLevel()) {
-        queryPlan.setLevel(queryOperator.getSpecialClauseComponent().getLevel());
-        try {
-          if (!verifyAllAggregationDataTypesEqual(queryOperator)) {
-            throw new QueryProcessException("Aggregate among unmatched data types");
-          }
-        } catch (MetadataException e) {
-          throw new QueryProcessException(e);
-        }
-      }
-      return queryPlan;
-    }
-  }
 
-  /** fill physical plan transfrom */
-  public static class FillPhysicalPlanRule implements Transform {
+      } else if (queryOperator.isGroupByLevel()) {
 
-    @Override
-    public QueryPlan transform(QueryOperator queryOperator) throws QueryProcessException {
-      FillQueryOperator fillQueryOperator = (FillQueryOperator) queryOperator;
-      if (queryOperator.hasTimeSeriesGeneratingFunction()) {
-        throw new QueryProcessException("Fill functions are not supported in UDF queries.");
       }
-      FillQueryPlan queryPlan = new FillQueryPlan();
-      FilterOperator timeFilter = fillQueryOperator.getWhereComponent().getFilterOperator();
-      if (!timeFilter.isSingle()) {
-        throw new QueryProcessException("Slice query must select a single time point");
-      }
-      long time = Long.parseLong(((BasicFunctionOperator) timeFilter).getValue());
-      queryPlan.setQueryTime(time);
-      queryPlan.setFillType(
-          ((FillClauseComponent) fillQueryOperator.getSpecialClauseComponent()).getFillTypes());
       return queryPlan;
     }
   }
@@ -907,27 +664,6 @@ public class PhysicalGenerator {
     return new ArrayList<>(columnList.subList(seriesOffset, endPosition));
   }
 
-  private static boolean verifyAllAggregationDataTypesEqual(QueryOperator queryOperator)
-      throws MetadataException {
-    List<String> aggregations = queryOperator.getSelectComponent().getAggregationFunctions();
-    if (aggregations.isEmpty()) {
-      return true;
-    }
-
-    List<PartialPath> paths = queryOperator.getSelectComponent().getPaths();
-    List<TSDataType> dataTypes = SchemaUtils.getSeriesTypesByPaths(paths);
-    String aggType = aggregations.get(0);
-    switch (aggType) {
-      case SQLConstant.MIN_VALUE:
-      case SQLConstant.MAX_VALUE:
-      case SQLConstant.AVG:
-      case SQLConstant.SUM:
-        return dataTypes.stream().allMatch(dataTypes.get(0)::equals);
-      default:
-        return true;
-    }
-  }
-
   protected List<PartialPath> getMatchedTimeseries(PartialPath path) throws MetadataException {
     return IoTDB.metaManager.getAllTimeseriesPath(path);
   }