Package org.apache.lucene.codecs.lucene99

## 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)

- - ### Field Summary

    - ### Fields inherited from class org.apache.lucene.codecs.MultiLevelSkipListReader

      `maxNumberOfSkipLevels, numberOfSkipLevels, skipDoc`

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `Lucene99SkipReader​(IndexInput skipStream, int maxSkipLevels, boolean hasPos, boolean hasOffsets, boolean hasPayloads)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `long` | `getDocPointer()` | Returns the doc pointer of the doc to which the last call of `MultiLevelSkipListReader.skipTo(int)` has skipped.
    `int` | `getNextSkipDoc()` |
    `int` | `getPayloadByteUpto()` |
    `long` | `getPayPointer()` |
    `int` | `getPosBufferUpto()` |
    `long` | `getPosPointer()` |
    `void` | `init​(long skipPointer, long docBasePointer, long posBasePointer, long payBasePointer, int df)` |
    `protected void` | `readImpacts​(int level, IndexInput skipStream)` |
    `protected int` | `readSkipData​(int level, IndexInput skipStream)` | Subclasses must implement the actual skip data encoding in this method.
    `protected void` | `seekChild​(int level)` | Seeks the skip entry on the given level
    `protected void` | `setLastSkipData​(int level)` | Copies the values of the last read skip entry on this level
    `protected int` | `trim​(int df)` | Trim original docFreq to tell skipReader read proper number of skip points.

    - ### Methods inherited from class org.apache.lucene.codecs.MultiLevelSkipListReader

      `close, getDoc, init, readChildPointer, readLevelLength, skipTo`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### Lucene99SkipReader

          public Lucene99SkipReader​(IndexInput skipStream,
                                    int maxSkipLevels,
                                    boolean hasPos,
                                    boolean hasOffsets,
                                    boolean hasPayloads)

  - ### Method Detail

    - #### 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`