[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.nio.file.*;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@ -40,7 +41,7 @@ public abstract class AbstractComparatorTest {
|
||||
*
|
||||
* @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;
|
||||
RocksDB db = null;
|
||||
@ -65,7 +66,6 @@ public abstract class AbstractComparatorTest {
|
||||
}
|
||||
db.close();
|
||||
|
||||
|
||||
// re-open db and read from start to end
|
||||
// integer keys should be in ascending
|
||||
// order as defined by SimpleIntComparator
|
||||
@ -84,9 +84,6 @@ public abstract class AbstractComparatorTest {
|
||||
|
||||
assertThat(count).isEqualTo(ITERATIONS);
|
||||
|
||||
} catch (final RocksDBException e) {
|
||||
System.err.format("[ERROR]: %s%n", e);
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (db != null) {
|
||||
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
|
||||
* so that they are in ascending order
|
||||
|
@ -26,7 +26,7 @@ public class ComparatorTest {
|
||||
public TemporaryFolder dbFolder = new TemporaryFolder();
|
||||
|
||||
@Test
|
||||
public void javaComparator() throws IOException {
|
||||
public void javaComparator() throws IOException, RocksDBException {
|
||||
|
||||
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
||||
@Override
|
||||
@ -51,6 +51,32 @@ public class ComparatorTest {
|
||||
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
|
||||
public void builtinForwardComparator()
|
||||
throws RocksDBException {
|
||||
|
@ -23,7 +23,7 @@ public class DirectComparatorTest {
|
||||
public TemporaryFolder dbFolder = new TemporaryFolder();
|
||||
|
||||
@Test
|
||||
public void directComparator() throws IOException {
|
||||
public void directComparator() throws IOException, RocksDBException {
|
||||
|
||||
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() {
|
||||
@Override
|
||||
|
@ -1874,9 +1874,9 @@ void Java_org_rocksdb_ColumnFamilyOptions_setComparatorHandle__JI(
|
||||
* Method: setComparatorHandle
|
||||
* 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) {
|
||||
reinterpret_cast<rocksdb::Options*>(jopt_handle)->comparator =
|
||||
reinterpret_cast<rocksdb::ColumnFamilyOptions*>(jopt_handle)->comparator =
|
||||
reinterpret_cast<rocksdb::Comparator*>(jcomparator_handle);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user