You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2022/01/15 02:00:04 UTC
[iotdb] 01/01: LEVEL can be specified at non-last level in metadata queries
This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch fix_2363
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 195b9b13cf3ec62633acdbb122e8d5a7cd1ea74e
Author: jt <jt...@163.com>
AuthorDate: Sat Jan 15 09:59:25 2022 +0800
LEVEL can be specified at non-last level in metadata queries
---
.../iotdb/db/integration/IoTDBMetadataFetchIT.java | 2 +-
.../mtree/traverser/collector/MNodeCollector.java | 23 ++++++++++++++++++----
.../mtree/traverser/counter/MNodeLevelCounter.java | 21 ++++++++++++++++----
.../org/apache/iotdb/db/metadata/MTreeTest.java | 13 +++++++++---
4 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
index 702edca..52210d2 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBMetadataFetchIT.java
@@ -578,7 +578,7 @@ public class IoTDBMetadataFetchIT {
"COUNT NODES root.ln.wf01.* level=3",
"COUNT NODES root.ln.wf01.* level=4"
};
- String[] standards = new String[] {"3,\n", "1,\n", "0,\n", "0,\n", "2,\n", "0,\n"};
+ String[] standards = new String[] {"3,\n", "1,\n", "1,\n", "1,\n", "2,\n", "0,\n"};
for (int n = 0; n < sqls.length; n++) {
String sql = sqls[n];
String standard = standards[n];
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
index ad9c9b6..f58bd2a 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/collector/MNodeCollector.java
@@ -23,6 +23,9 @@ import org.apache.iotdb.db.metadata.MManager.StorageGroupFilter;
import org.apache.iotdb.db.metadata.mnode.IMNode;
import org.apache.iotdb.db.metadata.path.PartialPath;
+import java.util.HashSet;
+import java.util.Set;
+
// This class defines any node in MTree as potential target node.
public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
@@ -30,7 +33,9 @@ public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
protected StorageGroupFilter storageGroupFilter = null;
// level query option
- protected int targetLevel;
+ protected int targetLevel = -1;
+
+ private Set<IMNode> processedNodes = new HashSet<>();
public MNodeCollector(IMNode startNode, PartialPath path) throws MetadataException {
super(startNode, path);
@@ -53,11 +58,21 @@ public abstract class MNodeCollector<T> extends CollectorTraverser<T> {
@Override
protected boolean processFullMatchedMNode(IMNode node, int idx, int level) {
- if (targetLevel > 0) {
- if (level == targetLevel) {
+ if (targetLevel >= 0) {
+ // move the cursor the given level when matched
+ if (level < targetLevel) {
+ return false;
+ }
+ while (level > targetLevel) {
+ node = node.getParent();
+ level--;
+ }
+ // record processed node so they will not be processed twice
+ if (!processedNodes.contains(node)) {
+ processedNodes.add(node);
transferToResult(node);
- return true;
}
+ return true;
} else {
transferToResult(node);
}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
index 90a1784..dc4e746 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/counter/MNodeLevelCounter.java
@@ -22,12 +22,17 @@ import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.metadata.mnode.IMNode;
import org.apache.iotdb.db.metadata.path.PartialPath;
+import java.util.HashSet;
+import java.util.Set;
+
// This node implements node count function.
public class MNodeLevelCounter extends CounterTraverser {
// level query option
protected int targetLevel;
+ private Set<IMNode> processedNodes = new HashSet<>();
+
public MNodeLevelCounter(IMNode startNode, PartialPath path, int targetLevel)
throws MetadataException {
super(startNode, path);
@@ -41,11 +46,19 @@ public class MNodeLevelCounter extends CounterTraverser {
@Override
protected boolean processFullMatchedMNode(IMNode node, int idx, int level) {
- if (level == targetLevel) {
- count++;
- return true;
- } else {
+ // move the cursor the given level when matched
+ if (level < targetLevel) {
return false;
}
+ while (level > targetLevel) {
+ node = node.getParent();
+ level--;
+ }
+ // record processed node so they will not be processed twice
+ if (!processedNodes.contains(node)) {
+ processedNodes.add(node);
+ count++;
+ }
+ return true;
}
}
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 2cea00f..2842f9e 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
@@ -446,9 +446,9 @@ public class MTreeTest {
Set<String> result1 = root.getChildNodeNameInNextLevel(new PartialPath("root.a.d0"));
Set<String> result2 = root.getChildNodeNameInNextLevel(new PartialPath("root.a"));
Set<String> result3 = root.getChildNodeNameInNextLevel(new PartialPath("root"));
- assertEquals(result1, new HashSet<>(Arrays.asList("s0", "s1")));
- assertEquals(result2, new HashSet<>(Arrays.asList("d0", "d5")));
- assertEquals(result3, new HashSet<>(Arrays.asList("a")));
+ assertEquals(new HashSet<>(Arrays.asList("s0", "s1")), result1);
+ assertEquals(new HashSet<>(Arrays.asList("d0", "d5")), result2);
+ assertEquals(new HashSet<>(Collections.singletonList("a")), result3);
// if child node is nll will return null HashSet
Set<String> result5 = root.getChildNodeNameInNextLevel(new PartialPath("root.a.d5"));
@@ -693,6 +693,9 @@ public class MTreeTest {
assertEquals(2, root.getAllTimeseriesCount(new PartialPath("root.laptop.*.s1")));
assertEquals(0, root.getAllTimeseriesCount(new PartialPath("root.laptop.d1.s3")));
+ assertEquals(1, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.**.s1"), 1));
+ assertEquals(1, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 1));
+ assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 2));
assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*"), 2));
assertEquals(4, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.*.*"), 3));
assertEquals(2, root.getNodesCountInGivenLevel(new PartialPath("root.laptop.**"), 2));
@@ -936,6 +939,10 @@ public class MTreeTest {
Assert.assertEquals(
2, root.getNodesListInGivenLevel(new PartialPath("root.*.*"), 2, null).size());
Assert.assertEquals(
+ 2, root.getNodesListInGivenLevel(new PartialPath("root.*.*"), 1, null).size());
+ Assert.assertEquals(
+ 2, root.getNodesListInGivenLevel(new PartialPath("root.*.*.s1"), 2, null).size());
+ Assert.assertEquals(
1, root.getNodesListInGivenLevel(new PartialPath("root.*.**"), 2, filter).size());
}