commit
db52419cf0
@ -0,0 +1,17 @@ |
||||
// 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 merge operands held under the same key in order to obtain a single |
||||
* value. |
||||
*/ |
||||
public interface MergeOperator { |
||||
public long newMergeOperatorHandle(); |
||||
} |
@ -0,0 +1,17 @@ |
||||
// 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; |
||||
|
||||
/** |
||||
* StringAppendOperator is a merge operator that concatenates |
||||
* two strings. |
||||
*/ |
||||
public class StringAppendOperator implements MergeOperator { |
||||
@Override public long newMergeOperatorHandle() { |
||||
return newMergeOperatorHandleImpl(); |
||||
} |
||||
private native long newMergeOperatorHandleImpl(); |
||||
} |
@ -0,0 +1,85 @@ |
||||
// 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,37 @@ |
||||
// 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