Author: chetanm Date: Fri Jan 5 10:50:46 2018 New Revision: 1820278 URL: http://svn.apache.org/viewvc?rev=1820278&view=rev Log: OAK-7123 - ChildNodeStateProvider does not return all immediate children
Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProvider.java jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProviderTest.java Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProvider.java?rev=1820278&r1=1820277&r2=1820278&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProvider.java (original) +++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProvider.java Fri Jan 5 10:50:46 2018 @@ -39,6 +39,7 @@ import static com.google.common.collect. import static java.util.Collections.emptyIterator; import static org.apache.jackrabbit.oak.commons.PathUtils.getName; import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath; +import static org.apache.jackrabbit.oak.commons.PathUtils.isAncestor; import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.MISSING_NODE; class ChildNodeStateProvider { @@ -94,15 +95,19 @@ class ChildNodeStateProvider { "Did not found path [%s] in leftover iterator. Possibly node state accessed " + "after main iterator has moved past it", path); - return new AbstractIterator<NodeStateEntry>() { + //Prepare an iterator to fetch all child node paths i.e. immediate and there children + Iterator<NodeStateEntry> itr = new AbstractIterator<NodeStateEntry>() { @Override protected NodeStateEntry computeNext() { - if (pitr.hasNext() && isImmediateChild(pitr.peek().getPath())) { + if (pitr.hasNext() && isAncestor(path, pitr.peek().getPath())) { return pitr.next(); } return endOfData(); } }; + + //Filter out non immediate children + return Iterators.filter(itr, (e) -> isImmediateChild(e.getPath())); } private static String name(NodeStateEntry p) { Modified: jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProviderTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProviderTest.java?rev=1820278&r1=1820277&r2=1820278&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProviderTest.java (original) +++ jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/ChildNodeStateProviderTest.java Fri Jan 5 10:50:46 2018 @@ -81,12 +81,12 @@ public class ChildNodeStateProviderTest ChildNodeStateProvider p = new ChildNodeStateProvider(citr, "/a", 100); assertEquals(singletonList("b"), copyOf(childNames(p.children()))); - assertEquals(3, citr.getCount()); + assertEquals(5, citr.getCount()); citr.reset(); p = new ChildNodeStateProvider(citr, "/a/b", 100); assertEquals(singletonList("c"), copyOf(childNames(p.children()))); - assertEquals(4, citr.getCount()); + assertEquals(5, citr.getCount()); p = new ChildNodeStateProvider(citr, "/a/b/c", 100); assertEquals(singletonList("d"), copyOf(childNames(p.children()))); @@ -129,6 +129,17 @@ public class ChildNodeStateProviderTest } @Test + public void childNames2() { + Set<String> preferred = ImmutableSet.of("jcr:content"); + CountingIterable<NodeStateEntry> citr = createList(preferred, asList("/a", "/a/jcr:content", "/a/jcr:content/metadata", + "/a/c", "/a/c/status","/a/d", "/e", "/e/f")); + ChildNodeStateProvider p = new ChildNodeStateProvider(citr, "/a", 100); + + assertEquals(asList("jcr:content", "c", "d"), copyOf(childNames(p.children()))); + assertEquals(7, citr.getCount()); + } + + @Test public void childEntries() { Set<String> preferred = ImmutableSet.of("jcr:content"); CountingIterable<NodeStateEntry> citr = createList(preferred, asList("/a", "/a/jcr:content", "/a/c", "/a/d", "/e", "/e/f"));