Optimize time cost on rewrite pattern by authority pattern

diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
index bff12ff..5c1d61d 100644
--- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
+++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTree.java
@@ -309,6 +309,60 @@
     return false;
   }
 
+  public PathPatternTree intersectWithFullPathPrefixTree(PathPatternTree fullPathPrefixTree) {
+    PathPatternTree result = new PathPatternTree(containWildcard);
+    List<PartialPath> partialPathList = null;
+
+    for (PartialPath fullPathOrPrefix : fullPathPrefixTree.getAllPathPatterns()) {
+      PathPatternNode<Void, VoidSerializer> curNode = root;
+      PathPatternNode<Void, VoidSerializer> tarNode = result.root;
+      String[] nodes = fullPathOrPrefix.nodes;
+      boolean done = false;
+      if (fullPathOrPrefix.endWithMultiLevelWildcard()) {
+        // if prefix match, directly construct result tree
+        for (int i = 1; i < nodes.length - 1; i++) {
+          done = true;
+          List<PathPatternNode<Void, VoidSerializer>> tmp = curNode.getMatchChildren(nodes[i]);
+          if (tmp.size() == 1 && tmp.get(0).getName().equals(nodes[i])) {
+            curNode = tmp.get(0);
+            if (tarNode.getChildren(nodes[i]) == null) {
+              tarNode.addChild(new PathPatternNode<>(nodes[i], VoidSerializer.getInstance()));
+            }
+            tarNode = tarNode.getChildren(nodes[i]);
+          } else {
+            done = false;
+            break;
+          }
+        }
+      }
+      if (done) {
+        for (PathPatternNode<Void, VoidSerializer> node : curNode.getChildren().values()) {
+          tarNode.addChild(node);
+        }
+      } else {
+        // this branch is to construct intersection one by one
+        if (partialPathList == null) {
+          partialPathList = getAllPathPatterns();
+        }
+        for (PartialPath pathPattern : partialPathList) {
+          if (fullPathOrPrefix.endWithMultiLevelWildcard()) {
+            // prefix
+            for (PartialPath temp : pathPattern.intersectWithPrefixPattern(fullPathOrPrefix)) {
+              result.appendPathPattern(temp);
+            }
+          } else {
+            // full path
+            if (pathPattern.matchFullPath(fullPathOrPrefix)) {
+              result.appendPathPattern(fullPathOrPrefix);
+            }
+          }
+        }
+      }
+    }
+    result.constructTree();
+    return result;
+  }
+
   /////////////////////////////////////////////////////////////////////////////////////////////////
   // serialize & deserialize
   /////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTreeUtils.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTreeUtils.java
index 563cedf..2fa1b16 100644
--- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTreeUtils.java
+++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternTreeUtils.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.commons.path;
 
+import org.apache.iotdb.commons.schema.SchemaConstant;
+
 public class PathPatternTreeUtils {
   /**
    * Intersect the pattern tree with the full path prefix tree, and return the intersected pattern
@@ -31,23 +33,9 @@
    */
   public static PathPatternTree intersectWithFullPathPrefixTree(
       PathPatternTree patternTree, PathPatternTree fullPathPrefixTree) {
-    PathPatternTree result = new PathPatternTree();
-    for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
-      for (PartialPath fullPathOrPrefix : fullPathPrefixTree.getAllPathPatterns()) {
-        if (fullPathOrPrefix.endWithMultiLevelWildcard()) {
-          // prefix
-          for (PartialPath temp : pathPattern.intersectWithPrefixPattern(fullPathOrPrefix)) {
-            result.appendPathPattern(temp);
-          }
-        } else {
-          // full path
-          if (pathPattern.matchFullPath(fullPathOrPrefix)) {
-            result.appendPathPattern(fullPathOrPrefix);
-          }
-        }
-      }
+    if (SchemaConstant.ALL_MATCH_SCOPE.equals(fullPathPrefixTree)) {
+      return patternTree;
     }
-    result.constructTree();
-    return result;
+    return patternTree.intersectWithFullPathPrefixTree(fullPathPrefixTree);
   }
 }