otis 2003/09/11 05:15:30 Modified: src/test/org/apache/lucene/util TestPriorityQueue.java src/java/org/apache/lucene/search IndexSearcher.java MultiSearcher.java src/java/org/apache/lucene/util PriorityQueue.java Log: - Added insert(Object) method to PriorityQueue class. Submitted by: Christoph Goller Reviewed by: Otis Revision Changes Path 1.4 +12 -0 jakarta-lucene/src/test/org/apache/lucene/util/TestPriorityQueue.java Index: TestPriorityQueue.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/test/org/apache/lucene/util/TestPriorityQueue.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TestPriorityQueue.java 5 Jun 2002 01:50:54 -0000 1.3 +++ TestPriorityQueue.java 11 Sep 2003 12:15:30 -0000 1.4 @@ -135,4 +135,16 @@ pq.clear(); assertEquals(0, pq.size()); } + + public void testFixedSize(){ + PriorityQueue pq = new IntegerQueue(3); + pq.insert(new Integer(2)); + pq.insert(new Integer(3)); + pq.insert(new Integer(1)); + pq.insert(new Integer(5)); + pq.insert(new Integer(7)); + pq.insert(new Integer(1)); + assertEquals(3, pq.size()); + assertEquals(3, ((Integer) pq.top()).intValue()); + } } 1.10 +1 -8 jakarta-lucene/src/java/org/apache/lucene/search/IndexSearcher.java Index: IndexSearcher.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/IndexSearcher.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- IndexSearcher.java 24 May 2003 15:24:26 -0000 1.9 +++ IndexSearcher.java 11 Sep 2003 12:15:30 -0000 1.10 @@ -133,18 +133,11 @@ final HitQueue hq = new HitQueue(nDocs); final int[] totalHits = new int[1]; scorer.score(new HitCollector() { - private float minScore = 0.0f; public final void collect(int doc, float score) { if (score > 0.0f && // ignore zeroed buckets (bits==null || bits.get(doc))) { // skip docs not in bits totalHits[0]++; - if (score >= minScore) { - hq.put(new ScoreDoc(doc, score)); // update hit queue - if (hq.size() > nDocs) { // if hit queue overfull - hq.pop(); // remove lowest in hit queue - minScore = ((ScoreDoc)hq.top()).score; // reset minScore - } - } + hq.insert(new ScoreDoc(doc, score)); } } }, reader.maxDoc()); 1.11 +3 -10 jakarta-lucene/src/java/org/apache/lucene/search/MultiSearcher.java Index: MultiSearcher.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/search/MultiSearcher.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- MultiSearcher.java 29 Jan 2003 17:18:54 -0000 1.10 +++ MultiSearcher.java 11 Sep 2003 12:15:30 -0000 1.11 @@ -144,7 +144,6 @@ public TopDocs search(Query query, Filter filter, int nDocs) throws IOException { HitQueue hq = new HitQueue(nDocs); - float minScore = 0.0f; int totalHits = 0; for (int i = 0; i < searchables.length; i++) { // search each searcher @@ -153,15 +152,9 @@ ScoreDoc[] scoreDocs = docs.scoreDocs; for (int j = 0; j < scoreDocs.length; j++) { // merge scoreDocs into hq ScoreDoc scoreDoc = scoreDocs[j]; - if (scoreDoc.score >= minScore) { - scoreDoc.doc += starts[i]; // convert doc - hq.put(scoreDoc); // update hit queue - if (hq.size() > nDocs) { // if hit queue overfull - hq.pop(); // remove lowest in hit queue - minScore = ((ScoreDoc)hq.top()).score; // reset minScore - } - } else - break; // no more scores > minScore + scoreDoc.doc += starts[i]; // convert doc + if(!hq.insert(scoreDoc)) + break; // no more scores > minScore } } 1.4 +28 -2 jakarta-lucene/src/java/org/apache/lucene/util/PriorityQueue.java Index: PriorityQueue.java =================================================================== RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/util/PriorityQueue.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- PriorityQueue.java 7 Nov 2002 05:55:40 -0000 1.3 +++ PriorityQueue.java 11 Sep 2003 12:15:30 -0000 1.4 @@ -60,6 +60,7 @@ public abstract class PriorityQueue { private Object[] heap; private int size; + private int maxSize; /** Determines the ordering of objects in this priority queue. Subclasses must define this one method. */ @@ -68,16 +69,41 @@ /** Subclass constructors must call this. */ protected final void initialize(int maxSize) { size = 0; - int heapSize = (maxSize * 2) + 1; + int heapSize = maxSize + 1; heap = new Object[heapSize]; + this.maxSize = maxSize; } - /** Adds an Object to a PriorityQueue in log(size) time. */ + /** + * Adds an Object to a PriorityQueue in log(size) time. + * If one tries to add more objects than maxSize from initialize + * a RuntimeException (ArrayIndexOutOfBound) is thrown. + */ public final void put(Object element) { size++; heap[size] = element; upHeap(); } + + /** + * Adds element to the PriorityQueue in log(size) time if either + * the PriorityQueue is not full, or !lessThan(element, top()). + * @param element + * @return true if element is added, false otherwise. + */ + public boolean insert(Object element){ + if(size < maxSize){ + put(element); + return true; + } + else if(size > 0 && !lessThan(element, top())){ + heap[1] = element; + adjustTop(); + return true; + } + else + return false; + } /** Returns the least element of the PriorityQueue in constant time. */ public final Object top() {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]