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()); }