Logo Search packages:      
Sourcecode: qt4-x11 version File versions

SegmentMergeInfo.cpp

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

Generated by  Doxygen 1.6.0   Back to index