diff -ruN -x .svn -x build trunk/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java missinglast/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java --- trunk/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java 2014-01-14 15:19:41.696364670 -0500 +++ missinglast/lucene/core/src/java/org/apache/lucene/search/FieldComparator.java 2014-01-15 16:02:37.357984482 -0500 @@ -62,6 +62,18 @@ *
  • {@link #compareBottom} Compare a new hit (docID) * against the "weakest" (bottom) entry in the queue. * + *
  • {@link #setTopValue} This method is called by + * {@link TopFieldCollector} to notify the + * FieldComparator of the top most value, which is + * used by future calls to {@link #compareTop}. + * + *
  • {@link #compareBottom} Compare a new hit (docID) + * against the "weakest" (bottom) entry in the queue. + * + *
  • {@link #compareTop} Compare a new hit (docID) + * against the top value previously set by a call to + * {@link #setTopValue}. + * *
  • {@link #copy} Installs a new hit into the * priority queue. The {@link FieldValueHitQueue} * calls this method when a new hit is competitive. @@ -104,7 +116,15 @@ public abstract void setBottom(final int slot); /** - * Compare the bottom of the queue with doc. This will + * Record the top value, for future calls to {@link + * #compareTop}. This is only called for searches that + * use searchAfter (deep paging), and is called before any + * calls to {@link #setNextReader}. + */ + public abstract void setTopValue(T value); + + /** + * Compare the bottom of the queue with this doc. This will * only invoked after setBottom has been called. This * should return the same result as {@link * #compare(int,int)}} as if bottom were slot1 and the new @@ -123,6 +143,22 @@ public abstract int compareBottom(int doc) throws IOException; /** + * Compare the top value with this doc. This will + * only invoked after setTopValue has been called. This + * should return the same result as {@link + * #compare(int,int)}} as if topValue were slot1 and the new + * document were slot 2. This is only called for searches that + * use searchAfter (deep paging). + * + * @param doc that was hit + * @return any N < 0 if the doc's value is sorted after + * the bottom entry (not competitive), any N > 0 if the + * doc's value is sorted before the bottom entry and 0 if + * they are equal. + */ + public abstract int compareTop(int doc) throws IOException; + + /** * This method is called when a new hit is competitive. * You should copy any state associated with this document * that will be required for future comparisons, into the @@ -184,10 +220,6 @@ } } - /** Returns negative result if the doc's value is less - * than the provided value. */ - public abstract int compareDocToValue(int doc, T value) throws IOException; - /** * Base FieldComparator class for numeric types */ @@ -223,6 +255,7 @@ private final DoubleParser parser; private FieldCache.Doubles currentReaderValues; private double bottom; + private double topValue; DoubleComparator(int numHits, String field, FieldCache.Parser parser, Double missingValue) { super(field, missingValue); @@ -273,20 +306,24 @@ } @Override + public void setTopValue(Double value) { + topValue = value; + } + + @Override public Double value(int slot) { return Double.valueOf(values[slot]); } @Override - public int compareDocToValue(int doc, Double valueObj) { - final double value = valueObj.doubleValue(); + public int compareTop(int doc) { double docValue = currentReaderValues.get(doc); // Test for docValue == 0 to save Bits.get method call for // the common case (doc has value and value is non-zero): if (docsWithField != null && docValue == 0 && !docsWithField.get(doc)) { docValue = missingValue; } - return Double.compare(docValue, value); + return Double.compare(topValue, docValue); } } @@ -297,6 +334,7 @@ private final FloatParser parser; private FieldCache.Floats currentReaderValues; private float bottom; + private float topValue; FloatComparator(int numHits, String field, FieldCache.Parser parser, Float missingValue) { super(field, missingValue); @@ -348,20 +386,24 @@ } @Override + public void setTopValue(Float value) { + topValue = value; + } + + @Override public Float value(int slot) { return Float.valueOf(values[slot]); } @Override - public int compareDocToValue(int doc, Float valueObj) { - final float value = valueObj.floatValue(); + public int compareTop(int doc) { float docValue = currentReaderValues.get(doc); // Test for docValue == 0 to save Bits.get method call for // the common case (doc has value and value is non-zero): if (docsWithField != null && docValue == 0 && !docsWithField.get(doc)) { docValue = missingValue; } - return Float.compare(docValue, value); + return Float.compare(topValue, docValue); } } @@ -372,6 +414,7 @@ private final IntParser parser; private FieldCache.Ints currentReaderValues; private int bottom; // Value of bottom of queue + private int topValue; IntComparator(int numHits, String field, FieldCache.Parser parser, Integer missingValue) { super(field, missingValue); @@ -422,20 +465,24 @@ } @Override + public void setTopValue(Integer value) { + topValue = value; + } + + @Override public Integer value(int slot) { return Integer.valueOf(values[slot]); } @Override - public int compareDocToValue(int doc, Integer valueObj) { - final int value = valueObj.intValue(); + public int compareTop(int doc) { int docValue = currentReaderValues.get(doc); // Test for docValue == 0 to save Bits.get method call for // the common case (doc has value and value is non-zero): if (docsWithField != null && docValue == 0 && !docsWithField.get(doc)) { docValue = missingValue; } - return Integer.compare(docValue, value); + return Integer.compare(topValue, docValue); } } @@ -446,6 +493,7 @@ private final LongParser parser; private FieldCache.Longs currentReaderValues; private long bottom; + private long topValue; LongComparator(int numHits, String field, FieldCache.Parser parser, Long missingValue) { super(field, missingValue); @@ -498,20 +546,24 @@ } @Override + public void setTopValue(Long value) { + topValue = value; + } + + @Override public Long value(int slot) { return Long.valueOf(values[slot]); } @Override - public int compareDocToValue(int doc, Long valueObj) { - final long value = valueObj.longValue(); + public int compareTop(int doc) { long docValue = currentReaderValues.get(doc); // Test for docValue == 0 to save Bits.get method call for // the common case (doc has value and value is non-zero): if (docsWithField != null && docValue == 0 && !docsWithField.get(doc)) { docValue = missingValue; } - return Long.compare(docValue, value); + return Long.compare(topValue, docValue); } } @@ -525,7 +577,8 @@ private final float[] scores; private float bottom; private Scorer scorer; - + private float topValue; + RelevanceComparator(int numHits) { scores = new float[numHits]; } @@ -559,6 +612,11 @@ } @Override + public void setTopValue(Float value) { + topValue = value; + } + + @Override public void setScorer(Scorer scorer) { // wrap with a ScoreCachingWrappingScorer so that successive calls to // score() will not incur score computation over and @@ -584,11 +642,10 @@ } @Override - public int compareDocToValue(int doc, Float valueObj) throws IOException { - final float value = valueObj.floatValue(); + public int compareTop(int doc) throws IOException { float docValue = scorer.score(); assert !Float.isNaN(docValue); - return Float.compare(value, docValue); + return Float.compare(docValue, topValue); } } @@ -597,6 +654,7 @@ private final int[] docIDs; private int docBase; private int bottom; + private int topValue; DocComparator(int numHits) { docIDs = new int[numHits]; @@ -634,15 +692,19 @@ } @Override + public void setTopValue(Integer value) { + topValue = value; + } + + @Override public Integer value(int slot) { return Integer.valueOf(docIDs[slot]); } @Override - public int compareDocToValue(int doc, Integer valueObj) { - final int value = valueObj.intValue(); + public int compareTop(int doc) { int docValue = docBase + doc; - return Integer.compare(docValue, value); + return Integer.compare(topValue, docValue); } } @@ -700,13 +762,42 @@ @lucene.internal */ BytesRef bottomValue; + /** Set by setTopValue. */ + BytesRef topValue; + boolean topSameReader; + int topOrd; + + private int docBase; + final BytesRef tempBR = new BytesRef(); + /** -1 if missing values are sorted first, 1 if they are + * sorted last */ + final int missingSortCmp; + + /** Which ordinal to use for a missing value. */ + final int missingOrd; + + /** Creates this, sorting missing values first. */ public TermOrdValComparator(int numHits, String field) { + this(numHits, field, false); + } + + /** Creates this, with control over how missing values + * are sorted. Pass sortMissingLast=true to put + * missing values at the end. */ + public TermOrdValComparator(int numHits, String field, boolean sortMissingLast) { ords = new int[numHits]; values = new BytesRef[numHits]; readerGen = new int[numHits]; this.field = field; + if (sortMissingLast) { + missingSortCmp = 1; + missingOrd = Integer.MAX_VALUE; + } else { + missingSortCmp = -1; + missingOrd = -1; + } } @Override @@ -721,140 +812,78 @@ if (val2 == null) { return 0; } - return -1; + return missingSortCmp; } else if (val2 == null) { - return 1; + return -missingSortCmp; } return val1.compareTo(val2); } @Override public int compareBottom(int doc) { - throw new UnsupportedOperationException(); + assert bottomSlot != -1; + int docOrd = termsIndex.getOrd(doc); + if (docOrd == -1) { + docOrd = missingOrd; + } + if (bottomSameReader) { + // ord is precisely comparable, even in the equal case + return bottomOrd - docOrd; + } else if (bottomOrd >= docOrd) { + // the equals case always means bottom is > doc + // (because we set bottomOrd to the lower bound in + // setBottom): + return 1; + } else { + return -1; + } } @Override public void copy(int slot, int doc) { - throw new UnsupportedOperationException(); - } - - @Override - public int compareDocToValue(int doc, BytesRef value) { int ord = termsIndex.getOrd(doc); if (ord == -1) { - if (value == null) { - return 0; - } - return -1; - } else if (value == null) { - return 1; - } - termsIndex.lookupOrd(ord, tempBR); - return tempBR.compareTo(value); - } - - /** Base class for specialized (per bit width of the - * ords) per-segment comparator. NOTE: this is messy; - * we do this only because hotspot can't reliably inline - * the underlying array access when looking up doc->ord - * @lucene.internal - */ - abstract class PerSegmentComparator extends FieldComparator { - - @Override - public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { - return TermOrdValComparator.this.setNextReader(context); - } - - @Override - public int compare(int slot1, int slot2) { - return TermOrdValComparator.this.compare(slot1, slot2); - } - - @Override - public void setBottom(final int bottom) { - TermOrdValComparator.this.setBottom(bottom); - } - - @Override - public BytesRef value(int slot) { - return TermOrdValComparator.this.value(slot); - } - - @Override - public int compareValues(BytesRef val1, BytesRef val2) { - if (val1 == null) { - if (val2 == null) { - return 0; - } - return -1; - } else if (val2 == null) { - return 1; + ord = missingOrd; + values[slot] = null; + } else { + assert ord >= 0; + if (values[slot] == null) { + values[slot] = new BytesRef(); } - return val1.compareTo(val2); - } - - @Override - public int compareDocToValue(int doc, BytesRef value) { - return TermOrdValComparator.this.compareDocToValue(doc, value); + termsIndex.lookupOrd(ord, values[slot]); } + ords[slot] = ord; + readerGen[slot] = currentReaderGen; } + + @Override + public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { + docBase = context.docBase; + termsIndex = FieldCache.DEFAULT.getTermsIndex(context.reader(), field); + currentReaderGen++; - // Used per-segment when docToOrd is null: - private final class AnyOrdComparator extends PerSegmentComparator { - private final SortedDocValues termsIndex; - private final int docBase; - - public AnyOrdComparator(SortedDocValues termsIndex, int docBase) { - this.termsIndex = termsIndex; - this.docBase = docBase; - } - - @Override - public int compareBottom(int doc) { - assert bottomSlot != -1; - final int docOrd = termsIndex.getOrd(doc); - if (bottomSameReader) { - // ord is precisely comparable, even in the equal case - return bottomOrd - docOrd; - } else if (bottomOrd >= docOrd) { - // the equals case always means bottom is > doc - // (because we set bottomOrd to the lower bound in - // setBottom): - return 1; - } else { - return -1; - } - } - - @Override - public void copy(int slot, int doc) { - final int ord = termsIndex.getOrd(doc); - ords[slot] = ord; - if (ord == -1) { - values[slot] = null; + if (topValue != null) { + // Recompute topOrd/SameReader + int ord = termsIndex.lookupTerm(topValue); + if (ord >= 0) { + topSameReader = true; + topOrd = ord; } else { - assert ord >= 0; - if (values[slot] == null) { - values[slot] = new BytesRef(); - } - termsIndex.lookupOrd(ord, values[slot]); + topSameReader = false; + topOrd = -ord-2; } - readerGen[slot] = currentReaderGen; + } else { + topOrd = missingOrd; + topSameReader = true; } - } + //System.out.println(" setNextReader topOrd=" + topOrd + " topSameReader=" + topSameReader); - @Override - public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { - final int docBase = context.docBase; - termsIndex = FieldCache.DEFAULT.getTermsIndex(context.reader(), field); - FieldComparator perSegComp = new AnyOrdComparator(termsIndex, docBase); - currentReaderGen++; if (bottomSlot != -1) { - perSegComp.setBottom(bottomSlot); + // Recompute bottomOrd/SameReader + setBottom(bottomSlot); } - return perSegComp; + return this; } @Override @@ -867,18 +896,18 @@ bottomSameReader = true; } else { if (bottomValue == null) { - // -1 ord is null for all segments - assert ords[bottomSlot] == -1; - bottomOrd = -1; + // missingOrd is null for all segments + assert ords[bottomSlot] == missingOrd; + bottomOrd = missingOrd; bottomSameReader = true; readerGen[bottomSlot] = currentReaderGen; } else { - final int index = termsIndex.lookupTerm(bottomValue); - if (index < 0) { - bottomOrd = -index - 2; + final int ord = termsIndex.lookupTerm(bottomValue); + if (ord < 0) { + bottomOrd = -ord - 2; bottomSameReader = false; } else { - bottomOrd = index; + bottomOrd = ord; // exact value match bottomSameReader = true; readerGen[bottomSlot] = currentReaderGen; @@ -889,27 +918,76 @@ } @Override + public void setTopValue(BytesRef value) { + // null is fine: it means the last doc of the prior + // search was missing this value + topValue = value; + //System.out.println("setTopValue " + topValue); + } + + @Override public BytesRef value(int slot) { return values[slot]; } + + @Override + public int compareTop(int doc) { + + int ord = termsIndex.getOrd(doc); + if (ord == -1) { + ord = missingOrd; + } + + if (topSameReader) { + // ord is precisely comparable, even in the equal + // case + //System.out.println("compareTop doc=" + doc + " ord=" + ord + " ret=" + (topOrd-ord)); + return topOrd - ord; + } else if (ord <= topOrd) { + // the equals case always means doc is < value + // (because we set lastOrd to the lower bound) + return 1; + } else { + return -1; + } + } + + @Override + public int compareValues(BytesRef val1, BytesRef val2) { + if (val1 == null) { + if (val2 == null) { + return 0; + } + return missingSortCmp; + } else if (val2 == null) { + return -missingSortCmp; + } + return val1.compareTo(val2); + } } - // just used internally in this comparator - private static final byte[] MISSING_BYTES = new byte[0]; - /** Sorts by field's natural Term sort order. All * comparisons are done using BytesRef.compareTo, which is * slow for medium to large result sets but possibly * very fast for very small results sets. */ + // TODO: should we remove this? who really uses it? public static final class TermValComparator extends FieldComparator { + // sentinels, just used internally in this comparator + private static final byte[] MISSING_BYTES = new byte[0]; + private static final byte[] NON_MISSING_BYTES = new byte[0]; + private BytesRef[] values; private BinaryDocValues docTerms; private Bits docsWithField; private final String field; private BytesRef bottom; + private BytesRef topValue; private final BytesRef tempBR = new BytesRef(); + // TODO: add missing first/last support here? + + /** Sole constructor. */ TermValComparator(int numHits, String field) { values = new BytesRef[numHits]; this.field = field; @@ -919,12 +997,12 @@ public int compare(int slot1, int slot2) { final BytesRef val1 = values[slot1]; final BytesRef val2 = values[slot2]; - if (val1 == null) { - if (val2 == null) { + if (val1.bytes == MISSING_BYTES) { + if (val2.bytes == MISSING_BYTES) { return 0; } return -1; - } else if (val2 == null) { + } else if (val2.bytes == MISSING_BYTES) { return 1; } @@ -934,18 +1012,8 @@ @Override public int compareBottom(int doc) { docTerms.get(doc, tempBR); - if (tempBR.length == 0 && docsWithField.get(doc) == false) { - tempBR.bytes = MISSING_BYTES; - } - if (bottom.bytes == MISSING_BYTES) { - if (tempBR.bytes == MISSING_BYTES) { - return 0; - } - return -1; - } else if (tempBR.bytes == MISSING_BYTES) { - return 1; - } - return bottom.compareTo(tempBR); + setMissingBytes(doc, tempBR); + return compareValues(bottom, tempBR); } @Override @@ -954,9 +1022,7 @@ values[slot] = new BytesRef(); } docTerms.get(doc, values[slot]); - if (values[slot].length == 0 && docsWithField.get(doc) == false) { - values[slot].bytes = MISSING_BYTES; - } + setMissingBytes(doc, values[slot]); } @Override @@ -972,30 +1038,48 @@ } @Override + public void setTopValue(BytesRef value) { + if (value == null) { + throw new IllegalArgumentException("value cannot be null"); + } + topValue = value; + } + + @Override public BytesRef value(int slot) { return values[slot]; } @Override public int compareValues(BytesRef val1, BytesRef val2) { - if (val1 == null) { - if (val2 == null) { + // missing always sorts first: + if (val1.bytes == MISSING_BYTES) { + if (val2.bytes == MISSING_BYTES) { return 0; } return -1; - } else if (val2 == null) { + } else if (val2.bytes == MISSING_BYTES) { return 1; } return val1.compareTo(val2); } @Override - public int compareDocToValue(int doc, BytesRef value) { + public int compareTop(int doc) { docTerms.get(doc, tempBR); - if (tempBR.length == 0 && docsWithField.get(doc) == false) { - tempBR.bytes = MISSING_BYTES; + setMissingBytes(doc, tempBR); + return compareValues(topValue, tempBR); + } + + private void setMissingBytes(int doc, BytesRef br) { + if (br.length == 0) { + br.offset = 0; + if (docsWithField.get(doc) == false) { + br.bytes = MISSING_BYTES; + } else { + br.bytes = NON_MISSING_BYTES; + } } - return tempBR.compareTo(value); } } } diff -ruN -x .svn -x build trunk/lucene/core/src/java/org/apache/lucene/search/FieldDoc.java missinglast/lucene/core/src/java/org/apache/lucene/search/FieldDoc.java --- trunk/lucene/core/src/java/org/apache/lucene/search/FieldDoc.java 2012-07-21 08:52:57.205098753 -0400 +++ missinglast/lucene/core/src/java/org/apache/lucene/search/FieldDoc.java 2014-01-15 13:03:21.822272201 -0500 @@ -17,6 +17,8 @@ * limitations under the License. */ +import java.util.Arrays; + /** * Expert: A ScoreDoc which also contains information about * how to sort the referenced document. In addition to the @@ -69,14 +71,10 @@ @Override public String toString() { // super.toString returns the doc and score information, so just add the - // fields information + // fields information StringBuilder sb = new StringBuilder(super.toString()); - sb.append("["); - for (int i = 0; i < fields.length; i++) { - sb.append(fields[i]).append(", "); - } - sb.setLength(sb.length() - 2); // discard last ", " - sb.append("]"); + sb.append(" fields="); + sb.append(Arrays.toString(fields)); return sb.toString(); } } diff -ruN -x .svn -x build trunk/lucene/core/src/java/org/apache/lucene/search/SortField.java missinglast/lucene/core/src/java/org/apache/lucene/search/SortField.java --- trunk/lucene/core/src/java/org/apache/lucene/search/SortField.java 2013-09-23 08:26:33.892802632 -0400 +++ missinglast/lucene/core/src/java/org/apache/lucene/search/SortField.java 2014-01-15 19:01:23.985697531 -0500 @@ -106,6 +106,9 @@ // Used for 'sortMissingFirst/Last' public Object missingValue = null; + // Only used with type=STRING + public boolean sortMissingLast; + /** Creates a sort by terms in the given field with the type of term * values explicitly given. * @param field Name of field to sort by. Can be null if @@ -165,13 +168,34 @@ this.reverse = reverse; this.parser = parser; } + + /** Pass this to {@link #setMissingValue} to have missing + * string values sort first. */ + public final static Object STRING_FIRST = new Object() { + @Override + public String toString() { + return "SortField.STRING_FIRST"; + } + }; - public SortField setMissingValue(Object missingValue) { - if (type != Type.INT && type != Type.FLOAT && type != Type.LONG && type != Type.DOUBLE) { - throw new IllegalArgumentException( "Missing value only works for numeric types" ); + /** Pass this to {@link #setMissingValue} to have missing + * string values sort last. */ + public final static Object STRING_LAST = new Object() { + @Override + public String toString() { + return "SortField.STRING_LAST"; + } + }; + + public void setMissingValue(Object missingValue) { + if (type == Type.STRING) { + if (missingValue != STRING_FIRST && missingValue != STRING_LAST) { + throw new IllegalArgumentException("For STRING type, missing value must be either STRING_FIRST or STRING_LAST"); + } + } else if (type != Type.INT && type != Type.FLOAT && type != Type.LONG && type != Type.DOUBLE) { + throw new IllegalArgumentException("Missing value only works for numeric or STRING types"); } this.missingValue = missingValue; - return this; } /** Creates a sort with a custom comparison function. @@ -294,6 +318,10 @@ } if (reverse) buffer.append('!'); + if (missingValue != null) { + buffer.append(" missingValue="); + buffer.append(missingValue); + } return buffer.toString(); } @@ -376,9 +404,10 @@ return comparatorSource.newComparator(field, numHits, sortPos, reverse); case STRING: - return new FieldComparator.TermOrdValComparator(numHits, field); + return new FieldComparator.TermOrdValComparator(numHits, field, missingValue == STRING_LAST); case STRING_VAL: + // TODO: should we remove this? who really uses it? return new FieldComparator.TermValComparator(numHits, field); case REWRITEABLE: diff -ruN -x .svn -x build trunk/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java missinglast/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java --- trunk/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java 2013-09-23 08:26:38.492802514 -0400 +++ missinglast/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java 2014-01-15 13:48:35.254199614 -0500 @@ -869,6 +869,13 @@ // Must set maxScore to NEG_INF, or otherwise Math.max always returns NaN. maxScore = Float.NEGATIVE_INFINITY; + + // Tell all comparators their top value: + for(int i=0;i comparator = (FieldComparator) comparators[i]; + comparator.setTopValue(after.fields[i]); + } } void updateBottom(int doc, float score) { @@ -880,37 +887,9 @@ @SuppressWarnings({"unchecked", "rawtypes"}) @Override public void collect(int doc) throws IOException { - totalHits++; - //System.out.println(" collect doc=" + doc); - // Check if this hit was already collected on a - // previous page: - boolean sameValues = true; - for(int compIDX=0;compIDX 0) { - // Not yet collected - sameValues = false; - //System.out.println(" keep: after"); - break; - } - } - - // Tie-break by docID: - if (sameValues && doc <= afterDoc) { - // Already collected on a previous page - //System.out.println(" skip: tie-break"); - return; - } - - collectedHits++; + totalHits++; float score = Float.NaN; if (trackMaxScore) { @@ -921,7 +900,8 @@ } if (queueFull) { - // Fastmatch: return if this hit is not competitive + // Fastmatch: return if this hit is no better than + // the worst hit currently in the queue: for (int i = 0;; i++) { final int c = reverseMul[i] * comparators[i].compareBottom(doc); if (c < 0) { @@ -939,7 +919,35 @@ break; } } + } + + // Check if this hit was already collected on a + // previous page: + boolean sameValues = true; + for(int compIDX=0;compIDX 0) { + // Already collected on a previous page + //System.out.println(" skip: before"); + return; + } else if (cmp < 0) { + // Not yet collected + sameValues = false; + //System.out.println(" keep: after; reverseMul=" + reverseMul[compIDX]); + break; + } + } + // Tie-break by docID: + if (sameValues && doc <= afterDoc) { + // Already collected on a previous page + //System.out.println(" skip: tie-break"); + return; + } + + if (queueFull) { // This hit is competitive - replace bottom element in queue & adjustTop for (int i = 0; i < comparators.length; i++) { comparators[i].copy(bottom.slot, doc); @@ -955,6 +963,8 @@ comparators[i].setBottom(bottom.slot); } } else { + collectedHits++; + // Startup transient: queue hasn't gathered numHits yet final int slot = collectedHits - 1; //System.out.println(" slot=" + slot); diff -ruN -x .svn -x build trunk/lucene/core/src/java/org/apache/lucene/util/UnicodeUtil.java missinglast/lucene/core/src/java/org/apache/lucene/util/UnicodeUtil.java --- trunk/lucene/core/src/java/org/apache/lucene/util/UnicodeUtil.java 2014-01-14 10:43:05.348808639 -0500 +++ missinglast/lucene/core/src/java/org/apache/lucene/util/UnicodeUtil.java 2014-01-15 13:03:23.134272167 -0500 @@ -96,7 +96,7 @@ public final class UnicodeUtil { /** A binary term consisting of a number of 0xff bytes, likely to be bigger than other terms - * one would normally encounter, and definitely bigger than any UTF-8 terms. + * (e.g. collation keys) one would normally encounter, and definitely bigger than any UTF-8 terms. *

    * WARNING: This is not a valid UTF8 Term **/ diff -ruN -x .svn -x build trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java missinglast/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java --- trunk/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java 2013-07-15 15:52:16.681877414 -0400 +++ missinglast/lucene/core/src/test/org/apache/lucene/search/JustCompileSearch.java 2014-01-15 13:03:20.238272245 -0500 @@ -146,6 +146,11 @@ } @Override + public void setTopValue(Object value) { + throw new UnsupportedOperationException(UNSUPPORTED_MSG); + } + + @Override public FieldComparator setNextReader(AtomicReaderContext context) { throw new UnsupportedOperationException(UNSUPPORTED_MSG); } @@ -156,7 +161,7 @@ } @Override - public int compareDocToValue(int doc, Object value) { + public int compareTop(int doc) { throw new UnsupportedOperationException(UNSUPPORTED_MSG); } } diff -ruN -x .svn -x build trunk/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java missinglast/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java --- trunk/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java 2013-02-20 13:38:17.868711923 -0500 +++ missinglast/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java 2014-01-15 13:03:20.210272244 -0500 @@ -157,6 +157,11 @@ bottomVal = values[slot]; } + @Override + public void setTopValue(Integer value) { + throw new UnsupportedOperationException(); + } + private int docVal(int doc) { int ord = idIndex.getOrd(doc); if (ord == -1) { @@ -190,11 +195,8 @@ } @Override - public int compareDocToValue(int doc, Integer valueObj) { - final int value = valueObj.intValue(); - final int docValue = docVal(doc); - // values will be small enough that there is no overflow concern - return value - docValue; + public int compareTop(int doc) { + throw new UnsupportedOperationException(); } }; } diff -ruN -x .svn -x build trunk/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java missinglast/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java --- trunk/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java 2013-09-23 08:26:38.512802512 -0400 +++ missinglast/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java 2014-01-15 14:59:19.462086076 -0500 @@ -17,7 +17,10 @@ * limitations under the License. */ +import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import org.apache.lucene.document.BinaryDocValuesField; import org.apache.lucene.document.Document; @@ -29,6 +32,7 @@ import org.apache.lucene.document.LongField; import org.apache.lucene.document.NumericDocValuesField; import org.apache.lucene.document.SortedDocValuesField; +import org.apache.lucene.document.StoredField; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.RandomIndexWriter; import org.apache.lucene.index.Term; @@ -45,39 +49,127 @@ private Directory dir; private IndexReader reader; private IndexSearcher searcher; + private int iter; + private List allSortFields; @Override public void setUp() throws Exception { super.setUp(); + + allSortFields = new ArrayList(Arrays.asList(new SortField[] { + new SortField("int", SortField.Type.INT, false), + new SortField("long", SortField.Type.LONG, false), + new SortField("float", SortField.Type.FLOAT, false), + new SortField("double", SortField.Type.DOUBLE, false), + new SortField("bytes", SortField.Type.STRING, false), + new SortField("bytesval", SortField.Type.STRING_VAL, false), + new SortField("intdocvalues", SortField.Type.INT, false), + new SortField("floatdocvalues", SortField.Type.FLOAT, false), + new SortField("sortedbytesdocvalues", SortField.Type.STRING, false), + new SortField("sortedbytesdocvaluesval", SortField.Type.STRING_VAL, false), + new SortField("straightbytesdocvalues", SortField.Type.STRING_VAL, false), + new SortField("int", SortField.Type.INT, true), + new SortField("long", SortField.Type.LONG, true), + new SortField("float", SortField.Type.FLOAT, true), + new SortField("double", SortField.Type.DOUBLE, true), + new SortField("bytes", SortField.Type.STRING, true), + new SortField("bytesval", SortField.Type.STRING_VAL, true), + new SortField("intdocvalues", SortField.Type.INT, true), + new SortField("floatdocvalues", SortField.Type.FLOAT, true), + new SortField("sortedbytesdocvalues", SortField.Type.STRING, true), + new SortField("sortedbytesdocvaluesval", SortField.Type.STRING_VAL, true), + new SortField("straightbytesdocvalues", SortField.Type.STRING_VAL, true), + SortField.FIELD_SCORE, + SortField.FIELD_DOC, + })); + + // Also test missing first / last for the "string" sorts: + for(String field : new String[] {"bytes", "sortedbytesdocvalues"}) { + for(int rev=0;rev<2;rev++) { + boolean reversed = rev == 0; + SortField sf = new SortField(field, SortField.Type.STRING, reversed); + sf.setMissingValue(SortField.STRING_FIRST); + allSortFields.add(sf); + + sf = new SortField(field, SortField.Type.STRING, reversed); + sf.setMissingValue(SortField.STRING_LAST); + allSortFields.add(sf); + } + } + + int limit = allSortFields.size(); + for(int i=0;i fields = new ArrayList(); + fields.add(newTextField("english", English.intToEnglish(i), Field.Store.NO)); + fields.add(newTextField("oddeven", (i % 2 == 0) ? "even" : "odd", Field.Store.NO)); + fields.add(newStringField("byte", "" + ((byte) random().nextInt()), Field.Store.NO)); + fields.add(newStringField("short", "" + ((short) random().nextInt()), Field.Store.NO)); + fields.add(new IntField("int", random().nextInt(), Field.Store.NO)); + fields.add(new LongField("long", random().nextLong(), Field.Store.NO)); + + fields.add(new FloatField("float", random().nextFloat(), Field.Store.NO)); + fields.add(new DoubleField("double", random().nextDouble(), Field.Store.NO)); + fields.add(newStringField("bytes", _TestUtil.randomRealisticUnicodeString(random()), Field.Store.NO)); + fields.add(newStringField("bytesval", _TestUtil.randomRealisticUnicodeString(random()), Field.Store.NO)); + fields.add(new DoubleField("double", random().nextDouble(), Field.Store.NO)); + + fields.add(new NumericDocValuesField("intdocvalues", random().nextInt())); + fields.add(new FloatDocValuesField("floatdocvalues", random().nextFloat())); + fields.add(new SortedDocValuesField("sortedbytesdocvalues", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); + fields.add(new SortedDocValuesField("sortedbytesdocvaluesval", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); + fields.add(new BinaryDocValuesField("straightbytesdocvalues", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); + Document document = new Document(); - document.add(newTextField("english", English.intToEnglish(i), Field.Store.NO)); - document.add(newTextField("oddeven", (i % 2 == 0) ? "even" : "odd", Field.Store.NO)); - document.add(newStringField("byte", "" + ((byte) random().nextInt()), Field.Store.NO)); - document.add(newStringField("short", "" + ((short) random().nextInt()), Field.Store.NO)); - document.add(new IntField("int", random().nextInt(), Field.Store.NO)); - document.add(new LongField("long", random().nextLong(), Field.Store.NO)); - - document.add(new FloatField("float", random().nextFloat(), Field.Store.NO)); - document.add(new DoubleField("double", random().nextDouble(), Field.Store.NO)); - document.add(newStringField("bytes", _TestUtil.randomRealisticUnicodeString(random()), Field.Store.NO)); - document.add(newStringField("bytesval", _TestUtil.randomRealisticUnicodeString(random()), Field.Store.NO)); - document.add(new DoubleField("double", random().nextDouble(), Field.Store.NO)); - - document.add(new NumericDocValuesField("intdocvalues", random().nextInt())); - document.add(new FloatDocValuesField("floatdocvalues", random().nextFloat())); - document.add(new SortedDocValuesField("sortedbytesdocvalues", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); - document.add(new SortedDocValuesField("sortedbytesdocvaluesval", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); - document.add(new BinaryDocValuesField("straightbytesdocvalues", new BytesRef(_TestUtil.randomRealisticUnicodeString(random())))); + document.add(new StoredField("id", ""+i)); + if (VERBOSE) { + System.out.println(" add doc id=" + i); + } + for(Field field : fields) { + // So we are sometimes missing that field: + if (random().nextInt(5) != 4) { + document.add(field); + if (VERBOSE) { + System.out.println(" " + field); + } + } + } iw.addDocument(document); + + if (random().nextInt(50) == 17) { + iw.commit(); + } } reader = iw.getReader(); iw.close(); searcher = newSearcher(reader); + if (VERBOSE) { + System.out.println(" searcher=" + searcher); + } } @Override @@ -104,25 +196,25 @@ assertQuery(bq, null); } } - + void assertQuery(Query query, Filter filter) throws Exception { assertQuery(query, filter, null); assertQuery(query, filter, Sort.RELEVANCE); assertQuery(query, filter, Sort.INDEXORDER); - for(int rev=0;rev<2;rev++) { - boolean reversed = rev == 1; - assertQuery(query, filter, new Sort(new SortField[] {new SortField("int", SortField.Type.INT, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("long", SortField.Type.LONG, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("float", SortField.Type.FLOAT, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("double", SortField.Type.DOUBLE, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("bytes", SortField.Type.STRING, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("bytesval", SortField.Type.STRING_VAL, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("intdocvalues", SortField.Type.INT, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("floatdocvalues", SortField.Type.FLOAT, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("sortedbytesdocvalues", SortField.Type.STRING, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("sortedbytesdocvaluesval", SortField.Type.STRING_VAL, reversed)})); - assertQuery(query, filter, new Sort(new SortField[] {new SortField("straightbytesdocvalues", SortField.Type.STRING_VAL, reversed)})); + for(SortField sortField : allSortFields) { + assertQuery(query, filter, new Sort(new SortField[] {sortField})); + } + for(int i=0;i<20;i++) { + assertQuery(query, filter, getRandomSort()); + } + } + + Sort getRandomSort() { + SortField[] sortFields = new SortField[_TestUtil.nextInt(random(), 2, 7)]; + for(int i=0;i docValues = new ArrayList(); // TODO: deletions while (numDocs < NUM_DOCS) { - final String s; - if (random.nextBoolean()) { - s = _TestUtil.randomSimpleString(random, maxLength); - } else { - s = _TestUtil.randomUnicodeString(random, maxLength); - } - final BytesRef br = new BytesRef(s); + final Document doc = new Document(); - if (!allowDups) { - if (seen.contains(s)) { - continue; + // 10% of the time, the document is missing the value: + final BytesRef br; + if (random().nextInt(10) != 7) { + final String s; + if (random.nextBoolean()) { + s = _TestUtil.randomSimpleString(random, maxLength); + } else { + s = _TestUtil.randomUnicodeString(random, maxLength); } - seen.add(s); - } - if (VERBOSE) { - System.out.println(" " + numDocs + ": s=" + s); + if (!allowDups) { + if (seen.contains(s)) { + continue; + } + seen.add(s); + } + + if (VERBOSE) { + System.out.println(" " + numDocs + ": s=" + s); + } + + br = new BytesRef(s); + doc.add(new SortedDocValuesField("stringdv", br)); + doc.add(newStringField("string", s, Field.Store.NO)); + docValues.add(br); + + } else { + br = null; + if (VERBOSE) { + System.out.println(" " + numDocs + ": "); + } + docValues.add(null); } - - final Document doc = new Document(); - doc.add(new SortedDocValuesField("stringdv", br)); - doc.add(newStringField("string", s, Field.Store.NO)); + doc.add(new NumericDocValuesField("id", numDocs)); - docValues.add(br); + doc.add(new StoredField("id", numDocs)); writer.addDocument(doc); numDocs++; @@ -103,13 +119,26 @@ final int ITERS = atLeast(100); for(int iter=0;iter" : br.utf8ToString())); if (idx == hitCount-1) { break; } @@ -161,12 +217,30 @@ System.out.println(" actual:"); for(int hitIDX=0;hitIDX" : br.utf8ToString()) + " id=" + s.doc(fd.doc).get("id")); } } for(int hitIDX=0;hitIDX { private final double[] values; private double bottom; + private double topValue; private ValueSource source; private FunctionValues scores; @@ -67,6 +68,11 @@ } @Override + public void setTopValue(Double value) { + topValue = value.doubleValue(); + } + + @Override public int compareBottom(int doc) throws IOException { return Double.compare(bottom, scores.doubleVal(doc)); } @@ -88,7 +94,7 @@ } @Override - public int compareDocToValue(int doc, Double valueObj) throws IOException { - return Double.compare(scores.doubleVal(doc), valueObj.doubleValue()); + public int compareTop(int doc) throws IOException { + return Double.compare(topValue, scores.doubleVal(doc)); } } diff -ruN -x .svn -x build trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinFieldComparator.java missinglast/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinFieldComparator.java --- trunk/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinFieldComparator.java 2013-07-15 15:52:17.749877387 -0400 +++ missinglast/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinFieldComparator.java 2014-01-15 13:03:25.626272099 -0500 @@ -60,6 +60,11 @@ } @Override + public void setTopValue(Object value) { + wrappedComparator.setTopValue(value); + } + + @Override public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { DocIdSet innerDocuments = childFilter.getDocIdSet(context, null); if (isEmpty(innerDocuments)) { @@ -193,7 +198,7 @@ @Override @SuppressWarnings("unchecked") - public int compareDocToValue(int parentDoc, Object value) throws IOException { + public int compareTop(int parentDoc) throws IOException { if (parentDoc == 0 || parentDocuments == null || childDocuments == null) { return 0; } @@ -216,7 +221,7 @@ if (childDoc >= parentDoc || childDoc == -1) { return cmp; } - int cmp1 = wrappedComparator.compareDocToValue(childDoc, value); + int cmp1 = wrappedComparator.compareTop(childDoc); if (cmp1 > 0) { return cmp1; } else { @@ -309,7 +314,7 @@ @Override @SuppressWarnings("unchecked") - public int compareDocToValue(int parentDoc, Object value) throws IOException { + public int compareTop(int parentDoc) throws IOException { if (parentDoc == 0 || parentDocuments == null || childDocuments == null) { return 0; } @@ -330,7 +335,7 @@ if (childDoc >= parentDoc || childDoc == -1) { return cmp; } - int cmp1 = wrappedComparator.compareDocToValue(childDoc, value); + int cmp1 = wrappedComparator.compareTop(childDoc); if (cmp1 < 0) { return cmp1; } else { diff -ruN -x .svn -x build trunk/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSource.java missinglast/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSource.java --- trunk/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSource.java 2013-03-20 06:26:06.975245399 -0400 +++ missinglast/lucene/queries/src/java/org/apache/lucene/queries/function/ValueSource.java 2014-01-15 13:03:18.838272280 -0500 @@ -131,6 +131,7 @@ private FunctionValues docVals; private double bottom; private final Map fcontext; + private double topValue; ValueSourceComparator(Map fcontext, int numHits) { this.fcontext = fcontext; @@ -164,15 +165,19 @@ } @Override + public void setTopValue(final Double value) { + this.topValue = value.doubleValue(); + } + + @Override public Double value(int slot) { return values[slot]; } @Override - public int compareDocToValue(int doc, Double valueObj) { - final double value = valueObj; + public int compareTop(int doc) { final double docValue = docVals.doubleVal(doc); - return Double.compare(docValue, value); + return Double.compare(topValue, docValue); } } } diff -ruN -x .svn -x build trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java missinglast/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java --- trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java 2013-09-01 07:24:26.307750681 -0400 +++ missinglast/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java 2014-01-15 13:03:09.546272531 -0500 @@ -44,6 +44,7 @@ private final String field; final Collator collator; private String bottom; + private String topValue; private final BytesRef tempBR = new BytesRef(); public SlowCollatedStringComparator(int numHits, String field, Collator collator) { @@ -105,6 +106,11 @@ } @Override + public void setTopValue(final String value) { + this.topValue = value; + } + + @Override public String value(int slot) { return values[slot]; } @@ -124,7 +130,7 @@ } @Override - public int compareDocToValue(int doc, String value) { + public int compareTop(int doc) { currentDocTerms.get(doc, tempBR); final String docValue; if (tempBR.length == 0 && docsWithField.get(doc) == false) { @@ -132,6 +138,6 @@ } else { docValue = tempBR.utf8ToString(); } - return compareValues(docValue, value); + return compareValues(topValue, docValue); } } diff -ruN -x .svn -x build trunk/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java missinglast/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java --- trunk/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java 2013-10-08 08:10:30.746159068 -0400 +++ missinglast/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java 2014-01-15 13:03:18.378272293 -0500 @@ -632,7 +632,7 @@ randomIOExceptionRateOnOpen = 0.0; if (DirectoryReader.indexExists(this)) { if (LuceneTestCase.VERBOSE) { - System.out.println("\nNOTE: MockDirectoryWrapper: now crash"); + System.out.println("\nNOTE: MockDirectoryWrapper: now crush"); } crash(); // corrupt any unsynced-files if (LuceneTestCase.VERBOSE) { diff -ruN -x .svn -x build trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java missinglast/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java --- trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java 2013-09-12 13:01:13.769785935 -0400 +++ missinglast/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java 2014-01-15 13:03:35.166271844 -0500 @@ -267,7 +267,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java $"; } /** diff -ruN -x .svn -x build trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java missinglast/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java --- trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java 2014-01-14 05:30:07.921310956 -0500 +++ missinglast/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java 2014-01-15 13:03:32.858271907 -0500 @@ -286,7 +286,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java $"; } public static final String ENABLE_DEBUG = "enableDebug"; diff -ruN -x .svn -x build trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java missinglast/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java --- trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java 2012-12-11 10:38:55.109944757 -0500 +++ missinglast/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java 2014-01-15 13:03:32.810271907 -0500 @@ -125,7 +125,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java missinglast/solr/core/src/java/org/apache/solr/core/RequestHandlers.java --- trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java 2013-07-15 15:52:22.361877262 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/core/RequestHandlers.java 2014-01-15 13:03:29.514271997 -0500 @@ -291,7 +291,7 @@ @Override public String getSource() { - String rev = "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java $"; + String rev = "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/core/RequestHandlers.java $"; if( _handler != null ) { rev += "\n" + _handler.getSource(); } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java missinglast/solr/core/src/java/org/apache/solr/core/SolrCore.java --- trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java 2014-01-14 05:30:07.905310955 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/core/SolrCore.java 2014-01-15 13:03:29.514271997 -0500 @@ -2295,7 +2295,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/core/SolrCore.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java 2012-12-11 10:37:59.705945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java 2014-01-15 13:03:28.066272034 -0500 @@ -123,7 +123,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlers.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java 2014-01-14 05:30:07.821310957 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java 2014-01-15 13:03:28.062272034 -0500 @@ -1148,6 +1148,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java 2013-07-15 15:52:23.177877240 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java 2014-01-15 13:03:28.066272034 -0500 @@ -158,6 +158,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java $"; } } \ No newline at end of file diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java 2013-09-16 06:46:07.909142803 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java 2014-01-15 13:03:28.066272034 -0500 @@ -661,7 +661,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java 2012-07-21 08:52:59.457098718 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java 2014-01-15 13:03:28.066272034 -0500 @@ -92,6 +92,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/PluginInfoHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java 2012-07-21 08:52:59.453098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java 2014-01-15 13:03:28.062272034 -0500 @@ -56,6 +56,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/PropertiesRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java 2013-12-07 16:24:57.815327818 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java 2014-01-15 13:03:28.066272034 -0500 @@ -383,6 +383,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java 2012-08-21 07:09:44.763360026 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java 2014-01-15 13:03:28.062272034 -0500 @@ -299,6 +299,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java 2014-01-14 05:30:07.821310957 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java 2014-01-15 13:03:28.062272034 -0500 @@ -346,7 +346,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java $"; } private static final long ONE_KB = 1024; diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java 2012-08-21 07:09:44.059360116 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java 2014-01-15 13:03:28.062272034 -0500 @@ -132,6 +132,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java 2012-07-21 08:52:59.545098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -44,6 +44,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java 2013-11-15 06:18:46.816888678 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -348,7 +348,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java 2013-02-20 13:38:17.088711935 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -612,7 +612,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java 2013-01-06 13:54:08.227227285 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -207,7 +207,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/HighlightComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java 2013-10-22 12:23:24.113395123 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java 2014-01-15 13:03:27.574272047 -0500 @@ -405,7 +405,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/MoreLikeThisComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java missinglast/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java 2012-11-30 12:39:18.112458371 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java 2014-01-15 13:03:27.570272047 -0500 @@ -269,6 +269,6 @@ // } // // public String getSource() { -// return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java $"; +// return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/PivotFacetHelper.java $"; // } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java 2014-01-10 05:10:47.802587144 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -1138,7 +1138,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java 2014-01-10 05:10:47.802587144 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -546,7 +546,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java $"; } @Override @@ -576,6 +576,7 @@ return new FieldComparator() { private final int[] values = new int[numHits]; private int bottomVal; + private int topVal; private TermsEnum termsEnum; private DocsEnum docsEnum; Set seen = new HashSet(elevations.ids.size()); @@ -590,6 +591,11 @@ bottomVal = values[slot]; } + @Override + public void setTopValue(Integer value) { + topVal = value.intValue(); + } + private int docVal(int doc) { if (ordSet.size() > 0) { int slot = ordSet.find(doc); @@ -646,10 +652,9 @@ } @Override - public int compareDocToValue(int doc, Integer valueObj) { - final int value = valueObj.intValue(); + public int compareTop(int doc) { final int docValue = docVal(doc); - return docValue - value; // values will be small enough that there is no overflow concern + return topVal - docValue; // values will be small enough that there is no overflow concern } }; } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java 2013-11-03 19:05:05.019394178 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java 2014-01-15 13:03:27.566272047 -0500 @@ -493,7 +493,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java 2013-12-07 16:24:57.815327818 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java 2014-01-15 13:03:27.570272047 -0500 @@ -346,7 +346,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java 2013-12-02 14:59:05.967022078 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -761,7 +761,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java 2013-12-02 14:59:05.967022078 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java 2014-01-15 13:03:27.574272047 -0500 @@ -162,7 +162,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java 2014-01-11 05:00:19.180292671 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java 2014-01-15 13:03:27.570272047 -0500 @@ -320,7 +320,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java 2013-07-23 16:25:55.779333091 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java 2014-01-15 13:03:27.574272047 -0500 @@ -476,7 +476,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java missinglast/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java --- trunk/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java 2013-01-21 14:10:16.670581069 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java 2014-01-15 13:03:27.574272047 -0500 @@ -470,7 +470,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java 2013-07-29 13:55:02.405707545 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -40,7 +40,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/CSVRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java 2013-07-15 15:52:23.209877239 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -124,7 +124,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/DocumentAnalysisRequestHandler.java $"; } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java 2012-07-21 08:52:59.521098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java 2014-01-15 13:03:28.126272036 -0500 @@ -69,6 +69,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java 2013-04-22 16:59:19.431676466 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -108,7 +108,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java $"; } // ================================================= Helper methods ================================================ diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java 2012-08-21 07:09:49.543360156 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java 2014-01-15 13:03:27.742272044 -0500 @@ -41,7 +41,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/JsonUpdateRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java 2013-01-08 11:31:23.208695143 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -458,7 +458,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java 2014-01-14 05:30:07.821310957 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -296,6 +296,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java 2012-07-21 08:52:59.453098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -42,7 +42,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/RealTimeGetHandler.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java 2013-11-15 06:18:46.820888679 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -535,7 +535,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java $"; } /** diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java 2012-07-21 08:52:59.453098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -52,7 +52,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/StandardRequestHandler.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java 2013-12-07 16:24:57.815327818 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -159,7 +159,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java 2012-07-21 08:52:59.521098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java 2014-01-15 13:03:28.126272036 -0500 @@ -43,7 +43,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java missinglast/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java --- trunk/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java 2012-07-21 08:52:59.453098717 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java 2014-01-15 13:03:28.058272034 -0500 @@ -43,6 +43,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/handler/XsltUpdateRequestHandler.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java missinglast/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java --- trunk/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java 2012-08-21 07:09:39.167360679 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java 2014-01-15 13:03:27.086272060 -0500 @@ -77,6 +77,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java missinglast/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java 2012-12-11 10:37:59.697945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java 2014-01-15 13:03:27.090272060 -0500 @@ -43,6 +43,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/DefaultEncoder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java missinglast/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java --- trunk/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java 2012-12-11 10:37:59.697945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java 2014-01-15 13:03:27.090272060 -0500 @@ -49,7 +49,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/GapFragmenter.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java missinglast/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java 2012-12-11 10:37:59.697945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java 2014-01-15 13:03:27.086272060 -0500 @@ -43,6 +43,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/HtmlEncoder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java missinglast/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java --- trunk/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java 2012-12-11 10:37:59.701945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java 2014-01-15 13:03:27.090272060 -0500 @@ -48,6 +48,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java missinglast/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java --- trunk/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java 2012-12-11 10:37:59.701945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java 2014-01-15 13:03:27.090272060 -0500 @@ -96,7 +96,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/RegexFragmenter.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java missinglast/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java 2012-07-21 08:52:59.433098719 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java 2014-01-15 13:03:27.090272060 -0500 @@ -43,6 +43,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/ScoreOrderFragmentsBuilder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java --- trunk/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java 2012-07-21 08:52:59.429098719 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java 2014-01-15 13:03:27.086272060 -0500 @@ -46,6 +46,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/SimpleBoundaryScanner.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java 2012-12-11 10:37:59.701945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java 2014-01-15 13:03:27.090272060 -0500 @@ -45,6 +45,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/SimpleFragListBuilder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java 2012-07-21 08:52:59.433098719 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java 2014-01-15 13:03:27.086272060 -0500 @@ -43,6 +43,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/SimpleFragmentsBuilder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java missinglast/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java --- trunk/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java 2012-12-11 10:37:59.701945596 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java 2014-01-15 13:03:27.090272060 -0500 @@ -45,6 +45,6 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/highlight/SingleFragListBuilder.java $"; } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/schema/EnumField.java missinglast/solr/core/src/java/org/apache/solr/schema/EnumField.java --- trunk/solr/core/src/java/org/apache/solr/schema/EnumField.java 2013-11-06 07:02:49.449619584 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/schema/EnumField.java 2014-01-15 13:03:29.982271984 -0500 @@ -178,7 +178,9 @@ public SortField getSortField(SchemaField field, boolean top) { field.checkSortability(); final Object missingValue = Integer.MIN_VALUE; - return new SortField(field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top).setMissingValue(missingValue); + SortField sf = new SortField(field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top); + sf.setMissingValue(missingValue); + return sf; } /** diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/schema/RandomSortField.java missinglast/solr/core/src/java/org/apache/solr/schema/RandomSortField.java --- trunk/solr/core/src/java/org/apache/solr/schema/RandomSortField.java 2012-09-10 07:27:39.478997101 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/schema/RandomSortField.java 2014-01-15 13:03:29.974271982 -0500 @@ -109,6 +109,7 @@ int seed; private final int[] values = new int[numHits]; int bottomVal; + int topVal; @Override public int compare(int slot1, int slot2) { @@ -121,6 +122,11 @@ } @Override + public void setTopValue(Integer value) { + topVal = value.intValue(); + } + + @Override public int compareBottom(int doc) { return bottomVal - hash(doc+seed); } @@ -142,9 +148,9 @@ } @Override - public int compareDocToValue(int doc, Integer valueObj) { + public int compareTop(int doc) { // values will be positive... no overflow possible. - return hash(doc+seed) - valueObj.intValue(); + return topVal - hash(doc+seed); } }; } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java missinglast/solr/core/src/java/org/apache/solr/schema/TrieField.java --- trunk/solr/core/src/java/org/apache/solr/schema/TrieField.java 2013-10-06 07:28:10.066849609 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/schema/TrieField.java 2014-01-15 13:03:29.978271982 -0500 @@ -142,7 +142,9 @@ Object missingValue = null; boolean sortMissingLast = field.sortMissingLast(); boolean sortMissingFirst = field.sortMissingFirst(); - + + SortField sf; + switch (type) { case INTEGER: if( sortMissingLast ) { @@ -151,7 +153,9 @@ else if( sortMissingFirst ) { missingValue = top ? Integer.MAX_VALUE : Integer.MIN_VALUE; } - return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top).setMissingValue(missingValue); + sf = new SortField( field.getName(), FieldCache.NUMERIC_UTILS_INT_PARSER, top); + sf.setMissingValue(missingValue); + return sf; case FLOAT: if( sortMissingLast ) { @@ -160,7 +164,9 @@ else if( sortMissingFirst ) { missingValue = top ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY; } - return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_FLOAT_PARSER, top).setMissingValue(missingValue); + sf = new SortField( field.getName(), FieldCache.NUMERIC_UTILS_FLOAT_PARSER, top); + sf.setMissingValue(missingValue); + return sf; case DATE: // fallthrough case LONG: @@ -170,7 +176,9 @@ else if( sortMissingFirst ) { missingValue = top ? Long.MAX_VALUE : Long.MIN_VALUE; } - return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_LONG_PARSER, top).setMissingValue(missingValue); + sf = new SortField( field.getName(), FieldCache.NUMERIC_UTILS_LONG_PARSER, top); + sf.setMissingValue(missingValue); + return sf; case DOUBLE: if( sortMissingLast ) { @@ -179,7 +187,9 @@ else if( sortMissingFirst ) { missingValue = top ? Double.POSITIVE_INFINITY : Double.NEGATIVE_INFINITY; } - return new SortField( field.getName(), FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, top).setMissingValue(missingValue); + sf = new SortField( field.getName(), FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, top); + sf.setMissingValue(missingValue); + return sf; default: throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type for trie field: " + field.name); diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/FastLRUCache.java missinglast/solr/core/src/java/org/apache/solr/search/FastLRUCache.java --- trunk/solr/core/src/java/org/apache/solr/search/FastLRUCache.java 2014-01-14 05:30:07.809310960 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/FastLRUCache.java 2014-01-15 13:03:30.342271973 -0500 @@ -190,7 +190,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/FastLRUCache.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/FastLRUCache.java $"; } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java missinglast/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java --- trunk/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java 2013-07-29 13:55:02.401707549 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java 2014-01-15 13:03:30.350271972 -0500 @@ -355,7 +355,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java $"; } } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java missinglast/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java --- trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java 2012-12-11 10:37:59.673945595 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java 2014-01-15 19:04:02.713693284 -0500 @@ -88,6 +88,15 @@ SearchGroup searchGroup = new SearchGroup(); searchGroup.groupValue = rawSearchGroup.getKey() != null ? new BytesRef(rawSearchGroup.getKey()) : null; searchGroup.sortValues = rawSearchGroup.getValue().toArray(new Comparable[rawSearchGroup.getValue().size()]); + for (int i = 0; i < searchGroup.sortValues.length; i++) { + SchemaField field = groupSort.getSort()[i].getField() != null ? searcher.getSchema().getFieldOrNull(groupSort.getSort()[i].getField()) : null; + if (field != null) { + FieldType fieldType = field.getType(); + if (searchGroup.sortValues[i] != null) { + searchGroup.sortValues[i] = fieldType.unmarshalSortValue(searchGroup.sortValues[i]); + } + } + } searchGroups.add(searchGroup); } } @@ -99,22 +108,17 @@ } private NamedList serializeSearchGroup(Collection> data, Sort groupSort) { - NamedList result = new NamedList(); - CharsRef spare = new CharsRef(); + NamedList result = new NamedList(); for (SearchGroup searchGroup : data) { - Comparable[] convertedSortValues = new Comparable[searchGroup.sortValues.length]; + Object[] convertedSortValues = new Object[searchGroup.sortValues.length]; for (int i = 0; i < searchGroup.sortValues.length; i++) { - Comparable sortValue = (Comparable) searchGroup.sortValues[i]; + Object sortValue = searchGroup.sortValues[i]; SchemaField field = groupSort.getSort()[i].getField() != null ? searcher.getSchema().getFieldOrNull(groupSort.getSort()[i].getField()) : null; if (field != null) { FieldType fieldType = field.getType(); - if (sortValue instanceof BytesRef) { - UnicodeUtil.UTF8toUTF16((BytesRef)sortValue, spare); - String indexedValue = spare.toString(); - sortValue = (Comparable) fieldType.toObject(field.createField(fieldType.indexedToReadable(indexedValue), 1.0f)); - } else if (sortValue instanceof String) { - sortValue = (Comparable) fieldType.toObject(field.createField(fieldType.indexedToReadable((String) sortValue), 1.0f)); + if (sortValue != null) { + sortValue = fieldType.marshalSortValue(sortValue); } } convertedSortValues[i] = sortValue; diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java missinglast/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java --- trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java 2013-04-22 16:59:19.379676466 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java 2014-01-15 19:04:02.713693284 -0500 @@ -93,6 +93,8 @@ public Map transformToNative(NamedList shardResponse, Sort groupSort, Sort sortWithinGroup, String shard) { Map result = new HashMap(); + final IndexSchema schema = rb.req.getSearcher().getSchema(); + for (Map.Entry entry : shardResponse) { String key = entry.getKey(); NamedList commandResult = entry.getValue(); @@ -124,6 +126,15 @@ Object sortValuesVal = document.get("sortValues"); if (sortValuesVal != null) { sortValues = ((List) sortValuesVal).toArray(); + for (int k = 0; k < sortValues.length; k++) { + SchemaField field = groupSort.getSort()[k].getField() != null ? schema.getFieldOrNull(groupSort.getSort()[k].getField()) : null; + if (field != null) { + FieldType fieldType = field.getType(); + if (sortValues[k] != null) { + sortValues[k] = fieldType.unmarshalSortValue(sortValues[k]); + } + } + } } else { log.warn("doc {} has null 'sortValues'", document); @@ -158,6 +169,15 @@ score = Float.NaN; } Object[] sortValues = ((List) document.get("sortValues")).toArray(); + for (int k = 0; k < sortValues.length; k++) { + SchemaField field = sortWithinGroup.getSort()[k].getField() != null ? schema.getFieldOrNull(sortWithinGroup.getSort()[k].getField()) : null; + if (field != null) { + FieldType fieldType = field.getType(); + if (sortValues[k] != null) { + sortValues[k] = fieldType.unmarshalSortValue(sortValues[k]); + } + } + } scoreDocs[j++] = new ShardDoc(score, sortValues, uniqueId, shard); } @@ -217,12 +237,8 @@ SchemaField field = sortWithinGroup.getSort()[j].getField() != null ? schema.getFieldOrNull(sortWithinGroup.getSort()[j].getField()) : null; if (field != null) { FieldType fieldType = field.getType(); - if (sortValue instanceof BytesRef) { - UnicodeUtil.UTF8toUTF16((BytesRef)sortValue, spare); - String indexedValue = spare.toString(); - sortValue = fieldType.toObject(field.createField(fieldType.indexedToReadable(indexedValue), 1.0f)); - } else if (sortValue instanceof String) { - sortValue = fieldType.toObject(field.createField(fieldType.indexedToReadable((String) sortValue), 1.0f)); + if (sortValue != null) { + sortValue = fieldType.marshalSortValue(sortValue); } } convertedSortValues[j] = sortValue; @@ -272,12 +288,8 @@ ? schema.getFieldOrNull(groupSort.getSort()[j].getField()) : null; if (field != null) { FieldType fieldType = field.getType(); - if (sortValue instanceof BytesRef) { - UnicodeUtil.UTF8toUTF16((BytesRef)sortValue, spare); - String indexedValue = spare.toString(); - sortValue = fieldType.toObject(field.createField(fieldType.indexedToReadable(indexedValue), 1.0f)); - } else if (sortValue instanceof String) { - sortValue = fieldType.toObject(field.createField(fieldType.indexedToReadable((String) sortValue), 1.0f)); + if (sortValue != null) { + sortValue = fieldType.marshalSortValue(sortValue); } } convertedSortValues[j] = sortValue; diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/LFUCache.java missinglast/solr/core/src/java/org/apache/solr/search/LFUCache.java --- trunk/solr/core/src/java/org/apache/solr/search/LFUCache.java 2014-01-14 05:30:07.809310960 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/LFUCache.java 2014-01-15 13:03:30.354271974 -0500 @@ -222,7 +222,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LFUCache.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/LFUCache.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/LRUCache.java missinglast/solr/core/src/java/org/apache/solr/search/LRUCache.java --- trunk/solr/core/src/java/org/apache/solr/search/LRUCache.java 2014-01-14 05:30:07.809310960 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/LRUCache.java 2014-01-15 13:03:30.362271975 -0500 @@ -218,7 +218,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/LRUCache.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/LRUCache.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java missinglast/solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java --- trunk/solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java 2013-02-20 13:38:17.036711934 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java 1969-12-31 19:00:00.000000000 -0500 @@ -1,310 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.solr.search; - -import java.io.IOException; - -import org.apache.lucene.index.AtomicReader; -import org.apache.lucene.index.AtomicReaderContext; -import org.apache.lucene.index.SortedDocValues; -import org.apache.lucene.search.FieldCache; -import org.apache.lucene.search.FieldComparator; -import org.apache.lucene.search.FieldComparatorSource; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.UnicodeUtil; -import org.apache.lucene.util.packed.PackedInts; - - -public class MissingStringLastComparatorSource extends FieldComparatorSource { - private final BytesRef missingValueProxy; - - public MissingStringLastComparatorSource() { - this(UnicodeUtil.BIG_TERM); - } - - /** Creates a {@link FieldComparatorSource} that sorts null last in a normal ascending sort. - * missingValueProxy as the value to return from FieldComparator.value() - * - * @param missingValueProxy The value returned when sortValue() is called for a document missing the sort field. - * This value is *not* normally used for sorting. - */ - public MissingStringLastComparatorSource(BytesRef missingValueProxy) { - this.missingValueProxy=missingValueProxy; - } - - @Override - public FieldComparator newComparator(String fieldname, int numHits, int sortPos, boolean reversed) throws IOException { - return new TermOrdValComparator_SML(numHits, fieldname, sortPos, reversed, missingValueProxy); - } - -} - -// Copied from Lucene's TermOrdValComparator and modified since the Lucene version couldn't -// be extended. -class TermOrdValComparator_SML extends FieldComparator { - private static final int NULL_ORD = Integer.MAX_VALUE-1; - - private final int[] ords; - private final BytesRef[] values; - private final int[] readerGen; - - private SortedDocValues termsIndex; - private final String field; - - private final BytesRef NULL_VAL; - private PerSegmentComparator current; - - public TermOrdValComparator_SML(int numHits, String field, int sortPos, boolean reversed, BytesRef nullVal) { - ords = new int[numHits]; - values = new BytesRef[numHits]; - readerGen = new int[numHits]; - this.field = field; - this.NULL_VAL = nullVal; - } - - @Override - public int compare(int slot1, int slot2) { - throw new UnsupportedOperationException(); - } - - @Override - public void setBottom(int slot) { - throw new UnsupportedOperationException(); - } - - @Override - public int compareBottom(int doc) { - throw new UnsupportedOperationException(); - } - - @Override - public void copy(int slot, int doc) { - throw new UnsupportedOperationException(); - } - - @Override - public BytesRef value(int slot) { - throw new UnsupportedOperationException(); - } - - @Override - public int compareValues(Comparable first, Comparable second) { - if (first == null) { - if (second == null) { - return 0; - } else { - return 1; - } - } else if (second == null) { - return -1; - } else { - return first.compareTo(second); - } - } - - @Override - public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { - return TermOrdValComparator_SML.createComparator(context.reader(), this); - } - - @Override - public int compareDocToValue(int doc, Comparable docValue) { - throw new UnsupportedOperationException(); - } - - // Base class for specialized (per bit width of the - // ords) per-segment comparator. NOTE: this is messy; - // we do this only because hotspot can't reliably inline - // the underlying array access when looking up doc->ord - private static abstract class PerSegmentComparator extends FieldComparator { - protected TermOrdValComparator_SML parent; - protected final int[] ords; - protected final BytesRef[] values; - protected final int[] readerGen; - - protected int currentReaderGen = -1; - protected SortedDocValues termsIndex; - - protected int bottomSlot = -1; - protected int bottomOrd; - protected boolean bottomSameReader = false; - protected BytesRef bottomValue; - protected final BytesRef tempBR = new BytesRef(); - - - public PerSegmentComparator(TermOrdValComparator_SML parent) { - this.parent = parent; - PerSegmentComparator previous = parent.current; - if (previous != null) { - currentReaderGen = previous.currentReaderGen; - bottomSlot = previous.bottomSlot; - bottomOrd = previous.bottomOrd; - bottomValue = previous.bottomValue; - } - ords = parent.ords; - values = parent.values; - readerGen = parent.readerGen; - termsIndex = parent.termsIndex; - currentReaderGen++; - } - - @Override - public FieldComparator setNextReader(AtomicReaderContext context) throws IOException { - return TermOrdValComparator_SML.createComparator(context.reader(), parent); - } - - @Override - public int compare(int slot1, int slot2) { - if (readerGen[slot1] == readerGen[slot2]) { - return ords[slot1] - ords[slot2]; - } - - final BytesRef val1 = values[slot1]; - final BytesRef val2 = values[slot2]; - if (val1 == null) { - if (val2 == null) { - return 0; - } - return 1; - } else if (val2 == null) { - return -1; - } - return val1.compareTo(val2); - } - - @Override - public void setBottom(final int bottom) { - bottomSlot = bottom; - - bottomValue = values[bottomSlot]; - if (currentReaderGen == readerGen[bottomSlot]) { - bottomOrd = ords[bottomSlot]; - bottomSameReader = true; - } else { - if (bottomValue == null) { - // -1 ord is null for all segments - assert ords[bottomSlot] == NULL_ORD; - bottomOrd = NULL_ORD; - bottomSameReader = true; - readerGen[bottomSlot] = currentReaderGen; - } else { - final int index = termsIndex.lookupTerm(bottomValue); - if (index < 0) { - bottomOrd = -index - 2; - bottomSameReader = false; - } else { - bottomOrd = index; - // exact value match - bottomSameReader = true; - readerGen[bottomSlot] = currentReaderGen; - ords[bottomSlot] = bottomOrd; - } - } - } - } - - @Override - public BytesRef value(int slot) { - return values==null ? parent.NULL_VAL : values[slot]; - } - - @Override - public int compareDocToValue(int doc, BytesRef value) { - int docOrd = termsIndex.getOrd(doc); - if (docOrd == -1) { - if (value == null) { - return 0; - } - return 1; - } else if (value == null) { - return -1; - } - termsIndex.lookupOrd(docOrd, tempBR); - return tempBR.compareTo(value); - } - } - - private static final class AnyOrdComparator extends PerSegmentComparator { - public AnyOrdComparator(TermOrdValComparator_SML parent) { - super(parent); - } - - @Override - public int compareBottom(int doc) { - assert bottomSlot != -1; - int order = termsIndex.getOrd(doc); - if (order == -1) order = NULL_ORD; - if (bottomSameReader) { - // ord is precisely comparable, even in the equal - // case - return bottomOrd - order; - } else { - // ord is only approx comparable: if they are not - // equal, we can use that; if they are equal, we - // must fallback to compare by value - - final int cmp = bottomOrd - order; - if (cmp != 0) { - return cmp; - } - - // take care of the case where both vals are null - if (order == NULL_ORD) { - return 0; - } - - // and at this point we know that neither value is null, so safe to compare - if (order == NULL_ORD) { - return bottomValue.compareTo(parent.NULL_VAL); - } else { - termsIndex.lookupOrd(order, tempBR); - return bottomValue.compareTo(tempBR); - } - } - } - - @Override - public void copy(int slot, int doc) { - int ord = termsIndex.getOrd(doc); - if (ord == -1) { - ords[slot] = NULL_ORD; - values[slot] = null; - } else { - ords[slot] = ord; - assert ord >= 0; - if (values[slot] == null) { - values[slot] = new BytesRef(); - } - termsIndex.lookupOrd(ord, values[slot]); - } - readerGen[slot] = currentReaderGen; - } - } - - public static FieldComparator createComparator(AtomicReader reader, TermOrdValComparator_SML parent) throws IOException { - parent.termsIndex = FieldCache.DEFAULT.getTermsIndex(reader, parent.field); - PerSegmentComparator perSegComp = new AnyOrdComparator(parent); - - if (perSegComp.bottomSlot != -1) { - perSegComp.setBottom(perSegComp.bottomSlot); - } - - parent.current = perSegComp; - return perSegComp; - } -} diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/QParserPlugin.java missinglast/solr/core/src/java/org/apache/solr/search/QParserPlugin.java --- trunk/solr/core/src/java/org/apache/solr/search/QParserPlugin.java 2013-11-20 09:27:41.601029016 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/QParserPlugin.java 2014-01-15 13:03:30.346271972 -0500 @@ -83,7 +83,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/QParserPlugin.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/QParserPlugin.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java missinglast/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java --- trunk/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java 2012-12-11 10:37:59.669945595 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java 2014-01-15 13:03:30.354271974 -0500 @@ -51,7 +51,7 @@ public Category getCategory() { return Category.CACHE; } @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/SolrFieldCacheMBean.java $"; } @Override public URL[] getDocs() { diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java missinglast/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java --- trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java 2014-01-14 05:30:07.809310960 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java 2014-01-15 13:03:30.346271972 -0500 @@ -2231,7 +2231,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java $"; } @Override diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/search/Sorting.java missinglast/solr/core/src/java/org/apache/solr/search/Sorting.java --- trunk/solr/core/src/java/org/apache/solr/search/Sorting.java 2012-07-21 08:52:59.377098718 -0400 +++ missinglast/solr/core/src/java/org/apache/solr/search/Sorting.java 2014-01-15 14:53:25.446095547 -0500 @@ -40,18 +40,25 @@ * @return SortField */ public static SortField getStringSortField(String fieldName, boolean reverse, boolean nullLast, boolean nullFirst) { - if (nullLast) { - if (!reverse) return new SortField(fieldName, nullStringLastComparatorSource); - else return new SortField(fieldName, SortField.Type.STRING, true); - } else if (nullFirst) { - if (reverse) return new SortField(fieldName, nullStringLastComparatorSource, true); - else return new SortField(fieldName, SortField.Type.STRING, false); - } else { - return new SortField(fieldName, SortField.Type.STRING, reverse); + if (nullFirst && nullLast) { + throw new IllegalArgumentException("Cannot specify missing values as both first and last"); } - } + SortField sortField = new SortField(fieldName, SortField.Type.STRING, reverse); + + // 4 cases: + // missingFirst / forward: default lucene behavior + // missingFirst / reverse: set sortMissingLast + // missingLast / forward: set sortMissingLast + // missingLast / reverse: default lucene behavior + + if (nullFirst && reverse) { + sortField.setMissingValue(SortField.STRING_LAST); + } else if (nullLast && !reverse) { + sortField.setMissingValue(SortField.STRING_LAST); + } - static final FieldComparatorSource nullStringLastComparatorSource = new MissingStringLastComparatorSource(null); + return sortField; + } } diff -ruN -x .svn -x build trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java missinglast/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java --- trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java 2014-01-14 05:30:07.893310955 -0500 +++ missinglast/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java 2014-01-15 13:03:28.778272015 -0500 @@ -808,7 +808,7 @@ @Override public String getSource() { - return "$URL: https://svn.apache.org/repos/asf/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java $"; + return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene539399/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java $"; } @Override