Summary: Added support for the merge operation to RocksJava. You can specify a merge function to be used on the current database. The merge function can either be one of the functions defined in utilities/merge_operators.h, which can be specified through its corresponding name, or a user-created function that needs to be encapsulated in a JNI object in order to be used. Examples are provided for both use cases. Test Plan: There are unit test in MergeTest.java Reviewers: ankgup87 Subscribers: vladb38 Differential Revision: https://reviews.facebook.net/D24525main
parent
b5dd7eed68
commit
a40ce219b9
@ -0,0 +1,19 @@ |
|||||||
|
// Copyright (c) 2014, Vlad Balan (vlad.gm@gmail.com). All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
package org.rocksdb; |
||||||
|
|
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* MergeOperator holds an operator to be applied when compacting |
||||||
|
* two values held under the same key in order to obtain a single |
||||||
|
* value. |
||||||
|
*/ |
||||||
|
public abstract class MergeOperator { |
||||||
|
|
||||||
|
abstract protected long newMergeOperatorHandle(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
// Copyright (c) 2014, Vlad Balan (vlad.gm@gmail.com). All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
package org.rocksdb; |
||||||
|
|
||||||
|
/** |
||||||
|
* MergeOperator holds an operator to be applied when compacting |
||||||
|
* two values held under the same key in order to obtain a single |
||||||
|
* value. |
||||||
|
*/ |
||||||
|
public class StringAppendOperator extends MergeOperator { |
||||||
|
|
||||||
|
@Override protected long newMergeOperatorHandle() { |
||||||
|
return newMergeOperatorHandleImpl(); |
||||||
|
} |
||||||
|
|
||||||
|
private native long newMergeOperatorHandleImpl(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
// Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
package org.rocksdb.test; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import org.rocksdb.*; |
||||||
|
|
||||||
|
public class MergeTest { |
||||||
|
static final String db_path_string = "/tmp/mergestringjni_db"; |
||||||
|
static final String db_path_function = "/tmp/mergefunctionjni_db"; |
||||||
|
static { |
||||||
|
RocksDB.loadLibrary(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void testStringOption() |
||||||
|
throws InterruptedException, RocksDBException { |
||||||
|
|
||||||
|
System.out.println("Testing merge function string option ==="); |
||||||
|
|
||||||
|
Options opt = new Options(); |
||||||
|
opt.setCreateIfMissing(true); |
||||||
|
opt.setMergeOperatorName("stringappend"); |
||||||
|
|
||||||
|
RocksDB db = RocksDB.open(opt, db_path_string); |
||||||
|
|
||||||
|
System.out.println("Writing aa under key..."); |
||||||
|
db.put("key".getBytes(), "aa".getBytes()); |
||||||
|
|
||||||
|
System.out.println("Writing bb under key..."); |
||||||
|
db.merge("key".getBytes(), "bb".getBytes()); |
||||||
|
|
||||||
|
byte[] value = db.get("key".getBytes()); |
||||||
|
String strValue = new String(value); |
||||||
|
|
||||||
|
System.out.println("Retrieved value: " + strValue); |
||||||
|
|
||||||
|
db.close(); |
||||||
|
opt.dispose(); |
||||||
|
|
||||||
|
assert(strValue.equals("aa,bb")); |
||||||
|
|
||||||
|
System.out.println("Merge function string option passed!"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static void testOperatorOption() |
||||||
|
throws InterruptedException, RocksDBException { |
||||||
|
|
||||||
|
System.out.println("Testing merge function operator option ==="); |
||||||
|
|
||||||
|
Options opt = new Options(); |
||||||
|
opt.setCreateIfMissing(true); |
||||||
|
|
||||||
|
StringAppendOperator stringAppendOperator = new StringAppendOperator(); |
||||||
|
opt.setMergeOperator(stringAppendOperator); |
||||||
|
|
||||||
|
RocksDB db = RocksDB.open(opt, db_path_string); |
||||||
|
|
||||||
|
System.out.println("Writing aa under key..."); |
||||||
|
db.put("key".getBytes(), "aa".getBytes()); |
||||||
|
|
||||||
|
System.out.println("Writing bb under key..."); |
||||||
|
db.merge("key".getBytes(), "bb".getBytes()); |
||||||
|
|
||||||
|
byte[] value = db.get("key".getBytes()); |
||||||
|
String strValue = new String(value); |
||||||
|
|
||||||
|
System.out.println("Retrieved value: " + strValue); |
||||||
|
|
||||||
|
db.close(); |
||||||
|
opt.dispose(); |
||||||
|
|
||||||
|
assert(strValue.equals("aa,bb")); |
||||||
|
|
||||||
|
System.out.println("Merge function operator option passed!"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) |
||||||
|
throws InterruptedException, RocksDBException { |
||||||
|
testStringOption(); |
||||||
|
testOperatorOption(); |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
// Copyright (c) 2014, Vlad Balan (vlad.gm@gmail.com). All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
//
|
||||||
|
// This file implements the "bridge" between Java and C++ for rocksdb::MergeOperator.
|
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <jni.h> |
||||||
|
#include <string> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
#include "include/org_rocksdb_StringAppendOperator.h" |
||||||
|
#include "rocksjni/portal.h" |
||||||
|
#include "rocksdb/db.h" |
||||||
|
#include "rocksdb/options.h" |
||||||
|
#include "rocksdb/statistics.h" |
||||||
|
#include "rocksdb/memtablerep.h" |
||||||
|
#include "rocksdb/table.h" |
||||||
|
#include "rocksdb/slice_transform.h" |
||||||
|
#include "rocksdb/merge_operator.h" |
||||||
|
#include "utilities/merge_operators.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_rocksdb_StringAppendOperator |
||||||
|
* Method: newMergeOperatorHandle |
||||||
|
* Signature: ()J |
||||||
|
*/ |
||||||
|
jlong Java_org_rocksdb_StringAppendOperator_newMergeOperatorHandleImpl(JNIEnv* env, jobject jobj) { |
||||||
|
std::shared_ptr<rocksdb::MergeOperator> *op = new std::shared_ptr<rocksdb::MergeOperator>(); |
||||||
|
*op = rocksdb::MergeOperators::CreateFromStringId("stringappend"); |
||||||
|
return reinterpret_cast<jlong>(op); |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue