Index: lucene/misc/src/java/org/apache/lucene/index/sorter/Sorter.java =================================================================== --- lucene/misc/src/java/org/apache/lucene/index/sorter/Sorter.java (revision 1466166) +++ lucene/misc/src/java/org/apache/lucene/index/sorter/Sorter.java (working copy) @@ -81,6 +81,47 @@ } + /** Sorts documents in reverse order of a wrapped {@link Sorter}. */ + public static final class ReverseOrderSorter extends Sorter { + + private final Sorter in; + + public ReverseOrderSorter(Sorter in) { + if (in == REVERSE_DOCS || in instanceof ReverseOrderSorter) { + throw new IllegalArgumentException("reversing the order of a reversing sorter doesn't make any sense!"); + } + this.in = in; + } + + @Override + public DocMap sort(final AtomicReader reader) throws IOException { + final int maxDoc = reader.maxDoc(); + final DocMap inMap = in.sort(reader); + return new DocMap() { + @Override + public int oldToNew(int docID) { + return maxDoc - inMap.oldToNew(docID) - 1; + } + + @Override + public int newToOld(int docID) { + return inMap.newToOld(maxDoc - docID -1); + } + + @Override + public int size() { + return inMap.size(); + } + + }; + } + + @Override + public String getID() { + return "Reverse(" + in.getID() + ")"; + } + } + /** Sorts documents in reverse order. * NOTE: This {@link Sorter} is not idempotent. Sorting an * {@link AtomicReader} once or twice will return two different @@ -111,7 +152,7 @@ return "ReverseDocs"; } }; - + private static final class DocValueSorterTemplate extends SorterTemplate { private final int[] docs; Index: lucene/misc/src/test/org/apache/lucene/index/sorter/IndexSortingTest.java =================================================================== --- lucene/misc/src/test/org/apache/lucene/index/sorter/IndexSortingTest.java (revision 1466166) +++ lucene/misc/src/test/org/apache/lucene/index/sorter/IndexSortingTest.java (working copy) @@ -52,6 +52,10 @@ Collections.reverse(values); } else { Collections.sort(values); + if (random().nextBoolean()) { + sorter = new Sorter.ReverseOrderSorter(sorter); + Collections.reverse(values); + } } sortedValues = values.toArray(new Integer[values.size()]); if (VERBOSE) {