Index: lucene/contrib/queries/src/java/org/apache/lucene/search/SlowCollatedStringComparator.java =================================================================== --- lucene/contrib/queries/src/java/org/apache/lucene/search/SlowCollatedStringComparator.java (revision 1140292) +++ lucene/contrib/queries/src/java/org/apache/lucene/search/SlowCollatedStringComparator.java (working copy) @@ -33,7 +33,7 @@ * This class will be removed in Lucene 5.0 */ @Deprecated -public final class SlowCollatedStringComparator extends FieldComparator { +public final class SlowCollatedStringComparator extends FieldComparator { private final String[] values; private DocTerms currentDocTerms; @@ -99,13 +99,12 @@ } @Override - public BytesRef value(int slot) { - final String s = values[slot]; - return s == null ? null : new BytesRef(values[slot]); + public String value(int slot) { + return values[slot]; } @Override - public int compareValues(BytesRef first, BytesRef second) { + public int compareValues(String first, String second) { if (first == null) { if (second == null) { return 0; Index: lucene/contrib/queries/src/test/org/apache/lucene/search/TestSlowCollationMethods.java =================================================================== --- lucene/contrib/queries/src/test/org/apache/lucene/search/TestSlowCollationMethods.java (revision 1140292) +++ lucene/contrib/queries/src/test/org/apache/lucene/search/TestSlowCollationMethods.java (working copy) @@ -41,6 +41,7 @@ private static IndexReader reader; private static Directory dir; private static int numDocs; + private static String splitDoc; @BeforeClass public static void beforeClass() throws Exception { @@ -59,6 +60,7 @@ doc.add(field); iw.addDocument(doc); } + splitDoc = _TestUtil.randomUnicodeString(random); reader = iw.getReader(); iw.close(); @@ -76,6 +78,15 @@ dir = null; } + private void doCheckSorting(TopDocs docs) throws Exception { + String prev = ""; + for (ScoreDoc doc : docs.scoreDocs) { + String value = reader.document(doc.doc).get("field"); + assertTrue(collator.compare(value, prev) >= 0); + prev = value; + } + } + public void testSort() throws Exception { SortField sf = new SortField("field", new FieldComparatorSource() { @Override @@ -83,13 +94,16 @@ return new SlowCollatedStringComparator(numHits, fieldname, collator); } }); - TopFieldDocs docs = searcher.search(new MatchAllDocsQuery(), null, numDocs, new Sort(sf)); - String prev = ""; - for (ScoreDoc doc : docs.scoreDocs) { - String value = reader.document(doc.doc).get("field"); - assertTrue(collator.compare(value, prev) >= 0); - prev = value; - } + final Sort sort = new Sort(sf); + + final TopDocs docs1 = searcher.search(TermRangeQuery.newStringRange("field", null, splitDoc, true, true), null, numDocs/(1+random.nextInt(4)), sort); + doCheckSorting(docs1); + + final TopDocs docs2 = searcher.search(TermRangeQuery.newStringRange("field", splitDoc, null, true, true), null, numDocs/(1+random.nextInt(4)), sort); + doCheckSorting(docs2); + + final TopDocs docs = TopDocs.merge(sort, numDocs/(1+random.nextInt(4)), new TopDocs[]{docs1, docs2}); + doCheckSorting(docs); } private void doTestRanges(String startPoint, String endPoint, Query query) throws Exception {