--- \dev\backup\sfdc\java\src\org\apache\lucene\search\TermScorer.java 2006-02-20 10:20:00.000000000 -0800
+++ \dev\sfdc\java\src\org\apache\lucene\search\TermScorer.java 2006-02-28 21:29:55.397500000 -0800
@@ -23,19 +23,12 @@
/** Expert: A Scorer for documents matching a Term.
*/
final class TermScorer extends Scorer {
+
private Weight weight;
private TermDocs termDocs;
private byte[] norms;
private float weightValue;
- private int doc;
-
- private final int[] docs = new int[32]; // buffered doc numbers
- private final int[] freqs = new int[32]; // buffered term freqs
- private int pointer;
- private int pointerMax;
-
- private static final int SCORE_CACHE_SIZE = 32;
- private float[] scoreCache = new float[SCORE_CACHE_SIZE];
+ private boolean atEnd = false; // If going next provides nothing.
/** Construct a TermScorer.
* @param weight The weight of the Term in the query.
@@ -50,9 +43,6 @@
this.termDocs = td;
this.norms = norms;
this.weightValue = weight.getValue();
-
- for (int i = 0; i < SCORE_CACHE_SIZE; i++)
- scoreCache[i] = getSimilarity().tf(i) * weightValue;
}
public void score(HitCollector hc) throws IOException {
@@ -62,29 +52,18 @@
protected boolean score(HitCollector c, int end) throws IOException {
Similarity similarity = getSimilarity(); // cache sim in local
- float[] normDecoder = Similarity.getNormDecoder();
- while (doc < end) { // for docs in window
- int f = freqs[pointer];
- float score = // compute tf(f)*weight
- f < SCORE_CACHE_SIZE // check cache
- ? scoreCache[f] // cache hit
- : similarity.tf(f)*weightValue; // cache miss
-
- score *= normDecoder[norms[doc] & 0xFF]; // normalize for field
-
- c.collect(doc, score); // collect score
-
- if (++pointer >= pointerMax) {
- pointerMax = termDocs.read(docs, freqs); // refill buffers
- if (pointerMax != 0) {
- pointer = 0;
- } else {
- termDocs.close(); // close stream
- doc = Integer.MAX_VALUE; // set to sentinel value
+ while (doc() < end) { // for docs in window
+ float score = similarity.tf(termDocs.freq())*weightValue; // cache miss
+
+ score *= Similarity.decodeNorm(norms[doc()]); // normalize for field
+
+ c.collect(doc(), score); // collect score
+
+ if (!next()) {
+ atEnd = true;
+ termDocs.close();
return false;
- }
- }
- doc = docs[pointer];
+ }
}
return true;
}
@@ -92,7 +71,7 @@
/** Returns the current document number matching the query.
* Initially invalid, until {@link #next()} is called the first time.
*/
- public int doc() { return doc; }
+ public int doc() { return atEnd ? Integer.MAX_VALUE : termDocs.doc(); }
/** Advances to the next document matching the query.
*
The iterator over the matching documents is buffered using
@@ -100,57 +79,28 @@
* @return true iff there is another document matching the query.
*/
public boolean next() throws IOException {
- pointer++;
- if (pointer >= pointerMax) {
- pointerMax = termDocs.read(docs, freqs); // refill buffer
- if (pointerMax != 0) {
- pointer = 0;
- } else {
- termDocs.close(); // close stream
- doc = Integer.MAX_VALUE; // set to sentinel value
- return false;
- }
- }
- doc = docs[pointer];
- return true;
+ boolean result = termDocs.next();
+ if (!result) {
+ atEnd = true;
+ termDocs.close();
+ }
+ return result;
}
public float score() {
- int f = freqs[pointer];
- float raw = // compute tf(f)*weight
- f < SCORE_CACHE_SIZE // check cache
- ? scoreCache[f] // cache hit
- : getSimilarity().tf(f)*weightValue; // cache miss
+ float raw = getSimilarity().tf(termDocs.freq())*weightValue; // compute tf(f)*weight
- return raw * Similarity.decodeNorm(norms[doc]); // normalize for field
+ return raw * Similarity.decodeNorm(norms[doc()]); // normalize for field
}
/** Skips to the first match beyond the current whose document number is
- * greater than or equal to a given target.
+ * greater than or equal to a given target.
*
The implementation uses {@link TermDocs#skipTo(int)}.
* @param target The target document number.
* @return true iff there is such a match.
*/
public boolean skipTo(int target) throws IOException {
- // first scan in cache
- for (pointer++; pointer < pointerMax; pointer++) {
- if (docs[pointer] >= target) {
- doc = docs[pointer];
- return true;
- }
- }
-
- // not found in cache, seek underlying stream
- boolean result = termDocs.skipTo(target);
- if (result) {
- pointerMax = 1;
- pointer = 0;
- docs[pointer] = doc = termDocs.doc();
- freqs[pointer] = termDocs.freq();
- } else {
- doc = Integer.MAX_VALUE;
- }
- return result;
+ return termDocs.skipTo(target);
}
/** Returns an explanation of the score for a document.
@@ -163,22 +113,15 @@
TermQuery query = (TermQuery)weight.getQuery();
Explanation tfExplanation = new Explanation();
int tf = 0;
- while (pointer < pointerMax) {
- if (docs[pointer] == doc)
- tf = freqs[pointer];
- pointer++;
- }
- if (tf == 0) {
while (termDocs.next()) {
if (termDocs.doc() == doc) {
tf = termDocs.freq();
}
}
- }
termDocs.close();
tfExplanation.setValue(getSimilarity().tf(tf));
tfExplanation.setDescription("tf(termFreq("+query.getTerm()+")="+tf+")");
-
+
return tfExplanation;
}