// randomly insert 200 elements in a map
final int numElements = 200;
final DefaultByteRangeComparator comp = DefaultByteRangeComparator.getInstance();
LSMTree tree = new LSMTree(null, comp, COMPRESSION, 16, 1024 * 1024 * 512, MMAP, -1);
final TreeMap<byte[], byte[]> map1 = new TreeMap<byte[], byte[]>(comp);
for (int i = 0x10; i < numElements; i++) {
byte[] key = Integer.toHexString(i).getBytes();
byte[] val = Integer.toHexString((int) (Math.random() * Integer.MAX_VALUE)).getBytes();
map1.put(key, val);
tree.insert(key, val);
}
int snap1 = tree.createSnapshot();
final TreeMap<byte[], byte[]> map2 = new TreeMap<byte[], byte[]>(map1);
for (int i = 0x10; i < numElements; i += 2) {
byte[] key = Integer.toHexString(i).getBytes();
tree.insert(key, null);
map2.remove(key);
}
int snap2 = tree.createSnapshot();
final TreeMap<byte[], byte[]> map3 = new TreeMap<byte[], byte[]>(map2);
for (int i = 0x10; i < numElements; i += 5) {
byte[] key = Integer.toHexString(i).getBytes();
byte[] val = Integer.toHexString((int) (Math.random() * Integer.MAX_VALUE)).getBytes();
tree.insert(key, val);
map3.put(key, val);
}
// peform prefix lookups
// current tree, ascending
Iterator<Entry<byte[], byte[]>> it = tree.prefixLookup(new byte[0], true);
Iterator<byte[]> itExpected = map3.values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// current tree, descending
it = tree.prefixLookup(new byte[0], false);
itExpected = map3.descendingMap().values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// snapshot 2, ascending
it = tree.prefixLookup(new byte[0], snap2, true);
itExpected = map2.values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// snapshot 2, descending
it = tree.prefixLookup(new byte[0], snap2, false);
itExpected = map2.descendingMap().values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// snapshot 1, ascending
it = tree.prefixLookup(new byte[0], snap1, true);
itExpected = map1.values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// snapshot 1, descending
it = tree.prefixLookup(new byte[0], snap1, false);
itExpected = map1.descendingMap().values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// real prefix lookup, current tree, ascending
it = tree.prefixLookup("4".getBytes(), true);
itExpected = map3.subMap("4".getBytes(), true, "5".getBytes(), false).values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// real prefix lookup, current tree, descending
it = tree.prefixLookup("4".getBytes(), false);
itExpected = map3.descendingMap().subMap("5".getBytes(), false, "4".getBytes(), true).values()
.iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// real (empty) prefix lookup, current tree, ascending
it = tree.prefixLookup("XXXXXXXX".getBytes(), true);
itExpected = map3.subMap("XXXXXXXX".getBytes(), true, "XXXXXXXY".getBytes(), false).values()
.iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// real (empty) prefix lookup, current tree, descending
it = tree.prefixLookup("XXXXXXXX".getBytes(), false);
itExpected = map3.descendingMap().subMap("XXXXXXXY".getBytes(), false, "XXXXXXXX".getBytes(), true)
.values().iterator();
while (it.hasNext())
assertEquals(itExpected.next(), it.next().getValue());
assertFalse(itExpected.hasNext());
// first entry, current tree
assertEquals(map3.firstEntry().getKey(), tree.firstEntry().getKey());
assertEquals(map3.firstEntry().getValue(), tree.firstEntry().getValue());
// last entry, current tree
assertEquals(map3.lastEntry().getKey(), tree.lastEntry().getKey());
assertEquals(map3.lastEntry().getValue(), tree.lastEntry().getValue());
// first entry, snapshot 2
assertEquals(map2.firstEntry().getKey(), tree.firstEntry(snap2).getKey());
assertEquals(map2.firstEntry().getValue(), tree.firstEntry(snap2).getValue());
// last entry, snapshot 2
assertEquals(map2.lastEntry().getKey(), tree.lastEntry(snap2).getKey());
assertEquals(map2.lastEntry().getValue(), tree.lastEntry(snap2).getValue());
// first entry, snapshot 1
assertEquals(map1.firstEntry().getKey(), tree.firstEntry(snap1).getKey());
assertEquals(map1.firstEntry().getValue(), tree.firstEntry(snap1).getValue());
// last entry, snapshot 1
assertEquals(map1.lastEntry().getKey(), tree.lastEntry(snap1).getKey());
assertEquals(map1.lastEntry().getValue(), tree.lastEntry(snap1).getValue());
}