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);
}
}