// Returns true if first is < second @Override public boolean lessThan(ShardRef first, ShardRef second) { assert first != second; final FieldDoc firstFD = (FieldDoc) shardHits[first.shardIndex][first.hitIndex]; final FieldDoc secondFD = (FieldDoc) shardHits[second.shardIndex][second.hitIndex]; // System.out.println(" lessThan:\n first=" + first + " doc=" + firstFD.doc + " score=" + // firstFD.score + "\n second=" + second + " doc=" + secondFD.doc + " score=" + // secondFD.score); for (int compIDX = 0; compIDX < comparators.length; compIDX++) { final FieldComparator comp = comparators[compIDX]; // System.out.println(" cmp idx=" + compIDX + " cmp1=" + firstFD.fields[compIDX] + " // cmp2=" + secondFD.fields[compIDX] + " reverse=" + reverseMul[compIDX]); final int cmp = reverseMul[compIDX] * comp.compareValues(firstFD.fields[compIDX], secondFD.fields[compIDX]); if (cmp != 0) { // System.out.println(" return " + (cmp < 0)); return cmp < 0; } } // Tie break: earlier shard wins if (first.shardIndex < second.shardIndex) { // System.out.println(" return tb true"); return true; } else if (first.shardIndex > second.shardIndex) { // System.out.println(" return tb false"); return false; } else { // Tie break in same shard: resolve however the // shard had resolved it: // System.out.println(" return tb " + (first.hitIndex < second.hitIndex)); assert first.hitIndex != second.hitIndex; return first.hitIndex < second.hitIndex; } }