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

ExactPhraseScorer.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 "ExactPhraseScorer.h"

#include "PhraseScorer.h"
#include "CLucene/index/Terms.h"

CL_NS_USE(index)
CL_NS_DEF(search)

      ExactPhraseScorer::ExactPhraseScorer(Weight* weight, TermPositions** tps, 
            int32_t* positions, Similarity* similarity, uint8_t* norms):
            PhraseScorer(weight, tps, positions, similarity, norms){
      //Func - Constructor
      //Pre  - tps != NULL
      //       tpsLength >= 0
      //       n != NULL
      //Post - Instance has been created

            CND_PRECONDITION(tps != NULL,"tps is NULL");
            CND_PRECONDITION(tps[0] != NULL,"tps is NULL");
            //CND_PRECONDITION(n != NULL,"n is NULL") =this is checked already in PhraseScorer

      }

      float_t ExactPhraseScorer::phraseFreq(){
      //Func - Returns the freqency of the phrase
      //Pre  - first != NULL
      //       last  != NULL
      //       pq    != NULL
      //       size of the PhraseQueue pq is 0
      //Post - The frequency of the phrase has been returned

            CND_PRECONDITION(first != NULL,"first is NULL");
            CND_PRECONDITION(last  != NULL,"last is NULL");
            CND_PRECONDITION(pq    != NULL,"pq is NULL");
            CND_PRECONDITION(pq->size()==0,"pq is not empty");

            //build pq from list

            //Add the nodes of the list of PhrasePositions and store them
            //into the PhraseQueue pq so it can used to build
            //a list of sorted nodes
            for (PhrasePositions* pp = first; pp != NULL; pp = pp->_next) {
                  //Read the first TermPosition of the current PhrasePositions pp
                  pp->firstPosition();
                  //Store the current PhrasePositions pp into the PhraseQueue pq
                  pq->put(pp);
            }
            //pqToList requires that first and last be NULL when it's called.  
            //This is done at the beginning of pqToList()
            //In this case, the nodes of the linked list are referenced by pq (see
            //above loop), so we can clear our pointers to the head and tail of the
            //linked list without fear of leaking the nodes.
            
            //rebuild list from pq
            pqToList();

            //Initialize freq at 0
            int32_t freq = 0;

            //find position with all terms
            do {
                  //scan forward in first
                  while (first->position < last->position){
                        do{
                              if (!first->nextPosition()){
                                    return (float_t)freq;
                              }
                        } while (first->position < last->position);
                        //Make the current first node the last node in the list
                        firstToLast();
                  }
                  //all equal: a match has been found
                  freq++;
            } while (last->nextPosition());

            return (float_t)freq;
      }
CL_NS_END

Generated by  Doxygen 1.6.0   Back to index