diff --git a/java/rocksjni/options.cc b/java/rocksjni/options.cc index ef5b4bffd..228e0f45c 100644 --- a/java/rocksjni/options.cc +++ b/java/rocksjni/options.cc @@ -706,6 +706,17 @@ void Java_org_rocksdb_Options_useFixedLengthPrefixExtractor( static_cast(jprefix_length))); } +/* + * Method: useCappedPrefixExtractor + * Signature: (JI)V + */ +void Java_org_rocksdb_Options_useCappedPrefixExtractor( + JNIEnv* env, jobject jobj, jlong jhandle, jint jprefix_length) { + reinterpret_cast(jhandle)->prefix_extractor.reset( + rocksdb::NewCappedPrefixTransform( + static_cast(jprefix_length))); +} + /* * Class: org_rocksdb_Options * Method: walTtlSeconds diff --git a/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java b/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java index cdb97167c..32cb341db 100644 --- a/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java +++ b/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java @@ -191,6 +191,13 @@ public class ColumnFamilyOptions extends RocksObject return this; } + @Override + public ColumnFamilyOptions useCappedPrefixExtractor(final int n) { + assert(isInitialized()); + useCappedPrefixExtractor(nativeHandle_, n); + return this; + } + @Override public ColumnFamilyOptions setCompressionType(final CompressionType compressionType) { setCompressionType(nativeHandle_, compressionType.getValue()); @@ -695,6 +702,8 @@ public class ColumnFamilyOptions extends RocksObject private native List compressionPerLevel(long handle); private native void useFixedLengthPrefixExtractor( long handle, int prefixLength); + private native void useCappedPrefixExtractor( + long handle, int prefixLength); private native void setNumLevels( long handle, int numLevels); private native int numLevels(long handle); diff --git a/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java b/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java index ad296f111..1c7a5a110 100644 --- a/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java +++ b/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java @@ -229,6 +229,16 @@ public interface ColumnFamilyOptionsInterface { */ Object useFixedLengthPrefixExtractor(int n); + + /** + * Same as fixed length prefix extractor, except that when slice is + * shorter than the fixed length, it will use the full key. + * + * @param n use the first n bytes of a key as its prefix. + * @return the reference to the current option. + */ + Object useCappedPrefixExtractor(int n); + /** * Compress blocks using the specified compression algorithm. This * parameter can be changed dynamically. diff --git a/java/src/main/java/org/rocksdb/Options.java b/java/src/main/java/org/rocksdb/Options.java index 92efc7887..771de0ac6 100644 --- a/java/src/main/java/org/rocksdb/Options.java +++ b/java/src/main/java/org/rocksdb/Options.java @@ -667,6 +667,13 @@ public class Options extends RocksObject return this; } + @Override + public Options useCappedPrefixExtractor(final int n) { + assert(isInitialized()); + useCappedPrefixExtractor(nativeHandle_, n); + return this; + } + @Override public CompressionType compressionType() { return CompressionType.values()[compressionType(nativeHandle_)]; @@ -1214,6 +1221,8 @@ public class Options extends RocksObject private native List compressionPerLevel(long handle); private native void useFixedLengthPrefixExtractor( long handle, int prefixLength); + private native void useCappedPrefixExtractor( + long handle, int prefixLength); private native void setNumLevels( long handle, int numLevels); private native int numLevels(long handle); diff --git a/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java b/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java index 1a0b4df3b..af7216128 100644 --- a/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java +++ b/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java @@ -615,6 +615,21 @@ public class ColumnFamilyOptionsTest { } } + + @Test + public void shouldSetTestCappedPrefixExtractor() { + ColumnFamilyOptions options = null; + try { + options = new ColumnFamilyOptions(); + options.useCappedPrefixExtractor(100); + options.useCappedPrefixExtractor(10); + } finally { + if (options != null) { + options.dispose(); + } + } + } + @Test public void compressionTypes() { ColumnFamilyOptions columnFamilyOptions = null; diff --git a/java/src/test/java/org/rocksdb/OptionsTest.java b/java/src/test/java/org/rocksdb/OptionsTest.java index 611e37c51..1c1dfc63a 100644 --- a/java/src/test/java/org/rocksdb/OptionsTest.java +++ b/java/src/test/java/org/rocksdb/OptionsTest.java @@ -1149,6 +1149,21 @@ public class OptionsTest { } } + @Test + public void shouldSetTestCappedPrefixExtractor() { + Options options = null; + try { + options = new Options(); + options.useCappedPrefixExtractor(100); + options.useCappedPrefixExtractor(10); + } finally { + if (options != null) { + options.dispose(); + } + } + } + + @Test public void shouldTestMemTableFactoryName() throws RocksDBException {