blob: 5a18f5fd007b03c860361933a643d5176ad48772 [file] [log] [blame]
/*------------------------------------------------------------------------------
* 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