Ejemplo n.º 1
0
void SkipListWriter::addSkipPoint(docid_t docId,fileoffset_t offset,fileoffset_t pOffset)
{
    curDoc_ = docId;
    curOffset_ = offset;
    curPOffset_ = pOffset;

    int nNumLevels;   
    int nNumPoints = ++numPointsInLowestLevel_;
    for (nNumLevels = 1; (nNumPoints % skipInterval_) == 0 && nNumLevels < maxSkipLevel_; nNumPoints /= skipInterval_) 
        nNumLevels++;

    uint64_t nChildPointer = 0;	 

    for (int level = 0; level < nNumLevels; level++) 
    {
        writeSkipData(level);

        pLastDoc_[level] = curDoc_;
        pLastOffset_[level] = curOffset_;
        pLastPOffset_[level] = curPOffset_;    
		
        uint64_t nNewChildPointer = ppSkipLevels_[level]->getLength();
        if (level != 0) 
        {
            // store child pointers for all levels except the lowest
            ppSkipLevels_[level]->addVData64(nChildPointer);
        }
        //remember the childPointer for the next level
        nChildPointer = nNewChildPointer;
    }	
}
void MultiLevelSkipListWriter::bufferSkip(int32_t df) {
    int32_t numLevels = 0;

    // determine max level
    for (; (df % skipInterval) == 0 && numLevels < numberOfSkipLevels; df /= skipInterval) {
        ++numLevels;
    }

    int64_t childPointer = 0;

    for (int32_t level = 0; level < numLevels; ++level) {
        writeSkipData(level, skipBuffer[level]);

        int64_t newChildPointer = skipBuffer[level]->getFilePointer();

        if (level != 0) {
            // store child pointers for all levels except the lowest
            skipBuffer[level]->writeVLong(childPointer);
        }

        // remember the childPointer for the next level
        childPointer = newChildPointer;
    }
}