This is an automated email from the ASF dual-hosted git repository.
Caideyipi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ce3ef055652 Fix schema recovery for single device attribute match
(#18490)
ce3ef055652 is described below
commit ce3ef055652489d83559495233b1251d59fc7b58
Author: Caideyipi <[email protected]>
AuthorDate: Wed Aug 26 12:24:37 2026 +0800
Fix schema recovery for single device attribute match (#18490)
---
.../iotdb/commons/schema/tree/AbstractTreeVisitor.java | 4 +++-
.../commons/schema/filter/impl/DeviceFilterUtilTest.java | 15 +++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
index 04f59402891..f1beb08095c 100644
---
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
+++
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/tree/AbstractTreeVisitor.java
@@ -571,9 +571,11 @@ public abstract class AbstractTreeVisitor<N extends
ITreeNode, R> implements Sch
this.transitionIterator = preciseMatchTransitionMap.values().iterator();
// Candidate counts are a rough cost estimate. Iterate the smaller side
so this remains
// adaptive without relying on unstable wall-clock thresholds. Prefer
child iteration on a
- // tie because it avoids a direct child lookup for every transition.
+ // tie because it avoids a direct child lookup for every transition. A
single candidate is
+ // kept on the direct-lookup path because enumerating one child has no
performance benefit.
this.iterateChildren =
patternFA.hasMultiExactMatchTransitions(sourceState)
+ && preciseMatchTransitionMap.size() > 1
&& getChildrenSize(parent) <= preciseMatchTransitionMap.size();
}
diff --git
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/filter/impl/DeviceFilterUtilTest.java
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/filter/impl/DeviceFilterUtilTest.java
index b74d7f007fd..af4c7e17e89 100644
---
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/filter/impl/DeviceFilterUtilTest.java
+++
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/filter/impl/DeviceFilterUtilTest.java
@@ -215,6 +215,21 @@ public class DeviceFilterUtilTest {
Assert.assertEquals(1, visitor.getTargetChildrenIterationCount());
}
+ @Test
+ public void testUseDirectLookupForSingleCandidate() {
+ final TestNode root = new TestNode("root");
+ final TestNode parent = new TestNode("meter");
+ root.addChild(parent);
+ parent.addChildren("card1");
+
+ final TestVisitor visitor =
+ new TestVisitor(root, createAdaptivePattern(Set.of("card1")), parent);
+
+ Assert.assertEquals(Collections.singletonList("card1"), collect(visitor));
+ Assert.assertEquals(1, visitor.getTargetDirectLookupCount());
+ Assert.assertEquals(0, visitor.getTargetChildrenIterationCount());
+ }
+
private static ExtendedPartialPath createAdaptivePattern(final Set<String>
values) {
final ExtendedPartialPath pattern =
new ExtendedPartialPath(new String[] {"root", "*", "*"}, true);