/*------------------------------------------------------------------------------ * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team * * Distributable under the terms of either the Apache License (Version 2.0) or * the GNU Lesser General Public License, as specified in the COPYING file. ------------------------------------------------------------------------------*/ #ifndef _lucene_search_multisearcher #define _lucene_search_multisearcher #if defined(_LUCENE_PRAGMA_ONCE) # pragma once #endif #include "SearchHeader.h" #include "CLucene/document/Document.h" #include "CLucene/index/Term.h" #include "CLucene/util/PriorityQueue.h" #include "HitQueue.h" CL_NS_DEF(search) class MultiHitCollector: public HitCollector{ private: HitCollector* results; int32_t start; public: MultiHitCollector(HitCollector* _results, int32_t _start); void collect(const int32_t doc, const float_t score) ; }; /** Implements search over a set of Searchables. * *

Applications usually need only call the inherited {@link #search(Query)} * or {@link #search(Query,Filter)} methods. */ class MultiSearcher: public Searcher { private: Searchable** searchables; int32_t searchablesLen; int32_t* starts; int32_t _maxDoc; protected: int32_t* getStarts() { return starts; } public: /** Creates a searcher which searches Searchables. */ MultiSearcher(Searchable** searchables); ~MultiSearcher(); /** Frees resources associated with this Searcher. */ void close() ; int32_t docFreq(const CL_NS(index)::Term* term) const ; /** For use by {@link HitCollector} implementations. */ CL_NS(document)::Document* doc(const int32_t n) ; /** For use by {@link HitCollector} implementations to identify the * index of the sub-searcher that a particular hit came from. */ int32_t searcherIndex(int32_t n) const; int32_t subSearcher(int32_t n) const; int32_t subDoc(int32_t n) const; int32_t maxDoc() const; TopDocs* _search(Query* query, Filter* filter, const int32_t nDocs) ; TopFieldDocs* _search (Query* query, Filter* filter, const int32_t n, const Sort* sort); /** Lower-level search API. * *

{@link HitCollector#collect(int32_t,float_t)} is called for every non-zero * scoring document. * *

Applications should only use this if they need all of the * matching documents. The high-level search API ({@link * Searcher#search(Query)}) is usually more efficient, as it skips * non-high-scoring hits. * * @param query to match documents * @param filter if non-null, a bitset used to eliminate some documents * @param results to receive hits */ void _search(Query* query, Filter* filter, HitCollector* results); Query* rewrite(Query* original); Explanation* explain(Query* query, int32_t doc); }; CL_NS_END #endif