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

[iotdb] branch master updated: Extract ISchemaTree interface (#6830)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 903a9d6ac0 Extract ISchemaTree interface (#6830)
903a9d6ac0 is described below

commit 903a9d6ac0025ab6e8b298ebd8011bb73f252876
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Fri Jul 29 13:46:35 2022 +0800

    Extract ISchemaTree interface (#6830)
    
    Extract ISchemaTree interface (#6830)
---
 .../db/metadata/cache/DataNodeSchemaCache.java     |  9 +--
 .../{SchemaTree.java => ClusterSchemaTree.java}    | 22 +++++--
 .../db/mpp/common/schematree/ISchemaTree.java      | 70 ++++++++++++++++++++++
 .../operator/schema/SchemaFetchScanOperator.java   |  4 +-
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java |  8 +--
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  | 37 ++++--------
 .../db/mpp/plan/analyze/ClusterSchemaFetcher.java  | 41 ++++++-------
 .../db/mpp/plan/analyze/ExpressionAnalyzer.java    | 10 ++--
 .../db/mpp/plan/analyze/FakeSchemaFetcherImpl.java | 11 ++--
 .../iotdb/db/mpp/plan/analyze/ISchemaFetcher.java  |  8 +--
 .../iotdb/db/mpp/plan/analyze/SchemaValidator.java |  6 +-
 .../mpp/plan/analyze/StandaloneSchemaFetcher.java  | 33 +++++-----
 .../db/mpp/plan/planner/LogicalPlanVisitor.java    |  9 ---
 .../planner/plan/node/write/DeleteDataNode.java    |  6 +-
 .../plan/node/write/InsertMultiTabletsNode.java    |  4 +-
 .../plan/planner/plan/node/write/InsertNode.java   |  4 +-
 .../planner/plan/node/write/InsertRowNode.java     |  4 +-
 .../planner/plan/node/write/InsertRowsNode.java    |  4 +-
 .../plan/node/write/InsertRowsOfOneDeviceNode.java |  4 +-
 .../planner/plan/node/write/InsertTabletNode.java  |  4 +-
 .../db/mpp/plan/statement/StatementVisitor.java    |  5 --
 .../internal/LastPointFetchStatement.java          | 58 ------------------
 .../db/metadata/cache/DataNodeSchemaCacheTest.java | 11 ++--
 ...emaTreeTest.java => ClusterSchemaTreeTest.java} | 28 ++++-----
 .../schema/SchemaFetchScanOperatorTest.java        |  5 +-
 25 files changed, 202 insertions(+), 203 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
index bb5410dae3..17cf02d7c3 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCache.java
@@ -23,7 +23,8 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.service.metrics.MetricsService;
 import org.apache.iotdb.db.service.metrics.enums.Metric;
 import org.apache.iotdb.db.service.metrics.enums.Tag;
@@ -86,8 +87,8 @@ public class DataNodeSchemaCache {
    * @param measurements
    * @return timeseries partialPath and its SchemaEntity
    */
-  public SchemaTree get(PartialPath devicePath, String[] measurements) {
-    SchemaTree schemaTree = new SchemaTree();
+  public ClusterSchemaTree get(PartialPath devicePath, String[] measurements) {
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     SchemaCacheEntry schemaCacheEntry;
     for (String measurement : measurements) {
       PartialPath path = devicePath.concatNode(measurement);
@@ -104,7 +105,7 @@ public class DataNodeSchemaCache {
     return schemaTree;
   }
 
-  public void put(SchemaTree schemaTree) {
+  public void put(ISchemaTree schemaTree) {
     for (MeasurementPath measurementPath : schemaTree.getAllMeasurement()) {
       SchemaCacheEntry schemaCacheEntry =
           new SchemaCacheEntry(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTree.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java
rename to server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTree.java
index fb7b7a6b48..f4d23b628a 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTree.java
@@ -47,17 +47,17 @@ import static org.apache.iotdb.db.metadata.MetadataConstant.ALL_MATCH_PATTERN;
 import static org.apache.iotdb.db.mpp.common.schematree.node.SchemaNode.SCHEMA_ENTITY_NODE;
 import static org.apache.iotdb.db.mpp.common.schematree.node.SchemaNode.SCHEMA_MEASUREMENT_NODE;
 
-public class SchemaTree {
+public class ClusterSchemaTree implements ISchemaTree {
 
   private List<String> storageGroups;
 
   private final SchemaNode root;
 
-  public SchemaTree() {
+  public ClusterSchemaTree() {
     root = new SchemaInternalNode(PATH_ROOT);
   }
 
-  public SchemaTree(SchemaNode root) {
+  public ClusterSchemaTree(SchemaNode root) {
     this.root = root;
   }
 
@@ -68,6 +68,7 @@ public class SchemaTree {
    * @param isPrefixMatch if true, the path pattern is used to match prefix path
    * @return Left: all measurement paths; Right: remaining series offset
    */
+  @Override
   public Pair<List<MeasurementPath>, Integer> searchMeasurementPaths(
       PartialPath pathPattern, int slimit, int soffset, boolean isPrefixMatch) {
     SchemaTreeMeasurementVisitor visitor =
@@ -75,6 +76,7 @@ public class SchemaTree {
     return new Pair<>(visitor.getAllResult(), visitor.getNextOffset());
   }
 
+  @Override
   public Pair<List<MeasurementPath>, Integer> searchMeasurementPaths(PartialPath pathPattern) {
     SchemaTreeMeasurementVisitor visitor =
         new SchemaTreeMeasurementVisitor(
@@ -86,6 +88,7 @@ public class SchemaTree {
     return new Pair<>(visitor.getAllResult(), visitor.getNextOffset());
   }
 
+  @Override
   public List<MeasurementPath> getAllMeasurement() {
     return searchMeasurementPaths(ALL_MATCH_PATTERN, 0, 0, false).left;
   }
@@ -96,16 +99,19 @@ public class SchemaTree {
    * @param pathPattern the pattern of the target devices.
    * @return A HashSet instance which stores info of the devices matching the given path pattern.
    */
+  @Override
   public List<DeviceSchemaInfo> getMatchedDevices(PartialPath pathPattern, boolean isPrefixMatch) {
     SchemaTreeDeviceVisitor visitor = new SchemaTreeDeviceVisitor(root, pathPattern, isPrefixMatch);
     return visitor.getAllResult();
   }
 
+  @Override
   public List<DeviceSchemaInfo> getMatchedDevices(PartialPath pathPattern) {
     SchemaTreeDeviceVisitor visitor = new SchemaTreeDeviceVisitor(root, pathPattern, false);
     return visitor.getAllResult();
   }
 
+  @Override
   public DeviceSchemaInfo searchDeviceSchemaInfo(
       PartialPath devicePath, List<String> measurements) {
 
@@ -182,7 +188,7 @@ public class SchemaTree {
     }
   }
 
-  public void mergeSchemaTree(SchemaTree schemaTree) {
+  public void mergeSchemaTree(ClusterSchemaTree schemaTree) {
     traverseAndMerge(this.root, null, schemaTree.root);
   }
 
@@ -220,7 +226,7 @@ public class SchemaTree {
     root.serialize(outputStream);
   }
 
-  public static SchemaTree deserialize(InputStream inputStream) throws IOException {
+  public static ClusterSchemaTree deserialize(InputStream inputStream) throws IOException {
 
     byte nodeType;
     int childNum;
@@ -257,7 +263,7 @@ public class SchemaTree {
         stack.push(internalNode);
       }
     }
-    return new SchemaTree(stack.poll());
+    return new ClusterSchemaTree(stack.poll());
   }
 
   /**
@@ -268,6 +274,7 @@ public class SchemaTree {
    * @param pathName only full path, cannot be path pattern
    * @return storage group in the given path
    */
+  @Override
   public String getBelongedStorageGroup(String pathName) {
     for (String storageGroup : storageGroups) {
       if (PathUtils.isStartWith(pathName, storageGroup)) {
@@ -277,10 +284,12 @@ public class SchemaTree {
     throw new RuntimeException("No matched storage group. Please check the path " + pathName);
   }
 
+  @Override
   public String getBelongedStorageGroup(PartialPath path) {
     return getBelongedStorageGroup(path.getFullPath());
   }
 
+  @Override
   public List<String> getStorageGroups() {
     return storageGroups;
   }
@@ -294,6 +303,7 @@ public class SchemaTree {
     return root;
   }
 
+  @Override
   public boolean isEmpty() {
     return root.getChildren() == null || root.getChildren().size() == 0;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ISchemaTree.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ISchemaTree.java
new file mode 100644
index 0000000000..a19eb41639
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/ISchemaTree.java
@@ -0,0 +1,70 @@
+/*
+ * 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.common.schematree;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.path.MeasurementPath;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+import java.util.List;
+
+public interface ISchemaTree {
+  /**
+   * Return all measurement paths for given path pattern and filter the result by slimit and offset.
+   *
+   * @param pathPattern can be a pattern or a full path of timeseries.
+   * @param isPrefixMatch if true, the path pattern is used to match prefix path
+   * @return Left: all measurement paths; Right: remaining series offset
+   */
+  Pair<List<MeasurementPath>, Integer> searchMeasurementPaths(
+      PartialPath pathPattern, int slimit, int soffset, boolean isPrefixMatch);
+
+  Pair<List<MeasurementPath>, Integer> searchMeasurementPaths(PartialPath pathPattern);
+
+  List<MeasurementPath> getAllMeasurement();
+
+  /**
+   * Get all device matching the path pattern.
+   *
+   * @param pathPattern the pattern of the target devices.
+   * @return A HashSet instance which stores info of the devices matching the given path pattern.
+   */
+  List<DeviceSchemaInfo> getMatchedDevices(PartialPath pathPattern, boolean isPrefixMatch);
+
+  List<DeviceSchemaInfo> getMatchedDevices(PartialPath pathPattern);
+
+  DeviceSchemaInfo searchDeviceSchemaInfo(PartialPath devicePath, List<String> measurements);
+
+  /**
+   * Get storage group name by path
+   *
+   * <p>e.g., root.sg1 is a storage group and path = root.sg1.d1, return root.sg1
+   *
+   * @param pathName only full path, cannot be path pattern
+   * @return storage group in the given path
+   */
+  String getBelongedStorageGroup(String pathName);
+
+  String getBelongedStorageGroup(PartialPath path);
+
+  List<String> getStorageGroups();
+
+  boolean isEmpty();
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
index c44542fab5..e35ed7aba2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java
@@ -23,8 +23,8 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -107,7 +107,7 @@ public class SchemaFetchScanOperator implements SourceOperator {
   }
 
   private void fetchSchema() throws MetadataException {
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     List<PartialPath> partialPathList = patternTree.getAllPathPatterns();
     for (PartialPath path : partialPathList) {
       schemaTree.appendMeasurementPaths(schemaRegion.fetchSchema(path, templateMap));
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
index d298d802ae..77799b4ad6 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
@@ -26,7 +26,7 @@ import org.apache.iotdb.commons.partition.SchemaPartition;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.FillDescriptor;
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.GroupByTimeParameter;
@@ -56,7 +56,7 @@ public class Analysis {
 
   private SchemaPartition schemaPartition;
 
-  private SchemaTree schemaTree;
+  private ISchemaTree schemaTree;
 
   // map from output column name (for every node) to its datatype
   private TypeProvider typeProvider;
@@ -188,11 +188,11 @@ public class Analysis {
     this.schemaPartition = schemaPartition;
   }
 
-  public SchemaTree getSchemaTree() {
+  public ISchemaTree getSchemaTree() {
     return schemaTree;
   }
 
-  public void setSchemaTree(SchemaTree schemaTree) {
+  public void setSchemaTree(ISchemaTree schemaTree) {
     this.schemaTree = schemaTree;
   }
 
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 48abd130d9..bd7d2176ac 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
@@ -36,8 +36,8 @@ import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
 import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.leaf.TimeSeriesOperand;
@@ -64,7 +64,6 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.InternalCreateTimeSeriesStatement;
-import org.apache.iotdb.db.mpp.plan.statement.internal.LastPointFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.SchemaFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.AlterTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountDevicesStatement;
@@ -174,7 +173,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
 
       // request schema fetch API
       logger.info("{} fetch query schema...", getLogHeader());
-      SchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
+      ISchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
       logger.info("{} fetch schema done", getLogHeader());
       // If there is no leaf node in the schema tree, the query should be completed immediately
       if (schemaTree.isEmpty()) {
@@ -425,7 +424,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private List<Pair<Expression, String>> analyzeSelect(
-      QueryStatement queryStatement, SchemaTree schemaTree) {
+      QueryStatement queryStatement, ISchemaTree schemaTree) {
     List<Pair<Expression, String>> outputExpressions = new ArrayList<>();
     boolean isGroupByLevel = queryStatement.isGroupByLevel();
     ColumnPaginationController paginationController =
@@ -480,7 +479,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return outputExpressions;
   }
 
-  private Set<PartialPath> analyzeFrom(QueryStatement queryStatement, SchemaTree schemaTree) {
+  private Set<PartialPath> analyzeFrom(QueryStatement queryStatement, ISchemaTree schemaTree) {
     // device path patterns in FROM clause
     List<PartialPath> devicePatternList = queryStatement.getFromComponent().getPrefixPaths();
 
@@ -497,7 +496,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
 
   private List<Pair<Expression, String>> analyzeSelect(
       QueryStatement queryStatement,
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       Set<PartialPath> deviceList,
       Map<String, Set<Expression>> deviceToTransformExpressions,
       Map<String, Set<String>> deviceToMeasurementsMap) {
@@ -649,7 +648,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return isHasRawDataInputAggregation;
   }
 
-  private Expression analyzeWhere(QueryStatement queryStatement, SchemaTree schemaTree) {
+  private Expression analyzeWhere(QueryStatement queryStatement, ISchemaTree schemaTree) {
     List<Expression> rewrittenPredicates =
         ExpressionAnalyzer.removeWildcardInQueryFilter(
             queryStatement.getWhereCondition().getPredicate(),
@@ -661,7 +660,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private Expression analyzeWhereSplitByDevice(
-      QueryStatement queryStatement, PartialPath devicePath, SchemaTree schemaTree) {
+      QueryStatement queryStatement, PartialPath devicePath, ISchemaTree schemaTree) {
     List<Expression> rewrittenPredicates =
         ExpressionAnalyzer.removeWildcardInQueryFilterByDevice(
             queryStatement.getWhereCondition().getPredicate(),
@@ -776,7 +775,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private Analysis analyzeLast(
-      Analysis analysis, List<MeasurementPath> allSelectedPath, SchemaTree schemaTree) {
+      Analysis analysis, List<MeasurementPath> allSelectedPath, ISchemaTree schemaTree) {
     Set<Expression> sourceExpressions;
     List<SortItem> sortItemList = analysis.getMergeOrderParameter().getSortItemList();
     if (sortItemList.size() > 0) {
@@ -825,7 +824,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return analysis;
   }
 
-  private DataPartition fetchDataPartitionByDevices(Set<String> deviceSet, SchemaTree schemaTree) {
+  private DataPartition fetchDataPartitionByDevices(Set<String> deviceSet, ISchemaTree schemaTree) {
     Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap = new HashMap<>();
     for (String devicePath : deviceSet) {
       DataPartitionQueryParam queryParam = new DataPartitionQueryParam();
@@ -857,20 +856,6 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     }
   }
 
-  @Override
-  public Analysis visitLastPointFetch(LastPointFetchStatement statement, MPPQueryContext context) {
-    context.setQueryType(QueryType.READ);
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(statement);
-
-    SchemaTree schemaTree = new SchemaTree();
-    schemaTree.setStorageGroups(statement.getStorageGroups());
-
-    analysis.setMergeOrderParameter(new OrderByParameter());
-    return analyzeLast(analysis, statement.getSelectedPaths(), schemaTree);
-  }
-
   @Override
   public Analysis visitInsert(InsertStatement insertStatement, MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
@@ -1219,7 +1204,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       patternTree.constructTree();
       // request schema fetch API
       logger.info("{} fetch query schema...", getLogHeader());
-      SchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
+      ISchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
       logger.info("{} fetch schema done", getLogHeader());
       List<MeasurementPath> allSelectedPath = schemaTree.getAllMeasurement();
 
@@ -1452,7 +1437,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       patternTree.appendPathPattern(pathPattern);
     }
 
-    SchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
+    ISchemaTree schemaTree = schemaFetcher.fetchSchema(patternTree);
     analysis.setSchemaTree(schemaTree);
 
     Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap = new HashMap<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
index 7537998fea..c3e97ec043 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterSchemaFetcher.java
@@ -30,9 +30,10 @@ import org.apache.iotdb.db.metadata.path.PathDeserializeUtil;
 import org.apache.iotdb.db.metadata.template.ClusterTemplateManager;
 import org.apache.iotdb.db.metadata.template.ITemplateManager;
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.plan.Coordinator;
 import org.apache.iotdb.db.mpp.plan.execution.ExecutionResult;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
@@ -92,7 +93,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
   private ClusterSchemaFetcher() {}
 
   @Override
-  public SchemaTree fetchSchema(PathPatternTree patternTree) {
+  public ClusterSchemaTree fetchSchema(PathPatternTree patternTree) {
     Map<Integer, Template> templateMap = new HashMap<>();
     patternTree.constructTree();
     for (PartialPath pattern : patternTree.getAllPathPatterns()) {
@@ -101,7 +102,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     return executeSchemaFetchQuery(new SchemaFetchStatement(patternTree, templateMap));
   }
 
-  private SchemaTree executeSchemaFetchQuery(SchemaFetchStatement schemaFetchStatement) {
+  private ClusterSchemaTree executeSchemaFetchQuery(SchemaFetchStatement schemaFetchStatement) {
     long queryId = SessionManager.getInstance().requestQueryId(false);
     try {
       ExecutionResult executionResult =
@@ -121,7 +122,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
                 executionResult.status.getCode(), executionResult.status.getMessage()));
       }
       try (SetThreadName threadName = new SetThreadName(executionResult.queryId.getId())) {
-        SchemaTree result = new SchemaTree();
+        ClusterSchemaTree result = new ClusterSchemaTree();
         List<String> storageGroupList = new ArrayList<>();
         while (coordinator.getQueryExecution(queryId).hasNextResult()) {
           // The query will be transited to FINISHED when invoking getBatchResult() at the last time
@@ -149,7 +150,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
   }
 
   private void parseFetchedData(
-      Binary data, SchemaTree resultSchemaTree, List<String> storageGroupList) {
+      Binary data, ClusterSchemaTree resultSchemaTree, List<String> storageGroupList) {
     InputStream inputStream = new ByteArrayInputStream(data.getValues());
     try {
       byte type = ReadWriteIOUtils.readByte(inputStream);
@@ -159,7 +160,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
           storageGroupList.add(ReadWriteIOUtils.readString(inputStream));
         }
       } else if (type == 1) {
-        resultSchemaTree.mergeSchemaTree(SchemaTree.deserialize(inputStream));
+        resultSchemaTree.mergeSchemaTree(ClusterSchemaTree.deserialize(inputStream));
       } else {
         throw new RuntimeException(
             new MetadataException("Failed to fetch schema because of unrecognized data"));
@@ -170,10 +171,10 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchemaWithAutoCreate(
+  public ISchemaTree fetchSchemaWithAutoCreate(
       PartialPath devicePath, String[] measurements, TSDataType[] tsDataTypes, boolean isAligned) {
 
-    SchemaTree schemaTree = schemaCache.get(devicePath, measurements);
+    ClusterSchemaTree schemaTree = schemaCache.get(devicePath, measurements);
     Pair<List<String>, List<TSDataType>> missingMeasurements =
         checkMissingMeasurements(schemaTree, devicePath, measurements, tsDataTypes);
 
@@ -186,7 +187,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree remoteSchemaTree = fetchSchema(patternTree);
+    ClusterSchemaTree remoteSchemaTree = fetchSchema(patternTree);
     schemaTree.mergeSchemaTree(remoteSchemaTree);
     schemaCache.put(remoteSchemaTree);
 
@@ -194,7 +195,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree missingSchemaTree =
+    ClusterSchemaTree missingSchemaTree =
         checkAndAutoCreateMissingMeasurements(
             remoteSchemaTree,
             devicePath,
@@ -209,13 +210,13 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchemaListWithAutoCreate(
+  public ISchemaTree fetchSchemaListWithAutoCreate(
       List<PartialPath> devicePathList,
       List<String[]> measurementsList,
       List<TSDataType[]> tsDataTypesList,
       List<Boolean> isAlignedList) {
 
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     PathPatternTree patternTree = new PathPatternTree();
     for (int i = 0; i < devicePathList.size(); i++) {
       schemaTree.mergeSchemaTree(schemaCache.get(devicePathList.get(i), measurementsList.get(i)));
@@ -235,7 +236,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree remoteSchemaTree = fetchSchema(patternTree);
+    ClusterSchemaTree remoteSchemaTree = fetchSchema(patternTree);
     schemaTree.mergeSchemaTree(remoteSchemaTree);
     schemaCache.put(remoteSchemaTree);
 
@@ -243,7 +244,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree missingSchemaTree;
+    ClusterSchemaTree missingSchemaTree;
     for (int i = 0; i < devicePathList.size(); i++) {
       missingSchemaTree =
           checkAndAutoCreateMissingMeasurements(
@@ -273,8 +274,8 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     return templateManager.getAllPathsSetTemplate(templateName);
   }
 
-  private SchemaTree checkAndAutoCreateMissingMeasurements(
-      SchemaTree schemaTree,
+  private ClusterSchemaTree checkAndAutoCreateMissingMeasurements(
+      ClusterSchemaTree schemaTree,
       PartialPath devicePath,
       String[] measurements,
       TSDataType[] tsDataTypes,
@@ -286,7 +287,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     List<String> missingMeasurements = checkResult.left;
     List<TSDataType> dataTypesOfMissingMeasurement = checkResult.right;
 
-    SchemaTree reFetchedSchemaTree = new SchemaTree();
+    ClusterSchemaTree reFetchedSchemaTree = new ClusterSchemaTree();
 
     if (missingMeasurements.isEmpty()) {
       return reFetchedSchemaTree;
@@ -337,7 +338,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
   }
 
   private Pair<List<String>, List<TSDataType>> checkMissingMeasurements(
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       PartialPath devicePath,
       String[] measurements,
       TSDataType[] tsDataTypes) {
@@ -360,7 +361,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
     return new Pair<>(missingMeasurements, dataTypesOfMissingMeasurement);
   }
 
-  private SchemaTree internalCreateTimeseries(
+  private ClusterSchemaTree internalCreateTimeseries(
       PartialPath devicePath,
       List<String> measurements,
       List<TSDataType> tsDataTypes,
@@ -383,7 +384,7 @@ public class ClusterSchemaFetcher implements ISchemaFetcher {
             .map(o -> measurements.indexOf(o.getMeasurement()))
             .collect(Collectors.toSet());
 
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     schemaTree.appendMeasurementPaths(measurementPathList);
 
     for (int i = 0, size = measurements.size(); i < size; i++) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
index b3ddc5d2c2..aa35eeff13 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
@@ -24,8 +24,8 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.sql.MeasurementNotExistException;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.ExpressionType;
 import org.apache.iotdb.db.mpp.plan.expression.binary.BinaryExpression;
@@ -332,7 +332,7 @@ public class ExpressionAnalyzer {
    * @return the expression list after binding schema
    */
   public static List<Expression> removeWildcardInExpression(
-      Expression expression, SchemaTree schemaTree) {
+      Expression expression, ISchemaTree schemaTree) {
     if (expression instanceof TernaryExpression) {
       List<Expression> firstExpressions =
           removeWildcardInExpression(
@@ -406,7 +406,7 @@ public class ExpressionAnalyzer {
   public static List<Expression> removeWildcardInQueryFilter(
       Expression predicate,
       List<PartialPath> prefixPaths,
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       TypeProvider typeProvider) {
     if (predicate instanceof TernaryExpression) {
       List<Expression> firstExpressions =
@@ -509,7 +509,7 @@ public class ExpressionAnalyzer {
   public static List<Expression> concatDeviceAndRemoveWildcard(
       Expression expression,
       PartialPath devicePath,
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       TypeProvider typeProvider) {
     if (expression instanceof TernaryExpression) {
       List<Expression> firstExpressions =
@@ -595,7 +595,7 @@ public class ExpressionAnalyzer {
   public static List<Expression> removeWildcardInQueryFilterByDevice(
       Expression predicate,
       PartialPath devicePath,
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       TypeProvider typeProvider) {
     if (predicate instanceof TernaryExpression) {
       List<Expression> firstExpressions =
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java
index 7426bffd96..af877f02d1 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakeSchemaFetcherImpl.java
@@ -21,8 +21,9 @@ package org.apache.iotdb.db.mpp.plan.analyze;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.node.SchemaEntityNode;
 import org.apache.iotdb.db.mpp.common.schematree.node.SchemaInternalNode;
 import org.apache.iotdb.db.mpp.common.schematree.node.SchemaMeasurementNode;
@@ -37,16 +38,16 @@ import java.util.Map;
 
 public class FakeSchemaFetcherImpl implements ISchemaFetcher {
 
-  private final SchemaTree schemaTree = new SchemaTree(generateSchemaTree());
+  private final ClusterSchemaTree schemaTree = new ClusterSchemaTree(generateSchemaTree());
 
   @Override
-  public SchemaTree fetchSchema(PathPatternTree patternTree) {
+  public ClusterSchemaTree fetchSchema(PathPatternTree patternTree) {
     schemaTree.setStorageGroups(Collections.singletonList("root.sg"));
     return schemaTree;
   }
 
   @Override
-  public SchemaTree fetchSchemaWithAutoCreate(
+  public ISchemaTree fetchSchemaWithAutoCreate(
       PartialPath devicePath, String[] measurements, TSDataType[] tsDataTypes, boolean aligned) {
     return schemaTree;
   }
@@ -98,7 +99,7 @@ public class FakeSchemaFetcherImpl implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchemaListWithAutoCreate(
+  public ISchemaTree fetchSchemaListWithAutoCreate(
       List<PartialPath> devicePath,
       List<String[]> measurements,
       List<TSDataType[]> tsDataTypes,
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java
index c56c753177..331acd60eb 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ISchemaFetcher.java
@@ -21,8 +21,8 @@ package org.apache.iotdb.db.mpp.plan.analyze;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Pair;
 
@@ -34,12 +34,12 @@ import java.util.Map;
  */
 public interface ISchemaFetcher {
 
-  SchemaTree fetchSchema(PathPatternTree patternTree);
+  ISchemaTree fetchSchema(PathPatternTree patternTree);
 
-  SchemaTree fetchSchemaWithAutoCreate(
+  ISchemaTree fetchSchemaWithAutoCreate(
       PartialPath devicePath, String[] measurements, TSDataType[] tsDataTypes, boolean aligned);
 
-  SchemaTree fetchSchemaListWithAutoCreate(
+  ISchemaTree fetchSchemaListWithAutoCreate(
       List<PartialPath> devicePath,
       List<String[]> measurements,
       List<TSDataType[]> tsDataTypes,
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/SchemaValidator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/SchemaValidator.java
index 732f80f69c..686a241f2b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/SchemaValidator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/SchemaValidator.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.mpp.plan.analyze;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.sql.SemanticException;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.BatchInsertNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertNode;
 
@@ -32,9 +32,9 @@ public class SchemaValidator {
           ? ClusterSchemaFetcher.getInstance()
           : StandaloneSchemaFetcher.getInstance();
 
-  public static SchemaTree validate(InsertNode insertNode) {
+  public static ISchemaTree validate(InsertNode insertNode) {
 
-    SchemaTree schemaTree;
+    ISchemaTree schemaTree;
     if (insertNode instanceof BatchInsertNode) {
       BatchInsertNode batchInsertNode = (BatchInsertNode) insertNode;
       schemaTree =
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java
index 587d331e00..86a30c1f3e 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java
@@ -27,9 +27,10 @@ import org.apache.iotdb.db.localconfignode.LocalConfigNode;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.metadata.schemaregion.SchemaEngine;
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -61,10 +62,10 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchema(PathPatternTree patternTree) {
+  public ClusterSchemaTree fetchSchema(PathPatternTree patternTree) {
     patternTree.constructTree();
     Set<String> storageGroupSet = new HashSet<>();
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     List<PartialPath> pathPatterns = patternTree.getAllPathPatterns();
     try {
       for (PartialPath pathPattern : pathPatterns) {
@@ -85,9 +86,9 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchemaWithAutoCreate(
+  public ISchemaTree fetchSchemaWithAutoCreate(
       PartialPath devicePath, String[] measurements, TSDataType[] tsDataTypes, boolean aligned) {
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
 
     PathPatternTree patternTree = new PathPatternTree();
     for (String measurement : measurements) {
@@ -98,7 +99,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree fetchedSchemaTree;
+    ClusterSchemaTree fetchedSchemaTree;
 
     if (!config.isAutoCreateSchemaEnabled()) {
       fetchedSchemaTree = fetchSchema(patternTree);
@@ -109,7 +110,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
     fetchedSchemaTree = fetchSchema(patternTree);
     schemaTree.mergeSchemaTree(fetchedSchemaTree);
 
-    SchemaTree missingSchemaTree =
+    ClusterSchemaTree missingSchemaTree =
         checkAndAutoCreateMissingMeasurements(
             fetchedSchemaTree, devicePath, measurements, tsDataTypes, aligned);
 
@@ -119,12 +120,12 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
   }
 
   @Override
-  public SchemaTree fetchSchemaListWithAutoCreate(
+  public ISchemaTree fetchSchemaListWithAutoCreate(
       List<PartialPath> devicePathList,
       List<String[]> measurementsList,
       List<TSDataType[]> tsDataTypesList,
       List<Boolean> isAlignedList) {
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     PathPatternTree patternTree = new PathPatternTree();
     for (int i = 0; i < devicePathList.size(); i++) {
       for (String measurement : measurementsList.get(i)) {
@@ -136,7 +137,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
       return schemaTree;
     }
 
-    SchemaTree fetchedSchemaTree;
+    ClusterSchemaTree fetchedSchemaTree;
 
     if (!config.isAutoCreateSchemaEnabled()) {
       fetchedSchemaTree = fetchSchema(patternTree);
@@ -147,7 +148,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
     fetchedSchemaTree = fetchSchema(patternTree);
     schemaTree.mergeSchemaTree(fetchedSchemaTree);
 
-    SchemaTree missingSchemaTree;
+    ClusterSchemaTree missingSchemaTree;
     for (int i = 0; i < devicePathList.size(); i++) {
       missingSchemaTree =
           checkAndAutoCreateMissingMeasurements(
@@ -180,7 +181,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
   public void invalidAllCache() {}
 
   private Pair<List<String>, List<TSDataType>> checkMissingMeasurements(
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       PartialPath devicePath,
       String[] measurements,
       TSDataType[] tsDataTypes) {
@@ -203,8 +204,8 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
     return new Pair<>(missingMeasurements, dataTypesOfMissingMeasurement);
   }
 
-  private SchemaTree checkAndAutoCreateMissingMeasurements(
-      SchemaTree schemaTree,
+  private ClusterSchemaTree checkAndAutoCreateMissingMeasurements(
+      ISchemaTree schemaTree,
       PartialPath devicePath,
       String[] measurements,
       TSDataType[] tsDataTypes,
@@ -217,7 +218,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
     List<TSDataType> dataTypesOfMissingMeasurement = checkResult.right;
 
     if (missingMeasurements.isEmpty()) {
-      return new SchemaTree();
+      return new ClusterSchemaTree();
     }
 
     internalCreateTimeseries(
@@ -227,7 +228,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher {
     for (String measurement : missingMeasurements) {
       patternTree.appendFullPath(devicePath, measurement);
     }
-    SchemaTree reFetchSchemaTree = fetchSchema(patternTree);
+    ClusterSchemaTree reFetchSchemaTree = fetchSchema(patternTree);
 
     Pair<List<String>, List<TSDataType>> recheckResult =
         checkMissingMeasurements(
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 0c9922a0f5..ad5cbbe1be 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
@@ -48,7 +48,6 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.InternalCreateTimeSeriesStatement;
-import org.apache.iotdb.db.mpp.plan.statement.internal.LastPointFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.SchemaFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.AlterTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountDevicesStatement;
@@ -308,14 +307,6 @@ public class LogicalPlanVisitor extends StatementVisitor<PlanNode, MPPQueryConte
     return planBuilder.getRoot();
   }
 
-  public PlanNode visitLastPointFetch(
-      LastPointFetchStatement lastPointFetchStatement, MPPQueryContext context) {
-    LogicalPlanBuilder planBuilder = new LogicalPlanBuilder(context);
-    return planBuilder
-        .planLast(analysis.getSourceExpressions(), null, new OrderByParameter())
-        .getRoot();
-  }
-
   @Override
   public PlanNode visitCreateTimeseries(
       CreateTimeSeriesStatement createTimeSeriesStatement, MPPQueryContext context) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/DeleteDataNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/DeleteDataNode.java
index ccc1bbd366..13e6294df3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/DeleteDataNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/DeleteDataNode.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.path.PathDeserializeUtil;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -168,7 +168,7 @@ public class DeleteDataNode extends WritePlanNode {
 
   @Override
   public List<WritePlanNode> splitByPartition(Analysis analysis) {
-    SchemaTree schemaTree = analysis.getSchemaTree();
+    ISchemaTree schemaTree = analysis.getSchemaTree();
     DataPartition dataPartition = analysis.getDataPartitionInfo();
 
     Map<TRegionReplicaSet, List<PartialPath>> regionToPatternMap = new HashMap<>();
@@ -193,7 +193,7 @@ public class DeleteDataNode extends WritePlanNode {
   private void splitPathPatternByDevice(
       PartialPath devicePattern,
       PartialPath pathPattern,
-      SchemaTree schemaTree,
+      ISchemaTree schemaTree,
       DataPartition dataPartition,
       Map<TRegionReplicaSet, List<PartialPath>> regionToPatternMap) {
     for (DeviceSchemaInfo deviceSchemaInfo : schemaTree.getMatchedDevices(devicePattern)) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
index 6085a55d8f..e20ab334be 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
@@ -22,7 +22,7 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.utils.StatusUtils;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -136,7 +136,7 @@ public class InsertMultiTabletsNode extends InsertNode implements BatchInsertNod
   }
 
   @Override
-  public boolean validateAndSetSchema(SchemaTree schemaTree) {
+  public boolean validateAndSetSchema(ISchemaTree schemaTree) {
     for (InsertTabletNode insertTabletNode : insertTabletNodeList) {
       if (!insertTabletNode.validateAndSetSchema(schemaTree)) {
         return false;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertNode.java
index f5b5bddb52..d9808da701 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertNode.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.consensus.multileader.wal.ConsensusReqReader;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.metadata.DataTypeMismatchException;
 import org.apache.iotdb.db.metadata.idtable.entry.IDeviceID;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.WritePlanNode;
 import org.apache.iotdb.db.wal.buffer.IWALByteBufferView;
@@ -216,7 +216,7 @@ public abstract class InsertNode extends WritePlanNode {
     return dataRegionReplicaSet;
   }
 
-  public abstract boolean validateAndSetSchema(SchemaTree schemaTree);
+  public abstract boolean validateAndSetSchema(ISchemaTree schemaTree);
 
   /** Check whether data types are matched with measurement schemas */
   protected boolean selfCheckDataTypes() {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
index 883fcc30c9..a7f012c484 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
@@ -28,7 +28,7 @@ import org.apache.iotdb.db.engine.StorageEngineV2;
 import org.apache.iotdb.db.exception.metadata.PathNotExistException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -169,7 +169,7 @@ public class InsertRowNode extends InsertNode implements WALEntryValue {
   }
 
   @Override
-  public boolean validateAndSetSchema(SchemaTree schemaTree) {
+  public boolean validateAndSetSchema(ISchemaTree schemaTree) {
     DeviceSchemaInfo deviceSchemaInfo =
         schemaTree.searchDeviceSchemaInfo(devicePath, Arrays.asList(measurements));
     if (deviceSchemaInfo.isAligned() != isAligned) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
index a81d7198e1..89c6b6df13 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.utils.StatusUtils;
 import org.apache.iotdb.db.engine.StorageEngineV2;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -120,7 +120,7 @@ public class InsertRowsNode extends InsertNode implements BatchInsertNode {
   public void addChild(PlanNode child) {}
 
   @Override
-  public boolean validateAndSetSchema(SchemaTree schemaTree) {
+  public boolean validateAndSetSchema(ISchemaTree schemaTree) {
     for (InsertRowNode insertRowNode : insertRowNodeList) {
       if (!insertRowNode.validateAndSetSchema(schemaTree)) {
         return false;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
index 5f9772f699..7435dbbad4 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.utils.StatusUtils;
 import org.apache.iotdb.db.engine.StorageEngineV2;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -143,7 +143,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode implements BatchInsert
   }
 
   @Override
-  public boolean validateAndSetSchema(SchemaTree schemaTree) {
+  public boolean validateAndSetSchema(ISchemaTree schemaTree) {
     for (InsertRowNode insertRowNode : insertRowNodeList) {
       if (!insertRowNode.validateAndSetSchema(schemaTree)) {
         return false;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
index a9e64c9db9..250ad58015 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
@@ -25,7 +25,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.engine.StorageEngineV2;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
@@ -166,7 +166,7 @@ public class InsertTabletNode extends InsertNode implements WALEntryValue {
   }
 
   @Override
-  public boolean validateAndSetSchema(SchemaTree schemaTree) {
+  public boolean validateAndSetSchema(ISchemaTree schemaTree) {
     DeviceSchemaInfo deviceSchemaInfo =
         schemaTree.searchDeviceSchemaInfo(devicePath, Arrays.asList(measurements));
     if (deviceSchemaInfo.isAligned() != isAligned) {
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 d20b0a4ecb..918881984e 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
@@ -28,7 +28,6 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.InternalCreateTimeSeriesStatement;
-import org.apache.iotdb.db.mpp.plan.statement.internal.LastPointFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.internal.SchemaFetchStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.AlterTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountDevicesStatement;
@@ -170,10 +169,6 @@ public abstract class StatementVisitor<R, C> {
     return visitStatement(queryStatement, context);
   }
 
-  public R visitLastPointFetch(LastPointFetchStatement lastPointFetchStatement, C context) {
-    return visitStatement(lastPointFetchStatement, context);
-  }
-
   // Insert Statement
   public R visitInsert(InsertStatement insertStatement, C context) {
     return visitStatement(insertStatement, context);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/LastPointFetchStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/LastPointFetchStatement.java
deleted file mode 100644
index 58347a68e4..0000000000
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/LastPointFetchStatement.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.statement.internal;
-
-import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.metadata.path.MeasurementPath;
-import org.apache.iotdb.db.mpp.plan.statement.Statement;
-import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
-
-import java.util.List;
-
-public class LastPointFetchStatement extends Statement {
-
-  private final List<MeasurementPath> selectedPaths;
-
-  // used for fetch data partition
-  private final List<String> storageGroups;
-
-  public LastPointFetchStatement(List<MeasurementPath> selectedPaths, List<String> storageGroups) {
-    this.selectedPaths = selectedPaths;
-    this.storageGroups = storageGroups;
-  }
-
-  public List<MeasurementPath> getSelectedPaths() {
-    return selectedPaths;
-  }
-
-  public List<String> getStorageGroups() {
-    return storageGroups;
-  }
-
-  @Override
-  public List<? extends PartialPath> getPaths() {
-    return selectedPaths;
-  }
-
-  @Override
-  public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
-    return visitor.visitLastPointFetch(this, context);
-  }
-}
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCacheTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCacheTest.java
index 0d72f84d99..2ed740eb2e 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCacheTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/cache/DataNodeSchemaCacheTest.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.metadata.cache;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
@@ -173,8 +174,8 @@ public class DataNodeSchemaCacheTest {
     Assert.assertNull(dataNodeSchemaCache.getLastCache(seriesPath3));
   }
 
-  private SchemaTree generateSchemaTree1() throws IllegalPathException {
-    SchemaTree schemaTree = new SchemaTree();
+  private ISchemaTree generateSchemaTree1() throws IllegalPathException {
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
 
     schemaTree.appendSingleMeasurement(
         new PartialPath("root.sg1.d1.s1"),
@@ -195,8 +196,8 @@ public class DataNodeSchemaCacheTest {
     return schemaTree;
   }
 
-  private SchemaTree generateSchemaTree2() throws IllegalPathException {
-    SchemaTree schemaTree = new SchemaTree();
+  private ISchemaTree generateSchemaTree2() throws IllegalPathException {
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
 
     schemaTree.appendSingleMeasurement(
         new PartialPath("root.sg1.d1.s3"),
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTreeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTreeTest.java
similarity index 95%
rename from server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTreeTest.java
rename to server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTreeTest.java
index d51deb19ec..7a6f3c0c93 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/SchemaTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/ClusterSchemaTreeTest.java
@@ -41,7 +41,7 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class SchemaTreeTest {
+public class ClusterSchemaTreeTest {
 
   @Test
   public void testSchemaTreeVisitor() throws Exception {
@@ -392,12 +392,12 @@ public class SchemaTreeTest {
 
   @Test
   public void testSearchDeviceInfo() throws Exception {
-    SchemaTree schemaTree = new SchemaTree(generateSchemaTree());
+    ISchemaTree schemaTree = new ClusterSchemaTree(generateSchemaTree());
 
     testSearchDeviceInfo(schemaTree);
   }
 
-  private void testSearchDeviceInfo(SchemaTree schemaTree) throws Exception {
+  private void testSearchDeviceInfo(ISchemaTree schemaTree) throws Exception {
     PartialPath devicePath = new PartialPath("root.sg.d1");
     List<String> measurements = new ArrayList<>();
     measurements.add("s1");
@@ -426,7 +426,7 @@ public class SchemaTreeTest {
 
   @Test
   public void testGetMatchedDevices() throws Exception {
-    SchemaTree schemaTree = new SchemaTree(generateSchemaTree());
+    ISchemaTree schemaTree = new ClusterSchemaTree(generateSchemaTree());
 
     List<DeviceSchemaInfo> deviceSchemaInfoList =
         schemaTree.getMatchedDevices(new PartialPath("root.sg.d2.a"), false);
@@ -466,7 +466,7 @@ public class SchemaTreeTest {
     root.serialize(outputStream);
 
     ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
-    SchemaTree schemaTree = SchemaTree.deserialize(inputStream);
+    ISchemaTree schemaTree = ClusterSchemaTree.deserialize(inputStream);
 
     Pair<List<MeasurementPath>, Integer> visitResult =
         schemaTree.searchMeasurementPaths(new PartialPath("root.sg.**.status"), 2, 1, true);
@@ -478,7 +478,7 @@ public class SchemaTreeTest {
 
   @Test
   public void testAppendMeasurementPath() throws Exception {
-    SchemaTree schemaTree = new SchemaTree();
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     List<MeasurementPath> measurementPathList = generateMeasurementPathList();
 
     schemaTree.appendMeasurementPaths(measurementPathList);
@@ -530,8 +530,8 @@ public class SchemaTreeTest {
 
   @Test
   public void testMergeSchemaTree() throws Exception {
-    SchemaTree schemaTree = new SchemaTree();
-    for (SchemaTree tree : generateSchemaTrees()) {
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
+    for (ClusterSchemaTree tree : generateSchemaTrees()) {
       schemaTree.mergeSchemaTree(tree);
     }
 
@@ -540,8 +540,8 @@ public class SchemaTreeTest {
 
   @Test
   public void testMergeSchemaTreeAndSearchDeviceSchemaInfo() throws Exception {
-    SchemaTree schemaTree = new SchemaTree();
-    for (SchemaTree tree : generateSchemaTrees()) {
+    ClusterSchemaTree schemaTree = new ClusterSchemaTree();
+    for (ClusterSchemaTree tree : generateSchemaTrees()) {
       schemaTree.mergeSchemaTree(tree);
     }
     PartialPath devicePath = new PartialPath("root.sg.d99999");
@@ -551,9 +551,9 @@ public class SchemaTreeTest {
     schemaTree.searchDeviceSchemaInfo(devicePath, measurements);
   }
 
-  private List<SchemaTree> generateSchemaTrees() throws Exception {
-    List<SchemaTree> schemaTreeList = new ArrayList<>();
-    SchemaTree schemaTree;
+  private List<ClusterSchemaTree> generateSchemaTrees() throws Exception {
+    List<ClusterSchemaTree> schemaTreeList = new ArrayList<>();
+    ClusterSchemaTree schemaTree;
     List<MeasurementPath> measurementPathList = generateMeasurementPathList();
     List<MeasurementPath> list;
     for (int i = 0; i < 6; i += 2) {
@@ -561,7 +561,7 @@ public class SchemaTreeTest {
       list.add(measurementPathList.get(i));
       list.add(measurementPathList.get(i + 1));
 
-      schemaTree = new SchemaTree();
+      schemaTree = new ClusterSchemaTree();
       schemaTree.appendMeasurementPaths(list);
       schemaTreeList.add(schemaTree);
     }
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java
index 3814f8e32d..a99a4743b9 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperatorTest.java
@@ -24,9 +24,10 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.metadata.schemaregion.SchemaEngine;
+import org.apache.iotdb.db.mpp.common.schematree.ClusterSchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
-import org.apache.iotdb.db.mpp.common.schematree.SchemaTree;
 import org.apache.iotdb.db.qp.physical.sys.CreateAlignedTimeSeriesPlan;
 import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
@@ -84,7 +85,7 @@ public class SchemaFetchScanOperatorTest {
     Binary binary = tsBlock.getColumn(0).getBinary(0);
     InputStream inputStream = new ByteArrayInputStream(binary.getValues());
     Assert.assertEquals(1, ReadWriteIOUtils.readByte(inputStream));
-    SchemaTree schemaTree = SchemaTree.deserialize(inputStream);
+    ISchemaTree schemaTree = ClusterSchemaTree.deserialize(inputStream);
 
     DeviceSchemaInfo deviceSchemaInfo =
         schemaTree.searchDeviceSchemaInfo(