This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/PathPatternTreeOpt in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a9cad4e9f9c4cf0e7c8b780f22b07b2881eac43e Author: Minghui Liu <[email protected]> AuthorDate: Wed Jun 15 14:45:45 2022 +0800 refactor method names in PathPatternTree --- .../iotdb/confignode/manager/ConfigManager.java | 4 +- .../thrift/ConfigNodeRPCServiceProcessor.java | 2 +- .../iotdb/db/localconfignode/LocalConfigNode.java | 4 +- .../db/mpp/common/schematree/PathPatternTree.java | 123 +++++++++------------ .../operator/schema/SchemaFetchScanOperator.java | 2 +- .../mpp/plan/analyze/ClusterPartitionFetcher.java | 4 +- .../mpp/plan/analyze/StandaloneSchemaFetcher.java | 4 +- .../db/mpp/plan/planner/LogicalPlanBuilder.java | 11 +- .../statement/internal/SchemaFetchStatement.java | 2 +- .../mpp/common/schematree/PathPatternTreeTest.java | 4 +- .../metadata/read/SchemaFetchScanNodeTest.java | 2 +- 11 files changed, 75 insertions(+), 87 deletions(-) diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index e81c72d76c..9331a83ebf 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -271,7 +271,7 @@ public class ConfigManager implements Manager { public DataSet getSchemaPartition(PathPatternTree patternTree) { TSStatus status = confirmLeader(); if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - List<String> devicePaths = patternTree.findAllDevicePaths(); + List<String> devicePaths = patternTree.getAllDevicePatterns(); List<String> storageGroups = getClusterSchemaManager().getStorageGroupNames(); GetSchemaPartitionReq getSchemaPartitionReq = new GetSchemaPartitionReq(); Map<String, List<TSeriesPartitionSlot>> partitionSlotsMap = new HashMap<>(); @@ -331,7 +331,7 @@ public class ConfigManager implements Manager { public DataSet getOrCreateSchemaPartition(PathPatternTree patternTree) { TSStatus status = confirmLeader(); if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - List<String> devicePaths = patternTree.findAllDevicePaths(); + List<String> devicePaths = patternTree.getAllDevicePatterns(); List<String> storageGroups = getClusterSchemaManager().getStorageGroupNames(); GetOrCreateSchemaPartitionReq getOrCreateSchemaPartitionReq = diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java index 4d0cf0e5c0..ccf897bac7 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java @@ -291,7 +291,7 @@ public class ConfigNodeRPCServiceProcessor implements ConfigIService.Iface { throws TException { PathPatternTree patternTree = PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree())); - PartialPath partialPath = patternTree.splitToPathList().get(0); + PartialPath partialPath = patternTree.getAllPathPatterns().get(0); SchemaNodeManagementResp schemaNodeManagementResp; schemaNodeManagementResp = (SchemaNodeManagementResp) configManager.getNodePathsPartition(partialPath, req.getLevel()); diff --git a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java index 456fc8252b..6d03e978c2 100644 --- a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java +++ b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java @@ -895,7 +895,7 @@ public class LocalConfigNode { Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> partitionSlotsMap = new HashMap<>(); patternTree.constructTree(); - List<PartialPath> partialPathList = patternTree.splitToPathList(); + List<PartialPath> partialPathList = patternTree.getAllPathPatterns(); try { for (PartialPath path : partialPathList) { List<PartialPath> storageGroups = getBelongedStorageGroups(path); @@ -922,7 +922,7 @@ public class LocalConfigNode { public Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> getOrCreateSchemaPartition( PathPatternTree patternTree) { - List<String> devicePaths = patternTree.findAllDevicePaths(); + List<String> devicePaths = patternTree.getAllDevicePatterns(); Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> partitionSlotsMap = new HashMap<>(); try { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java index b86f8c3f44..8a950d2366 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTree.java @@ -40,11 +40,11 @@ public class PathPatternTree { private PathPatternNode root; - @Deprecated private List<PartialPath> pathList; + private List<PartialPath> pathPatternList; public PathPatternTree() { this.root = new PathPatternNode(SQLConstant.ROOT); - this.pathList = new ArrayList<>(); + this.pathPatternList = new ArrayList<>(); } public PathPatternNode getRoot() { @@ -56,18 +56,15 @@ public class PathPatternTree { } ///////////////////////////////////////////////////////////////////////////////////////////////// - // Operations for time series paths + // Operations for constructing tree ///////////////////////////////////////////////////////////////////////////////////////////////// - /** @param fullPath */ + /** Append a fullPath (without wildcards) as a branch on the tree. */ public void appendFullPath(PartialPath fullPath) { appendBranchWithoutPrune(root, fullPath.getNodes(), 0); } - /** - * @param devicePath - * @param measurement - */ + /** Append a fullPath consisting of device and measurement as a branch on the tree. */ public void appendFullPath(PartialPath devicePath, String measurement) { int deviceNodeLength = devicePath.getNodeLength(); String[] pathNodes = new String[deviceNodeLength + 1]; @@ -77,31 +74,30 @@ public class PathPatternTree { appendBranchWithoutPrune(root, pathNodes, 0); } - /** @param pathPattern */ + /** Add a pathPattern (may contain wildcards) to pathPatternList. */ public void appendPathPattern(PartialPath pathPattern) { boolean isExist = false; - for (PartialPath path : pathList) { + for (PartialPath path : pathPatternList) { if (path.matchFullPath(pathPattern)) { - // path already exists in pathList + // path already exists in pathPatternList isExist = true; break; } } if (!isExist) { - // remove duplicate path in pathList - pathList.removeAll( - pathList.stream().filter(pathPattern::matchFullPath).collect(Collectors.toList())); - pathList.add(pathPattern); + // remove duplicate path in pathPatternList + pathPatternList.removeAll( + pathPatternList.stream().filter(pathPattern::matchFullPath).collect(Collectors.toList())); + pathPatternList.add(pathPattern); } } - /** */ - @Deprecated + /** Construct tree according to the pathPatternList. */ public void constructTree() { - for (PartialPath path : pathList) { + for (PartialPath path : pathPatternList) { appendBranchWithoutPrune(root, path.getNodes(), 0); } - pathList.clear(); + pathPatternList.clear(); } private void appendBranchWithoutPrune(PathPatternNode curNode, String[] pathNodes, int pos) { @@ -127,101 +123,72 @@ public class PathPatternTree { } ///////////////////////////////////////////////////////////////////////////////////////////////// - // Operations for time series paths + // Operations for querying tree ///////////////////////////////////////////////////////////////////////////////////////////////// public boolean isEmpty() { return (root.getChildren() == null || root.getChildren().isEmpty()) - && (pathList == null || pathList.isEmpty()); + && (pathPatternList == null || pathPatternList.isEmpty()); } - /** @return */ - public List<String> findAllDevicePaths() { + public List<String> getAllDevicePatterns() { List<String> nodes = new ArrayList<>(); List<String> pathPatternList = new ArrayList<>(); - findAllDevicePaths(root, nodes, pathPatternList); + searchDevicePattern(root, nodes, pathPatternList); return pathPatternList; } - /** @return */ - public List<PartialPath> splitToPathList() { - List<PartialPath> result = new ArrayList<>(); - Deque<String> ancestors = new ArrayDeque<>(); - searchFullPath(root, ancestors, result); - return result; - } - - /** @return */ - public PathPatternTree findOverlappedPattern(PartialPath pattern) { - PathPatternTree patternTree = new PathPatternTree(); - for (PartialPath pathPattern : findOverlappedPaths(pattern)) { - patternTree.appendPathPattern(pathPattern); - } - return patternTree; - } - - private void findAllDevicePaths( + private void searchDevicePattern( PathPatternNode curNode, List<String> nodes, List<String> pathPatternList) { nodes.add(curNode.getName()); if (curNode.isLeaf()) { if (!curNode.getName().equals("**")) { - pathPatternList.add(parseNodesToString(nodes.subList(0, nodes.size() - 1))); + pathPatternList.add(convertNodesToString(nodes.subList(0, nodes.size() - 1))); } else { - pathPatternList.add(parseNodesToString(nodes)); + pathPatternList.add(convertNodesToString(nodes)); } nodes.remove(nodes.size() - 1); return; } if (curNode.isWildcard()) { - pathPatternList.add(parseNodesToString(nodes)); + pathPatternList.add(convertNodesToString(nodes)); nodes.remove(nodes.size() - 1); return; } for (PathPatternNode childNode : curNode.getChildren().values()) { - findAllDevicePaths(childNode, nodes, pathPatternList); + searchDevicePattern(childNode, nodes, pathPatternList); } nodes.remove(nodes.size() - 1); } - private String parseNodesToString(List<String> nodes) { - StringBuilder fullPathBuilder = new StringBuilder(nodes.get(0)); - for (int i = 1; i < nodes.size(); i++) { - fullPathBuilder.append(TsFileConstant.PATH_SEPARATOR).append(nodes.get(i)); - } - return fullPathBuilder.toString(); + public List<PartialPath> getAllPathPatterns() { + List<PartialPath> result = new ArrayList<>(); + Deque<String> ancestors = new ArrayDeque<>(); + searchPathPattern(root, ancestors, result); + return result; } - private void searchFullPath( + private void searchPathPattern( PathPatternNode node, Deque<String> ancestors, List<PartialPath> fullPaths) { if (node.isLeaf()) { - fullPaths.add(constructFullPath(node, ancestors)); + fullPaths.add(convertNodesToPartialPath(node, ancestors)); return; } ancestors.push(node.getName()); for (PathPatternNode child : node.getChildren().values()) { - searchFullPath(child, ancestors, fullPaths); + searchPathPattern(child, ancestors, fullPaths); } ancestors.pop(); } - private PartialPath constructFullPath(PathPatternNode node, Deque<String> ancestors) { - Iterator<String> iterator = ancestors.descendingIterator(); - List<String> nodeList = new ArrayList<>(ancestors.size() + 1); - while (iterator.hasNext()) { - nodeList.add(iterator.next()); - } - nodeList.add(node.getName()); - return new PartialPath(nodeList.toArray(new String[0])); - } - - private List<PartialPath> findOverlappedPaths(PartialPath pattern) { - if (pathList.isEmpty()) { - pathList = splitToPathList(); + public List<PartialPath> getOverlappedPathPatterns(PartialPath pattern) { + if (pathPatternList.isEmpty()) { + pathPatternList = getAllPathPatterns(); } List<PartialPath> results = new ArrayList<>(); - for (PartialPath path : pathList) { + for (PartialPath path : pathPatternList) { if (pattern.overlapWith(path)) { results.add(path); } @@ -229,6 +196,24 @@ public class PathPatternTree { return results; } + private String convertNodesToString(List<String> nodes) { + StringBuilder fullPathBuilder = new StringBuilder(nodes.get(0)); + for (int i = 1; i < nodes.size(); i++) { + fullPathBuilder.append(TsFileConstant.PATH_SEPARATOR).append(nodes.get(i)); + } + return fullPathBuilder.toString(); + } + + private PartialPath convertNodesToPartialPath(PathPatternNode node, Deque<String> ancestors) { + Iterator<String> iterator = ancestors.descendingIterator(); + List<String> nodeList = new ArrayList<>(ancestors.size() + 1); + while (iterator.hasNext()) { + nodeList.add(iterator.next()); + } + nodeList.add(node.getName()); + return new PartialPath(nodeList.toArray(new String[0])); + } + ///////////////////////////////////////////////////////////////////////////////////////////////// // serialize & deserialize ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java index 542d974c5b..282559195f 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaFetchScanOperator.java @@ -102,7 +102,7 @@ public class SchemaFetchScanOperator implements SourceOperator { private void fetchSchema() throws MetadataException { SchemaTree schemaTree = new SchemaTree(); - List<PartialPath> partialPathList = patternTree.splitToPathList(); + List<PartialPath> partialPathList = patternTree.getAllPathPatterns(); for (PartialPath path : partialPathList) { schemaTree.appendMeasurementPaths(schemaRegion.getMeasurementPaths(path, false)); } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java index 6ca63f54c4..8435e4b457 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java @@ -108,7 +108,7 @@ public class ClusterPartitionFetcher implements IPartitionFetcher { try (ConfigNodeClient client = configNodeClientManager.borrowClient(ConfigNodeInfo.partitionRegionId)) { patternTree.constructTree(); - List<String> devicePaths = patternTree.findAllDevicePaths(); + List<String> devicePaths = patternTree.getAllDevicePatterns(); Map<String, String> deviceToStorageGroupMap = getDeviceToStorageGroup(devicePaths, false); SchemaPartition schemaPartition = partitionCache.getSchemaPartition(deviceToStorageGroupMap); if (null == schemaPartition) { @@ -132,7 +132,7 @@ public class ClusterPartitionFetcher implements IPartitionFetcher { try (ConfigNodeClient client = configNodeClientManager.borrowClient(ConfigNodeInfo.partitionRegionId)) { patternTree.constructTree(); - List<String> devicePaths = patternTree.findAllDevicePaths(); + List<String> devicePaths = patternTree.getAllDevicePatterns(); Map<String, String> deviceToStorageGroupMap = getDeviceToStorageGroup(devicePaths, true); SchemaPartition schemaPartition = partitionCache.getSchemaPartition(deviceToStorageGroupMap); if (null == schemaPartition) { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java index a83d25c484..cc61c86362 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandaloneSchemaFetcher.java @@ -64,7 +64,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher { patternTree.constructTree(); Set<String> storageGroupSet = new HashSet<>(); SchemaTree schemaTree = new SchemaTree(); - List<PartialPath> partialPathList = patternTree.splitToPathList(); + List<PartialPath> partialPathList = patternTree.getAllPathPatterns(); try { for (PartialPath path : partialPathList) { List<PartialPath> storageGroups = localConfigNode.getBelongedStorageGroups(path); @@ -94,7 +94,7 @@ public class StandaloneSchemaFetcher implements ISchemaFetcher { patternTree.constructTree(); Set<String> storageGroupSet = new HashSet<>(); SchemaTree schemaTree = new SchemaTree(); - List<PartialPath> partialPathList = patternTree.splitToPathList(); + List<PartialPath> partialPathList = patternTree.getAllPathPatterns(); try { for (PartialPath path : partialPathList) { String storageGroup = localConfigNode.getBelongedStorageGroup(path).getFullPath(); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java index a451623307..4514f387ac 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java @@ -720,12 +720,15 @@ public class LogicalPlanBuilder { for (String storageGroup : storageGroupList) { try { storageGroupPath = new PartialPath(storageGroup); + PathPatternTree overlappedPatternTree = new PathPatternTree(); + for (PartialPath pathPattern : + patternTree.getOverlappedPathPatterns( + storageGroupPath.concatNode(MULTI_LEVEL_PATH_WILDCARD))) { + overlappedPatternTree.appendPathPattern(pathPattern); + } this.root.addChild( new SchemaFetchScanNode( - context.getQueryId().genPlanNodeId(), - storageGroupPath, - patternTree.findOverlappedPattern( - storageGroupPath.concatNode(MULTI_LEVEL_PATH_WILDCARD)))); + context.getQueryId().genPlanNodeId(), storageGroupPath, overlappedPatternTree)); } catch (IllegalPathException e) { // definitely won't happen throw new RuntimeException(e); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java index 9ab133be35..fde6a01a08 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/internal/SchemaFetchStatement.java @@ -59,6 +59,6 @@ public class SchemaFetchStatement extends Statement { @Override public List<PartialPath> getPaths() { - return patternTree.splitToPathList(); + return patternTree.getAllPathPatterns(); } } diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java index ec9c52f550..614430f4fb 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/common/schematree/PathPatternTreeTest.java @@ -160,7 +160,7 @@ public class PathPatternTreeTest { .map(PartialPath::getFullPath) .sorted() .collect(Collectors.toList()), - patternTree.findAllDevicePaths().stream().sorted().collect(Collectors.toList())); + patternTree.getAllDevicePatterns().stream().sorted().collect(Collectors.toList())); PublicBAOS outputStream = new PublicBAOS(); resultPatternTree.serialize(outputStream); @@ -188,6 +188,6 @@ public class PathPatternTreeTest { Assert.assertEquals( Arrays.asList(new PartialPath("root.sg1.*.t1.s1"), new PartialPath("root.sg1.d1.t2.s2")), - patternTree.splitToPathList()); + patternTree.getAllPathPatterns()); } } diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java index 6f254b0275..ea3b5543e6 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java @@ -45,6 +45,6 @@ public class SchemaFetchScanNodeTest { SchemaFetchScanNode recoveredNode = (SchemaFetchScanNode) PlanNodeType.deserialize(byteBuffer); Assert.assertEquals("root.sg", recoveredNode.getStorageGroup().getFullPath()); Assert.assertEquals( - "root.sg.**.*", recoveredNode.getPatternTree().splitToPathList().get(0).getFullPath()); + "root.sg.**.*", recoveredNode.getPatternTree().getAllPathPatterns().get(0).getFullPath()); } }
