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:03 UTC
[iotdb] branch fix_2363 created (now 195b9b1)
This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a change to branch fix_2363
in repository https://gitbox.apache.org/repos/asf/iotdb.git.
at 195b9b1 LEVEL can be specified at non-last level in metadata queries
This branch includes the following new commits:
new 195b9b1 LEVEL can be specified at non-last level in metadata queries
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[iotdb] 01/01: LEVEL can be specified at non-last level in metadata queries
Posted by ji...@apache.org.
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());
}