Beispiel #1
0
  public int currentSizeEstimate() {
    // no need to estimate if closed
    if (finished) {
      return block.size();
    }

    // no records is just a single int
    if (block.size() == 0) {
      return SIZE_OF_INT;
    }

    return block.size()
        + // raw data buffer
        restartPositions.size() * SIZE_OF_INT
        + // restart positions
        SIZE_OF_INT; // restart position size
  }
Beispiel #2
0
  public void add(Slice key, Slice value) {
    Preconditions.checkNotNull(key, "key is null");
    Preconditions.checkNotNull(value, "value is null");
    Preconditions.checkState(!finished, "block is finished");
    Preconditions.checkPositionIndex(restartBlockEntryCount, blockRestartInterval);

    Preconditions.checkArgument(
        lastKey == null || comparator.compare(key, lastKey) > 0,
        "key %s must be greater than last key %s",
        key,
        lastKey);

    int sharedKeyBytes = 0;
    if (restartBlockEntryCount < blockRestartInterval) {
      sharedKeyBytes = calculateSharedBytes(key, lastKey);
    } else {
      // restart prefix compression
      restartPositions.add(block.size());
      restartBlockEntryCount = 0;
    }

    int nonSharedKeyBytes = key.length() - sharedKeyBytes;

    // write "<shared><non_shared><value_size>"
    VariableLengthQuantity.writeVariableLengthInt(sharedKeyBytes, block);
    VariableLengthQuantity.writeVariableLengthInt(nonSharedKeyBytes, block);
    VariableLengthQuantity.writeVariableLengthInt(value.length(), block);

    // write non-shared key bytes
    block.writeBytes(key, sharedKeyBytes, nonSharedKeyBytes);

    // write value bytes
    block.writeBytes(value, 0, value.length());

    // update last key
    lastKey = key;

    // update state
    entryCount++;
    restartBlockEntryCount++;
  }