diff --git a/leveldb/src/main/java/org/iq80/leveldb/impl/FileMetaData.java b/leveldb/src/main/java/org/iq80/leveldb/impl/FileMetaData.java index cf32c5df..151e1be7 100644 --- a/leveldb/src/main/java/org/iq80/leveldb/impl/FileMetaData.java +++ b/leveldb/src/main/java/org/iq80/leveldb/impl/FileMetaData.java @@ -48,8 +48,8 @@ public FileMetaData(long number, long fileSize, InternalKey smallest, InternalKe { this.number = number; this.fileSize = fileSize; - this.smallest = smallest; - this.largest = largest; + this.smallest = smallest.compressed(); + this.largest = largest.compressed(); } public long getFileSize() diff --git a/leveldb/src/main/java/org/iq80/leveldb/impl/InternalKey.java b/leveldb/src/main/java/org/iq80/leveldb/impl/InternalKey.java index 1b9fa73e..7ed0204d 100644 --- a/leveldb/src/main/java/org/iq80/leveldb/impl/InternalKey.java +++ b/leveldb/src/main/java/org/iq80/leveldb/impl/InternalKey.java @@ -140,4 +140,9 @@ private static Slice getUserKey(Slice data) { return data.slice(0, data.length() - SIZE_OF_LONG); } + + public InternalKey compressed() + { + return new InternalKey(this.userKey.compressed(), sequenceNumber, valueType); + } } diff --git a/leveldb/src/main/java/org/iq80/leveldb/util/Slice.java b/leveldb/src/main/java/org/iq80/leveldb/util/Slice.java index 0605e771..351bb68c 100644 --- a/leveldb/src/main/java/org/iq80/leveldb/util/Slice.java +++ b/leveldb/src/main/java/org/iq80/leveldb/util/Slice.java @@ -43,6 +43,8 @@ public final class Slice implements Comparable { + static final int COMPRESSION_THRESHOLD = 1024; + private final byte[] data; private final int offset; private final int length; @@ -717,4 +719,15 @@ public String toString() "length=" + length() + ')'; } + + /** + * get compressed slice if data.length - length >= 1kb + */ + public Slice compressed() + { + if (this.data.length - length < COMPRESSION_THRESHOLD) { + return this; + } + return new Slice(getBytes()); + } }