package com.bigdata.htree;
import java.util.Random;
import java.util.UUID;
import com.bigdata.btree.HTreeIndexMetadata;
import com.bigdata.io.DirectBufferPool;
import com.bigdata.io.TestCase3;
import com.bigdata.rawstore.IRawStore;
import com.bigdata.rawstore.SimpleMemoryRawStore;
import com.bigdata.rwstore.sector.MemStore;
public class TestRemovals extends AbstractHTreeTestCase {
public TestRemovals() {
}
public TestRemovals(String name) {
super(name);
}
/**
* Just insert and remove a single key
*/
public void test_simpleRemoval() {
final IRawStore store = new SimpleMemoryRawStore();
try {
final Random r = new Random();
final HTreeIndexMetadata metadata = new HTreeIndexMetadata(UUID.randomUUID());
metadata.setAddressBits(2);
final HTree htree = HTree.create(store, metadata);
final byte[] key = new byte[] { 1, 2, 3 };
final byte[] val = new byte[24]; // some random 24 character value
r.nextBytes(val);
// insert an entry under that key.
assertNull(htree.insert(key, val));
// this test assumes that everything is in a single bucket page.
assertEquals(1, htree.getEntryCount());
// examine the root.
final DirectoryPage root = (DirectoryPage) htree.getRoot();
// verify that the expected data were read.
TestCase3.assertEquals(val, htree.lookupFirst(key));
htree.remove(key);
assertEquals(0, htree.getEntryCount());
TestCase3.assertEquals(null, htree.lookupFirst(key));
} finally {
store.destroy();
}
}
/**
* Insert and remove several copies of the same key. Test includes
* insertions of other key values, unaffected by the removal.
*/
public void test_simpleRemoveAll() {
final IRawStore store = new SimpleMemoryRawStore();
try {
final Random r = new Random();
final HTreeIndexMetadata metadata = new HTreeIndexMetadata(UUID.randomUUID());
metadata.setAddressBits(2);
final HTree htree = HTree.create(store, metadata);
final byte[] key = new byte[] { 1, 2, 3 };
final byte[] val = new byte[24]; // some random 24 character value
r.nextBytes(val);
// insert n entries under that key.
final int entries = 23;
for (int i = 0; i < entries; i++) {
htree.insert(key, val);
}
final byte[] altkey = new byte[] { 2, 3, 4 };
final int altentries = 11;
for (int i = 0; i < altentries; i++) {
htree.insert(altkey, val);
}
// this test assumes that everything is in a single bucket page.
assertEquals(entries+altentries, htree.getEntryCount());
// examine the root.
final DirectoryPage root = (DirectoryPage) htree.getRoot();
// verify that the expected data were read.
TestCase3.assertEquals(val, htree.lookupFirst(key));
assertEquals(entries, htree.removeAll(key));
assertEquals(altentries, htree.getEntryCount());
TestCase3.assertEquals(null, htree.lookupFirst(key));
} finally {
store.destroy();
}
}
/**
* Test removal with raw records.
*/
public void test_simpleRemovalWithRawRecords() {
final MemStore store = new MemStore(DirectBufferPool.INSTANCE, 5);
try {
final Random r = new Random();
final HTreeIndexMetadata metadata = new HTreeIndexMetadata(UUID.randomUUID());
metadata.setAddressBits(2);
metadata.setRawRecords(true);
metadata.setMaxRecLen(64);
final HTree htree = HTree.create(store, metadata);
assertEquals(64, htree.getMaxRecLen());
assertTrue(htree.rawRecords);
final byte[] key = new byte[] { 1, 2, 3 };
final byte[] val = new byte[htree.getMaxRecLen() + 1];
r.nextBytes(val);
// insert several entries under that key.
final int ninserts = 15;
for (int i = 0; i < ninserts; i++) {
htree.insert(key, val);
}
// this test assumes that everything is in a single bucket page.
assertEquals(ninserts, htree.getEntryCount());
// verify that the expected data were read.
TestCase3.assertEquals(val, htree.lookupFirst(key));
assertEquals(ninserts, htree.removeAll(key));
assertEquals(0, htree.getEntryCount());
TestCase3.assertEquals(null, htree.lookupFirst(key));
} finally {
store.destroy();
}
}
}