#include "LCTopFieldDocCollector.h" #include "LCIndexReader.h" #include "LCSort.h" #include "LCFieldSortedHitQueue.h" #include "LCTopFieldDocs.h" #include "GNUstep.h" /** A {@link HitCollector} implementation that collects the top-sorting * documents, returning them as a {@link TopFieldDocs}. This is used by {@link * IndexSearcher} to implement {@link TopFieldDocs}-based search. * *

This may be extended, overriding the collect method to, e.g., * conditionally invoke super() in order to filter which * documents are collected. **/ @implementation LCTopFieldDocCollector /** Construct to collect a given number of hits. * @param reader the index to be searched * @param sort the sort criteria * @param numHits the maximum number of hits to collect */ - (id) initWithReader: (LCIndexReader *) reader sort: (LCSort *) sort maximalHits: (int) nh { LCFieldSortedHitQueue *fshq = [[LCFieldSortedHitQueue alloc] initWithReader: reader sortFields: [sort sortFields] size: nh]; return [super initWithMaximalHits: nh queue: AUTORELEASE(fshq)]; } // inherited - (void) collect: (int) doc score: (float) score { if (score > 0.0f) { totalHits++; LCFieldDoc *d = [[LCFieldDoc alloc] initWithDocument: doc score: score]; [hq insert: d]; DESTROY(d); } } // inherited - (LCTopDocs *) topDocs { LCFieldSortedHitQueue *fshq = (LCFieldSortedHitQueue *) hq; NSMutableArray *scoreDocs = AUTORELEASE([[NSMutableArray alloc] init]); int i, count = [fshq size]-1; for (i = count; i >= 0; i--) // put docs in array { [scoreDocs insertObject: [fshq fillFields: (LCFieldDoc *)[fshq pop]] atIndex: 0]; } LCTopFieldDocs *d = [[LCTopFieldDocs alloc] initWithTotalHits: totalHits scoreDocuments: scoreDocs sortFields: [fshq sortFields] maxScore: [fshq maximalScore]]; return AUTORELEASE(d); } @end