HBASE-24194 : Refactor anonymous inner classes of BufferedEncodedSeeker to named inner classes (#1522)
Signed-off-by: Peter Somogyi <psomogyi@apache.org> Signed-off-by: binlijin <binlijin@gmail.com>
This commit is contained in:
parent
1f66806c96
commit
24e15c08ed
|
@ -81,35 +81,7 @@ public class CopyKeyDataBlockEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
@Override
|
||||
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
|
||||
return new BufferedEncodedSeeker<SeekerState>(decodingCtx) {
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
current.keyLength = currentBuffer.getInt();
|
||||
current.valueLength = currentBuffer.getInt();
|
||||
current.ensureSpaceForKey();
|
||||
currentBuffer.get(current.keyBuffer, 0, current.keyLength);
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
if (includesTags()) {
|
||||
// Read short as unsigned, high byte first
|
||||
current.tagsLength = ((currentBuffer.get() & 0xff) << 8) ^ (currentBuffer.get() & 0xff);
|
||||
currentBuffer.skip(current.tagsLength);
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
current.lastCommonPrefix = 0;
|
||||
decodeNext();
|
||||
}
|
||||
};
|
||||
return new SeekerStateBufferedEncodedSeeker(decodingCtx);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -123,4 +95,41 @@ public class CopyKeyDataBlockEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
private static class SeekerStateBufferedEncodedSeeker
|
||||
extends BufferedEncodedSeeker<SeekerState> {
|
||||
|
||||
private SeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
|
||||
super(decodingCtx);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
current.keyLength = currentBuffer.getInt();
|
||||
current.valueLength = currentBuffer.getInt();
|
||||
current.ensureSpaceForKey();
|
||||
currentBuffer.get(current.keyBuffer, 0, current.keyLength);
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
if (includesTags()) {
|
||||
// Read short as unsigned, high byte first
|
||||
current.tagsLength = ((currentBuffer.get() & 0xff) << 8) ^ (currentBuffer.get() & 0xff);
|
||||
currentBuffer.skip(current.tagsLength);
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
current.lastCommonPrefix = 0;
|
||||
decodeNext();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -381,129 +381,7 @@ public class DiffKeyDeltaEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
@Override
|
||||
public EncodedSeeker createSeeker(HFileBlockDecodingContext decodingCtx) {
|
||||
return new BufferedEncodedSeeker<DiffSeekerState>(decodingCtx) {
|
||||
private byte[] familyNameWithSize;
|
||||
private static final int TIMESTAMP_WITH_TYPE_LENGTH =
|
||||
Bytes.SIZEOF_LONG + Bytes.SIZEOF_BYTE;
|
||||
|
||||
private void decode(boolean isFirst) {
|
||||
byte flag = currentBuffer.get();
|
||||
byte type = 0;
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
if (!isFirst) {
|
||||
type = current.keyBuffer[current.keyLength - Bytes.SIZEOF_BYTE];
|
||||
}
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
|
||||
current.ensureSpaceForKey();
|
||||
|
||||
if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
|
||||
// length of row is different, copy everything except family
|
||||
|
||||
// copy the row size
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
|
||||
// copy the rest of row
|
||||
currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
|
||||
current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
|
||||
|
||||
// copy the column family
|
||||
System.arraycopy(familyNameWithSize, 0, current.keyBuffer,
|
||||
current.rowLengthWithSize, familyNameWithSize.length);
|
||||
|
||||
// copy the qualifier
|
||||
currentBuffer.get(current.keyBuffer,
|
||||
current.rowLengthWithSize + familyNameWithSize.length,
|
||||
current.keyLength - current.rowLengthWithSize -
|
||||
familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
|
||||
} else if (current.lastCommonPrefix < current.rowLengthWithSize) {
|
||||
// we have to copy part of row and qualifier,
|
||||
// but column family is in right place
|
||||
|
||||
// before column family (rest of row)
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.rowLengthWithSize - current.lastCommonPrefix);
|
||||
|
||||
// after column family (qualifier)
|
||||
currentBuffer.get(current.keyBuffer,
|
||||
current.rowLengthWithSize + familyNameWithSize.length,
|
||||
current.keyLength - current.rowLengthWithSize -
|
||||
familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
|
||||
} else {
|
||||
// copy just the ending
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH -
|
||||
current.lastCommonPrefix);
|
||||
}
|
||||
|
||||
// timestamp
|
||||
int pos = current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH;
|
||||
int timestampFitInBytes = 1 +
|
||||
((flag & MASK_TIMESTAMP_LENGTH) >>> SHIFT_TIMESTAMP_LENGTH);
|
||||
long timestampOrDiff = ByteBuff.readLong(currentBuffer, timestampFitInBytes);
|
||||
if ((flag & FLAG_TIMESTAMP_SIGN) != 0) {
|
||||
timestampOrDiff = -timestampOrDiff;
|
||||
}
|
||||
if ((flag & FLAG_TIMESTAMP_IS_DIFF) == 0) { // it is timestamp
|
||||
current.timestamp = timestampOrDiff;
|
||||
} else { // it is diff
|
||||
current.timestamp = current.timestamp - timestampOrDiff;
|
||||
}
|
||||
Bytes.putLong(current.keyBuffer, pos, current.timestamp);
|
||||
pos += Bytes.SIZEOF_LONG;
|
||||
|
||||
// type
|
||||
if ((flag & FLAG_SAME_TYPE) == 0) {
|
||||
currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
|
||||
} else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
current.keyBuffer[pos] = type;
|
||||
}
|
||||
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
|
||||
// read column family
|
||||
byte familyNameLength = currentBuffer.get();
|
||||
familyNameWithSize = new byte[familyNameLength + Bytes.SIZEOF_BYTE];
|
||||
familyNameWithSize[0] = familyNameLength;
|
||||
currentBuffer.get(familyNameWithSize, Bytes.SIZEOF_BYTE,
|
||||
familyNameLength);
|
||||
decode(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
decode(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DiffSeekerState createSeekerState() {
|
||||
return new DiffSeekerState(this.tmpPair, this.includesTags());
|
||||
}
|
||||
};
|
||||
return new DiffSeekerStateBufferedEncodedSeeker(decodingCtx);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -525,4 +403,133 @@ public class DiffKeyDeltaEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
private static class DiffSeekerStateBufferedEncodedSeeker
|
||||
extends BufferedEncodedSeeker<DiffSeekerState> {
|
||||
private byte[] familyNameWithSize;
|
||||
private static final int TIMESTAMP_WITH_TYPE_LENGTH =
|
||||
Bytes.SIZEOF_LONG + Bytes.SIZEOF_BYTE;
|
||||
|
||||
private DiffSeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
|
||||
super(decodingCtx);
|
||||
}
|
||||
|
||||
private void decode(boolean isFirst) {
|
||||
byte flag = currentBuffer.get();
|
||||
byte type = 0;
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
if (!isFirst) {
|
||||
type = current.keyBuffer[current.keyLength - Bytes.SIZEOF_BYTE];
|
||||
}
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
|
||||
current.ensureSpaceForKey();
|
||||
|
||||
if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
|
||||
// length of row is different, copy everything except family
|
||||
|
||||
// copy the row size
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
|
||||
// copy the rest of row
|
||||
currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
|
||||
current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
|
||||
|
||||
// copy the column family
|
||||
System.arraycopy(familyNameWithSize, 0, current.keyBuffer,
|
||||
current.rowLengthWithSize, familyNameWithSize.length);
|
||||
|
||||
// copy the qualifier
|
||||
currentBuffer.get(current.keyBuffer,
|
||||
current.rowLengthWithSize + familyNameWithSize.length,
|
||||
current.keyLength - current.rowLengthWithSize -
|
||||
familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
|
||||
} else if (current.lastCommonPrefix < current.rowLengthWithSize) {
|
||||
// we have to copy part of row and qualifier,
|
||||
// but column family is in right place
|
||||
|
||||
// before column family (rest of row)
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.rowLengthWithSize - current.lastCommonPrefix);
|
||||
|
||||
// after column family (qualifier)
|
||||
currentBuffer.get(current.keyBuffer,
|
||||
current.rowLengthWithSize + familyNameWithSize.length,
|
||||
current.keyLength - current.rowLengthWithSize -
|
||||
familyNameWithSize.length - TIMESTAMP_WITH_TYPE_LENGTH);
|
||||
} else {
|
||||
// copy just the ending
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH -
|
||||
current.lastCommonPrefix);
|
||||
}
|
||||
|
||||
// timestamp
|
||||
int pos = current.keyLength - TIMESTAMP_WITH_TYPE_LENGTH;
|
||||
int timestampFitInBytes = 1 +
|
||||
((flag & MASK_TIMESTAMP_LENGTH) >>> SHIFT_TIMESTAMP_LENGTH);
|
||||
long timestampOrDiff = ByteBuff.readLong(currentBuffer, timestampFitInBytes);
|
||||
if ((flag & FLAG_TIMESTAMP_SIGN) != 0) {
|
||||
timestampOrDiff = -timestampOrDiff;
|
||||
}
|
||||
if ((flag & FLAG_TIMESTAMP_IS_DIFF) == 0) { // it is timestamp
|
||||
current.timestamp = timestampOrDiff;
|
||||
} else { // it is diff
|
||||
current.timestamp = current.timestamp - timestampOrDiff;
|
||||
}
|
||||
Bytes.putLong(current.keyBuffer, pos, current.timestamp);
|
||||
pos += Bytes.SIZEOF_LONG;
|
||||
|
||||
// type
|
||||
if ((flag & FLAG_SAME_TYPE) == 0) {
|
||||
currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
|
||||
} else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
current.keyBuffer[pos] = type;
|
||||
}
|
||||
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
|
||||
// read column family
|
||||
byte familyNameLength = currentBuffer.get();
|
||||
familyNameWithSize = new byte[familyNameLength + Bytes.SIZEOF_BYTE];
|
||||
familyNameWithSize[0] = familyNameLength;
|
||||
currentBuffer.get(familyNameWithSize, Bytes.SIZEOF_BYTE,
|
||||
familyNameLength);
|
||||
decode(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
decode(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DiffSeekerState createSeekerState() {
|
||||
return new DiffSeekerState(this.tmpPair, this.includesTags());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -396,130 +396,138 @@ public class FastDiffDeltaEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
@Override
|
||||
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
|
||||
return new BufferedEncodedSeeker<FastDiffSeekerState>(decodingCtx) {
|
||||
private void decode(boolean isFirst) {
|
||||
byte flag = currentBuffer.get();
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
if (!isFirst) {
|
||||
System.arraycopy(current.keyBuffer,
|
||||
current.keyLength - current.prevTimestampAndType.length,
|
||||
current.prevTimestampAndType, 0,
|
||||
current.prevTimestampAndType.length);
|
||||
}
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
return new FastDiffSeekerStateBufferedEncodedSeeker(decodingCtx);
|
||||
}
|
||||
|
||||
private static class FastDiffSeekerStateBufferedEncodedSeeker
|
||||
extends BufferedEncodedSeeker<FastDiffSeekerState> {
|
||||
|
||||
private FastDiffSeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
|
||||
super(decodingCtx);
|
||||
}
|
||||
|
||||
private void decode(boolean isFirst) {
|
||||
byte flag = currentBuffer.get();
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
if (!isFirst) {
|
||||
System.arraycopy(current.keyBuffer,
|
||||
current.keyLength - current.prevTimestampAndType.length,
|
||||
current.prevTimestampAndType, 0,
|
||||
current.prevTimestampAndType.length);
|
||||
}
|
||||
if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
if ((flag & FLAG_SAME_VALUE_LENGTH) == 0) {
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
}
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
|
||||
current.ensureSpaceForKey();
|
||||
current.ensureSpaceForKey();
|
||||
|
||||
if (isFirst) {
|
||||
// copy everything
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.prevTimestampAndType.length);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
current.familyLengthWithSize =
|
||||
current.keyBuffer[current.rowLengthWithSize] + Bytes.SIZEOF_BYTE;
|
||||
} else if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
|
||||
// length of row is different, copy everything except family
|
||||
if (isFirst) {
|
||||
// copy everything
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.prevTimestampAndType.length);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
current.familyLengthWithSize =
|
||||
current.keyBuffer[current.rowLengthWithSize] + Bytes.SIZEOF_BYTE;
|
||||
} else if (current.lastCommonPrefix < Bytes.SIZEOF_SHORT) {
|
||||
// length of row is different, copy everything except family
|
||||
|
||||
// copy the row size
|
||||
int oldRowLengthWithSize = current.rowLengthWithSize;
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
// copy the row size
|
||||
int oldRowLengthWithSize = current.rowLengthWithSize;
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
Bytes.SIZEOF_SHORT - current.lastCommonPrefix);
|
||||
current.rowLengthWithSize = Bytes.toShort(current.keyBuffer, 0) +
|
||||
Bytes.SIZEOF_SHORT;
|
||||
|
||||
// move the column family
|
||||
System.arraycopy(current.keyBuffer, oldRowLengthWithSize,
|
||||
current.keyBuffer, current.rowLengthWithSize,
|
||||
current.familyLengthWithSize);
|
||||
// move the column family
|
||||
System.arraycopy(current.keyBuffer, oldRowLengthWithSize,
|
||||
current.keyBuffer, current.rowLengthWithSize,
|
||||
current.familyLengthWithSize);
|
||||
|
||||
// copy the rest of row
|
||||
currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
|
||||
current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
|
||||
// copy the rest of row
|
||||
currentBuffer.get(current.keyBuffer, Bytes.SIZEOF_SHORT,
|
||||
current.rowLengthWithSize - Bytes.SIZEOF_SHORT);
|
||||
|
||||
// copy the qualifier
|
||||
currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
|
||||
+ current.familyLengthWithSize, current.keyLength
|
||||
- current.rowLengthWithSize - current.familyLengthWithSize
|
||||
- current.prevTimestampAndType.length);
|
||||
} else if (current.lastCommonPrefix < current.rowLengthWithSize) {
|
||||
// We have to copy part of row and qualifier, but the column family
|
||||
// is in the right place.
|
||||
// copy the qualifier
|
||||
currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
|
||||
+ current.familyLengthWithSize, current.keyLength
|
||||
- current.rowLengthWithSize - current.familyLengthWithSize
|
||||
- current.prevTimestampAndType.length);
|
||||
} else if (current.lastCommonPrefix < current.rowLengthWithSize) {
|
||||
// We have to copy part of row and qualifier, but the column family
|
||||
// is in the right place.
|
||||
|
||||
// before column family (rest of row)
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.rowLengthWithSize - current.lastCommonPrefix);
|
||||
// before column family (rest of row)
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.rowLengthWithSize - current.lastCommonPrefix);
|
||||
|
||||
// after column family (qualifier)
|
||||
currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
|
||||
+ current.familyLengthWithSize, current.keyLength
|
||||
- current.rowLengthWithSize - current.familyLengthWithSize
|
||||
- current.prevTimestampAndType.length);
|
||||
} else {
|
||||
// copy just the ending
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.prevTimestampAndType.length
|
||||
- current.lastCommonPrefix);
|
||||
}
|
||||
|
||||
// timestamp
|
||||
int pos = current.keyLength - current.prevTimestampAndType.length;
|
||||
int commonTimestampPrefix = (flag & MASK_TIMESTAMP_LENGTH) >>>
|
||||
SHIFT_TIMESTAMP_LENGTH;
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
System.arraycopy(current.prevTimestampAndType, 0, current.keyBuffer,
|
||||
pos, commonTimestampPrefix);
|
||||
}
|
||||
pos += commonTimestampPrefix;
|
||||
currentBuffer.get(current.keyBuffer, pos,
|
||||
Bytes.SIZEOF_LONG - commonTimestampPrefix);
|
||||
pos += Bytes.SIZEOF_LONG - commonTimestampPrefix;
|
||||
|
||||
// type
|
||||
if ((flag & FLAG_SAME_TYPE) == 0) {
|
||||
currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
|
||||
} else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
current.keyBuffer[pos] =
|
||||
current.prevTimestampAndType[Bytes.SIZEOF_LONG];
|
||||
}
|
||||
|
||||
// handle value
|
||||
if ((flag & FLAG_SAME_VALUE) == 0) {
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
}
|
||||
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
// after column family (qualifier)
|
||||
currentBuffer.get(current.keyBuffer, current.rowLengthWithSize
|
||||
+ current.familyLengthWithSize, current.keyLength
|
||||
- current.rowLengthWithSize - current.familyLengthWithSize
|
||||
- current.prevTimestampAndType.length);
|
||||
} else {
|
||||
// copy just the ending
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.prevTimestampAndType.length
|
||||
- current.lastCommonPrefix);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
decode(true);
|
||||
// timestamp
|
||||
int pos = current.keyLength - current.prevTimestampAndType.length;
|
||||
int commonTimestampPrefix = (flag & MASK_TIMESTAMP_LENGTH) >>>
|
||||
SHIFT_TIMESTAMP_LENGTH;
|
||||
if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
System.arraycopy(current.prevTimestampAndType, 0, current.keyBuffer,
|
||||
pos, commonTimestampPrefix);
|
||||
}
|
||||
pos += commonTimestampPrefix;
|
||||
currentBuffer.get(current.keyBuffer, pos,
|
||||
Bytes.SIZEOF_LONG - commonTimestampPrefix);
|
||||
pos += Bytes.SIZEOF_LONG - commonTimestampPrefix;
|
||||
|
||||
// type
|
||||
if ((flag & FLAG_SAME_TYPE) == 0) {
|
||||
currentBuffer.get(current.keyBuffer, pos, Bytes.SIZEOF_BYTE);
|
||||
} else if ((flag & FLAG_SAME_KEY_LENGTH) == 0) {
|
||||
current.keyBuffer[pos] =
|
||||
current.prevTimestampAndType[Bytes.SIZEOF_LONG];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
decode(false);
|
||||
// handle value
|
||||
if ((flag & FLAG_SAME_VALUE) == 0) {
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected FastDiffSeekerState createSeekerState() {
|
||||
return new FastDiffSeekerState(this.tmpPair, this.includesTags());
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
};
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
decode(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
decode(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected FastDiffSeekerState createSeekerState() {
|
||||
return new FastDiffSeekerState(this.tmpPair, this.includesTags());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -194,34 +194,42 @@ public class PrefixKeyDeltaEncoder extends BufferedDataBlockEncoder {
|
|||
|
||||
@Override
|
||||
public EncodedSeeker createSeeker(final HFileBlockDecodingContext decodingCtx) {
|
||||
return new BufferedEncodedSeeker<SeekerState>(decodingCtx) {
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.keyLength += current.lastCommonPrefix;
|
||||
current.ensureSpaceForKey();
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.lastCommonPrefix);
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
return new SeekerStateBufferedEncodedSeeker(decodingCtx);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
decodeNext();
|
||||
private static class SeekerStateBufferedEncodedSeeker
|
||||
extends BufferedEncodedSeeker<SeekerState> {
|
||||
|
||||
private SeekerStateBufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {
|
||||
super(decodingCtx);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeNext() {
|
||||
current.keyLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.valueLength = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.lastCommonPrefix = ByteBuff.readCompressedInt(currentBuffer);
|
||||
current.keyLength += current.lastCommonPrefix;
|
||||
current.ensureSpaceForKey();
|
||||
currentBuffer.get(current.keyBuffer, current.lastCommonPrefix,
|
||||
current.keyLength - current.lastCommonPrefix);
|
||||
current.valueOffset = currentBuffer.position();
|
||||
currentBuffer.skip(current.valueLength);
|
||||
if (includesTags()) {
|
||||
decodeTags();
|
||||
}
|
||||
};
|
||||
if (includesMvcc()) {
|
||||
current.memstoreTS = ByteBufferUtils.readVLong(currentBuffer);
|
||||
} else {
|
||||
current.memstoreTS = 0;
|
||||
}
|
||||
current.nextKvOffset = currentBuffer.position();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decodeFirst() {
|
||||
currentBuffer.skip(Bytes.SIZEOF_INT);
|
||||
decodeNext();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue