/*------------------------------------------------------------------------------ | |
* 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. | |
------------------------------------------------------------------------------*/ | |
#include "CLucene/StdHeader.h" | |
#include "SegmentMergeInfo.h" | |
#include "SegmentTermEnum.h" | |
#include "SegmentHeader.h" | |
CL_NS_DEF(index) | |
SegmentMergeInfo::SegmentMergeInfo(const int32_t b, TermEnum* te, IndexReader* r): | |
reader(r),termEnum(te),base(b), docMap(NULL) { | |
//Func - Constructor | |
//Pre - b >= 0 | |
// te contains a valid reference to a SegmentTermEnum instance | |
// r contains a valid reference to a SegmentReader instance | |
//Post - The instance has been created | |
CND_PRECONDITION(b >= 0, "b is a negative number"); | |
postings=NULL; | |
term = te->term(); | |
} | |
SegmentMergeInfo::~SegmentMergeInfo(){ | |
//Func - Destructor | |
//Pre - true | |
//Post - The instance has been destroyed | |
close(); | |
} | |
int32_t* SegmentMergeInfo::getDocMap(){ | |
if ( docMap == NULL ){ | |
// build array which maps document numbers around deletions | |
if (reader->hasDeletions()) { | |
//Get the total number of documents managed by the reader including the deleted ones | |
int32_t maxDoc = reader->maxDoc(); | |
//Create a map for all documents | |
docMap = _CL_NEWARRAY(int32_t,maxDoc); | |
int32_t j = 0; | |
//Iterate through all the document numbers | |
for (int32_t i = 0; i < maxDoc; i++) { | |
//Check if document i is marked deleted | |
if (reader->isDeleted(i)){ | |
//Document i has not been marked deleted so assign -1 | |
docMap[i] = -1; | |
}else{ | |
docMap[i] = j++; | |
} | |
} | |
} | |
} | |
return docMap; | |
} | |
TermPositions* SegmentMergeInfo::getPositions() { | |
if (postings == NULL) { | |
postings = reader->termPositions(); | |
} | |
return postings; | |
} | |
bool SegmentMergeInfo::next() { | |
//Func - Moves the current term of the enumeration termEnum to the next and term | |
// points to this new current term | |
//Pre - true | |
//Post - Returns true if the term has been moved to the next otherwise false | |
if (termEnum->next()) { | |
_CLDECDELETE(term); | |
term = termEnum->term(); | |
return true; | |
} else { | |
_CLDECDELETE(term); //TODO: test HighFreqTerms errors with this | |
term = NULL; | |
return false; | |
} | |
} | |
void SegmentMergeInfo::close() { | |
//Func - Closes the the resources | |
//Pre - true | |
//Post - The resources have been closed | |
//First make sure posting has been closed | |
if ( postings != NULL ){ | |
postings->close(); | |
_CLVDELETE(postings); //todo: not a clucene object... should be | |
} | |
if ( termEnum != NULL ){ | |
termEnum->close(); | |
_CLDELETE(termEnum); | |
} | |
_CLDECDELETE(term); | |
_CLDELETE_ARRAY(docMap); | |
} | |
CL_NS_END |