use of herddb.utils.Sized in project herddb by diennea.
the class BlockRangeIndexTest method testSimpleSplit.
@Test
public void testSimpleSplit() {
BlockRangeIndex<Sized<Integer>, Sized<String>> index = new BlockRangeIndex<>(400, new RandomPageReplacementPolicy(10));
index.put(Sized.valueOf(1), Sized.valueOf("a"));
index.put(Sized.valueOf(2), Sized.valueOf("b"));
index.put(Sized.valueOf(3), Sized.valueOf("c"));
dumpIndex(index);
assertEquals(Sized.valueOf("a"), index.search(Sized.valueOf(1)).get(0));
assertEquals(Sized.valueOf("b"), index.search(Sized.valueOf(2)).get(0));
assertEquals(Sized.valueOf("c"), index.search(Sized.valueOf(3)).get(0));
assertEquals(2, index.getNumBlocks());
}
use of herddb.utils.Sized in project herddb by diennea.
the class BlockRangeIndexTest method testSplitAndDelete.
/**
* Verify that BRIN blocks next field is managed when pointed block get deleted
*
* @author diego.salvi
*/
@Test
public void testSplitAndDelete() throws IOException {
/* Must be 1 to keep just one page in memory keeping to unload on every page load */
final PageReplacementPolicy policy = new RandomPageReplacementPolicy(1);
final MemoryIndexDataStorage<Sized<Integer>, Sized<String>> storage = new MemoryIndexDataStorage<>();
final BlockRangeIndex<Sized<Integer>, Sized<String>> index = new BlockRangeIndex<>(400, policy, storage);
/* Add values until block split */
int elements;
for (elements = 0; index.getNumBlocks() < 2; elements++) {
/* All entries have the same key to create contiguous blocks with same keys */
index.put(Sized.valueOf(1), Sized.valueOf("test_" + elements));
}
/* NumBlocks must be greater than 1 (split done) */
Assert.assertTrue(index.getNumBlocks() > 1);
/* Check every value existance */
{
List<Sized<String>> result = index.search(Sized.valueOf(1));
Assert.assertEquals(elements, result.size());
}
/* Remove every last value until last block is empty */
for (int i = elements - 1; i > -1; i--) {
index.delete(Sized.valueOf(1), Sized.valueOf("test_" + i));
/* Check if last block got emptied */
if (index.getBlocks().lastEntry().getValue().getSize() == 0) {
elements = i;
break;
}
}
/* Now checkpoint to remove empty block */
BlockRangeIndexMetadata<Sized<Integer>> metadata = index.checkpoint();
/* Deletes unreferenced pages from memory store */
storage.getPages().retainAll(metadata.getBlocksMetadata().stream().map(m -> m.pageId).collect(Collectors.toList()));
/* Delete remaining values (next should have been handled to avoid errors) */
for (int i = 0; i < elements; i++) {
index.delete(Sized.valueOf(1), Sized.valueOf("test_" + i));
}
/* Check every value non existance */
{
List<Sized<String>> result = index.search(Sized.valueOf(1));
Assert.assertEquals(0, result.size());
}
index.clear();
}
use of herddb.utils.Sized in project herddb by diennea.
the class BLinkTest method testScanMiddleNotExistent.
@Test
public void testScanMiddleNotExistent() throws Exception {
BLinkIndexDataStorage<Sized<Long>, Long> storage = new DummyBLinkIndexDataStorage<>();
try (BLink<Sized<Long>, Long> blink = new BLink<>(2048L, new LongSizeEvaluator(), new RandomPageReplacementPolicy(10), storage)) {
final long headInserts = 100;
final long nonExistents = 100;
final long tailInserts = 100;
for (long l = 0; l < headInserts; l++) {
blink.insert(Sized.valueOf(l), l);
}
for (long l = headInserts + nonExistents; l < headInserts + nonExistents + tailInserts; l++) {
blink.insert(Sized.valueOf(l), l);
}
BLinkMetadata<Sized<Long>> metadata = blink.checkpoint();
/* Require at least two nodes! */
assertNotEquals(1, metadata.nodes.size());
long offset = 10;
for (long l = headInserts; l < headInserts + nonExistents - offset; l++) {
Stream<Entry<Sized<Long>, Long>> stream = blink.scan(Sized.valueOf(l), Sized.valueOf(l + offset));
Holder<Long> h = new Holder<>(l);
Holder<Long> count = new Holder<>(0L);
StringBuilder builder = new StringBuilder();
/* Check each value */
stream.forEach(entry -> {
assertEquals(h.value, entry.getValue());
h.value++;
count.value++;
builder.append(entry.getValue()).append(", ");
});
assertEquals(0, (long) count.value);
}
}
}
use of herddb.utils.Sized in project herddb by diennea.
the class BLinkTest method testUnload.
@Test
public void testUnload() throws Exception {
final int pages = 5;
final int inserts = 100;
BLinkIndexDataStorage<Sized<Long>, Long> storage = new DummyBLinkIndexDataStorage<>();
PageReplacementPolicy policy = new RandomPageReplacementPolicy(pages);
try (BLink<Sized<Long>, Long> blink = new BLink<>(2048L, new LongSizeEvaluator(), policy, storage)) {
for (long l = 0; l < inserts; l++) {
blink.insert(Sized.valueOf(l), l);
}
/* Must fill the polocy */
assertEquals(pages, policy.size());
assertEquals(inserts, blink.size());
blink.close();
/* No pages should remain in memory after unload!! */
assertEquals(0, policy.size());
assertEquals(0, blink.size());
}
}
use of herddb.utils.Sized in project herddb by diennea.
the class BLinkTest method testDataSet.
private void testDataSet(List<Long> data, int maxSize) throws Exception {
System.out.println("testDataSet " + data.size() + " maxSize:" + maxSize + ": " + data);
BLinkIndexDataStorage<Sized<Long>, Long> storage = new DummyBLinkIndexDataStorage<>();
BLinkMetadata<Sized<Long>> metadata;
try (BLink<Sized<Long>, Long> blink = new BLink<>(maxSize, new LongSizeEvaluator(), new RandomPageReplacementPolicy(10), storage)) {
for (long l : data) {
blink.insert(Sized.valueOf(l), l);
}
for (long l : data) {
assertEquals(l, (long) blink.search(Sized.valueOf(l)));
}
metadata = blink.checkpoint();
System.out.println("metadata:" + metadata);
metadata.nodes.forEach(n -> {
System.out.println("node:" + n + " rightsep:" + n.rightsep);
});
}
// reboot
try (BLink<Sized<Long>, Long> blink = new BLink<>(maxSize, new LongSizeEvaluator(), new RandomPageReplacementPolicy(10), storage, metadata)) {
for (long l : data) {
assertEquals(l, (long) blink.search(Sized.valueOf(l)));
}
}
}
Aggregations