| /*------------------------------------------------------------------------------ |
| * 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 |