/* $Id: ftsearchermem.h 4025 2008-10-01 00:01:14Z abehm $ Copyright (C) 2007 by The Regents of the University of California Redistribution of this file is permitted under the terms of the BSD license Date: 09/17/2007 Author: Alexander Behm */ #ifndef _ftsearchermem_h_ #define _ftsearchermem_h_ #include "ftsearcherabs.h" #include "ftindexersimple.h" #include "listmerger/divideskipmerger.h" template class FtSearcherMem; template struct FtSearcherTraits > { typedef TFtIndexer FtIndexer; typedef TMerger Merger; }; template , class Merger = DivideSkipMerger<> > class FtSearcherMem : public FtSearcherAbs > { public: typedef FtIndexerTraits IndexerTraitsType; typedef typename IndexerTraitsType::InvList InvList; protected: typedef FtSearcherAbs > SuperClass; public: FtSearcherMem(Merger* m, FtIndexer* indexer = NULL) : SuperClass(m, indexer) {} void processLeaves_Impl(const vector*>& leaves, const Query& query, const vector& queryGramCodes, vector& resultStringIDs, StatsUtil* sutil); }; template void FtSearcherMem:: processLeaves_Impl(const vector*>& leaves, const Query& query, const vector& queryGramCodes, vector& resultStringIDs, StatsUtil* sutil) { // Step 0: Check for panic if((signed)this->mergeThreshold <= 0) { for(unsigned i = 0; i < leaves.size(); i++) this->searchLeafNodePanic(leaves.at(i), query, resultStringIDs, sutil); return; } if(sutil) { for(unsigned i = 0; i < leaves.size(); i++) { vector candidates; // Step 1: Preprocess sutil->startTimeMeasurement(); vector lists; leaves.at(i)->getInvertedLists(queryGramCodes, lists); sutil->stopTimeMeasurement(); sutil->searchStats.preprocessTime += sutil->getTimeMeasurement(); // Step 2.1: Merge sutil->startTimeMeasurement(); this->merger->merge(lists, this->mergeThreshold, candidates); sutil->stopTimeMeasurement(); sutil->searchStats.candidateStrings += candidates.size(); sutil->searchStats.mergeTime += sutil->getTimeMeasurement(); // Step 2.2: Postprocess this->postProcess(query, candidates, resultStringIDs, sutil); } } else { for(unsigned i = 0; i < leaves.size(); i++) { vector candidates; // Step 1: Preprocess vector lists; leaves.at(i)->getInvertedLists(queryGramCodes, lists); // Step 2.1: Merge this->merger->merge(lists, this->mergeThreshold, candidates); // Step 2.2: Postprocess this->postProcess(query, candidates, resultStringIDs, sutil); } } } #endif