blob: 7611056e7f2866fc2f5a6993a49c89f1982f1ece [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 "PhrasePositions.h"
#include "CLucene/index/Terms.h"
CL_NS_USE(index)
CL_NS_DEF(search)
PhrasePositions::PhrasePositions(TermPositions* Tp, const int32_t OffSet){
//Func - Constructor
//Pre - t != NULL
// OffSet != NULL
//Post - The instance has been created
CND_PRECONDITION(Tp != NULL,"Tp is NULL");
CND_PRECONDITION(OffSet >= 0 ,"OffSet is a negative number");
tp = Tp;
offset = OffSet;
position = 0;
count = 0;
doc = 0;
_next = NULL;
}
PhrasePositions::~PhrasePositions(){
//Func - Destructor
//Pre - true
//Post - The instance has been deleted
//delete next Phrase position and by doing that
//all PhrasePositions in the list
_CLDELETE(_next);
//Check if tp is valid
if ( tp != NULL ){
//Close TermPositions tp
tp->close();
_CLDELETE(tp);
}
}
bool PhrasePositions::next(){
//Func - Increments to next doc
//Pre - tp != NULL
//Post - if there was no next then doc = INT_MAX otherwise
// doc contains the current document number
CND_PRECONDITION(tp != NULL,"tp is NULL");
//Move to the next in TermPositions tp
if (!tp->next()) {
//There is no next so close the stream
tp->close();
//delete tp and reset tp to NULL
_CLVDELETE(tp); //todo: not a clucene object... should be
//Assign Doc sentinel value
doc = INT_MAX;
return false;
}else{
doc = tp->doc();
position = 0;
return true;
}
}
bool PhrasePositions::skipTo(int32_t target){
if (!tp->skipTo(target)) {
tp->close(); // close stream
doc = LUCENE_INT32_MAX_SHOULDBE; // sentinel value
return false;
}
doc = tp->doc();
position = 0;
return true;
}
void PhrasePositions::firstPosition(){
//Func - Read the first TermPosition
//Pre - tp != NULL
//Post -
CND_PRECONDITION(tp != NULL,"tp is NULL");
//read first pos
count = tp->freq();
//Move to the next TermPosition
nextPosition();
}
bool PhrasePositions::nextPosition(){
//Func - Move to the next position
//Pre - tp != NULL
//Post -
CND_PRECONDITION(tp != NULL,"tp is NULL");
if (count-- > 0) {
//read subsequent pos's
position = tp->nextPosition() - offset;
//Check position always bigger than or equal to 0
//bvk: todo, bug??? position < 0 occurs, cant figure out why,
//old version does it too and will fail the "SearchTest" test
//CND_CONDITION(position >= 0, "position has become a negative number");
return true;
}else{
return false;
}
}
CL_NS_END