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