diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java index a3450f72332b0..e9405f0374bb9 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/path/PatternTreeMapTest.java @@ -182,6 +182,9 @@ public void modificationPatternTreeMapTest() throws IllegalPathException { patternTreeMap.append( new PartialPath("root.sg1.d1.*.d3.s4"), new Deletion(new PartialPath("root.sg1.d1.*.d3.s4"), 3, 4, 6)); + patternTreeMap.append( + new PartialPath("root.sg1.d1.t1.d*.s5"), + new Deletion(new PartialPath("root.sg1.d1.t1.d*.s5"), 4, 7, 10)); checkOverlappedByDevice( patternTreeMap, @@ -205,7 +208,8 @@ public void modificationPatternTreeMapTest() throws IllegalPathException { new Deletion(new PartialPath("root.**.s1"), 10, 100, 200), new Deletion(new PartialPath("root.**"), 5, 10, 100), new Deletion(new PartialPath("root.sg1.d1.*.d3.s5"), 2, 4, 6), - new Deletion(new PartialPath("root.sg1.d1.*.d3.s4"), 3, 4, 6))); + new Deletion(new PartialPath("root.sg1.d1.*.d3.s4"), 3, 4, 6), + new Deletion(new PartialPath("root.sg1.d1.t1.d*.s5"), 4, 7, 10))); } private void checkOverlapped( diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java index 89ae7444d19f3..3dd274b8c3704 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternNode.java @@ -58,6 +58,10 @@ public class PathPatternNode childrenNamesWithNonTrivialWildcard = new HashSet<>(); + public PathPatternNode(String name, VSerializer serializer) { this.name = name; this.children = new HashMap<>(); @@ -90,6 +94,10 @@ public List> getMatchChildren(String nodeName) { if (children.containsKey(MULTI_LEVEL_PATH_WILDCARD)) { res.add(children.get(MULTI_LEVEL_PATH_WILDCARD)); } + childrenNamesWithNonTrivialWildcard.stream() + .filter(path -> PathPatternUtil.isNodeMatch(path, nodeName)) + .map(children::get) + .forEach(res::add); return res; } @@ -98,7 +106,13 @@ public Map> getChildren() { } public void addChild(PathPatternNode tmpNode) { - children.put(tmpNode.getName(), tmpNode); + String nodeName = tmpNode.getName(); + if (PathPatternUtil.hasWildcard(nodeName) + && !PathPatternUtil.isMultiLevelMatchWildcard(nodeName) + && !ONE_LEVEL_PATH_WILDCARD.equals(nodeName)) { + childrenNamesWithNonTrivialWildcard.add(nodeName); + } + children.put(nodeName, tmpNode); } public void deleteChild(PathPatternNode tmpNode) { @@ -265,6 +279,7 @@ public long ramBytesUsed() { return SHALLOW_SIZE + RamUsageEstimator.sizeOf(name) + RamUsageEstimator.sizeOfHashSet(valueSet) + + RamUsageEstimator.sizeOfHashSet(childrenNamesWithNonTrivialWildcard) + RamUsageEstimator.sizeOfMapWithKnownShallowSize( children, RamUsageEstimator.SHALLOW_SIZE_OF_HASHMAP, diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternUtil.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternUtil.java index a8ba920813b67..6ee736453500e 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternUtil.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/path/PathPatternUtil.java @@ -33,7 +33,8 @@ private PathPatternUtil() {} * patternNode that can match batch explicit node names. e.g. *, e.g. *, **, d*, *d*. */ public static boolean hasWildcard(String node) { - return node.startsWith(ONE_LEVEL_PATH_WILDCARD) || node.endsWith(ONE_LEVEL_PATH_WILDCARD); + return node != null + && (node.startsWith(ONE_LEVEL_PATH_WILDCARD) || node.endsWith(ONE_LEVEL_PATH_WILDCARD)); } public static boolean isMultiLevelMatchWildcard(String node) {