Class MonotonicBlockPackedWriter


public final class MonotonicBlockPackedWriter extends Object
A writer for large monotonically increasing sequences of positive longs.

The sequence is divided into fixed-size blocks and for each block, values are modeled after a linear function f: x → A × x + B. The block encodes deltas from the expected values computed from this function using as few bits as possible.


  • <BLock>BlockCount
  • BlockCount: ⌈ ValueCount / BlockSize ⌉
  • Block: <Header, (Ints)>
  • Header: <B, A, BitsPerValue>
  • B: the B from f: x → A × x + B using a zig-zag encoded vLong
  • A: the A from f: x → A × x + B encoded using Float.floatToIntBits(float) on 4 bytes
  • BitsPerValue: a variable-length int
  • Ints: if BitsPerValue is 0, then there is nothing to read and all values perfectly match the result of the function. Otherwise, these are the packed deltas from the expected value (computed from the function) using exactly BitsPerValue bits per value.
See Also:
NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
  • Field Details

    • out

      protected DataOutput out
    • values

      protected final long[] values
    • blocks

      protected byte[] blocks
    • off

      protected int off
    • ord

      protected long ord
    • finished

      protected boolean finished
  • Constructor Details

    • MonotonicBlockPackedWriter

      public MonotonicBlockPackedWriter(DataOutput out, int blockSize)
      Sole constructor.
      blockSize - the number of values of a single block, must be a power of 2
  • Method Details

    • add

      public void add(long l) throws IOException
      Append a new long.
    • flush

      protected void flush() throws IOException
    • reset

      public void reset(DataOutput out)
      Reset this writer to wrap out. The block size remains unchanged.
    • finish

      public void finish() throws IOException
      Flush all buffered data to disk. This instance is not usable anymore after this method has been called until reset(DataOutput) has been called.
    • ord

      public long ord()
      Return the number of values which have been added.
    • writeValues

      protected final void writeValues(int bitsRequired) throws IOException