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

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


The following commit(s) were added to refs/heads/master by this push:
     new 516bf65  [IOTDB-1361] Support delete an aligned timeseries (#4166)
516bf65 is described below

commit 516bf6588d18a58deb2088524cd042f1e938cc64
Author: Marcos_Zyk <[email protected]>
AuthorDate: Wed Oct 20 17:24:48 2021 +0800

    [IOTDB-1361] Support delete an aligned timeseries (#4166)
---
 .../apache/iotdb/cluster/metadata/CMManager.java   | 18 ++---
 .../iotdb/cluster/query/LocalQueryExecutor.java    |  3 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java | 16 +----
 .../iotdb/db/engine/merge/recover/LogAnalyzer.java |  2 +-
 .../org/apache/iotdb/db/metadata/MManager.java     | 79 ++++++++++-----------
 .../org/apache/iotdb/db/metadata/PartialPath.java  | 18 ++++-
 .../iotdb/db/metadata/mnode/IEntityMNode.java      | 19 -----
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |  4 +-
 .../iotdb/db/metadata/mnode/InternalMNode.java     | 13 ----
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  | 10 +++
 .../mnode/{IEntityMNode.java => MNodeUtils.java}   | 58 +++++++++-------
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |  5 --
 .../org/apache/iotdb/db/metadata/mtree/MTree.java  | 80 ++++++++++++++--------
 .../apache/iotdb/db/metadata/utils/MetaUtils.java  | 11 ---
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  9 +--
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |  2 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |  2 +-
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java |  2 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  2 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    | 12 ++--
 .../iotdb/db/metadata/MManagerBasicTest.java       | 40 ++++++++---
 .../org/apache/iotdb/db/metadata/MTreeTest.java    | 18 ++---
 .../apache/iotdb/db/metadata/PartialPathTest.java  |  7 ++
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |  3 +-
 24 files changed, 232 insertions(+), 201 deletions(-)

diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
index f28308d..bca7810 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
@@ -171,11 +171,11 @@ public class CMManager extends MManager {
   }
 
   @Override
-  public String deleteTimeseries(PartialPath prefixPath) throws 
MetadataException {
+  public String deleteTimeseries(PartialPath pathPattern) throws 
MetadataException {
     cacheLock.writeLock().lock();
-    mRemoteMetaCache.removeItem(prefixPath);
+    mRemoteMetaCache.removeItem(pathPattern);
     cacheLock.writeLock().unlock();
-    return super.deleteTimeseries(prefixPath);
+    return super.deleteTimeseries(pathPattern);
   }
 
   @Override
@@ -751,7 +751,7 @@ public class CMManager extends MManager {
       throws IllegalPathException {
     List<String> measurements = new ArrayList<>();
     for (String series : seriesList) {
-      measurements.addAll(MetaUtils.getMeasurementsInPartialPath(new 
PartialPath(series)));
+      measurements.add((new PartialPath(series)).getMeasurement());
     }
 
     List<TSDataType> dataTypes = new ArrayList<>(measurements.size());
@@ -1019,9 +1019,9 @@ public class CMManager extends MManager {
   private List<PartialPath> getMatchedPathsLocally(PartialPath partialPath, 
boolean withAlias)
       throws MetadataException {
     if (!withAlias) {
-      return getAllTimeseriesPath(partialPath);
+      return getFlatMeasurementPaths(partialPath);
     } else {
-      return super.getAllTimeseriesPathWithAlias(partialPath, -1, -1).left;
+      return super.getFlatMeasurementPathsWithAlias(partialPath, -1, -1).left;
     }
   }
 
@@ -1222,7 +1222,7 @@ public class CMManager extends MManager {
 
   /** Similar to method getAllTimeseriesPath(), but return Path with alias 
alias. */
   @Override
-  public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+  public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
       PartialPath pathPattern, int limit, int offset) throws MetadataException 
{
     Map<String, String> sgPathMap = groupPathByStorageGroup(pathPattern);
     List<PartialPath> result = getMatchedPaths(sgPathMap, true);
@@ -1305,7 +1305,7 @@ public class CMManager extends MManager {
   public List<String> getAllPaths(List<String> paths) throws MetadataException 
{
     List<String> ret = new ArrayList<>();
     for (String path : paths) {
-      getAllTimeseriesPath(new PartialPath(path)).stream()
+      getFlatMeasurementPaths(new PartialPath(path)).stream()
           .map(PartialPath::getFullPath)
           .forEach(ret::add);
     }
@@ -1721,7 +1721,7 @@ public class CMManager extends MManager {
     if (withAlias) {
       for (String path : paths) {
         List<PartialPath> allTimeseriesPathWithAlias =
-            super.getAllTimeseriesPathWithAlias(new PartialPath(path), -1, 
-1).left;
+            super.getFlatMeasurementPathsWithAlias(new PartialPath(path), -1, 
-1).left;
         for (PartialPath timeseriesPathWithAlias : allTimeseriesPathWithAlias) 
{
           retPaths.add(timeseriesPathWithAlias.getFullPath());
           alias.add(timeseriesPathWithAlias.getMeasurementAlias());
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
index 571d1c3..7300827 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/LocalQueryExecutor.java
@@ -778,7 +778,8 @@ public class LocalQueryExecutor {
     List<String> result = new ArrayList<>();
     for (String seriesPath : timeseriesList) {
       try {
-        List<PartialPath> path = getCMManager().getAllTimeseriesPath(new 
PartialPath(seriesPath));
+        List<PartialPath> path =
+            getCMManager().getFlatMeasurementPaths(new 
PartialPath(seriesPath));
         if (path.size() != 1) {
           throw new MetadataException(
               String.format("Timeseries number of the name [%s] is not 1.", 
seriesPath));
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index 58501a9..cbbf421 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.exception.WriteProcessException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
-import org.apache.iotdb.db.metadata.utils.MetaUtils;
 import org.apache.iotdb.db.qp.physical.crud.InsertRowPlan;
 import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
 import org.apache.iotdb.db.rescon.TVListAllocator;
@@ -365,26 +364,17 @@ public abstract class AbstractMemTable implements 
IMemTable {
     while (iter.hasNext()) {
       Entry<String, IWritableMemChunk> entry = iter.next();
       IWritableMemChunk chunk = entry.getValue();
+      // the key is measurement rather than component of multiMeasurement
       PartialPath fullPath = devicePath.concatNode(entry.getKey());
-      IMeasurementSchema schema = chunk.getSchema();
       if (originalPath.matchFullPath(fullPath)) {
+        // matchFullPath ensures this branch could work on delete data of 
unary or multi measurement
+        // and delete timeseries or aligned timeseries
         if (startTimestamp == Long.MIN_VALUE && endTimestamp == 
Long.MAX_VALUE) {
           iter.remove();
         }
         int deletedPointsNumber = chunk.delete(startTimestamp, endTimestamp);
         totalPointsNum -= deletedPointsNumber;
       }
-      // for vector type
-      else if (schema.getType() == TSDataType.VECTOR) {
-        List<String> measurements = 
MetaUtils.getMeasurementsInPartialPath(originalPath);
-        if (measurements.containsAll(schema.getSubMeasurementsList())) {
-          if (startTimestamp == Long.MIN_VALUE && endTimestamp == 
Long.MAX_VALUE) {
-            iter.remove();
-          }
-          int deletedPointsNumber = chunk.delete(startTimestamp, endTimestamp);
-          totalPointsNum -= deletedPointsNumber;
-        }
-      }
     }
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
index 9693d3c..61cea2d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/merge/recover/LogAnalyzer.java
@@ -103,7 +103,7 @@ public class LogAnalyzer {
         analyzeUnseqFiles(bufferedReader);
 
         List<PartialPath> storageGroupPaths =
-            IoTDB.metaManager.getAllTimeseriesPath(new 
PartialPath(storageGroupName + ".*"));
+            IoTDB.metaManager.getFlatMeasurementPaths(new 
PartialPath(storageGroupName + ".*"));
         unmergedPaths = new ArrayList<>();
         unmergedPaths.addAll(storageGroupPaths);
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index bc9e520..153fcbf 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
 import org.apache.iotdb.db.engine.trigger.executor.TriggerEngine;
 import org.apache.iotdb.db.exception.metadata.AliasAlreadyExistException;
-import org.apache.iotdb.db.exception.metadata.AlignedTimeseriesException;
 import org.apache.iotdb.db.exception.metadata.DataTypeMismatchException;
 import org.apache.iotdb.db.exception.metadata.DeleteFailedException;
 import org.apache.iotdb.db.exception.metadata.MNodeTypeMismatchException;
@@ -619,36 +618,23 @@ public class MManager {
   }
 
   /**
-   * Delete all timeseries matching the given path pattern, may cross 
different storage group
+   * Delete all timeseries matching the given path pattern, may cross 
different storage group The
+   * given pathPattern only match measurement but not flat measurement. For 
example, given MTree:
+   * root.sg.d.vector(s1, s2), root.sg.d.s2; give pathPattern root.**.s2 and 
then only root.sg.d.s2
+   * will be deleted; give pathPattern like root.sg.d.* or root.sg.d.vector 
and then the deletion
+   * will work on root.sg.d.vector(s1, s2)
    *
-   * @param prefixPath path to be deleted, could be root or a prefix path or a 
full path
+   * @param pathPattern path to be deleted
    * @return deletion failed Timeseries
    */
-  public String deleteTimeseries(PartialPath prefixPath) throws 
MetadataException {
-    if (isStorageGroup(prefixPath)) {
-      mNodeCache.clear();
-    }
+  public String deleteTimeseries(PartialPath pathPattern) throws 
MetadataException {
     try {
-      List<PartialPath> allTimeseries = mtree.getAllTimeseriesPath(prefixPath);
+      List<PartialPath> allTimeseries = mtree.getMeasurementPaths(pathPattern);
       if (allTimeseries.isEmpty()) {
-        throw new PathNotExistException(prefixPath.getFullPath());
-      }
-
-      // for not support deleting part of aligned timeseies
-      // should be removed after partial deletion is supported
-      IMNode lastNode = mtree.getNodeByPath(allTimeseries.get(0));
-      if (lastNode.isMeasurement()) {
-        IMeasurementMNode measurementMNode = lastNode.getAsMeasurementMNode();
-        if (measurementMNode.isMultiMeasurement()) {
-          if 
(measurementMNode.getAsMultiMeasurementMNode().getSubMeasurementList().size()
-              != allTimeseries.size()) {
-            throw new AlignedTimeseriesException(
-                "Not support deleting part of aligned timeseies!", 
prefixPath.getFullPath());
-          } else {
-            allTimeseries.clear();
-            allTimeseries.add(lastNode.getPartialPath());
-          }
-        }
+        throw new MetadataException(
+            String.format(
+                "No matched timeseries or aligned timeseries for Path [%s]",
+                pathPattern.getFullPath()));
       }
 
       // Monitor storage group seriesPath is not allowed to be deleted
@@ -705,8 +691,17 @@ public class MManager {
     // drop trigger with no exceptions
     TriggerEngine.drop(pair.right);
 
-    // TODO: delete the path node and all its ancestors
-    mNodeCache.clear();
+    IMNode node = measurementMNode.getParent();
+
+    if (node.isUseTemplate() && 
node.getSchemaTemplate().hasSchema(measurementMNode.getName())) {
+      // measurement represent by template doesn't affect the MTree structure 
and memory control
+      return storageGroupPath;
+    }
+
+    while (node.isEmptyInternal()) {
+      mNodeCache.removeObject(node.getPartialPath());
+      node = node.getParent();
+    }
     totalSeriesNumber.addAndGet(-timeseriesNum);
     if (!allowToCreateNewSeries
         && totalSeriesNumber.get() * ESTIMATED_SERIES_SIZE < 
MTREE_SIZE_THRESHOLD) {
@@ -1111,22 +1106,24 @@ public class MManager {
   }
 
   /**
-   * Return all paths for given path if the path is abstract. Or return the 
path itself. Regular
-   * expression in this method is formed by the amalgamation of seriesPath and 
the character '*'.
+   * Return all flat measurement paths for given path if the path is abstract. 
Or return the path
+   * itself. Regular expression in this method is formed by the amalgamation 
of seriesPath and the
+   * character '*'.
    *
    * @param pathPattern can be a pattern or a full path of timeseries.
    */
-  public List<PartialPath> getAllTimeseriesPath(PartialPath pathPattern) 
throws MetadataException {
-    return mtree.getAllTimeseriesPath(pathPattern);
+  public List<PartialPath> getFlatMeasurementPaths(PartialPath pathPattern)
+      throws MetadataException {
+    return mtree.getFlatMeasurementPaths(pathPattern);
   }
 
   /**
    * Similar to method getAllTimeseriesPath(), but return Path with alias and 
filter the result by
    * limit and offset.
    */
-  public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+  public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
       PartialPath pathPattern, int limit, int offset) throws MetadataException 
{
-    return mtree.getAllTimeseriesPathWithAlias(pathPattern, limit, offset);
+    return mtree.getFlatMeasurementPathsWithAlias(pathPattern, limit, offset);
   }
 
   public List<ShowTimeSeriesResult> showTimeseries(ShowTimeSeriesPlan plan, 
QueryContext context)
@@ -1194,9 +1191,9 @@ public class MManager {
       ShowTimeSeriesPlan plan, QueryContext context) throws MetadataException {
     List<Pair<PartialPath, String[]>> ans;
     if (plan.isOrderByHeat()) {
-      ans = mtree.getAllMeasurementSchemaByHeatOrder(plan, context);
+      ans = mtree.getAllFlatMeasurementSchemaByHeatOrder(plan, context);
     } else {
-      ans = mtree.getAllMeasurementSchema(plan);
+      ans = mtree.getAllFlatMeasurementSchema(plan);
     }
     List<ShowTimeSeriesResult> res = new LinkedList<>();
     for (Pair<PartialPath, String[]> ansString : ans) {
@@ -1276,7 +1273,7 @@ public class MManager {
    * @return MeasurementSchema or VectorMeasurementSchema
    */
   public IMeasurementSchema getSeriesSchema(PartialPath fullPath) throws 
MetadataException {
-    IMeasurementMNode leaf = mtree.getMeasurementMNode(fullPath);
+    IMeasurementMNode leaf = getMeasurementMNode(fullPath);
     return getSeriesSchema(fullPath, leaf);
   }
 
@@ -1375,7 +1372,7 @@ public class MManager {
     IMeasurementMNode[] mNodes = new IMeasurementMNode[measurements.length];
     for (int i = 0; i < mNodes.length; i++) {
       try {
-        mNodes[i] = 
mtree.getMeasurementMNode(deviceId.concatNode(measurements[i]));
+        mNodes[i] = getMeasurementMNode(deviceId.concatNode(measurements[i]));
       } catch (PathNotExistException | MNodeTypeMismatchException ignored) {
         logger.warn("MeasurementMNode {} does not exist in {}", 
measurements[i], deviceId);
       }
@@ -1698,7 +1695,7 @@ public class MManager {
       Long latestFlushedTime) {
     IMeasurementMNode node;
     try {
-      node = mtree.getMeasurementMNode(seriesPath);
+      node = getMeasurementMNode(seriesPath);
     } catch (MetadataException e) {
       logger.warn("failed to update last cache for the {}, err:{}", 
seriesPath, e.getMessage());
       return;
@@ -1768,7 +1765,7 @@ public class MManager {
   public TimeValuePair getLastCache(PartialPath seriesPath) {
     IMeasurementMNode node;
     try {
-      node = mtree.getMeasurementMNode(seriesPath);
+      node = getMeasurementMNode(seriesPath);
     } catch (MetadataException e) {
       logger.warn("failed to get last cache for the {}, err:{}", seriesPath, 
e.getMessage());
       return null;
@@ -1814,7 +1811,7 @@ public class MManager {
   public void resetLastCache(PartialPath seriesPath) {
     IMeasurementMNode node;
     try {
-      node = mtree.getMeasurementMNode(seriesPath);
+      node = getMeasurementMNode(seriesPath);
     } catch (MetadataException e) {
       logger.warn("failed to reset last cache for the {}, err:{}", seriesPath, 
e.getMessage());
       return;
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
index 04f6abc..c052161 100755
--- a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
@@ -128,14 +128,26 @@ public class PartialPath extends Path implements 
Comparable<Path> {
   }
 
   /**
-   * Construct a new PartialPath by resetting the prefix nodes to prefixPath
+   * Construct a new PartialPath by resetting the prefix nodes with 
prefixPath. If the prefix nodes
+   * contains **, then the prefixPath will be set before **. For example, give 
this = root.**.d and
+   * prefixPath = root.a.sg, then the result will be root.a.sg.**.d
    *
    * @param prefixPath the prefix path used to replace current nodes
    * @return A new PartialPath with altered prefix
    */
   public PartialPath alterPrefixPath(PartialPath prefixPath) {
-    String[] newNodes = Arrays.copyOf(nodes, Math.max(nodes.length, 
prefixPath.getNodeLength()));
-    System.arraycopy(prefixPath.getNodes(), 0, newNodes, 0, 
prefixPath.getNodeLength());
+    int newLength = Math.max(nodes.length, prefixPath.getNodeLength());
+    int startIndex = Math.min(nodes.length, prefixPath.getNodeLength());
+    for (int i = 0; i < startIndex; i++) {
+      if (nodes[i].equals(MULTI_LEVEL_PATH_WILDCARD)) {
+        newLength += startIndex - i;
+        startIndex = i;
+        break;
+      }
+    }
+    String[] newNodes = Arrays.copyOf(prefixPath.getNodes(), newLength);
+    System.arraycopy(
+        nodes, startIndex, newNodes, prefixPath.getNodeLength(), nodes.length 
- startIndex);
     return new PartialPath(newNodes);
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
index dc23d7b..a77abe62 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
@@ -39,23 +39,4 @@ public interface IEntityMNode extends IMNode {
   ILastCacheContainer getLastCacheContainer(String measurementId);
 
   Map<String, ILastCacheContainer> getTemplateLastCaches();
-
-  static IEntityMNode setToEntity(IMNode node) {
-    IEntityMNode entityMNode;
-    if (node.isEntity()) {
-      entityMNode = node.getAsEntityMNode();
-    } else {
-      if (node.isStorageGroup()) {
-        entityMNode =
-            new StorageGroupEntityMNode(
-                node.getParent(), node.getName(), ((StorageGroupMNode) 
node).getDataTTL());
-      } else {
-        entityMNode = new EntityMNode(node.getParent(), node.getName());
-      }
-      if (node.getParent() != null) {
-        node.getParent().replaceChild(node.getName(), entityMNode);
-      }
-    }
-    return entityMNode;
-  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 9b0c3f2..dbbd02a 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -67,7 +67,9 @@ public interface IMNode extends Serializable {
 
   void setSchemaTemplate(Template schemaTemplate);
 
-  int getMeasurementMNodeCount();
+  // EmptyInternal means there's no child or template under this node
+  // and this node is not the root nor a storageGroup nor a measurement.
+  boolean isEmptyInternal();
 
   boolean isStorageGroup();
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index c6585cf..4a07b53 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -212,19 +212,6 @@ public class InternalMNode extends MNode {
     this.schemaTemplate = schemaTemplate;
   }
 
-  /** get the count of all MeasurementMNode whose ancestor is current node */
-  @Override
-  public int getMeasurementMNodeCount() {
-    if (children == null) {
-      return 0;
-    }
-    int measurementMNodeCount = 0;
-    for (IMNode child : children.values()) {
-      measurementMNodeCount += child.getMeasurementMNodeCount();
-    }
-    return measurementMNodeCount;
-  }
-
   @Override
   public void serializeTo(MLogWriter logWriter) throws IOException {
     serializeChildren(logWriter);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
index bf0240f..9f6e075 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
@@ -122,6 +122,16 @@ public abstract class MNode implements IMNode {
   }
 
   @Override
+  public boolean isEmptyInternal() {
+    return !IoTDBConstant.PATH_ROOT.equals(name)
+        && !isStorageGroup()
+        && !isMeasurement()
+        && getSchemaTemplate() == null
+        && !isUseTemplate()
+        && getChildren().size() == 0;
+  }
+
+  @Override
   public boolean isUseTemplate() {
     return false;
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
similarity index 50%
copy from 
server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
copy to server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
index dc23d7b..0e41f28 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeUtils.java
@@ -18,29 +18,17 @@
  */
 package org.apache.iotdb.db.metadata.mnode;
 
-import org.apache.iotdb.db.metadata.lastCache.container.ILastCacheContainer;
+public class MNodeUtils {
 
-import java.util.Map;
-
-public interface IEntityMNode extends IMNode {
-
-  boolean addAlias(String alias, IMeasurementMNode child);
-
-  void deleteAliasChild(String alias);
-
-  Map<String, IMeasurementMNode> getAliasChildren();
-
-  void setAliasChildren(Map<String, IMeasurementMNode> aliasChildren);
-
-  boolean isUseTemplate();
-
-  void setUseTemplate(boolean useTemplate);
-
-  ILastCacheContainer getLastCacheContainer(String measurementId);
-
-  Map<String, ILastCacheContainer> getTemplateLastCaches();
-
-  static IEntityMNode setToEntity(IMNode node) {
+  /**
+   * When a measurement, represented by template or MeasurementMNode, is going 
to be added to a
+   * node, the node should be set to entity. Before invoking this method, lock 
the related MTree
+   * part first.
+   *
+   * @param node node to be transformed
+   * @return generated entityMNode
+   */
+  public static IEntityMNode setToEntity(IMNode node) {
     IEntityMNode entityMNode;
     if (node.isEntity()) {
       entityMNode = node.getAsEntityMNode();
@@ -48,7 +36,7 @@ public interface IEntityMNode extends IMNode {
       if (node.isStorageGroup()) {
         entityMNode =
             new StorageGroupEntityMNode(
-                node.getParent(), node.getName(), ((StorageGroupMNode) 
node).getDataTTL());
+                node.getParent(), node.getName(), 
node.getAsStorageGroupMNode().getDataTTL());
       } else {
         entityMNode = new EntityMNode(node.getParent(), node.getName());
       }
@@ -58,4 +46,28 @@ public interface IEntityMNode extends IMNode {
     }
     return entityMNode;
   }
+
+  /**
+   * When there's no measurement, represented by template or MeasurementMNode, 
is under this
+   * entityMNode, it should not act as entity anymore. Before invoking this 
method, lock related
+   * MTree structure first.
+   *
+   * @param entityMNode node to be transformed
+   * @return generated NoEntity node
+   */
+  public static IMNode setToInternal(IEntityMNode entityMNode) {
+    IMNode node;
+    IMNode parent = entityMNode.getParent();
+    if (entityMNode.isStorageGroup()) {
+      node =
+          new StorageGroupMNode(
+              parent, entityMNode.getName(), 
entityMNode.getAsStorageGroupMNode().getDataTTL());
+    } else {
+      node = new InternalMNode(parent, entityMNode.getName());
+    }
+    if (parent != null) {
+      parent.replaceChild(entityMNode.getName(), node);
+    }
+    return node;
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index 2d96a40..e094a34 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -87,11 +87,6 @@ public abstract class MeasurementMNode extends MNode 
implements IMeasurementMNod
   public abstract IMeasurementSchema getSchema();
 
   @Override
-  public int getMeasurementMNodeCount() {
-    return 1;
-  }
-
-  @Override
   public abstract int getMeasurementCount();
 
   /**
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
index b48dc47..219b27d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTree.java
@@ -34,13 +34,7 @@ import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.metadata.logfile.MLogReader;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
-import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
-import org.apache.iotdb.db.metadata.mnode.IMNode;
-import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
-import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
-import org.apache.iotdb.db.metadata.mnode.InternalMNode;
-import org.apache.iotdb.db.metadata.mnode.MeasurementMNode;
-import org.apache.iotdb.db.metadata.mnode.StorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.*;
 import org.apache.iotdb.db.metadata.mtree.traverser.PathGrouperByStorageGroup;
 import 
org.apache.iotdb.db.metadata.mtree.traverser.collector.BelongedEntityPathCollector;
 import 
org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityPathCollector;
@@ -259,7 +253,7 @@ public class MTree implements Serializable {
             childrenMap.put(child.getName(), child);
             if (child.isMeasurement()) {
               if (!node.isEntity()) {
-                node = IEntityMNode.setToEntity(node);
+                node = MNodeUtils.setToEntity(node);
               }
               String alias = child.getAsMeasurementMNode().getAlias();
               if (alias != null) {
@@ -392,7 +386,7 @@ public class MTree implements Serializable {
         throw new AliasAlreadyExistException(path.getFullPath(), alias);
       }
 
-      IEntityMNode entityMNode = IEntityMNode.setToEntity(cur);
+      IEntityMNode entityMNode = MNodeUtils.setToEntity(cur);
 
       IMeasurementMNode measurementMNode =
           MeasurementMNode.getMeasurementMNode(
@@ -465,7 +459,7 @@ public class MTree implements Serializable {
         throw new PathAlreadyExistException(devicePath.getFullPath() + "." + 
leafName);
       }
 
-      IEntityMNode entityMNode = IEntityMNode.setToEntity(cur);
+      IEntityMNode entityMNode = MNodeUtils.setToEntity(cur);
 
       int measurementsSize = measurements.size();
 
@@ -498,17 +492,30 @@ public class MTree implements Serializable {
     }
 
     IMeasurementMNode deletedNode = getMeasurementMNode(path);
-    IMNode curNode = deletedNode;
+    IEntityMNode parent = deletedNode.getParent();
     // delete the last node of path
-    curNode.getParent().deleteChild(path.getMeasurement());
+    parent.deleteChild(path.getMeasurement());
     if (deletedNode.getAlias() != null) {
-      
deletedNode.getParent().deleteAliasChild((curNode.getAsMeasurementMNode().getAlias()));
+      parent.deleteAliasChild((deletedNode.getAlias()));
     }
-    curNode = curNode.getParent();
+    IMNode curNode = parent;
+    if (!parent.isUseTemplate()) {
+      boolean hasMeasurement = false;
+      for (IMNode child : parent.getChildren().values()) {
+        if (child.isMeasurement()) {
+          hasMeasurement = true;
+          break;
+        }
+      }
+      if (!hasMeasurement) {
+        synchronized (this) {
+          curNode = MNodeUtils.setToInternal(parent);
+        }
+      }
+    }
+
     // delete all empty ancestors except storage group and MeasurementMNode
-    while (!IoTDBConstant.PATH_ROOT.equals(curNode.getName())
-        && !(curNode.isUseTemplate())
-        && curNode.getChildren().size() == 0) {
+    while (curNode.isEmptyInternal()) {
       // if current storage group has no time series, return the storage group 
name
       if (curNode.isStorageGroup()) {
         return new Pair<>(curNode.getPartialPath(), deletedNode);
@@ -562,7 +569,7 @@ public class MTree implements Serializable {
     // synchronize check and replace, we need replaceChild become atomic 
operation
     // only write on mtree will be synchronized
     synchronized (this) {
-      return IEntityMNode.setToEntity(node);
+      return MNodeUtils.setToEntity(node);
     }
   }
   // endregion
@@ -869,22 +876,41 @@ public class MTree implements Serializable {
   }
 
   /**
-   * Get all timeseries matching the given path pattern
+   * Get all measurement paths matching the given path pattern
+   *
+   * @param pathPattern a path pattern or a full path, may contain wildcard.
+   */
+  public List<PartialPath> getMeasurementPaths(PartialPath pathPattern) throws 
MetadataException {
+    MeasurementCollector<List<PartialPath>> collector =
+        new MeasurementCollector<List<PartialPath>>(root, pathPattern) {
+          @Override
+          protected void collectMeasurement(IMeasurementMNode node) {
+            resultSet.add(node.getPartialPath());
+          }
+        };
+    collector.setResultSet(new LinkedList<>());
+    collector.traverse();
+    return collector.getResult();
+  }
+
+  /**
+   * Get all flat measurement paths matching the given path pattern
    *
    * @param pathPattern a path pattern or a full path, may contain wildcard.
    */
-  public List<PartialPath> getAllTimeseriesPath(PartialPath pathPattern) 
throws MetadataException {
-    return getAllTimeseriesPathWithAlias(pathPattern, 0, 0).left;
+  public List<PartialPath> getFlatMeasurementPaths(PartialPath pathPattern)
+      throws MetadataException {
+    return getFlatMeasurementPathsWithAlias(pathPattern, 0, 0).left;
   }
 
   /**
-   * Get all timeseries paths matching the given path pattern
+   * Get all flat measurement paths matching the given path pattern
    *
    * @param pathPattern a path pattern or a full path, may contain wildcard
    * @return Pair.left contains all the satisfied paths Pair.right means the 
current offset or zero
    *     if we don't set offset.
    */
-  public Pair<List<PartialPath>, Integer> getAllTimeseriesPathWithAlias(
+  public Pair<List<PartialPath>, Integer> getFlatMeasurementPathsWithAlias(
       PartialPath pathPattern, int limit, int offset) throws MetadataException 
{
     FlatMeasurementPathCollector collector =
         new FlatMeasurementPathCollector(root, pathPattern, limit, offset);
@@ -895,11 +921,11 @@ public class MTree implements Serializable {
   }
 
   /**
-   * Get all time series schema matching the given path pattern order by 
insert frequency
+   * Get all flat measurement schema matching the given path pattern order by 
insert frequency
    *
    * <p>result: [name, alias, storage group, dataType, encoding, compression, 
offset]
    */
-  public List<Pair<PartialPath, String[]>> getAllMeasurementSchemaByHeatOrder(
+  public List<Pair<PartialPath, String[]>> 
getAllFlatMeasurementSchemaByHeatOrder(
       ShowTimeSeriesPlan plan, QueryContext queryContext) throws 
MetadataException {
     FlatMeasurementSchemaCollector collector =
         new FlatMeasurementSchemaCollector(root, plan.getPath());
@@ -925,11 +951,11 @@ public class MTree implements Serializable {
   }
 
   /**
-   * Get all time series schema matching the given path pattern
+   * Get all flat measurement schema matching the given path pattern
    *
    * <p>result: [name, alias, storage group, dataType, encoding, compression, 
offset]
    */
-  public List<Pair<PartialPath, String[]>> 
getAllMeasurementSchema(ShowTimeSeriesPlan plan)
+  public List<Pair<PartialPath, String[]>> 
getAllFlatMeasurementSchema(ShowTimeSeriesPlan plan)
       throws MetadataException {
     FlatMeasurementSchemaCollector collector =
         new FlatMeasurementSchemaCollector(root, plan.getPath(), 
plan.getLimit(), plan.getOffset());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
index af39a0f..47b4062 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/utils/MetaUtils.java
@@ -26,7 +26,6 @@ import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.utils.TestOnly;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -105,16 +104,6 @@ public class MetaUtils {
     return new PartialPath(storageGroupNodes);
   }
 
-  /**
-   * get aligned measurements in partial path FIXME maybe called by prefix path
-   *
-   * @param fullPath partial. For example: root.sg1.d1.(s1, s2, s3)
-   * @return measurement names. For example: [s1, s2, s3]
-   */
-  public static List<String> getMeasurementsInPartialPath(PartialPath 
fullPath) {
-    return Arrays.asList(fullPath.getMeasurement());
-  }
-
   @TestOnly
   public static List<String> getMultiFullPaths(IMNode node) {
     if (node == null) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 9aad5bf..86691a6 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -708,7 +708,7 @@ public class PlanExecutor implements IPlanExecutor {
   }
 
   protected List<PartialPath> getPathsName(PartialPath path) throws 
MetadataException {
-    return IoTDB.metaManager.getAllTimeseriesPath(path);
+    return IoTDB.metaManager.getFlatMeasurementPaths(path);
   }
 
   protected List<PartialPath> getNodesList(PartialPath schemaPattern, int 
level)
@@ -1203,7 +1203,8 @@ public class PlanExecutor implements IPlanExecutor {
         }
       }
       for (PartialPath path :
-          
IoTDB.metaManager.getAllTimeseriesPath(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD)))
 {
+          IoTDB.metaManager.getFlatMeasurementPaths(
+              devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD))) {
         existSeriesSet.add(path.getMeasurement());
         existSeriesSet.add(path.getMeasurementAlias());
       }
@@ -1949,10 +1950,6 @@ public class PlanExecutor implements IPlanExecutor {
     return dataSet;
   }
 
-  protected String deleteTimeSeries(PartialPath path) throws MetadataException 
{
-    return IoTDB.metaManager.deleteTimeseries(path);
-  }
-
   @SuppressWarnings("unused") // for the distributed version
   protected void loadConfiguration(LoadConfigurationPlan plan) throws 
QueryProcessException {
     IoTDBDescriptor.getInstance().loadHotModifiedProps();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
index c0afd30..8ad429f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
@@ -501,7 +501,7 @@ public class QueryOperator extends Operator {
   }
 
   protected List<PartialPath> getMatchedTimeseries(PartialPath path) throws 
MetadataException {
-    return IoTDB.metaManager.getAllTimeseriesPath(path);
+    return IoTDB.metaManager.getFlatMeasurementPaths(path);
   }
 
   public boolean isEnableTracing() {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index a2754c1..4031a5c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -238,7 +238,7 @@ public class ConcatPathOptimizer implements 
ILogicalOptimizer {
     try {
       for (PartialPath originalPath : originalPaths) {
         List<PartialPath> all =
-            IoTDB.metaManager.getAllTimeseriesPathWithAlias(originalPath, 0, 
0).left;
+            IoTDB.metaManager.getFlatMeasurementPathsWithAlias(originalPath, 
0, 0).left;
         if (all.isEmpty()) {
           throw new LogicalOptimizeException(
               String.format("Unknown time series %s in `where clause`", 
originalPath));
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java 
b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
index a3c664e..3fbc71c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/utils/WildcardsRemover.java
@@ -59,7 +59,7 @@ public class WildcardsRemover {
   public List<PartialPath> removeWildcardFrom(PartialPath path) throws 
LogicalOptimizeException {
     try {
       Pair<List<PartialPath>, Integer> pair =
-          IoTDB.metaManager.getAllTimeseriesPathWithAlias(path, currentLimit, 
currentOffset);
+          IoTDB.metaManager.getFlatMeasurementPathsWithAlias(path, 
currentLimit, currentOffset);
 
       consumed += pair.right;
       if (currentOffset != 0) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java 
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 2753527..3c658a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -387,7 +387,7 @@ public class TSServiceImpl implements TSIService.Iface {
   }
 
   protected List<PartialPath> getPaths(PartialPath path) throws 
MetadataException {
-    return IoTDB.metaManager.getAllTimeseriesPath(path);
+    return IoTDB.metaManager.getFlatMeasurementPaths(path);
   }
 
   private boolean executeInsertRowsPlan(InsertRowsPlan insertRowsPlan, 
List<TSStatus> result) {
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 7e2c23c..7c133d8 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -151,17 +151,17 @@ public class MManagerAdvancedTest {
           new PartialPath("root.vehicle.d0"),
           mmanager.getBelongedStorageGroup(new 
PartialPath("root.vehicle.d0.s1")));
       List<PartialPath> pathList =
-          mmanager.getAllTimeseriesPath(new PartialPath("root.vehicle.d1.**"));
+          mmanager.getFlatMeasurementPaths(new 
PartialPath("root.vehicle.d1.**"));
       assertEquals(6, pathList.size());
-      pathList = mmanager.getAllTimeseriesPath(new 
PartialPath("root.vehicle.d0.**"));
+      pathList = mmanager.getFlatMeasurementPaths(new 
PartialPath("root.vehicle.d0.**"));
       assertEquals(6, pathList.size());
-      pathList = mmanager.getAllTimeseriesPath(new 
PartialPath("root.vehicle.d*.**"));
+      pathList = mmanager.getFlatMeasurementPaths(new 
PartialPath("root.vehicle.d*.**"));
       assertEquals(12, pathList.size());
-      pathList = mmanager.getAllTimeseriesPath(new PartialPath("root.ve*.**"));
+      pathList = mmanager.getFlatMeasurementPaths(new 
PartialPath("root.ve*.**"));
       assertEquals(12, pathList.size());
-      pathList = mmanager.getAllTimeseriesPath(new 
PartialPath("root.vehicle*.d*.s1"));
+      pathList = mmanager.getFlatMeasurementPaths(new 
PartialPath("root.vehicle*.d*.s1"));
       assertEquals(2, pathList.size());
-      pathList = mmanager.getAllTimeseriesPath(new 
PartialPath("root.vehicle.d2.**"));
+      pathList = mmanager.getFlatMeasurementPaths(new 
PartialPath("root.vehicle.d2.**"));
       assertEquals(0, pathList.size());
     } catch (MetadataException e) {
       e.printStackTrace();
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index 8cdf119..6bd54a1 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -247,7 +247,7 @@ public class MManagerBasicTest {
 
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   @Test
-  public void testCreateAlignedTimeseries() throws IllegalPathException {
+  public void testCreateAlignedTimeseries() throws MetadataException {
     MManager manager = IoTDB.metaManager;
     try {
       manager.setStorageGroup(new PartialPath("root.laptop"));
@@ -290,17 +290,19 @@ public class MManagerBasicTest {
       manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector.s2"));
     } catch (MetadataException e) {
       assertEquals(
-          "Not support deleting part of aligned timeseies! (Path: 
root.laptop.d1.vector.s2)",
-          e.getMessage());
+          e.getMessage(),
+          "No matched timeseries or aligned timeseries for Path 
[root.laptop.d1.vector.s2]");
     }
 
     try {
       manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector.*"));
     } catch (MetadataException e) {
-      e.printStackTrace();
-      fail(e.getMessage());
+      assertEquals(
+          e.getMessage(),
+          "No matched timeseries or aligned timeseries for Path 
[root.laptop.d1.vector.*]");
     }
 
+    manager.deleteTimeseries(new PartialPath("root.laptop.d1.vector"));
     assertTrue(manager.isPathExist(new PartialPath("root.laptop.d1")));
     assertTrue(manager.isPathExist(new PartialPath("root.laptop.d1.s0")));
     assertFalse(manager.isPathExist(new PartialPath("root.laptop.d1.vector")));
@@ -543,7 +545,7 @@ public class MManagerBasicTest {
     MManager manager = IoTDB.metaManager;
 
     try {
-      assertTrue(manager.getAllTimeseriesPath(new 
PartialPath("root")).isEmpty());
+      assertTrue(manager.getFlatMeasurementPaths(new 
PartialPath("root")).isEmpty());
       assertTrue(manager.getBelongedStorageGroups(new 
PartialPath("root")).isEmpty());
       assertTrue(manager.getBelongedStorageGroups(new 
PartialPath("root.vehicle")).isEmpty());
       assertTrue(
@@ -1446,6 +1448,29 @@ public class MManagerBasicTest {
       Assert.assertEquals(2, manager.getDevicesNum(new 
PartialPath("root.laptop.*")));
       Assert.assertEquals(2, manager.getDevicesNum(new 
PartialPath("root.laptop.**")));
 
+      manager.createTimeseries(
+          new PartialPath("root.laptop.d1.a.s3"),
+          TSDataType.INT32,
+          TSEncoding.PLAIN,
+          CompressionType.GZIP,
+          null);
+
+      manager.createTimeseries(
+          new PartialPath("root.laptop.d2.a.s3"),
+          TSDataType.INT32,
+          TSEncoding.PLAIN,
+          CompressionType.GZIP,
+          null);
+
+      Assert.assertEquals(4, manager.getDevicesNum(new 
PartialPath("root.laptop.**")));
+
+      manager.deleteTimeseries(new PartialPath("root.laptop.d2.s1"));
+      Assert.assertEquals(3, manager.getDevicesNum(new 
PartialPath("root.laptop.**")));
+      manager.deleteTimeseries(new PartialPath("root.laptop.d2.a.s3"));
+      Assert.assertEquals(2, manager.getDevicesNum(new 
PartialPath("root.laptop.**")));
+      manager.deleteTimeseries(new PartialPath("root.laptop.d1.a.s3"));
+      Assert.assertEquals(1, manager.getDevicesNum(new 
PartialPath("root.laptop.**")));
+
     } catch (MetadataException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -1566,7 +1591,6 @@ public class MManagerBasicTest {
       IMNode node = manager.getSeriesSchemasAndReadLockDevice(insertRowPlan);
       assertEquals(1, 
manager.getAllTimeseriesCount(node.getPartialPath().concatNode("**")));
       assertEquals(3, 
manager.getAllTimeseriesFlatCount(node.getPartialPath().concatNode("**")));
-      assertEquals(1, node.getMeasurementMNodeCount());
       assertNull(insertRowPlan.getMeasurementMNodes()[0]);
       assertNull(insertRowPlan.getMeasurementMNodes()[1]);
       assertNull(insertRowPlan.getMeasurementMNodes()[2]);
@@ -1652,7 +1676,7 @@ public class MManagerBasicTest {
 
       // call getSeriesSchemasAndReadLockDevice
       IMNode node = manager.getSeriesSchemasAndReadLockDevice(insertRowPlan);
-      assertEquals(1, node.getMeasurementMNodeCount());
+      assertEquals(1, 
manager.getAllTimeseriesCount(node.getPartialPath().concatNode("**")));
       assertNull(insertRowPlan.getMeasurementMNodes()[0]);
       assertEquals(1, insertRowPlan.getFailedMeasurementNumber());
 
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index f65a0a0..51f1ff3 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -206,12 +206,12 @@ public class MTreeTest {
     }
 
     try {
-      List<PartialPath> result = root.getAllTimeseriesPath(new 
PartialPath("root.a.*.s0"));
+      List<PartialPath> result = root.getFlatMeasurementPaths(new 
PartialPath("root.a.*.s0"));
       assertEquals(2, result.size());
       assertEquals("root.a.d0.s0", result.get(0).getFullPath());
       assertEquals("root.a.d1.s0", result.get(1).getFullPath());
 
-      result = root.getAllTimeseriesPath(new PartialPath("root.a.*.*.s0"));
+      result = root.getFlatMeasurementPaths(new PartialPath("root.a.*.*.s0"));
       assertEquals("root.a.b.d0.s0", result.get(0).getFullPath());
     } catch (MetadataException e) {
       e.printStackTrace();
@@ -273,18 +273,18 @@ public class MTreeTest {
     }
 
     try {
-      List<PartialPath> result = root.getAllTimeseriesPath(new 
PartialPath("root.a.*.s0"));
+      List<PartialPath> result = root.getFlatMeasurementPaths(new 
PartialPath("root.a.*.s0"));
       assertEquals(2, result.size());
       assertEquals("root.a.d0.s0", result.get(0).getFullPath());
       assertEquals("root.a.d1.s0", result.get(1).getFullPath());
 
-      result = root.getAllTimeseriesPath(new 
PartialPath("root.a.*.temperature"));
+      result = root.getFlatMeasurementPaths(new 
PartialPath("root.a.*.temperature"));
       assertEquals(2, result.size());
       assertEquals("root.a.d0.s0", result.get(0).getFullPath());
       assertEquals("root.a.d1.s0", result.get(1).getFullPath());
 
       List<PartialPath> result2 =
-          root.getAllTimeseriesPathWithAlias(new PartialPath("root.a.*.s0"), 
0, 0).left;
+          root.getFlatMeasurementPathsWithAlias(new 
PartialPath("root.a.*.s0"), 0, 0).left;
       assertEquals(2, result2.size());
       assertEquals("root.a.d0.s0", result2.get(0).getFullPath());
       assertFalse(result2.get(0).isMeasurementAliasExists());
@@ -292,13 +292,13 @@ public class MTreeTest {
       assertFalse(result2.get(1).isMeasurementAliasExists());
 
       result2 =
-          root.getAllTimeseriesPathWithAlias(new 
PartialPath("root.a.*.temperature"), 0, 0).left;
+          root.getFlatMeasurementPathsWithAlias(new 
PartialPath("root.a.*.temperature"), 0, 0).left;
       assertEquals(2, result2.size());
       assertEquals("root.a.d0.temperature", 
result2.get(0).getFullPathWithAlias());
       assertEquals("root.a.d1.temperature", 
result2.get(1).getFullPathWithAlias());
 
       Pair<List<PartialPath>, Integer> result3 =
-          root.getAllTimeseriesPathWithAlias(new PartialPath("root.a.**"), 2, 
0);
+          root.getFlatMeasurementPathsWithAlias(new PartialPath("root.a.**"), 
2, 0);
       assertEquals(2, result3.left.size());
       assertEquals(2, result3.right.intValue());
 
@@ -724,9 +724,9 @@ public class MTreeTest {
     assertEquals(2, root.getDevices(new PartialPath("root"), true).size());
     assertEquals(2, root.getDevices(new PartialPath("root.**"), false).size());
     assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.**")));
-    assertEquals(2, root.getAllTimeseriesPath(new 
PartialPath("root.**")).size());
+    assertEquals(2, root.getFlatMeasurementPaths(new 
PartialPath("root.**")).size());
     assertEquals(
-        2, root.getAllTimeseriesPathWithAlias(new PartialPath("root.**"), 0, 
0).left.size());
+        2, root.getFlatMeasurementPathsWithAlias(new PartialPath("root.**"), 
0, 0).left.size());
   }
 
   @Test
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
index 5838b3e..5c189a5 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/PartialPathTest.java
@@ -87,6 +87,13 @@ public class PartialPathTest {
 
     Assert.assertEquals("root.sg2.d1.s1", p2.getFullPath());
     Assert.assertEquals("root.sg2.d1.d2.s3", p3.getFullPath());
+
+    PartialPath p4 = new PartialPath("root.**.d.s");
+    PartialPath p5 = p4.alterPrefixPath(new PartialPath("root.sg"));
+    Assert.assertEquals("root.sg.**.d.s", p5.getFullPath());
+    PartialPath p6 = new PartialPath("root.a.**.d.s");
+    PartialPath p7 = p5.alterPrefixPath(new PartialPath("root.b.sg"));
+    Assert.assertEquals("root.b.sg.**.d.s", p7.getFullPath());
   }
 
   @Test
diff --git 
a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java 
b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
index bd0f4e1..712f8d2 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
@@ -538,7 +538,8 @@ public class IoTDBSessionSimpleIT {
     try {
       session.deleteTimeseries(Arrays.asList("root.sg1.d1.t6", 
"root.sg1.d1.t2", "root.sg1.d1.t3"));
     } catch (BatchExecutionException e) {
-      assertEquals("Path [root.sg1.d1.t6] does not exist;", e.getMessage());
+      assertEquals(
+          "No matched timeseries or aligned timeseries for Path 
[root.sg1.d1.t6];", e.getMessage());
     }
     assertTrue(session.checkTimeseriesExists("root.sg1.d1.t1"));
     assertFalse(session.checkTimeseriesExists("root.sg1.d1.t2"));

Reply via email to