CLucene - a full-featured, c++ search engine
API Documentation
00001 /*------------------------------------------------------------------------------ 00002 * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team 00003 * 00004 * Distributable under the terms of either the Apache License (Version 2.0) or 00005 * the GNU Lesser General Public License, as specified in the COPYING file. 00006 ------------------------------------------------------------------------------*/ 00007 #ifndef _lucene_index_SegmentMerger_ 00008 #define _lucene_index_SegmentMerger_ 00009 00010 #if defined(_LUCENE_PRAGMA_ONCE) 00011 # pragma once 00012 #endif 00013 00014 #include "CLucene/store/Directory.h" 00015 #include "CLucene/store/RAMDirectory.h" 00016 #include "CLucene/util/VoidList.h" 00017 #include "SegmentMergeInfo.h" 00018 #include "SegmentMergeQueue.h" 00019 #include "IndexWriter.h" 00020 #include "FieldInfos.h" 00021 #include "FieldsWriter.h" 00022 #include "TermInfosWriter.h" 00023 00024 CL_NS_DEF(index) 00025 00026 00037 class SegmentMerger:LUCENE_BASE { 00038 bool useCompoundFile; 00039 00040 CL_NS(store)::RAMIndexOutput* skipBuffer; 00041 int32_t lastSkipDoc; 00042 int64_t lastSkipFreqPointer; 00043 int64_t lastSkipProxPointer; 00044 00045 void resetSkip(); 00046 void bufferSkip(int32_t doc); 00047 int64_t writeSkip(); 00048 00049 //Directory of the segment 00050 CL_NS(store)::Directory* directory; 00051 //name of the new segment 00052 const char* segment; 00053 //Set of IndexReaders 00054 CL_NS(util)::CLVector<IndexReader*,CL_NS(util)::Deletor::Object<IndexReader> > readers; 00055 //Field Infos for t he FieldInfo instances of all fields 00056 FieldInfos* fieldInfos; 00057 00058 //The queue that holds SegmentMergeInfo instances 00059 SegmentMergeQueue* queue; 00060 //IndexOutput to the new Frequency File 00061 CL_NS(store)::IndexOutput* freqOutput; 00062 //IndexOutput to the new Prox File 00063 CL_NS(store)::IndexOutput* proxOutput; 00064 //Writes Terminfos that have been merged 00065 TermInfosWriter* termInfosWriter; 00066 TermInfo termInfo; //(new) minimize consing 00067 00068 int32_t termIndexInterval; 00069 int32_t skipInterval; 00070 00071 public: 00078 SegmentMerger( IndexWriter* writer, const char* name ); 00079 00080 //Destructor 00081 ~SegmentMerger(); 00082 00087 void add(IndexReader* reader); 00088 00094 IndexReader* segmentReader(const int32_t i); 00095 00101 int32_t merge(); 00107 void closeReaders(); 00108 private: 00109 void addIndexed(IndexReader* reader, FieldInfos* fieldInfos, CL_NS(util)::StringArrayWithDeletor& names, 00110 bool storeTermVectors, bool storePositionWithTermVector, 00111 bool storeOffsetWithTermVector); 00112 00118 int32_t mergeFields(); 00119 00124 void mergeVectors(); 00125 00127 void mergeTerms(); 00128 00130 void mergeTermInfos(); 00131 00139 void mergeTermInfo( SegmentMergeInfo** smis); 00140 00149 int32_t appendPostings(SegmentMergeInfo** smis); 00150 00151 //Merges the norms for all fields 00152 void mergeNorms(); 00153 00154 void createCompoundFile(const char* filename, CL_NS(util)::AStringArrayWithDeletor& files); 00155 friend class IndexWriter; //allow IndexWriter to use createCompoundFile 00156 }; 00157 CL_NS_END 00158 #endif