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; } }