[RocksJava] Comparator tests for CF
- Added AbstractComparatorTest. - Fixed a bug in the JNI Part about Java comparators
This commit is contained in:
parent
335e6ad5cd
commit
e002a6122f
@ -9,7 +9,8 @@ import org.rocksdb.*;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
import java.nio.file.attribute.BasicFileAttributes;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@ -40,7 +41,7 @@ public abstract class AbstractComparatorTest {
|
|||||||
*
|
*
|
||||||
* @throws java.io.IOException if IO error happens.
|
* @throws java.io.IOException if IO error happens.
|
||||||
*/
|
*/
|
||||||
public void testRoundtrip(final Path db_path) throws IOException {
|
public void testRoundtrip(final Path db_path) throws IOException, RocksDBException {
|
||||||
|
|
||||||
Options opt = null;
|
Options opt = null;
|
||||||
RocksDB db = null;
|
RocksDB db = null;
|
||||||
@ -65,7 +66,6 @@ public abstract class AbstractComparatorTest {
|
|||||||
}
|
}
|
||||||
db.close();
|
db.close();
|
||||||
|
|
||||||
|
|
||||||
// re-open db and read from start to end
|
// re-open db and read from start to end
|
||||||
// integer keys should be in ascending
|
// integer keys should be in ascending
|
||||||
// order as defined by SimpleIntComparator
|
// order as defined by SimpleIntComparator
|
||||||
@ -84,9 +84,6 @@ public abstract class AbstractComparatorTest {
|
|||||||
|
|
||||||
assertThat(count).isEqualTo(ITERATIONS);
|
assertThat(count).isEqualTo(ITERATIONS);
|
||||||
|
|
||||||
} catch (final RocksDBException e) {
|
|
||||||
System.err.format("[ERROR]: %s%n", e);
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
} finally {
|
||||||
if (db != null) {
|
if (db != null) {
|
||||||
db.close();
|
db.close();
|
||||||
@ -98,6 +95,96 @@ public abstract class AbstractComparatorTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test which stores random keys into a column family
|
||||||
|
* in the database
|
||||||
|
* using an @see getAscendingIntKeyComparator
|
||||||
|
* it then checks that these keys are read back in
|
||||||
|
* ascending order
|
||||||
|
*
|
||||||
|
* @param db_path A path where we can store database
|
||||||
|
* files temporarily
|
||||||
|
*
|
||||||
|
* @throws java.io.IOException if IO error happens.
|
||||||
|
*/
|
||||||
|
public void testRoundtripCf(final Path db_path) throws IOException,
|
||||||
|
RocksDBException {
|
||||||
|
|
||||||
|
DBOptions opt = null;
|
||||||
|
RocksDB db = null;
|
||||||
|
List<ColumnFamilyDescriptor> cfDescriptors =
|
||||||
|
new ArrayList<>();
|
||||||
|
cfDescriptors.add(new ColumnFamilyDescriptor(
|
||||||
|
RocksDB.DEFAULT_COLUMN_FAMILY));
|
||||||
|
cfDescriptors.add(new ColumnFamilyDescriptor("new_cf",
|
||||||
|
new ColumnFamilyOptions().setComparator(
|
||||||
|
getAscendingIntKeyComparator())));
|
||||||
|
List<ColumnFamilyHandle> cfHandles = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
opt = new DBOptions().
|
||||||
|
setCreateIfMissing(true).
|
||||||
|
setCreateMissingColumnFamilies(true);
|
||||||
|
|
||||||
|
// store 10,000 random integer keys
|
||||||
|
final int ITERATIONS = 10000;
|
||||||
|
|
||||||
|
db = RocksDB.open(opt, db_path.toString(), cfDescriptors, cfHandles);
|
||||||
|
assertThat(cfDescriptors.size()).isEqualTo(2);
|
||||||
|
assertThat(cfHandles.size()).isEqualTo(2);
|
||||||
|
|
||||||
|
final Random random = new Random();
|
||||||
|
for (int i = 0; i < ITERATIONS; i++) {
|
||||||
|
final byte key[] = intToByte(random.nextInt());
|
||||||
|
if (i > 0 && db.get(cfHandles.get(1), key) != null) { // does key already exist (avoid duplicates)
|
||||||
|
i--; // generate a different key
|
||||||
|
} else {
|
||||||
|
db.put(cfHandles.get(1), key, "value".getBytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (ColumnFamilyHandle handle : cfHandles) {
|
||||||
|
handle.dispose();
|
||||||
|
}
|
||||||
|
cfHandles.clear();
|
||||||
|
db.close();
|
||||||
|
|
||||||
|
// re-open db and read from start to end
|
||||||
|
// integer keys should be in ascending
|
||||||
|
// order as defined by SimpleIntComparator
|
||||||
|
db = RocksDB.open(opt, db_path.toString(), cfDescriptors, cfHandles);
|
||||||
|
assertThat(cfDescriptors.size()).isEqualTo(2);
|
||||||
|
assertThat(cfHandles.size()).isEqualTo(2);
|
||||||
|
final RocksIterator it = db.newIterator(cfHandles.get(1));
|
||||||
|
it.seekToFirst();
|
||||||
|
int lastKey = Integer.MIN_VALUE;
|
||||||
|
int count = 0;
|
||||||
|
for (it.seekToFirst(); it.isValid(); it.next()) {
|
||||||
|
final int thisKey = byteToInt(it.key());
|
||||||
|
assertThat(thisKey).isGreaterThan(lastKey);
|
||||||
|
lastKey = thisKey;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
for (ColumnFamilyHandle handle : cfHandles) {
|
||||||
|
handle.dispose();
|
||||||
|
}
|
||||||
|
cfHandles.clear();
|
||||||
|
db.close();
|
||||||
|
assertThat(count).isEqualTo(ITERATIONS);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
for (ColumnFamilyHandle handle : cfHandles) {
|
||||||
|
handle.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (db != null) {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt != null) {
|
||||||
|
opt.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compares integer keys
|
* Compares integer keys
|
||||||
* so that they are in ascending order
|
* so that they are in ascending order
|
||||||
|
@ -26,7 +26,7 @@ public class ComparatorTest {
|
|||||||
public TemporaryFolder dbFolder = new TemporaryFolder();
|
public TemporaryFolder dbFolder = new TemporaryFolder();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void javaComparator() throws IOException {
|
public void javaComparator() throws IOException, RocksDBException {
|
||||||
|
|
||||||
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
||||||
@Override
|
@Override
|
||||||
@ -51,6 +51,32 @@ public class ComparatorTest {
|
|||||||
dbFolder.getRoot().getAbsolutePath()));
|
dbFolder.getRoot().getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void javaComparatorCf() throws IOException, RocksDBException {
|
||||||
|
|
||||||
|
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
||||||
|
@Override
|
||||||
|
public AbstractComparator getAscendingIntKeyComparator() {
|
||||||
|
return new Comparator(new ComparatorOptions()) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name() {
|
||||||
|
return "test.AscendingIntKeyComparator";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(final Slice a, final Slice b) {
|
||||||
|
return compareIntKeys(a.data(), b.data());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// test the round-tripability of keys written and read with the Comparator
|
||||||
|
comparatorTest.testRoundtripCf(FileSystems.getDefault().getPath(
|
||||||
|
dbFolder.getRoot().getAbsolutePath()));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void builtinForwardComparator()
|
public void builtinForwardComparator()
|
||||||
throws RocksDBException {
|
throws RocksDBException {
|
||||||
|
@ -23,7 +23,7 @@ public class DirectComparatorTest {
|
|||||||
public TemporaryFolder dbFolder = new TemporaryFolder();
|
public TemporaryFolder dbFolder = new TemporaryFolder();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void directComparator() throws IOException {
|
public void directComparator() throws IOException, RocksDBException {
|
||||||
|
|
||||||
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -1874,9 +1874,9 @@ void Java_org_rocksdb_ColumnFamilyOptions_setComparatorHandle__JI(
|
|||||||
* Method: setComparatorHandle
|
* Method: setComparatorHandle
|
||||||
* Signature: (JJ)V
|
* Signature: (JJ)V
|
||||||
*/
|
*/
|
||||||
void Java_org_rocksdb_ColumnFamilyOptions_setComparatorHandle__JI(
|
void Java_org_rocksdb_ColumnFamilyOptions_setComparatorHandle__JJ(
|
||||||
JNIEnv* env, jobject jobj, jlong jopt_handle, jlong jcomparator_handle) {
|
JNIEnv* env, jobject jobj, jlong jopt_handle, jlong jcomparator_handle) {
|
||||||
reinterpret_cast<rocksdb::Options*>(jopt_handle)->comparator =
|
reinterpret_cast<rocksdb::ColumnFamilyOptions*>(jopt_handle)->comparator =
|
||||||
reinterpret_cast<rocksdb::Comparator*>(jcomparator_handle);
|
reinterpret_cast<rocksdb::Comparator*>(jcomparator_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user