public override int Advance(int target) { //System.out.println("StandardR.D&PE advance seg=" + segment + " target=" + target + " this=" + this); if ((target - outerInstance.skipInterval) >= doc && limit >= outerInstance.skipMinimum) { // There are enough docs in the posting to have // skip data, and it isn't too close if (skipper == null) { // this is the first time this enum has ever been used for skipping -- do lazy init skipper = new Lucene40SkipListReader((IndexInput)freqIn.Clone(), outerInstance.maxSkipLevels, outerInstance.skipInterval); } if (!skipped) { // this is the first time this posting has // skipped, since reset() was called, so now we // load the skip data for this posting //System.out.println(" init skipper freqOffset=" + freqOffset + " skipOffset=" + skipOffset + " vs len=" + freqIn.length()); skipper.Init(freqOffset + skipOffset, freqOffset, proxOffset, limit, storePayloads, storeOffsets); skipped = true; } int newOrd = skipper.SkipTo(target); if (newOrd > ord) { // Skipper moved ord = newOrd; doc = accum = skipper.Doc; freqIn.Seek(skipper.FreqPointer); lazyProxPointer = skipper.ProxPointer; posPendingCount = 0; position = 0; startOffset = 0; payloadPending = false; payloadLength = skipper.PayloadLength; offsetLength = skipper.OffsetLength; } } // Now, linear scan for the rest: do { NextDoc(); } while (target > doc); return(doc); }
private int SkipTo(int target) { if ((target - outerInstance.skipInterval) >= m_accum && m_limit >= outerInstance.skipMinimum) { // There are enough docs in the posting to have // skip data, and it isn't too close. if (skipper == null) { // this is the first time this enum has ever been used for skipping -- do lazy init skipper = new Lucene40SkipListReader((IndexInput)freqIn.Clone(), outerInstance.maxSkipLevels, outerInstance.skipInterval); } if (!m_skipped) { // this is the first time this posting has // skipped since reset() was called, so now we // load the skip data for this posting skipper.Init(m_freqOffset + m_skipOffset, m_freqOffset, 0, m_limit, m_storePayloads, m_storeOffsets); m_skipped = true; } int newOrd = skipper.SkipTo(target); if (newOrd > m_ord) { // Skipper moved m_ord = newOrd; m_accum = skipper.Doc; freqIn.Seek(skipper.FreqPointer); } } return(ScanTo(target)); }