/*******************************************************************************
* Copyright 2010 Cees De Groot, Alex Boisvert, Jan Kotek
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.apache.jdbm;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
/**
* Random insertion/removal test for B+Tree data structure.
*
* @author Alex Boisvert
*/
public class BTreeBench extends TestCaseWithTestFile {
DBAbstract db;
/**
* Test w/o compression or specialized key or value serializers.
*
* @throws IOException
*/
public void test_001() throws IOException {
db = newDBCache();
BTree<Long, Long> tree = BTree.createInstance(db);
doTest(db, tree, 5001);
db.close();
}
public static void doTest(DB db, BTree<Long, Long> tree, int ITERATIONS)
throws IOException {
long beginTime = System.currentTimeMillis();
Hashtable<Long, Long> hash = new Hashtable<Long, Long>();
for (int i = 0; i < ITERATIONS; i++) {
Long random = new Long(random(0, 64000));
if ((i % 5000) == 0) {
long elapsed = System.currentTimeMillis() - beginTime;
System.out.println("Iterations=" + i + " Objects=" + tree._entries + ", elapsed=" + elapsed + "ms");
db.commit();
}
if (hash.get(random) == null) {
//System.out.println( "Insert " + random );
hash.put(random, random);
tree.insert(random, random, false);
} else {
//System.out.println( "Remove " + random );
hash.remove(random);
Object removed = (Object) tree.remove(random);
if ((removed == null) || (!removed.equals(random))) {
throw new IllegalStateException("Remove expected " + random + " got " + removed);
}
}
// tree.assertOrdering();
compare(tree, hash);
}
}
static long random(int min, int max) {
return Math.round(Math.random() * (max - min)) + min;
}
static void compare(BTree<Long, Long> tree, Hashtable<Long, Long> hash) throws IOException {
boolean failed = false;
Enumeration<Long> enumeration;
if (tree._entries != hash.size()) {
throw new IllegalStateException("Tree size " + tree._entries + " Hash size " + hash.size());
}
enumeration = hash.keys();
while (enumeration.hasMoreElements()) {
Long key = enumeration.nextElement();
Long hashValue = hash.get(key);
Long treeValue = tree.get(key);
if (!hashValue.equals(treeValue)) {
System.out.println("Compare expected " + hashValue + " got " + treeValue);
failed = true;
}
}
if (failed) {
throw new IllegalStateException("Compare failed");
}
}
}