/*------------------------------------------------------------------------------ | |
* 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 "FilteredTermEnum.h" | |
CL_NS_USE(index) | |
CL_NS_DEF(search) | |
FilteredTermEnum::FilteredTermEnum(){ | |
//Func - Constructor | |
//Pre - true | |
//Post - Instance has been created | |
currentTerm = NULL; | |
actualEnum = NULL; | |
} | |
FilteredTermEnum::~FilteredTermEnum() { | |
//Func - Destructor | |
//Pre - true | |
//Post - The instance has been destroyed | |
close(); | |
} | |
int32_t FilteredTermEnum::docFreq() const { | |
//Func - Returns the docFreq of the current Term in the enumeration. | |
//Pre - next() must have been called at least once | |
//Post - if actualEnum is NULL result is -1 otherwise the frequencey is returned | |
if (actualEnum == NULL){ | |
return -1; | |
} | |
return actualEnum->docFreq(); | |
} | |
bool FilteredTermEnum::next() { | |
//Func - Increments the enumeration to the next element. | |
//Pre - true | |
//Post - Returns True if the enumeration has been moved to the next element otherwise false | |
//The actual enumerator is not initialized! | |
if (actualEnum == NULL){ | |
return false; | |
} | |
//Finalize the currentTerm and reset it to NULL | |
_CLDECDELETE( currentTerm ); | |
//Iterate through the enumeration | |
while (currentTerm == NULL) { | |
if (endEnum()) | |
return false; | |
if (actualEnum->next()) { | |
//Order term not to return reference ownership here. */ | |
Term* term = actualEnum->term(false); | |
//Compare the retrieved term | |
if (termCompare(term)){ | |
//Matched so finalize the current | |
_CLDECDELETE(currentTerm); | |
//Get a reference to the matched term | |
currentTerm = _CL_POINTER(term); | |
return true; | |
} | |
}else | |
return false; | |
} | |
_CLDECDELETE(currentTerm); | |
currentTerm = NULL; | |
return false; | |
} | |
Term* FilteredTermEnum::term() { | |
//Func - Returns the current Term in the enumeration. | |
//Pre - next() must have been called at least once | |
// pointer is true or false | |
//Post - if pre(pointer) is true the reference counter of currentTerm is increased | |
// and current Term is returned otherwise currentTerm is only returned | |
return _CL_POINTER(currentTerm); | |
} | |
Term* FilteredTermEnum::term(bool pointer) { | |
if ( pointer ) | |
return _CL_POINTER(currentTerm); | |
else | |
return currentTerm; | |
} | |
void FilteredTermEnum::close(){ | |
//Func - Closes the enumeration to further activity, freeing resources. | |
//Pre - true | |
//Post - The Enumeration has been closed | |
//Check if actualEnum is valid | |
if (actualEnum){ | |
//Close the enumeration | |
actualEnum->close(); | |
} | |
//Destroy the enumeration | |
_CLDELETE(actualEnum); | |
//Destroy currentTerm | |
_CLDECDELETE(currentTerm); | |
} | |
void FilteredTermEnum::setEnum(TermEnum* actualEnum) { | |
//Func - Sets the actual Enumeration | |
//Pre - actualEnum != NULL | |
//Post - The instance has been created | |
CND_PRECONDITION(actualEnum != NULL,"actualEnum is NULL"); | |
_CLDELETE(this->actualEnum); | |
this->actualEnum = actualEnum; | |
// Find the first term that matches | |
//Ordered term not to return reference ownership here. | |
Term* term = actualEnum->term(false); | |
if (term != NULL && termCompare(term)){ | |
_CLDECDELETE(currentTerm); | |
currentTerm = _CL_POINTER(term); | |
}else{ | |
next(); | |
} | |
} | |
CL_NS_END |