Class Lucene99SkipReader

java.lang.Object
org.apache.lucene.codecs.MultiLevelSkipListReader
org.apache.lucene.codecs.lucene99.Lucene99SkipReader
All Implemented Interfaces:
Closeable, AutoCloseable

public class Lucene99SkipReader extends MultiLevelSkipListReader
Implements the skip list reader for block postings format that stores positions and payloads.

Although this skipper uses MultiLevelSkipListReader as an interface, its definition of skip position will be a little different.

For example, when skipInterval = blockSize = 3, df = 2*skipInterval = 6,

 0 1 2 3 4 5
 d d d d d d    (posting list)
     ^     ^    (skip point in MultiLeveSkipWriter)
       ^        (skip point in Lucene99SkipWriter)
 

In this case, MultiLevelSkipListReader will use the last document as a skip point, while Lucene99SkipReader should assume no skip point will comes.

If we use the interface directly in Lucene99SkipReader, it may silly try to read another skip data after the only skip point is loaded.

To illustrate this, we can call skipTo(d[5]), since skip point d[3] has smaller docId, and numSkipped+blockSize== df, the MultiLevelSkipListReader will assume the skip list isn't exhausted yet, and try to load a non-existed skip point

Therefore, we'll trim df before passing it to the interface. see trim(int)

  • Constructor Details

    • Lucene99SkipReader

      public Lucene99SkipReader(IndexInput skipStream, int maxSkipLevels, boolean hasPos, boolean hasOffsets, boolean hasPayloads)
  • Method Details

    • trim

      protected int trim(int df)
      Trim original docFreq to tell skipReader read proper number of skip points.

      Since our definition in Lucene99Skip* is a little different from MultiLevelSkip* This trimmed docFreq will prevent skipReader from: 1. silly reading a non-existed skip point after the last block boundary 2. moving into the vInt block

    • init

      public void init(long skipPointer, long docBasePointer, long posBasePointer, long payBasePointer, int df) throws IOException
      Throws:
      IOException
    • getDocPointer

      public long getDocPointer()
      Returns the doc pointer of the doc to which the last call of MultiLevelSkipListReader.skipTo(int) has skipped.
    • getPosPointer

      public long getPosPointer()
    • getPosBufferUpto

      public int getPosBufferUpto()
    • getPayPointer

      public long getPayPointer()
    • getPayloadByteUpto

      public int getPayloadByteUpto()
    • getNextSkipDoc

      public int getNextSkipDoc()
    • seekChild

      protected void seekChild(int level) throws IOException
      Description copied from class: MultiLevelSkipListReader
      Seeks the skip entry on the given level
      Overrides:
      seekChild in class MultiLevelSkipListReader
      Throws:
      IOException
    • setLastSkipData

      protected void setLastSkipData(int level)
      Description copied from class: MultiLevelSkipListReader
      Copies the values of the last read skip entry on this level
      Overrides:
      setLastSkipData in class MultiLevelSkipListReader
    • readSkipData

      protected int readSkipData(int level, IndexInput skipStream) throws IOException
      Description copied from class: MultiLevelSkipListReader
      Subclasses must implement the actual skip data encoding in this method.
      Specified by:
      readSkipData in class MultiLevelSkipListReader
      Parameters:
      level - the level skip data shall be read from
      skipStream - the skip stream to read from
      Throws:
      IOException
    • readImpacts

      protected void readImpacts(int level, IndexInput skipStream) throws IOException
      Throws:
      IOException