You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2017/12/08 07:25:58 UTC

svn commit: r1817462 - in /jackrabbit/oak/trunk/oak-run/src: main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java

Author: chetanm
Date: Fri Dec  8 07:25:58 2017
New Revision: 1817462

URL: http://svn.apache.org/viewvc?rev=1817462&view=rev
Log:
OAK-6353 - Use Document order traversal for reindexing performed on DocumentNodeStore setups

Support for preferred sorting

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java
    jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java?rev=1817462&r1=1817461&r2=1817462&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparator.java Fri Dec  8 07:25:58 2017
@@ -19,17 +19,31 @@
 
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile;
 
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
 
 public class PathElementComparator implements Comparator<Iterable<String>> {
+    private final Set<String> preferred;
+
+    public PathElementComparator() {
+        this(Collections.emptySet());
+    }
+
+    public PathElementComparator(Iterable<String> preferredPathElements) {
+        this.preferred = ImmutableSet.copyOf(preferredPathElements);
+    }
+
     @Override
     public int compare(Iterable<String> p1, Iterable<String> p2) {
         Iterator<String> i1 = p1.iterator();
         Iterator<String> i2 = p2.iterator();
 
         //Shorter paths come first i.e. first parent then children
-        //TODO Rank jcr:content higher i.e. first child
+        //Also Rank jcr:content higher i.e. first child
         while (i1.hasNext() || i2.hasNext()) {
             if (!i1.hasNext()) {
                 return -1;
@@ -37,7 +51,22 @@ public class PathElementComparator imple
             if (!i2.hasNext()) {
                 return 1;
             }
-            int compare = i1.next().compareTo(i2.next());
+
+            String pe1 = i1.next();
+            String pe2 = i2.next();
+
+            boolean pe1Preferred = preferred.contains(pe1);
+            boolean pe2Preferred = preferred.contains(pe2);
+
+            if (pe1Preferred && !pe2Preferred) {
+                return -1;
+            }
+
+            if (pe2Preferred && !pe1Preferred) {
+                return 1;
+            }
+
+            int compare = pe1.compareTo(pe2);
             if (compare != 0) {
                 return compare;
             }

Modified: jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java?rev=1817462&r1=1817461&r2=1817462&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/PathElementComparatorTest.java Fri Dec  8 07:25:58 2017
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.junit.Test;
 
@@ -44,15 +45,30 @@ public class PathElementComparatorTest {
     public void sort2() {
         assertSorted(asList("/a", "/a/b", "/a/b/c", "/d", "/e/f", "/g"));
         assertSorted(asList("/", "/a", "/a/b", "/a/b/c", "/d", "/e/f", "/g"));
+        assertSorted(asList("/", "/a", "/a/b", "/a/b/b", "/a/b/c", "/d", "/e/f", "/g"));
+        assertSorted(asList("/", "/a", "/a/b", "/a/b/bc", "/a/b/c", "/d", "/e/f", "/g"));
 
         //Duplicates
         assertSorted(asList("/", "/a", "/a", "/a/b", "/a/b/c", "/d", "/e/f", "/g"));
     }
 
+    @Test
+    public void preferredElements() throws Exception{
+        PathElementComparator c = new PathElementComparator(asList("jcr:content"));
+        assertEquals(asList("/a", "/a/jcr:content", "/a/b"), sortPaths(asList("/a/jcr:content", "/a/b", "/a"), c));
+
+        assertSorted(asList("/a", "/a/jcr:content", "/a/b"),c);
+        assertSorted(asList("/a", "/a/jcr:content", "/a/b", "/a/b/c", "/d", "/e/f", "/g"), c);
+    }
+
     private void assertSorted(List<String> sorted) {
+        assertSorted(sorted, new PathElementComparator());
+    }
+
+    private void assertSorted(List<String> sorted, Comparator<Iterable<String>> comparator) {
         List<String> copy = new ArrayList<>(sorted);
         Collections.shuffle(copy);
-        List<String> sortedNew = sortPaths(copy);
+        List<String> sortedNew = sortPaths(copy, comparator);
         assertEquals(sorted, sortedNew);
     }
 
@@ -61,7 +77,8 @@ public class PathElementComparatorTest {
     }
 
     private List<String> sortPaths(List<String> paths, Comparator<Iterable<String>> comparator) {
-        List<Iterable<String>> copy = paths.stream().map(PathUtils::elements).sorted(comparator).collect(Collectors.toList());
+        List<Iterable<String>> copy = paths.stream().map(p -> ImmutableList.copyOf(PathUtils.elements(p)))
+                .sorted(comparator).collect(Collectors.toList());
         Joiner j = Joiner.on('/');
         return copy.stream().map(e -> "/" + j.join(e)).collect(Collectors.toList());
     }