LUCENE-2504: always access the latest generation of field comparators

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@997095 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yonik Seeley 2010-09-14 21:04:29 +00:00
parent c18ae60c8c
commit 0e9e44f10d
2 changed files with 17 additions and 10 deletions

View File

@ -52,8 +52,6 @@ public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueu
* there is just one comparator.
*/
private static final class OneComparatorFieldValueHitQueue extends FieldValueHitQueue {
private final FieldComparator comparator;
private final int oneReverseMul;
public OneComparatorFieldValueHitQueue(SortField[] fields, int size)
@ -64,10 +62,9 @@ public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueu
}
SortField field = fields[0];
comparator = field.getComparator(size, 0);
setComparator(0,field.getComparator(size, 0));
oneReverseMul = field.reverse ? -1 : 1;
comparators[0] = comparator;
reverseMul[0] = oneReverseMul;
initialize(size);
@ -85,7 +82,7 @@ public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueu
assert hitA != hitB;
assert hitA.slot != hitB.slot;
final int c = oneReverseMul * comparator.compare(hitA.slot, hitB.slot);
final int c = oneReverseMul * firstComparator.compare(hitA.slot, hitB.slot);
if (c != 0) {
return c > 0;
}
@ -111,7 +108,7 @@ public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueu
SortField field = fields[i];
reverseMul[i] = field.reverse ? -1 : 1;
comparators[i] = field.getComparator(size, i);
setComparator(i, field.getComparator(size, i));
}
initialize(size);
@ -182,9 +179,15 @@ public abstract class FieldValueHitQueue extends PriorityQueue<FieldValueHitQueu
int[] getReverseMul() { return reverseMul; }
protected void setComparator(int pos, FieldComparator comparator) {
if (pos==0) firstComparator = comparator;
comparators[pos] = comparator;
}
/** Stores the sort criteria being used. */
protected final SortField[] fields;
protected final FieldComparator[] comparators;
protected final FieldComparator[] comparators; // use setComparator to change this array
protected FieldComparator firstComparator; // this must always be equal to comparators[0]
protected final int[] reverseMul;
@Override

View File

@ -48,10 +48,12 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
FieldComparator comparator;
final int reverseMul;
final FieldValueHitQueue queue;
public OneComparatorNonScoringCollector(FieldValueHitQueue queue,
int numHits, boolean fillFields) throws IOException {
super(queue, numHits, fillFields);
this.queue = queue;
comparator = queue.getComparators()[0];
reverseMul = queue.getReverseMul()[0];
}
@ -92,7 +94,8 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
@Override
public void setNextReader(IndexReader reader, int docBase) throws IOException {
this.docBase = docBase;
comparator = comparator.setNextReader(reader, docBase);
queue.setComparator(0, comparator.setNextReader(reader, docBase));
comparator = queue.firstComparator;
}
@Override
@ -381,10 +384,11 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
final FieldComparator[] comparators;
final int[] reverseMul;
final FieldValueHitQueue queue;
public MultiComparatorNonScoringCollector(FieldValueHitQueue queue,
int numHits, boolean fillFields) throws IOException {
super(queue, numHits, fillFields);
this.queue = queue;
comparators = queue.getComparators();
reverseMul = queue.getReverseMul();
}
@ -446,7 +450,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
public void setNextReader(IndexReader reader, int docBase) throws IOException {
this.docBase = docBase;
for (int i = 0; i < comparators.length; i++) {
comparators[i] = comparators[i].setNextReader(reader, docBase);
queue.setComparator(i, comparators[i].setNextReader(reader, docBase));
}
}