You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2023/07/12 07:09:32 UTC

[iotdb] branch rc/1.2.0 updated: [To rel/1.2] Disabling Logical View

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

haonan pushed a commit to branch rc/1.2.0
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rc/1.2.0 by this push:
     new 11ba3bfacf4 [To rel/1.2] Disabling Logical View
11ba3bfacf4 is described below

commit 11ba3bfacf477d45286fef631f4b6b16a92c2f81
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Wed Jul 12 14:51:16 2023 +0800

    [To rel/1.2] Disabling Logical View
---
 .../db/it/schema/view/IoTDBAliasSeriesIT.java      | 102 -----
 .../iotdb/db/it/schema/view/IoTDBAlterViewIT.java  | 348 -----------------
 .../it/schema/view/IoTDBCreateAndShowViewIT.java   | 429 ---------------------
 .../view/IoTDBShowDevicesContainedViewIT.java      | 226 -----------
 .../commons/schema/node/utils/MNodeFactory.java    |  31 ++
 .../apache/iotdb/db/metadata/MetadataConstant.java |   1 +
 .../mnode/config/factory/ConfigMNodeFactory.java   |   5 +-
 .../mnode/mem/factory/MemMNodeFactory.java         |  24 +-
 .../metadata/mnode/mem/impl/LogicalViewMNode.java  |  64 ---
 .../metadata/mnode/mem/info/LogicalViewInfo.java   |  10 +-
 .../schemafile/factory/CacheMNodeFactory.java      |  17 +-
 .../metadata/mnode/utils/MNodeFactoryLoader.java   | 143 +++++++
 .../db/metadata/mtree/MTreeBelowSGCachedImpl.java  |   6 +-
 .../db/metadata/mtree/MTreeBelowSGMemoryImpl.java  |  19 +-
 .../mtree/snapshot/MemMTreeSnapshotUtil.java       |   5 +-
 .../db/metadata/mtree/store/CachedMTreeStore.java  |   8 +-
 .../db/metadata/mtree/store/MemMTreeStore.java     |   9 +-
 .../store/disk/schemafile/MockSchemaFile.java      |   6 +-
 .../mtree/store/disk/schemafile/RecordUtils.java   |   5 +-
 .../mtree/store/disk/schemafile/SchemaFile.java    |   5 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |   5 +-
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |   5 +-
 .../mtree/disk/CachedMNodeContainerTest.java       |   5 +-
 .../metadata/mtree/schemafile/RecordUtilTests.java |   5 +-
 .../mtree/schemafile/SchemaFileLogTest.java        |   5 +-
 .../metadata/mtree/schemafile/SchemaFileTest.java  |   5 +-
 .../metadata/mtree/schemafile/SchemaPageTest.java  |   5 +-
 .../mtree/schemafile/WrappedSegmentTest.java       |   5 +-
 .../schemaRegion/SchemaStatisticsTest.java         |   9 +-
 .../iotdb/db/tools/PBTreeFileSketchTest.java       |   5 +-
 30 files changed, 254 insertions(+), 1263 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAliasSeriesIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAliasSeriesIT.java
deleted file mode 100644
index 2045f23b59e..00000000000
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAliasSeriesIT.java
+++ /dev/null
@@ -1,102 +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.it.schema.view;
-
-import org.apache.iotdb.it.env.EnvFactory;
-import org.apache.iotdb.it.framework.IoTDBTestRunner;
-import org.apache.iotdb.itbase.category.ClusterIT;
-import org.apache.iotdb.itbase.category.LocalStandaloneIT;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-@RunWith(IoTDBTestRunner.class)
-@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAliasSeriesIT {
-
-  @BeforeClass
-  public static void setUpCluster() throws Exception {
-    EnvFactory.getEnv().initClusterEnvironment();
-  }
-
-  @AfterClass
-  public static void tearDownCluster() throws Exception {
-    EnvFactory.getEnv().cleanClusterEnvironment();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      try {
-        statement.execute("DELETE DATABASE root.**");
-      } catch (Exception e) {
-        // If database is null, it will throw exception. Do nothing.
-      }
-    }
-  }
-
-  @Test
-  public void testSelectIntoAliasSeries() throws SQLException {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      statement.execute("CREATE DATABASE root.db");
-      statement.execute("CREATE DATABASE root.view");
-
-      statement.execute("create timeseries root.db.device.s01 with datatype=INT32");
-      statement.execute("create timeseries root.db.device.s02 with datatype=INT32");
-      statement.execute("CREATE VIEW root.view.device.status AS SELECT s01 FROM root.db.device");
-      statement.execute("insert into root.db.device(time,s02) values(1,1)");
-
-      try (ResultSet resultSet =
-          statement.executeQuery("select s02 into root.view.device(status) from root.db.device")) {
-        StringBuilder stringBuilder = new StringBuilder();
-        if (resultSet.next()) {
-          for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
-            stringBuilder.append(resultSet.getString(i)).append(",");
-          }
-          Assert.assertEquals(
-              "root.db.device.s02,root.view.device.status,1,", stringBuilder.toString());
-        }
-        Assert.assertFalse(resultSet.next());
-      }
-      try (ResultSet resultSet = statement.executeQuery("select status from root.view.device")) {
-        StringBuilder stringBuilder = new StringBuilder();
-        if (resultSet.next()) {
-          for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
-            stringBuilder.append(resultSet.getString(i)).append(",");
-          }
-          Assert.assertEquals("1,1,", stringBuilder.toString());
-        }
-        Assert.assertFalse(resultSet.next());
-      }
-    }
-  }
-}
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAlterViewIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAlterViewIT.java
deleted file mode 100644
index 4145f240bc2..00000000000
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBAlterViewIT.java
+++ /dev/null
@@ -1,348 +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.it.schema.view;
-
-import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
-import org.apache.iotdb.it.env.EnvFactory;
-import org.apache.iotdb.it.framework.IoTDBTestRunner;
-import org.apache.iotdb.itbase.category.ClusterIT;
-import org.apache.iotdb.itbase.category.LocalStandaloneIT;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-@RunWith(IoTDBTestRunner.class)
-@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlterViewIT {
-
-  @BeforeClass
-  public static void setUpCluster() throws Exception {
-    EnvFactory.getEnv().initClusterEnvironment();
-  }
-
-  @AfterClass
-  public static void tearDownCluster() throws Exception {
-    EnvFactory.getEnv().cleanClusterEnvironment();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      try {
-        statement.execute("DELETE DATABASE root.**");
-      } catch (Exception e) {
-        // If database is null, it will throw exception. Do nothing.
-      }
-    }
-  }
-
-  @Test
-  public void testAlterView() throws SQLException {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      statement.execute("create timeseries root.db.d1.s1 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s2 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s3 with datatype=INT32");
-      statement.execute("create timeseries root.db.d2.s1 with datatype=INT32");
-      statement.execute("create timeseries root.db.d2.s2 with datatype=INT32");
-      statement.execute("create timeseries root.db.d2.s3 with datatype=INT32");
-
-      statement.execute(
-          "create view root(view.d1.s1, view.d1.s2, view.d1.s3, view.d2.s1, view.d2.s2, view.d2.s3) as root(db.d1.s1, db.d1.s2, db.d1.s3, db.d2.s1, db.d2.s2, db.d2.s3)");
-
-      String[][] map =
-          new String[][] {
-            new String[] {"root.view.d1.s1", "root.db.d1.s1"},
-            new String[] {"root.view.d1.s2", "root.db.d1.s2"},
-            new String[] {"root.view.d1.s3", "root.db.d1.s3"},
-            new String[] {"root.view.d2.s1", "root.db.d2.s1"},
-            new String[] {"root.view.d2.s2", "root.db.d2.s2"},
-            new String[] {"root.view.d2.s3", "root.db.d2.s3"},
-          };
-      for (String[] strings : map) {
-        try (ResultSet resultSet =
-            statement.executeQuery(String.format("show view %s", strings[0]))) {
-          Assert.assertTrue(resultSet.next());
-          Assert.assertEquals(strings[1], resultSet.getString("Source"));
-        }
-      }
-
-      statement.execute(
-          "alter view root(view.d1.s1, view.d1.s2, view.d1.s3, view.d2.s1, view.d2.s2, view.d2.s3) as root(db.d2.s2, db.d2.s3, db.d2.s1, db.d1.s2, db.d1.s3, db.d1.s1)");
-
-      map =
-          new String[][] {
-            new String[] {"root.view.d1.s1", "root.db.d2.s2"},
-            new String[] {"root.view.d1.s2", "root.db.d2.s3"},
-            new String[] {"root.view.d1.s3", "root.db.d2.s1"},
-            new String[] {"root.view.d2.s1", "root.db.d1.s2"},
-            new String[] {"root.view.d2.s2", "root.db.d1.s3"},
-            new String[] {"root.view.d2.s3", "root.db.d1.s1"},
-          };
-      for (String[] strings : map) {
-        try (ResultSet resultSet =
-            statement.executeQuery(String.format("show view %s", strings[0]))) {
-          Assert.assertTrue(resultSet.next());
-          Assert.assertEquals(strings[1], resultSet.getString("Source"));
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testAlterViewTagsAndAttributes() throws Exception {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      statement.execute("create timeseries root.db.d1.s1 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s2 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s3 with datatype=INT32");
-
-      statement.execute("create view root.view.${2}(${3}) as select * from root.db.**;");
-
-      String[][] map =
-          new String[][] {
-            new String[] {"root.view.d1.s1", "root.db.d1.s1"},
-            new String[] {"root.view.d1.s2", "root.db.d1.s2"},
-            new String[] {"root.view.d1.s3", "root.db.d1.s3"},
-          };
-      for (String[] strings : map) {
-        try (ResultSet resultSet =
-            statement.executeQuery(String.format("show view %s", strings[0]))) {
-          Assert.assertTrue(resultSet.next());
-          Assert.assertEquals(strings[1], resultSet.getString("Source"));
-        }
-      }
-
-      // case1: ADD TAGS AND ATTRIBUES
-      statement.execute("alter view root.view.d1.s1 ADD TAGS tag1=v1, tag2=v2");
-      statement.execute("alter view root.view.d1.s1 ADD ATTRIBUTES attr1=a1");
-      statement.execute("alter view root.view.d1.s2 ADD TAGS tag1=v1, tag2=v2");
-      statement.execute("alter view root.view.d1.s2 ADD ATTRIBUTES attr2=a2");
-      statement.execute("alter view root.view.d1.s3 ADD TAGS tag1=v1, tag2=v2");
-      statement.execute("alter view root.view.d1.s3 ADD ATTRIBUTES attr3=a3");
-      Set<String> expectedResult =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.view.d1.s1,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},{\"attr1\":\"a1\"},VIEW,root.db.d1.s1",
-                  "root.view.d1.s2,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},{\"attr2\":\"a2\"},VIEW,root.db.d1.s2",
-                  "root.view.d1.s3,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},{\"attr3\":\"a3\"},VIEW,root.db.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view")) {
-        while (resultSet.next()) {
-          String actualResult =
-              resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.TAGS)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.SOURCE);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-
-      // case2: DROP TAGS AND ATTRIBUES
-      statement.execute("alter view root.view.d1.s1 DROP tag1");
-      statement.execute("alter view root.view.d1.s2 DROP tag2");
-      statement.execute("alter view root.view.d1.s3 DROP attr3");
-      expectedResult =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.view.d1.s1,INT32,{\"tag2\":\"v2\"},{\"attr1\":\"a1\"},VIEW,root.db.d1.s1",
-                  "root.view.d1.s2,INT32,{\"tag1\":\"v1\"},{\"attr2\":\"a2\"},VIEW,root.db.d1.s2",
-                  "root.view.d1.s3,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},null,VIEW,root.db.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view")) {
-        while (resultSet.next()) {
-          String actualResult =
-              resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.TAGS)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.SOURCE);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-
-      // case3: SET TAGS AND ATTRIBUES
-      statement.execute("alter view root.view.d1.s1 SET tag2=new2");
-      statement.execute("alter view root.view.d1.s2 SET attr2=new2");
-      expectedResult =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.view.d1.s1,INT32,{\"tag2\":\"new2\"},{\"attr1\":\"a1\"},VIEW,root.db.d1.s1",
-                  "root.view.d1.s2,INT32,{\"tag1\":\"v1\"},{\"attr2\":\"new2\"},VIEW,root.db.d1.s2",
-                  "root.view.d1.s3,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},null,VIEW,root.db.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view")) {
-        while (resultSet.next()) {
-          String actualResult =
-              resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.TAGS)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.SOURCE);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-
-      // case4: RENAME TAGS AND ATTRIBUES
-      statement.execute("alter view root.view.d1.s1 RENAME tag2 TO newTag2");
-      statement.execute("alter view root.view.d1.s2 RENAME attr2 TO newAttr2");
-      expectedResult =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.view.d1.s1,INT32,{\"newTag2\":\"new2\"},{\"attr1\":\"a1\"},VIEW,root.db.d1.s1",
-                  "root.view.d1.s2,INT32,{\"tag1\":\"v1\"},{\"newAttr2\":\"new2\"},VIEW,root.db.d1.s2",
-                  "root.view.d1.s3,INT32,{\"tag1\":\"v1\",\"tag2\":\"v2\"},null,VIEW,root.db.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view")) {
-        while (resultSet.next()) {
-          String actualResult =
-              resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.TAGS)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.SOURCE);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-    }
-  }
-
-  @Test
-  public void testQueryFilterByTag() throws Exception {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      statement.execute("create timeseries root.db.d1.s1 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s2 with datatype=INT32");
-      statement.execute("create timeseries root.db.d1.s3 with datatype=INT32");
-
-      statement.execute("create view root.view.${2}(${3}) as select * from root.db.**;");
-
-      String[][] map =
-          new String[][] {
-            new String[] {"root.view.d1.s1", "root.db.d1.s1"},
-            new String[] {"root.view.d1.s2", "root.db.d1.s2"},
-            new String[] {"root.view.d1.s3", "root.db.d1.s3"},
-          };
-      for (String[] strings : map) {
-        try (ResultSet resultSet =
-            statement.executeQuery(String.format("show view %s", strings[0]))) {
-          Assert.assertTrue(resultSet.next());
-          Assert.assertEquals(strings[1], resultSet.getString("Source"));
-        }
-      }
-
-      // ADD TAGS
-      statement.execute("alter view root.view.d1.s1 ADD TAGS tag1=v1");
-      statement.execute("alter view root.view.d1.s2 ADD TAGS tag1=v2");
-      statement.execute("alter view root.view.d1.s3 ADD TAGS tag1=v1");
-      Set<String> expectedResult =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.view.d1.s1,INT32,{\"tag1\":\"v1\"},null,VIEW,root.db.d1.s1",
-                  "root.view.d1.s2,INT32,{\"tag1\":\"v2\"},null,VIEW,root.db.d1.s2",
-                  "root.view.d1.s3,INT32,{\"tag1\":\"v1\"},null,VIEW,root.db.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view")) {
-        while (resultSet.next()) {
-          String actualResult =
-              resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.TAGS)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                  + ","
-                  + resultSet.getString(ColumnHeaderConstant.SOURCE);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-
-      // case1: query where TAGS(tag1)='v1'
-      expectedResult = new HashSet<>(Arrays.asList("root.view.d1.s1", "root.view.d1.s3"));
-      try (ResultSet resultSet = statement.executeQuery("show view where TAGS(tag1)='v1';")) {
-        while (resultSet.next()) {
-          String actualResult = resultSet.getString(ColumnHeaderConstant.TIMESERIES);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-
-      // case2: query where TAGS(tag1) contains 'v'
-      expectedResult =
-          new HashSet<>(Arrays.asList("root.view.d1.s1", "root.view.d1.s2", "root.view.d1.s3"));
-      try (ResultSet resultSet =
-          statement.executeQuery("show view where TAGS(tag1) contains 'v';")) {
-        while (resultSet.next()) {
-          String actualResult = resultSet.getString(ColumnHeaderConstant.TIMESERIES);
-          Assert.assertTrue(expectedResult.contains(actualResult));
-          expectedResult.remove(actualResult);
-        }
-      }
-      Assert.assertTrue(expectedResult.isEmpty());
-    }
-  }
-}
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBCreateAndShowViewIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBCreateAndShowViewIT.java
deleted file mode 100644
index e86f26fd36b..00000000000
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBCreateAndShowViewIT.java
+++ /dev/null
@@ -1,429 +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.it.schema.view;
-
-import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
-import org.apache.iotdb.it.env.EnvFactory;
-import org.apache.iotdb.it.framework.IoTDBTestRunner;
-import org.apache.iotdb.itbase.category.ClusterIT;
-import org.apache.iotdb.itbase.category.LocalStandaloneIT;
-
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-@RunWith(IoTDBTestRunner.class)
-@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBCreateAndShowViewIT {
-
-  private static final String[] SQLs =
-      new String[] {
-        "CREATE DATABASE root.db;",
-        "CREATE DATABASE root.view;",
-        "CREATE TIMESERIES root.db.d01.s01 INT32 encoding=RLE compression=SNAPPY;",
-        "CREATE TIMESERIES root.db.d01.s02 INT32 encoding=RLE compression=SNAPPY;",
-        "CREATE TIMESERIES root.db.d02.s01 INT32 encoding=RLE compression=SNAPPY;",
-        "CREATE TIMESERIES root.db.d02.s02 INT32 encoding=RLE compression=SNAPPY;",
-        "CREATE VIEW root.view.myview.d01.s01 AS root.db.d01.s01;",
-        "CREATE VIEW root.view.myview.d01.s02 AS SELECT s02 FROM root.db.d01;",
-        "CREATE VIEW root.view.myview.d02(s01, s02) AS SELECT s01, s02 FROM root.db.d02;",
-        "CREATE VIEW root.view.cal_view.avg AS SELECT (s01+s02)/2 FROM root.db.d01;",
-        "CREATE VIEW root.view.cal_view(multiple, divide) AS SELECT s01*s02, s01/s02 FROM root.db.d02;",
-        "CREATE VIEW root.view.cal_view.cast_view AS SELECT CAST(s01 as TEXT) FROM root.db.d01;",
-        "CREATE VIEW root.view.multi_view.all_in_one(${2}_${3}) AS SELECT * FROM root.db.**;",
-        "CREATE VIEW root.view.copy_view.${2}(${3}) AS SELECT * FROM root.db.**;",
-        "ALTER VIEW root.view.myview.d01.s01 UPSERT TAGS(tag1=value1, tag2=value2) ATTRIBUTES(attribute1=value1)",
-        "ALTER VIEW root.view.myview.d02.s01 UPSERT TAGS(tag1=value2, tag2=value3) ATTRIBUTES(attribute1=value1)"
-      };
-
-  private static final String[] unsupportedSQLs =
-      new String[] {
-        "CREATE VIEW root.view.myview.nested_view AS root.view.myview.d01.s01;",
-        "CREATE VIEW root.view.agg_view(agg_avg1, agg_avg2) AS SELECT AVG(s01)+1 FROM root.db.d01, root.db.d02;",
-        "CREATE VIEW root.view.agg_view(agg_max1, agg_max2) AS SELECT MAX_VALUE(s01) FROM root.db.d01, root.db.d02;",
-        "CREATE VIEW root.view.myview.illegal_view AS root.view.myview.d01.s01 + 1;",
-        "CREATE VIEW root.view.multi_view($illegal_name) AS root.db.d01.s01;",
-        "CREATE VIEW root.view.multi_view.multi_nodes(${3}.${2}) AS SELECT * FROM root.db.**;",
-        "CREATE VIEW root.view.copy_view.$illegal_char(${3}) AS SELECT * FROM root.db.**;",
-        "CREATE VIEW root.view.copy_view.mismatched_count(${3}) AS SELECT * FROM root.db.**;",
-        "CREATE VIEW root.view.repeated_view(a, a) AS SELECT s01, s02 FROM root.db.d01;",
-        "CREATE VIEW root.view.repeated_view.abc, root.view.repeated_view.abc  AS SELECT s01, s02 FROM root.db.d01;",
-        "ALTER VIW root.db.d01.s01 UPSERT TAGS(tag1=value1, tag2=value2) ATTRIBUTES(attribute1=value1)"
-      };
-
-  @BeforeClass
-  public static void setUp() throws Exception {
-    EnvFactory.getEnv().initClusterEnvironment();
-
-    createSchema();
-  }
-
-  @AfterClass
-  public static void tearDown() throws Exception {
-    EnvFactory.getEnv().cleanClusterEnvironment();
-  }
-
-  // region Test show timesereis
-  @Test
-  public void testShowOriginTimeseries() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.db.d01.s01,null,root.db,INT32,RLE,SNAPPY,null,null,BASE;",
-                "root.db.d01.s02,null,root.db,INT32,RLE,SNAPPY,null,null,BASE;",
-                "root.db.d02.s01,null,root.db,INT32,RLE,SNAPPY,null,null,BASE;",
-                "root.db.d02.s02,null,root.db,INT32,RLE,SNAPPY,null,null,BASE;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.db.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ALIAS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ENCODING)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.COMPRESSION)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-
-  @Test
-  public void testShowAliasViewsWithShowTimeseries() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.view.myview.d01.s01,null,root.view,INT32,null,null,{\"tag1\":\"value1\",\"tag2\":\"value2\"},{\"attribute1\":\"value1\"},VIEW;",
-                "root.view.myview.d01.s02,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.myview.d02.s01,null,root.view,INT32,null,null,{\"tag1\":\"value2\",\"tag2\":\"value3\"},{\"attribute1\":\"value1\"},VIEW;",
-                "root.view.myview.d02.s02,null,root.view,INT32,null,null,null,null,VIEW;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.view.myview.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ALIAS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ENCODING)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.COMPRESSION)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-
-  @Test
-  public void testShowViewsWithCalculationWithShowTimeseries() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.view.cal_view.avg,null,root.view,DOUBLE,null,null,null,null,VIEW;",
-                "root.view.cal_view.multiple,null,root.view,DOUBLE,null,null,null,null,VIEW;",
-                "root.view.cal_view.divide,null,root.view,DOUBLE,null,null,null,null,VIEW;",
-                "root.view.cal_view.cast_view,null,root.view,TEXT,null,null,null,null,VIEW;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.view.cal_view.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ALIAS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ENCODING)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.COMPRESSION)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-
-  @Test
-  public void testShowViewsWithMultiCreationWithShowTimeseriesPart01() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.view.multi_view.all_in_one.d01_s01,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.multi_view.all_in_one.d01_s02,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.multi_view.all_in_one.d02_s01,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.multi_view.all_in_one.d02_s02,null,root.view,INT32,null,null,null,null,VIEW;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.view.multi_view.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ALIAS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ENCODING)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.COMPRESSION)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-
-  @Test
-  public void testShowViewsWithMultiCreationWithShowTimeseriesPart02() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.view.copy_view.d01.s01,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.copy_view.d01.s02,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.copy_view.d02.s01,null,root.view,INT32,null,null,null,null,VIEW;",
-                "root.view.copy_view.d02.s02,null,root.view,INT32,null,null,null,null,VIEW;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES root.view.copy_view.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ALIAS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ENCODING)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.COMPRESSION)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-  // endregion
-
-  // region Test Show View
-  @Test
-  public void testShowAllViewsWithShowView() {
-
-    Set<String> retSet =
-        new HashSet<>(
-            Arrays.asList(
-                "root.view.myview.d01.s01,root.view,INT32,{\"tag1\":\"value1\",\"tag2\":\"value2\"},{\"attribute1\":\"value1\"},VIEW,root.db.d01.s01;",
-                "root.view.myview.d01.s02,root.view,INT32,null,null,VIEW,root.db.d01.s02;",
-                "root.view.myview.d02.s01,root.view,INT32,{\"tag1\":\"value2\",\"tag2\":\"value3\"},{\"attribute1\":\"value1\"},VIEW,root.db.d02.s01;",
-                "root.view.myview.d02.s02,root.view,INT32,null,null,VIEW,root.db.d02.s02;",
-                "root.view.cal_view.avg,root.view,DOUBLE,null,null,VIEW,(root.db.d01.s01 + root.db.d01.s02) / 2;",
-                "root.view.cal_view.multiple,root.view,DOUBLE,null,null,VIEW,root.db.d02.s01 * root.db.d02.s02;",
-                "root.view.cal_view.divide,root.view,DOUBLE,null,null,VIEW,root.db.d02.s01 / root.db.d02.s02;",
-                "root.view.cal_view.cast_view,root.view,TEXT,null,null,VIEW,cast(type=TEXT)(root.db.d01.s01);",
-                "root.view.multi_view.all_in_one.d01_s01,root.view,INT32,null,null,VIEW,root.db.d01.s01;",
-                "root.view.multi_view.all_in_one.d01_s02,root.view,INT32,null,null,VIEW,root.db.d01.s02;",
-                "root.view.multi_view.all_in_one.d02_s01,root.view,INT32,null,null,VIEW,root.db.d02.s01;",
-                "root.view.multi_view.all_in_one.d02_s02,root.view,INT32,null,null,VIEW,root.db.d02.s02;",
-                "root.view.copy_view.d01.s01,root.view,INT32,null,null,VIEW,root.db.d01.s01;",
-                "root.view.copy_view.d01.s02,root.view,INT32,null,null,VIEW,root.db.d01.s02;",
-                "root.view.copy_view.d02.s01,root.view,INT32,null,null,VIEW,root.db.d02.s01;",
-                "root.view.copy_view.d02.s02,root.view,INT32,null,null,VIEW,root.db.d02.s02;"));
-
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      ResultSet resultSet = statement.executeQuery("SHOW VIEW root.**;");
-      int count = 0;
-      while (resultSet.next()) {
-        String ans =
-            resultSet.getString(ColumnHeaderConstant.TIMESERIES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATABASE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.DATATYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.TAGS)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.ATTRIBUTES)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.VIEW_TYPE)
-                + ","
-                + resultSet.getString(ColumnHeaderConstant.SOURCE)
-                + ";";
-
-        System.out.println("actual result:" + ans);
-        assertTrue(retSet.contains(ans));
-        count++;
-      }
-      assertEquals(retSet.size(), count);
-      resultSet.close();
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail(e.getMessage());
-    }
-  }
-  // endregion
-
-  // region unsupported SQLs
-  @Test
-  public void testUnsupportedSQLs() {
-    for (String unsupportedSQL : unsupportedSQLs) {
-      try (Connection connection = EnvFactory.getEnv().getConnection();
-          Statement statement = connection.createStatement()) {
-        statement.execute(String.format(unsupportedSQL));
-        Assert.fail(String.format("SQL [%s] should fail but no exception thrown.", unsupportedSQL));
-      } catch (SQLException ignored) {
-      }
-    }
-  }
-
-  // endregion
-
-  private static void createSchema() {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-
-      for (String sql : SQLs) {
-        statement.execute(sql);
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBShowDevicesContainedViewIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBShowDevicesContainedViewIT.java
deleted file mode 100644
index b5f51a55cfb..00000000000
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/view/IoTDBShowDevicesContainedViewIT.java
+++ /dev/null
@@ -1,226 +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.it.schema.view;
-
-import org.apache.iotdb.it.env.EnvFactory;
-import org.apache.iotdb.it.framework.IoTDBTestRunner;
-import org.apache.iotdb.itbase.category.ClusterIT;
-import org.apache.iotdb.itbase.category.LocalStandaloneIT;
-
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-@RunWith(IoTDBTestRunner.class)
-@Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBShowDevicesContainedViewIT {
-
-  private static final String showDevicesSQL = "show devices;";
-  private static final String deleteAllTimeSeriesSQL = "delete timeseries root.**;";
-
-  @BeforeClass
-  public static void setUp() throws Exception {
-    EnvFactory.getEnv().initClusterEnvironment();
-  }
-
-  @AfterClass
-  public static void tearDown() throws Exception {
-    EnvFactory.getEnv().cleanClusterEnvironment();
-  }
-
-  private void validateResultSetAndStandard(ResultSet resultSet, Set<String> standard)
-      throws SQLException {
-    ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
-    while (resultSet.next()) {
-      StringBuilder builder = new StringBuilder();
-      for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
-        builder.append(resultSet.getString(i)).append(",");
-      }
-      String string = builder.toString();
-      Assert.assertTrue(standard.contains(string));
-      standard.remove(string);
-    }
-  }
-
-  @Test
-  public void testShowDevicesContainedView01() throws SQLException {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      // step 1. create normal time series and the alignment is true or false
-      String[] sqls =
-          new String[] {
-            "create timeseries root.db.d01.s01 INT32 encoding=RLE;",
-            "create timeseries root.db.d01.s02 INT32 encoding=RLE;",
-            "create aligned timeseries root.db.d02(s01 INT32 encoding=RLE, s02 INT32 encoding=RLE);"
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      Set<String> standard =
-          new HashSet<>(Arrays.asList("root.db.d01,false,", "root.db.d02,true,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 2. create views under these devices and the alignment remain unchanged
-      sqls =
-          new String[] {
-            "create VIEW root.db.d01.s_view AS root.db.d01.s01",
-            "create VIEW root.db.d02.s_view AS root.db.d02.s01",
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard = new HashSet<>(Arrays.asList("root.db.d01,false,", "root.db.d02,true,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 3. create view and auto create device, the alignment of these devices are null
-      sqls =
-          new String[] {
-            "create VIEW root.db.d03.s_view AS root.db.d01.s01",
-            "create VIEW root.db.d04.s_view AS root.db.d01.s01",
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.db.d01,false,",
-                  "root.db.d02,true,",
-                  "root.db.d03,null,",
-                  "root.db.d04,null,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 4. create time series under those devices who just have views, and alignment should be
-      // true or false
-      sqls =
-          new String[] {
-            "create timeseries root.db.d03.s01 INT32 encoding=RLE;",
-            "create aligned timeseries root.db.d04(s01 INT32 encoding=RLE, s02 INT32 encoding=RLE);"
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.db.d01,false,",
-                  "root.db.d02,true,",
-                  "root.db.d03,false,",
-                  "root.db.d04,true,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 5. delete all non-view time series created at last step, and the alignment of devices
-      // should be null
-      sqls =
-          new String[] {
-            "delete timeseries root.db.d03.s01;",
-            "delete timeseries root.db.d04.s01;",
-            "delete timeseries root.db.d04.s02;"
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList(
-                  "root.db.d01,false,",
-                  "root.db.d02,true,",
-                  "root.db.d03,null,",
-                  "root.db.d04,null,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // clean environment
-      statement.execute(deleteAllTimeSeriesSQL);
-    } // end of try
-  }
-
-  @Test
-  public void testShowDevicesContainedView02() throws SQLException {
-    try (Connection connection = EnvFactory.getEnv().getConnection();
-        Statement statement = connection.createStatement()) {
-      // step 1. create normal time series (prepared for views)
-      String[] sqls =
-          new String[] {
-            "create timeseries root.db.d01.s01 INT32 encoding=RLE;",
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      Set<String> standard = new HashSet<>(Collections.singletonList("root.db.d01,false,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 2. create view and auto create device, the alignment of these devices are null
-      sqls =
-          new String[] {
-            "create VIEW root.db.d05.s_view AS root.db.d01.s01",
-            "create VIEW root.db.d06.s_view AS root.db.d01.s01",
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList("root.db.d01,false,", "root.db.d05,null,", "root.db.d06,null,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 3. insert data under those devices who have only views, the alignment should be true
-      // or false
-      sqls =
-          new String[] {
-            "insert into root.db.d05(time,s01) values(1, 36);",
-            "insert into root.db.d06(time,s01) aligned values(1, 36);"
-          };
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList("root.db.d01,false,", "root.db.d05,false,", "root.db.d06,true,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // step 4. delete all auto created timeseries at last step, and the alignment of devices
-      // should be null
-      sqls =
-          new String[] {"delete timeseries root.db.d05.s01;", "delete timeseries root.db.d06.s01;"};
-      for (String sql : sqls) {
-        statement.execute(sql);
-      }
-      standard =
-          new HashSet<>(
-              Arrays.asList("root.db.d01,false,", "root.db.d05,null,", "root.db.d06,null,"));
-      validateResultSetAndStandard(statement.executeQuery(showDevicesSQL), standard);
-
-      // clean environment
-      statement.execute(deleteAllTimeSeriesSQL);
-    } // end of try
-  }
-}
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/MNodeFactory.java b/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/MNodeFactory.java
new file mode 100644
index 00000000000..7da691a05ab
--- /dev/null
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/utils/MNodeFactory.java
@@ -0,0 +1,31 @@
+/*
+ * 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.commons.schema.node.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface MNodeFactory {
+  String env() default "IoTDB";
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
index 2aecd489b52..079de1cfb7b 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
@@ -78,6 +78,7 @@ public class MetadataConstant {
   public static final String SCHEMA_ENGINE_METRIC_NAME = "pbtree";
 
   public static final String DEFAULT_SCHEMA_ENGINE_MODE = "Memory";
+  public static final String DEFAULT_MNODE_FACTORY_ENV = "IoTDB";
 
   public static String getMNodeTypeName(byte type) {
     switch (type) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/config/factory/ConfigMNodeFactory.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/config/factory/ConfigMNodeFactory.java
index a1a7611d087..77b12019fb9 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/config/factory/ConfigMNodeFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/config/factory/ConfigMNodeFactory.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mnode.config.factory;
 
 import org.apache.iotdb.commons.schema.node.info.IMeasurementInfo;
@@ -23,11 +24,13 @@ import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
+import org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.config.IConfigMNode;
 import org.apache.iotdb.db.metadata.mnode.config.impl.ConfigBasicInternalMNode;
 import org.apache.iotdb.db.metadata.mnode.config.impl.ConfigDatabaseMNode;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
+@MNodeFactory
 public class ConfigMNodeFactory implements IMNodeFactory<IConfigMNode> {
   private ConfigMNodeFactory() {}
 
@@ -83,6 +86,6 @@ public class ConfigMNodeFactory implements IMNodeFactory<IConfigMNode> {
   @Override
   public IMeasurementMNode<IConfigMNode> createLogicalViewMNode(
       IDeviceMNode<IConfigMNode> parent, String name, IMeasurementInfo measurementInfo) {
-    throw new UnsupportedOperationException();
+    throw new UnsupportedOperationException("View is not supported.");
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/factory/MemMNodeFactory.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/factory/MemMNodeFactory.java
index 1f4e21f7e15..b11437237ff 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/factory/MemMNodeFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/factory/MemMNodeFactory.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mnode.mem.factory;
 
 import org.apache.iotdb.commons.schema.node.info.IMeasurementInfo;
@@ -23,31 +24,19 @@ import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
+import org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.AboveDatabaseMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.BasicInternalMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.DatabaseDeviceMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.DatabaseMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.DeviceMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.impl.LogicalViewMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.impl.MeasurementMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
+@MNodeFactory
 public class MemMNodeFactory implements IMNodeFactory<IMemMNode> {
 
-  private MemMNodeFactory() {}
-
-  private static class MemMNodeFactoryHolder {
-    private static final MemMNodeFactory INSTANCE = new MemMNodeFactory();
-
-    private MemMNodeFactoryHolder() {}
-  }
-
-  public static MemMNodeFactory getInstance() {
-    return MemMNodeFactory.MemMNodeFactoryHolder.INSTANCE;
-  }
-
   @Override
   public IMeasurementMNode<IMemMNode> createMeasurementMNode(
       IDeviceMNode<IMemMNode> parent, String name, IMeasurementSchema schema, String alias) {
@@ -88,11 +77,6 @@ public class MemMNodeFactory implements IMNodeFactory<IMemMNode> {
   @Override
   public IMeasurementMNode<IMemMNode> createLogicalViewMNode(
       IDeviceMNode<IMemMNode> parent, String name, IMeasurementInfo measurementInfo) {
-    if (measurementInfo instanceof LogicalViewInfo) {
-      return new LogicalViewMNode(
-          parent, name, ((LogicalViewInfo) measurementInfo).getExpression());
-    }
-    throw new UnsupportedOperationException(
-        "createLogicalViewMNode should accept LogicalViewInfo, but got an instance that is not of this type.");
+    throw new UnsupportedOperationException("View is not supported.");
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/impl/LogicalViewMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/impl/LogicalViewMNode.java
deleted file mode 100644
index be179120cf9..00000000000
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/impl/LogicalViewMNode.java
+++ /dev/null
@@ -1,64 +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.metadata.mnode.mem.impl;
-
-import org.apache.iotdb.commons.schema.node.common.AbstractMeasurementMNode;
-import org.apache.iotdb.commons.schema.node.info.IMeasurementInfo;
-import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
-import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
-import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
-import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
-import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.basic.BasicMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.container.MemMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
-
-public class LogicalViewMNode extends AbstractMeasurementMNode<IMemMNode, BasicMNode>
-    implements IMemMNode {
-
-  public LogicalViewMNode(
-      IDeviceMNode<IMemMNode> parent, String name, ViewExpression viewExpression) {
-    super(
-        new BasicMNode(parent == null ? null : parent.getAsMNode(), name),
-        new LogicalViewInfo(new LogicalViewSchema(name, viewExpression)));
-  }
-
-  @Override
-  public IMNodeContainer<IMemMNode> getChildren() {
-    return MemMNodeContainer.emptyMNodeContainer();
-  }
-
-  @Override
-  public IMemMNode getAsMNode() {
-    return this;
-  }
-
-  public void setExpression(ViewExpression expression) {
-    IMeasurementInfo measurementInfo = this.getMeasurementInfo();
-    if (measurementInfo instanceof LogicalViewInfo) {
-      ((LogicalViewInfo) measurementInfo).setExpression(expression);
-    }
-  }
-
-  @Override
-  public final boolean isLogicalView() {
-    return true;
-  }
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/info/LogicalViewInfo.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/info/LogicalViewInfo.java
index 5ed17ff7893..d73a1af1e7e 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/info/LogicalViewInfo.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/mem/info/LogicalViewInfo.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpressionType;
 import org.apache.iotdb.commons.schema.view.viewExpression.leaf.TimeSeriesViewOperand;
-import org.apache.iotdb.db.metadata.mnode.mem.impl.LogicalViewMNode;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
@@ -151,12 +150,9 @@ public class LogicalViewInfo implements IMeasurementInfo {
 
   @Override
   public void moveDataToNewMNode(IMeasurementMNode<?> newMNode) {
-    // TODO: CRTODO: is this ok for a logical view?
-    if (newMNode instanceof LogicalViewMNode) {
-      LogicalViewMNode logicalViewMNode = (LogicalViewMNode) newMNode;
-      logicalViewMNode.setSchema(this.schema);
-      logicalViewMNode.setPreDeleted(preDeleted);
-      logicalViewMNode.setExpression(this.getExpression());
+    if (newMNode.isLogicalView()) {
+      newMNode.setSchema(this.schema);
+      newMNode.setPreDeleted(preDeleted);
     }
     throw new RuntimeException(
         new IllegalArgumentException(
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/schemafile/factory/CacheMNodeFactory.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/schemafile/factory/CacheMNodeFactory.java
index 75b99bdf226..72ae8233db7 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/schemafile/factory/CacheMNodeFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/schemafile/factory/CacheMNodeFactory.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mnode.schemafile.factory;
 
 import org.apache.iotdb.commons.schema.node.info.IMeasurementInfo;
@@ -23,6 +24,7 @@ import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
+import org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.impl.CachedAboveDatabaseMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.impl.CachedBasicInternalMNode;
@@ -32,20 +34,9 @@ import org.apache.iotdb.db.metadata.mnode.schemafile.impl.CachedDeviceMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.impl.CachedMeasurementMNode;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
+@MNodeFactory
 public class CacheMNodeFactory implements IMNodeFactory<ICachedMNode> {
 
-  private CacheMNodeFactory() {}
-
-  private static class CacheMNodeFactoryHolder {
-    private static final CacheMNodeFactory INSTANCE = new CacheMNodeFactory();
-
-    private CacheMNodeFactoryHolder() {}
-  }
-
-  public static CacheMNodeFactory getInstance() {
-    return CacheMNodeFactory.CacheMNodeFactoryHolder.INSTANCE;
-  }
-
   @Override
   public IMeasurementMNode<ICachedMNode> createMeasurementMNode(
       IDeviceMNode<ICachedMNode> parent, String name, IMeasurementSchema schema, String alias) {
@@ -86,6 +77,6 @@ public class CacheMNodeFactory implements IMNodeFactory<ICachedMNode> {
   @Override
   public IMeasurementMNode<ICachedMNode> createLogicalViewMNode(
       IDeviceMNode<ICachedMNode> parent, String name, IMeasurementInfo measurementInfo) {
-    throw new UnsupportedOperationException();
+    throw new UnsupportedOperationException("View is not supported.");
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/utils/MNodeFactoryLoader.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/utils/MNodeFactoryLoader.java
new file mode 100644
index 00000000000..c0be2209a14
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/utils/MNodeFactoryLoader.java
@@ -0,0 +1,143 @@
+/*
+ * 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.metadata.mnode.utils;
+
+import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
+import org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
+import org.apache.iotdb.db.metadata.MetadataConstant;
+import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
+import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
+
+import org.reflections.Reflections;
+import org.reflections.util.ConfigurationBuilder;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@SuppressWarnings({"squid:S6548", "squid:3077"})
+public class MNodeFactoryLoader {
+
+  private final List<String> scanPackages = new ArrayList<>();
+  private String env;
+  private volatile IMNodeFactory<ICachedMNode> cachedMNodeIMNodeFactory;
+  private volatile IMNodeFactory<IMemMNode> memMNodeIMNodeFactory;
+
+  private MNodeFactoryLoader() {
+    addScanPackage("org.apache.iotdb.db.metadata.mnode.mem.factory");
+    addScanPackage("org.apache.iotdb.db.metadata.mnode.schemafile.factory");
+    setEnv(MetadataConstant.DEFAULT_MNODE_FACTORY_ENV);
+  }
+
+  public void addScanPackage(String scanPackage) {
+    scanPackages.add(scanPackage);
+  }
+
+  public void setEnv(String env) {
+    this.env = env;
+  }
+
+  @SuppressWarnings("squid:S3740")
+  public IMNodeFactory<ICachedMNode> getCachedMNodeIMNodeFactory() {
+    if (cachedMNodeIMNodeFactory == null) {
+      synchronized (this) {
+        if (cachedMNodeIMNodeFactory == null) {
+          cachedMNodeIMNodeFactory = loadMNodeFactory(ICachedMNode.class);
+        }
+      }
+    }
+    return cachedMNodeIMNodeFactory;
+  }
+
+  @SuppressWarnings("squid:S3740")
+  public IMNodeFactory<IMemMNode> getMemMNodeIMNodeFactory() {
+    if (memMNodeIMNodeFactory == null) {
+      synchronized (this) {
+        if (memMNodeIMNodeFactory == null) {
+          memMNodeIMNodeFactory = loadMNodeFactory(IMemMNode.class);
+        }
+      }
+    }
+    return memMNodeIMNodeFactory;
+  }
+
+  @SuppressWarnings("squid:S3740")
+  private IMNodeFactory loadMNodeFactory(Class<?> nodeType) {
+    Reflections reflections =
+        new Reflections(
+            new ConfigurationBuilder().forPackages(scanPackages.toArray(new String[0])));
+    Set<Class<?>> nodeFactorySet = reflections.getTypesAnnotatedWith(MNodeFactory.class);
+    for (Class<?> nodeFactory : nodeFactorySet) {
+      if (isGenericMatch(nodeFactory, nodeType) && isEnvMatch(nodeFactory, env)) {
+        try {
+          return (IMNodeFactory) nodeFactory.getDeclaredConstructor().newInstance();
+        } catch (Exception e) {
+          throw new RuntimeException(e);
+        }
+      }
+    }
+    // if no satisfied MNodeFactory in customer env found, use default env
+    for (Class<?> nodeFactory : nodeFactorySet) {
+      if (isGenericMatch(nodeFactory, nodeType)
+          && isEnvMatch(nodeFactory, MetadataConstant.DEFAULT_MNODE_FACTORY_ENV)) {
+        try {
+          return (IMNodeFactory) nodeFactory.getDeclaredConstructor().newInstance();
+        } catch (Exception e) {
+          throw new RuntimeException(e);
+        }
+      }
+    }
+    throw new RuntimeException("No satisfied MNodeFactory found");
+  }
+
+  public boolean isGenericMatch(Class<?> factory, Class<?> targetType) {
+    Type[] interfaces = factory.getGenericInterfaces();
+    for (Type type : interfaces) {
+      if (type instanceof ParameterizedType) {
+        ParameterizedType parameterizedType = (ParameterizedType) type;
+        Type[] typeArguments = parameterizedType.getActualTypeArguments();
+        for (Type typeArgument : typeArguments) {
+          if (typeArgument instanceof Class
+              && targetType.isAssignableFrom((Class<?>) typeArgument)) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  private boolean isEnvMatch(Class<?> factory, String env) {
+    MNodeFactory annotationInfo = factory.getAnnotation(MNodeFactory.class);
+    return annotationInfo.env().equals(env);
+  }
+
+  private static class MNodeFactoryLoaderHolder {
+    private static final MNodeFactoryLoader INSTANCE = new MNodeFactoryLoader();
+
+    private MNodeFactoryLoaderHolder() {}
+  }
+
+  public static MNodeFactoryLoader getInstance() {
+    return MNodeFactoryLoaderHolder.INSTANCE;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
index c02560fba7f..81c65bd3c29 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mtree;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
@@ -39,7 +40,7 @@ import org.apache.iotdb.db.exception.metadata.template.DifferentTemplateExceptio
 import org.apache.iotdb.db.exception.metadata.template.TemplateIsInUseException;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.CachedMTreeStore;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
@@ -115,7 +116,8 @@ public class MTreeBelowSGCachedImpl {
   private volatile ICachedMNode storageGroupMNode;
   private final ICachedMNode rootNode;
   private final Function<IMeasurementMNode<ICachedMNode>, Map<String, String>> tagGetter;
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
   private final int levelOfSG;
   private final CachedSchemaRegionStatistics regionStatistics;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 225eed79580..3b1ca6ab239 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mtree;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
@@ -43,8 +44,8 @@ import org.apache.iotdb.db.exception.metadata.template.TemplateIsInUseException;
 import org.apache.iotdb.db.exception.quota.ExceedQuotaException;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.MemMTreeStore;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
@@ -119,7 +120,8 @@ public class MTreeBelowSGMemoryImpl {
   private volatile IMemMNode storageGroupMNode;
   private final IMemMNode rootNode;
   private final Function<IMeasurementMNode<IMemMNode>, Map<String, String>> tagGetter;
-  private final IMNodeFactory<IMemMNode> nodeFactory = MemMNodeFactory.getInstance();
+  private final IMNodeFactory<IMemMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();
   private final int levelOfSG;
   private final MemSchemaRegionStatistics regionStatistics;
 
@@ -1073,9 +1075,11 @@ public class MTreeBelowSGMemoryImpl {
     IMemMNode deviceParent = checkAndAutoCreateInternalPath(devicePath);
 
     synchronized (this) {
-      IMemMNode device = checkAndAutoCreateDeviceNode(devicePath.getTailNode(), deviceParent);
-
       String leafName = path.getMeasurement();
+      IMeasurementMNode<IMemMNode> measurementMNode =
+          nodeFactory.createLogicalViewMNode(
+              null, leafName, new LogicalViewInfo(new LogicalViewSchema(leafName, viewExpression)));
+      IMemMNode device = checkAndAutoCreateDeviceNode(devicePath.getTailNode(), deviceParent);
 
       // no need to check alias, because logical view has no alias
 
@@ -1106,12 +1110,7 @@ public class MTreeBelowSGMemoryImpl {
         entityMNode.setAligned(null);
       }
 
-      IMeasurementMNode<IMemMNode> measurementMNode =
-          nodeFactory.createLogicalViewMNode(
-              entityMNode,
-              leafName,
-              new LogicalViewInfo(new LogicalViewSchema(leafName, viewExpression)));
-
+      measurementMNode.setParent(entityMNode.getAsMNode());
       store.addChild(entityMNode.getAsMNode(), leafName, measurementMNode.getAsMNode());
 
       return measurementMNode;
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/snapshot/MemMTreeSnapshotUtil.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/snapshot/MemMTreeSnapshotUtil.java
index 8221e858764..3c7be34b998 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/snapshot/MemMTreeSnapshotUtil.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/snapshot/MemMTreeSnapshotUtil.java
@@ -33,8 +33,8 @@ import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.MemMTreeStore;
 import org.apache.iotdb.db.metadata.rescon.MemSchemaRegionStatistics;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -71,7 +71,8 @@ public class MemMTreeSnapshotUtil {
       "Error occurred during deserializing MemMTree.";
 
   private static final byte VERSION = 0;
-  private static final IMNodeFactory<IMemMNode> nodeFactory = MemMNodeFactory.getInstance();
+  private static final IMNodeFactory<IMemMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();;
 
   public static boolean createSnapshot(File snapshotDir, MemMTreeStore store) {
     File snapshotTmp =
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
index 1eb95296bf6..36cc8e44199 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mtree.store;
 
 import org.apache.iotdb.commons.exception.MetadataException;
@@ -30,8 +31,8 @@ import org.apache.iotdb.db.metadata.mnode.mem.estimator.MNodeSizeEstimator;
 import org.apache.iotdb.db.metadata.mnode.mem.iterator.AbstractTraverserIterator;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.iterator.CachedTraverserIterator;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mnode.utils.MNodeUtils;
 import org.apache.iotdb.db.metadata.mtree.store.disk.cache.CacheMemoryManager;
 import org.apache.iotdb.db.metadata.mtree.store.disk.cache.ICacheManager;
@@ -39,7 +40,6 @@ import org.apache.iotdb.db.metadata.mtree.store.disk.memcontrol.MemManager;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISchemaFile;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFile;
 import org.apache.iotdb.db.metadata.rescon.CachedSchemaRegionStatistics;
-import org.apache.iotdb.db.metadata.rescon.DataNodeSchemaQuotaManager;
 import org.apache.iotdb.db.metadata.template.Template;
 
 import org.slf4j.Logger;
@@ -63,9 +63,9 @@ public class CachedMTreeStore implements IMTreeStore<ICachedMNode> {
   private ISchemaFile file;
   private ICachedMNode root;
   private final Runnable flushCallback;
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
   private final CachedSchemaRegionStatistics regionStatistics;
-  private final DataNodeSchemaQuotaManager quotaManager = DataNodeSchemaQuotaManager.getInstance();
   private final StampedWriterPreferredLock lock = new StampedWriterPreferredLock();
 
   public CachedMTreeStore(
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/MemMTreeStore.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/MemMTreeStore.java
index 99c6e671211..020a05ca77d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/MemMTreeStore.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/MemMTreeStore.java
@@ -28,13 +28,12 @@ import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.estimator.MNodeSizeEstimator;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.iterator.AbstractTraverserIterator;
 import org.apache.iotdb.db.metadata.mnode.mem.iterator.MNodeIterator;
 import org.apache.iotdb.db.metadata.mnode.mem.iterator.MemoryTraverserIterator;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mnode.utils.MNodeUtils;
 import org.apache.iotdb.db.metadata.mtree.snapshot.MemMTreeSnapshotUtil;
-import org.apache.iotdb.db.metadata.rescon.DataNodeSchemaQuotaManager;
 import org.apache.iotdb.db.metadata.rescon.MemSchemaRegionStatistics;
 import org.apache.iotdb.db.metadata.template.Template;
 
@@ -47,10 +46,8 @@ import java.util.function.Consumer;
 public class MemMTreeStore implements IMTreeStore<IMemMNode> {
 
   private final MemSchemaRegionStatistics regionStatistics;
-  private final IMNodeFactory<IMemMNode> nodeFactory = MemMNodeFactory.getInstance();
-
-  private final DataNodeSchemaQuotaManager schemaQuotaManager =
-      DataNodeSchemaQuotaManager.getInstance();
+  private final IMNodeFactory<IMemMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();;
 
   private IMemMNode root;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/MockSchemaFile.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/MockSchemaFile.java
index 13ed4aeb29b..dcc8213c3f2 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/MockSchemaFile.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/MockSchemaFile.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.metadata.mtree.store.disk.schemafile;
 
 import org.apache.iotdb.commons.conf.CommonDescriptor;
@@ -26,7 +27,7 @@ import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.CachedMNodeContainer;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 
 import java.io.File;
 import java.io.IOException;
@@ -42,7 +43,8 @@ public class MockSchemaFile implements ISchemaFile {
 
   private PartialPath storageGroupPath;
   private IDatabaseMNode<ICachedMNode> storageGroupMNode;
-  private static final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private static final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   private long fileTail = 0;
   private final Map<Long, Map<String, ICachedMNode>> mockFile = new HashMap<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/RecordUtils.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/RecordUtils.java
index e648c673acf..0d977dc6fb9 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/RecordUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/RecordUtils.java
@@ -25,7 +25,7 @@ import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 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;
@@ -63,7 +63,8 @@ public class RecordUtils {
   private static final byte ENTITY_TYPE = 1;
   private static final byte MEASUREMENT_TYPE = 4;
 
-  private static final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private static final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   public static ByteBuffer node2Buffer(ICachedMNode node) {
     if (node.isMeasurement()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java
index 9e8ec6b8365..36abbe8f6a5 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/schemafile/SchemaFile.java
@@ -29,7 +29,7 @@ import org.apache.iotdb.db.exception.metadata.schemafile.SchemaFileNotExists;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.pagemgr.BTreePageManager;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.pagemgr.IPageManager;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.pagemgr.PageManager;
@@ -77,7 +77,8 @@ public class SchemaFile implements ISchemaFile {
   private File pmtFile;
   private FileChannel channel;
 
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   // todo refactor constructor for schema file in Jan.
   private SchemaFile(
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
index 67b700641e1..a779734cc7d 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MetaUtilsTest.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Pair;
@@ -43,7 +43,8 @@ import static org.junit.Assert.fail;
 
 public class MetaUtilsTest {
 
-  private final IMNodeFactory<IMemMNode> nodeFactory = MemMNodeFactory.getInstance();
+  private final IMNodeFactory<IMemMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();;
 
   @Test
   public void testGetMultiFullPaths() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
index 42fde861adf..35707a7457a 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
@@ -22,7 +22,7 @@ import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
 
 import org.junit.Test;
@@ -35,7 +35,8 @@ import static org.junit.Assert.assertSame;
 
 public class MNodeTest {
 
-  private final IMNodeFactory<IMemMNode> nodeFactory = MemMNodeFactory.getInstance();
+  private final IMNodeFactory<IMemMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();;
 
   @Test
   public void testReplaceChild() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/disk/CachedMNodeContainerTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/disk/CachedMNodeContainerTest.java
index 9312c67d3a8..0bb1d93c59e 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/disk/CachedMNodeContainerTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/disk/CachedMNodeContainerTest.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.metadata.mtree.disk;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.CachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 
 import org.junit.Test;
 
@@ -31,7 +31,8 @@ import java.util.Map;
 
 public class CachedMNodeContainerTest {
 
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Test
   public void testIterator() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/RecordUtilTests.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/RecordUtilTests.java
index 31d6bca7209..86d99aa923c 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/RecordUtilTests.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/RecordUtilTests.java
@@ -22,7 +22,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.RecordUtils;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -42,7 +42,8 @@ import java.util.Map;
 
 public class RecordUtilTests {
 
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileLogTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileLogTest.java
index ea96e0780c5..72175f80aed 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileLogTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileLogTest.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISchemaPage;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFile;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFileConfig;
@@ -52,7 +52,8 @@ import static org.junit.Assert.fail;
 public class SchemaFileLogTest {
 
   private static final int TEST_SCHEMA_REGION_ID = 0;
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
index 3e05306f12e..8d382f51531 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
@@ -27,7 +27,7 @@ import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.container.ICachedMNodeContainer;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mnode.utils.MNodeUtils;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISchemaFile;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.RecordUtils;
@@ -62,7 +62,8 @@ import java.util.stream.Collectors;
 public class SchemaFileTest {
 
   private static final int TEST_SCHEMA_REGION_ID = 0;
-  private static final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private static final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaPageTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaPageTest.java
index 0294ab5f53d..f23209c1fe8 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaPageTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaPageTest.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.metadata.mtree.schemafile;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISchemaPage;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.RecordUtils;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFileConfig;
@@ -41,7 +41,8 @@ import java.nio.ByteBuffer;
 
 public class SchemaPageTest {
 
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/WrappedSegmentTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/WrappedSegmentTest.java
index f404428fe19..124b72ce60a 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/WrappedSegmentTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/WrappedSegmentTest.java
@@ -22,7 +22,7 @@ import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISegment;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.RecordUtils;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFileConfig;
@@ -42,7 +42,8 @@ import java.nio.ByteBuffer;
 
 public class WrappedSegmentTest {
 
-  private static final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private static final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaStatisticsTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaStatisticsTest.java
index 38e3de3f680..e1a26c8490c 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaStatisticsTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaStatisticsTest.java
@@ -23,8 +23,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
-import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.plan.schemaregion.impl.write.SchemaRegionWritePlanFactory;
 import org.apache.iotdb.db.metadata.rescon.CachedSchemaEngineStatistics;
 import org.apache.iotdb.db.metadata.rescon.CachedSchemaRegionStatistics;
@@ -77,7 +76,7 @@ public class SchemaStatisticsTest extends AbstractSchemaRegionTest {
     if (testParams.getTestModeName().equals("SchemaFile-PartialMemory")
         || testParams.getTestModeName().equals("SchemaFile-NonMemory")) {
 
-      IMNodeFactory<?> nodeFactory = CacheMNodeFactory.getInstance();
+      IMNodeFactory<?> nodeFactory = MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
       // wait release and flush task
       Thread.sleep(1000);
       // schemaRegion1
@@ -98,8 +97,8 @@ public class SchemaStatisticsTest extends AbstractSchemaRegionTest {
     } else {
       IMNodeFactory nodeFactory =
           testParams.getSchemaEngineMode().equals("Memory")
-              ? MemMNodeFactory.getInstance()
-              : CacheMNodeFactory.getInstance();
+              ? MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory()
+              : MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
       // schemaRegion1
       IMNode<?> sg1 =
           nodeFactory.createDatabaseDeviceMNode(
diff --git a/server/src/test/java/org/apache/iotdb/db/tools/PBTreeFileSketchTest.java b/server/src/test/java/org/apache/iotdb/db/tools/PBTreeFileSketchTest.java
index c54a52b9e01..a4846e664c0 100644
--- a/server/src/test/java/org/apache/iotdb/db/tools/PBTreeFileSketchTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/tools/PBTreeFileSketchTest.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
-import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
+import org.apache.iotdb.db.metadata.mnode.utils.MNodeFactoryLoader;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.ISchemaFile;
 import org.apache.iotdb.db.metadata.mtree.store.disk.schemafile.SchemaFile;
 import org.apache.iotdb.db.metadata.schemaregion.SchemaEngineMode;
@@ -51,7 +51,8 @@ import java.util.Queue;
 
 public class PBTreeFileSketchTest {
 
-  private final IMNodeFactory<ICachedMNode> nodeFactory = CacheMNodeFactory.getInstance();
+  private final IMNodeFactory<ICachedMNode> nodeFactory =
+      MNodeFactoryLoader.getInstance().getCachedMNodeIMNodeFactory();
 
   @Before
   public void setUp() {