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"));


Reply via email to