blob: 937016a37dbd8ae22797dac830f48033602f20f1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.directory.mavibot.btree;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
import org.apache.directory.mavibot.btree.BulkLoader.LevelEnum;
import org.apache.directory.mavibot.btree.exception.BTreeAlreadyManagedException;
import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
import org.apache.directory.mavibot.btree.exception.KeyNotFoundException;
import org.apache.directory.mavibot.btree.serializer.LongSerializer;
import org.apache.directory.mavibot.btree.serializer.StringSerializer;
import org.junit.Ignore;
import org.junit.Test;
/**
* Test the BulkLoader class.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class BulkLoaderTest
{
private void checkBtree( BTree<Long, String> oldBtree, BTree<Long, String> newBtree )
throws EndOfFileExceededException, IOException, KeyNotFoundException
{
assertEquals( oldBtree.getNbElems(), newBtree.getNbElems() );
TupleCursor<Long, String> cursorOld = oldBtree.browse();
TupleCursor<Long, String> cursorNew = newBtree.browse();
while ( cursorOld.hasNext() && cursorNew.hasNext() )
{
Tuple<Long, String> tupleOld = cursorOld.next();
Tuple<Long, String> tupleNew = cursorNew.next();
assertEquals( tupleOld.getKey(), tupleNew.getKey() );
assertEquals( tupleOld.getValue(), tupleNew.getValue() );
}
assertEquals( cursorOld.hasNext(), cursorNew.hasNext() );
}
/**
* Test that we can compact a btree which has no element
*/
@Test
public void testInMemoryBulkLoadNoElement() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
TupleCursor<Long, String> cursorOld = btree.browse();
TupleCursor<Long, String> cursorNew = btree.browse();
assertFalse( cursorOld.hasNext() );
assertFalse( cursorNew.hasNext() );
}
/**
* Test that we can compact a btree which has a partially full leaf only
*/
@Ignore
@Test
public void testInMemoryBulkLoad3Elements() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 3L; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
}
/**
* Test that we can compact a btree which has a 2 full leaves
*/
@Ignore
@Test
public void testInMemoryBulkLoad8Elements() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 8L; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
}
/**
* Test that we can load 100 BTrees with 0 to 1000 elements
* @throws BTreeAlreadyManagedException
*/
@Test
public void testPersistedBulkLoad1000Elements() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
for ( int i = 1000000; i < 1000001; i++ )
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
btree.setPageSize( 64 );
int nbElems = i;
int addedElems = 0;
final Tuple<Long, String>[] elems = new Tuple[nbElems];
Map<Long, Tuple<Long, Set<String>>> expected = new HashMap<Long, Tuple<Long, Set<String>>>();
long t00 = System.currentTimeMillis();
while ( addedElems < nbElems )
{
long key = random.nextLong() % 3333333L;
if ( expected.containsKey( key ) )
{
continue;
}
long w = random.nextLong() % 3333333L;
String value = "V" + w;
elems[addedElems] = new Tuple<Long, String>( key, value );
Tuple<Long, Set<String>> expectedTuple = expected.get( key );
if ( expectedTuple == null )
{
expectedTuple = new Tuple<Long, Set<String>>( key, new TreeSet<String>() );
}
expectedTuple.value.add( value );
expected.put( key, expectedTuple );
addedElems++;
}
long t01 = System.currentTimeMillis();
// System.out.println( "Time to create the " + nbElems + " elements " + ( ( t01 - t00 ) / 1 ) );
Iterator<Tuple<Long, String>> tupleIterator = new Iterator<Tuple<Long, String>>()
{
private int pos = 0;
@Override
public Tuple<Long, String> next()
{
return elems[pos++];
}
@Override
public boolean hasNext()
{
return pos < elems.length;
}
@Override
public void remove()
{
}
};
long t0 = System.currentTimeMillis();
BTree<Long, String> result = BulkLoader.load( btree, tupleIterator, 1024000 );
long t1 = System.currentTimeMillis();
if ( ( i % 100 ) == 0 )
{
System.out.println( "== Btree #" + i + ", Time to bulkoad the " + nbElems + " elements "
+ ( t1 - t0 ) + "ms" );
}
TupleCursor<Long, String> cursor = result.browse();
int nbFetched = 0;
long t2 = System.currentTimeMillis();
while ( cursor.hasNext() )
{
Tuple<Long, String> elem = cursor.next();
assertTrue( expected.containsKey( elem.key ) );
Tuple<Long, Set<String>> tuple = expected.get( elem.key );
assertNotNull( tuple );
nbFetched++;
}
long t3 = System.currentTimeMillis();
//System.out.println( "Time to read the " + nbElems + " elements " + ( t3 - t2 ) );
assertEquals( nbElems, nbFetched );
checkBtree( btree, result );
}
finally
{
file.delete();
}
}
}
/**
* Test that we can compact a btree which has a full parent node, with all the leaves full.
*/
@Test
public void testInMemoryBulkLoad20Elements() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 20L; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
}
/**
* Test that we can compact a btree which has two full parent nodes, with all the leaves full.
* That means we have an upper node with one element.
*/
@Ignore
@Test
public void testInMemoryBulkLoad40Elements() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 40L; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
}
/**
* Test that we can compact a btree which has two full parent nodes, with all the leaves full.
* That means we have an upper node with one element.
*/
@Test
public void testInMemoryBulkLoad100Elements() throws IOException, KeyNotFoundException
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 100L; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
checkBtree( btree, newBtree );
}
@Ignore
@Test
public void testInMemoryBulkLoadN() throws IOException, KeyNotFoundException
{
Random random = new Random( System.nanoTime() );
long t0 = System.currentTimeMillis();
for ( long n = 0L; n < 2500L; n++ )
{
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < n; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
//long t1 = System.currentTimeMillis();
//System.out.println( "Delta initial load = " + ( t1 - t0 ) );
//long t2 = System.currentTimeMillis();
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
//long t3 = System.currentTimeMillis();
//System.out.println( "Delta initial load = " + ( t3 - t2 ) );
//System.out.println( "Checking for N = " + n );
checkBtree( btree, newBtree );
}
}
@Ignore
@Test
public void testInMemoryBulkLoad21() throws IOException, KeyNotFoundException
{
Random random = new Random( System.nanoTime() );
long t0 = System.currentTimeMillis();
BTree<Long, String> btree = BTreeFactory.createInMemoryBTree( "test", LongSerializer.INSTANCE,
StringSerializer.INSTANCE );
btree.setPageSize( 4 );
for ( Long i = 0L; i < 21; i++ )
{
String value = "V" + i;
btree.insert( i, value );
}
//long t1 = System.currentTimeMillis();
//System.out.println( "Delta initial load = " + ( t1 - t0 ) );
//long t2 = System.currentTimeMillis();
BTree<Long, String> newBtree = ( BTree<Long, String> ) BulkLoader.compact( btree );
//long t3 = System.currentTimeMillis();
//System.out.println( "Delta initial load = " + ( t3 - t2 ) );
//System.out.println( "Checking for N = " + 21 );
checkBtree( btree, newBtree );
}
/**
* test the computeLeafLevel method
*/
@Test
public void testPersistedBulkLoadComputeLeafLevel() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
int[] expectedNbPages = new int[]
{
0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
};
int[] expectedLimit = new int[]
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 32,
16, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, 48
};
int[] expectedKeys = new int[]
{
0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
};
for ( int i = 0; i < 49; i++ )
{
LevelInfo<Long, String> leafInfo = BulkLoader.computeLevel( btree, i, LevelEnum.LEAF );
assertEquals( expectedNbPages[i], leafInfo.getNbPages() );
assertEquals( expectedLimit[i], leafInfo.getNbElemsLimit() );
assertEquals( expectedKeys[i], leafInfo.getCurrentPage().getNbElems() );
}
}
finally
{
file.delete();
}
}
/**
* test the computeNodeLevel method
*/
@Test
public void testPersistedBulkLoadComputeNodeLevel() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
int[] expectedNbPages = new int[]
{
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
};
int[] expectedLimit = new int[]
{
-1,
-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 34,
17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 51
};
int[] expectedKeys = new int[]
{
-1, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
};
for ( int i = 2; i < 52; i++ )
{
LevelInfo<Long, String> nodeInfo = BulkLoader.computeLevel( btree, i, LevelEnum.NODE );
assertEquals( expectedNbPages[i], nodeInfo.getNbPages() );
assertEquals( expectedLimit[i], nodeInfo.getNbElemsLimit() );
assertEquals( expectedKeys[i], nodeInfo.getCurrentPage().getNbElems() );
}
}
finally
{
file.delete();
}
}
/**
* test the computeNodeLevel method
*/
@Test
public void testPersistedBulkLoadComputeLevels() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
int[] expectedNbPages = new int[]
{
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
};
int[] expectedLimit = new int[]
{
-1,
-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 34,
17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 51
};
int[] expectedKeys = new int[]
{
-1, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
};
for ( int i = 2599; i <= 2599; i++ )
{
List<LevelInfo<Long, String>> levels = BulkLoader.computeLevels( btree, i );
}
}
finally
{
file.delete();
}
}
/**
* Test that we can load 100 BTrees with 0 to 1000 elements, each one of them having multiple values
* @throws BTreeAlreadyManagedException
*/
//@Ignore("The test is failing atm due to the sub-btree construction which is not working correctly when we have too many elements")
@Test
public void testPersistedBulkLoad1000ElementsMultipleValues() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
for ( int i = 1; i < 1001; i++ )
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
int nbElems = i;
int addedElems = 0;
final Tuple<Long, String>[] elems = new Tuple[nbElems];
Map<Long, Tuple<Long, Set<String>>> expected = new HashMap<Long, Tuple<Long, Set<String>>>();
long valueNumber = 0;
long t00 = System.currentTimeMillis();
while ( addedElems < nbElems )
{
long key = random.nextLong() % 33L;
String value = "V" + valueNumber++;
elems[addedElems] = new Tuple<Long, String>( key, value );
Tuple<Long, Set<String>> expectedTuple = expected.get( key );
if ( expectedTuple == null )
{
expectedTuple = new Tuple<Long, Set<String>>( key, new TreeSet<String>() );
}
expectedTuple.value.add( value );
expected.put( key, expectedTuple );
addedElems++;
if ( addedElems % 100 == 0 )
{
//System.out.println( "Nb added elements = " + addedElems );
}
}
long t01 = System.currentTimeMillis();
// System.out.println( "Time to create the " + nbElems + " elements " + ( ( t01 - t00 ) / 1 ) );
Iterator<Tuple<Long, String>> tupleIterator = new Iterator<Tuple<Long, String>>()
{
private int pos = 0;
@Override
public Tuple<Long, String> next()
{
return elems[pos++];
}
@Override
public boolean hasNext()
{
return pos < elems.length;
}
@Override
public void remove()
{
}
};
long t0 = System.currentTimeMillis();
BTree<Long, String> result = BulkLoader.load( btree, tupleIterator, 128 );
long t1 = System.currentTimeMillis();
//System.out.println( "== Btree #" + i + ", Time to bulkoad the " + nbElems + " elements "
// + ( t1 - t0 ) + "ms" );
TupleCursor<Long, String> cursor = result.browse();
int nbFetched = 0;
long t2 = System.currentTimeMillis();
try
{
while ( cursor.hasNext() )
{
Tuple<Long, String> elem = cursor.next();
assertTrue( expected.containsKey( elem.key ) );
Tuple<Long, Set<String>> tuple = expected.get( elem.key );
assertNotNull( tuple );
nbFetched++;
}
}
catch ( Exception e )
{
for ( Tuple<Long, String> tuple : elems )
{
System.out
.println( "listTuples.add( new Tuple<Long, String>( " + tuple.getKey() + "L, \""
+ tuple.getValue() + "\" ) );" );
}
e.printStackTrace();
break;
}
long t3 = System.currentTimeMillis();
//System.out.println( "Time to read the " + nbElems + " elements " + ( t3 - t2 ) );
assertEquals( nbElems, nbFetched );
checkBtree( btree, result );
}
finally
{
file.delete();
}
}
}
/**
* Test that we can load 100 BTrees with 0 to 1000 elements, each one of them having multiple values
* @throws BTreeAlreadyManagedException
*/
@Test
public void testPersistedBulkLoad1000ElementsMultipleValuesDebug() throws IOException, KeyNotFoundException,
BTreeAlreadyManagedException
{
Random random = new Random( System.currentTimeMillis() );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
int nbElems = 4;
int addedElems = 0;
final Tuple<Long, String>[] elems = new Tuple[nbElems];
Map<Long, Tuple<Long, Set<String>>> expected = new HashMap<Long, Tuple<Long, Set<String>>>();
long valueNumber = 0;
elems[0] = new Tuple<Long, String>( 26L, "V0" );
elems[1] = new Tuple<Long, String>( 26L, "V1" );
elems[2] = new Tuple<Long, String>( -22L, "V2" );
elems[3] = new Tuple<Long, String>( 5L, "V3" );
Iterator<Tuple<Long, String>> tupleIterator = new Iterator<Tuple<Long, String>>()
{
private int pos = 0;
@Override
public Tuple<Long, String> next()
{
return elems[pos++];
}
@Override
public boolean hasNext()
{
return pos < elems.length;
}
@Override
public void remove()
{
}
};
long t0 = System.currentTimeMillis();
BTree<Long, String> result = null;
result = BulkLoader.load( btree, tupleIterator, 128 );
long t1 = System.currentTimeMillis();
TupleCursor<Long, String> cursor = result.browse();
int nbFetched = 0;
long t2 = System.currentTimeMillis();
while ( cursor.hasNext() )
{
Tuple<Long, String> elem = cursor.next();
nbFetched++;
}
long t3 = System.currentTimeMillis();
//System.out.println( "Time to read the " + nbElems + " elements " + ( t3 - t2 ) );
assertEquals( nbElems, nbFetched );
checkBtree( btree, result );
}
finally
{
file.delete();
}
}
@Test
public void testDebug() throws IOException
{
final List<Tuple<Long, String>> listTuples = new ArrayList<Tuple<Long, String>>();
listTuples.add( new Tuple<Long, String>( 0L, "V0" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V1" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V2" ) );
listTuples.add( new Tuple<Long, String>( 6L, "V3" ) );
listTuples.add( new Tuple<Long, String>( -12L, "V4" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V5" ) );
listTuples.add( new Tuple<Long, String>( -18L, "V6" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V7" ) );
listTuples.add( new Tuple<Long, String>( 32L, "V8" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V9" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V10" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V11" ) );
listTuples.add( new Tuple<Long, String>( -7L, "V12" ) );
listTuples.add( new Tuple<Long, String>( -13L, "V13" ) );
listTuples.add( new Tuple<Long, String>( 23L, "V14" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V15" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V16" ) );
listTuples.add( new Tuple<Long, String>( -13L, "V17" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V18" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V19" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V20" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V21" ) );
listTuples.add( new Tuple<Long, String>( 28L, "V22" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V23" ) );
listTuples.add( new Tuple<Long, String>( 3L, "V24" ) );
listTuples.add( new Tuple<Long, String>( -31L, "V25" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V26" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V27" ) );
listTuples.add( new Tuple<Long, String>( 5L, "V28" ) );
listTuples.add( new Tuple<Long, String>( 29L, "V29" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V30" ) );
listTuples.add( new Tuple<Long, String>( 8L, "V31" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V32" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V33" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V34" ) );
listTuples.add( new Tuple<Long, String>( -7L, "V35" ) );
listTuples.add( new Tuple<Long, String>( -3L, "V36" ) );
listTuples.add( new Tuple<Long, String>( -7L, "V37" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V38" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V39" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V40" ) );
listTuples.add( new Tuple<Long, String>( 19L, "V41" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V42" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V43" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V44" ) );
listTuples.add( new Tuple<Long, String>( -2L, "V45" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V46" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V47" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V48" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V49" ) );
listTuples.add( new Tuple<Long, String>( -11L, "V50" ) );
listTuples.add( new Tuple<Long, String>( -23L, "V51" ) );
listTuples.add( new Tuple<Long, String>( 3L, "V52" ) );
listTuples.add( new Tuple<Long, String>( 4L, "V53" ) );
listTuples.add( new Tuple<Long, String>( -28L, "V54" ) );
listTuples.add( new Tuple<Long, String>( 24L, "V55" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V56" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V57" ) );
listTuples.add( new Tuple<Long, String>( -2L, "V58" ) );
listTuples.add( new Tuple<Long, String>( -3L, "V59" ) );
listTuples.add( new Tuple<Long, String>( 14L, "V60" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V61" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V62" ) );
listTuples.add( new Tuple<Long, String>( 16L, "V63" ) );
listTuples.add( new Tuple<Long, String>( -15L, "V64" ) );
listTuples.add( new Tuple<Long, String>( -25L, "V65" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V66" ) );
listTuples.add( new Tuple<Long, String>( -12L, "V67" ) );
listTuples.add( new Tuple<Long, String>( -13L, "V68" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V69" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V70" ) );
listTuples.add( new Tuple<Long, String>( -8L, "V71" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V72" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V73" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V74" ) );
listTuples.add( new Tuple<Long, String>( 1L, "V75" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V76" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V77" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V78" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V79" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V80" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V81" ) );
listTuples.add( new Tuple<Long, String>( 10L, "V82" ) );
listTuples.add( new Tuple<Long, String>( 28L, "V83" ) );
listTuples.add( new Tuple<Long, String>( 23L, "V84" ) );
listTuples.add( new Tuple<Long, String>( -20L, "V85" ) );
listTuples.add( new Tuple<Long, String>( 22L, "V86" ) );
listTuples.add( new Tuple<Long, String>( -2L, "V87" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V88" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V89" ) );
listTuples.add( new Tuple<Long, String>( -7L, "V90" ) );
listTuples.add( new Tuple<Long, String>( 20L, "V91" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V92" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V93" ) );
listTuples.add( new Tuple<Long, String>( 24L, "V94" ) );
listTuples.add( new Tuple<Long, String>( 5L, "V95" ) );
listTuples.add( new Tuple<Long, String>( 1L, "V96" ) );
listTuples.add( new Tuple<Long, String>( 11L, "V97" ) );
listTuples.add( new Tuple<Long, String>( 3L, "V98" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V99" ) );
listTuples.add( new Tuple<Long, String>( 6L, "V100" ) );
listTuples.add( new Tuple<Long, String>( 27L, "V101" ) );
listTuples.add( new Tuple<Long, String>( -23L, "V102" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V103" ) );
listTuples.add( new Tuple<Long, String>( 30L, "V104" ) );
listTuples.add( new Tuple<Long, String>( -29L, "V105" ) );
listTuples.add( new Tuple<Long, String>( 13L, "V106" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V107" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V108" ) );
listTuples.add( new Tuple<Long, String>( 1L, "V109" ) );
listTuples.add( new Tuple<Long, String>( 10L, "V110" ) );
listTuples.add( new Tuple<Long, String>( -11L, "V111" ) );
listTuples.add( new Tuple<Long, String>( 29L, "V112" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V113" ) );
listTuples.add( new Tuple<Long, String>( -30L, "V114" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V115" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V116" ) );
listTuples.add( new Tuple<Long, String>( 5L, "V117" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V118" ) );
listTuples.add( new Tuple<Long, String>( -32L, "V119" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V120" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V121" ) );
listTuples.add( new Tuple<Long, String>( -22L, "V122" ) );
listTuples.add( new Tuple<Long, String>( -32L, "V123" ) );
listTuples.add( new Tuple<Long, String>( -23L, "V124" ) );
listTuples.add( new Tuple<Long, String>( -25L, "V125" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V126" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V127" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V128" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V129" ) );
listTuples.add( new Tuple<Long, String>( 12L, "V130" ) );
listTuples.add( new Tuple<Long, String>( -17L, "V131" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V132" ) );
listTuples.add( new Tuple<Long, String>( 14L, "V133" ) );
listTuples.add( new Tuple<Long, String>( -16L, "V134" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V135" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V136" ) );
listTuples.add( new Tuple<Long, String>( 20L, "V137" ) );
listTuples.add( new Tuple<Long, String>( -2L, "V138" ) );
listTuples.add( new Tuple<Long, String>( 14L, "V139" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V140" ) );
listTuples.add( new Tuple<Long, String>( 13L, "V141" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V142" ) );
listTuples.add( new Tuple<Long, String>( -29L, "V143" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V144" ) );
listTuples.add( new Tuple<Long, String>( 6L, "V145" ) );
listTuples.add( new Tuple<Long, String>( -22L, "V146" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V147" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V148" ) );
listTuples.add( new Tuple<Long, String>( 27L, "V149" ) );
listTuples.add( new Tuple<Long, String>( 31L, "V150" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V151" ) );
listTuples.add( new Tuple<Long, String>( 30L, "V152" ) );
listTuples.add( new Tuple<Long, String>( -31L, "V153" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V154" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V155" ) );
listTuples.add( new Tuple<Long, String>( -22L, "V156" ) );
listTuples.add( new Tuple<Long, String>( 15L, "V157" ) );
listTuples.add( new Tuple<Long, String>( 25L, "V158" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V159" ) );
listTuples.add( new Tuple<Long, String>( 22L, "V160" ) );
listTuples.add( new Tuple<Long, String>( 32L, "V161" ) );
listTuples.add( new Tuple<Long, String>( 16L, "V162" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V163" ) );
listTuples.add( new Tuple<Long, String>( 11L, "V164" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V165" ) );
listTuples.add( new Tuple<Long, String>( -11L, "V166" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V167" ) );
listTuples.add( new Tuple<Long, String>( 19L, "V168" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V169" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V170" ) );
listTuples.add( new Tuple<Long, String>( 10L, "V171" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V172" ) );
listTuples.add( new Tuple<Long, String>( 30L, "V173" ) );
listTuples.add( new Tuple<Long, String>( -12L, "V174" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V175" ) );
listTuples.add( new Tuple<Long, String>( 14L, "V176" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V177" ) );
listTuples.add( new Tuple<Long, String>( -14L, "V178" ) );
listTuples.add( new Tuple<Long, String>( 5L, "V179" ) );
listTuples.add( new Tuple<Long, String>( 8L, "V180" ) );
listTuples.add( new Tuple<Long, String>( -32L, "V181" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V182" ) );
listTuples.add( new Tuple<Long, String>( -17L, "V183" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V184" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V185" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V186" ) );
listTuples.add( new Tuple<Long, String>( -12L, "V187" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V188" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V189" ) );
listTuples.add( new Tuple<Long, String>( 16L, "V190" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V191" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V192" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V193" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V194" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V195" ) );
listTuples.add( new Tuple<Long, String>( 32L, "V196" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V197" ) );
listTuples.add( new Tuple<Long, String>( 13L, "V198" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V199" ) );
listTuples.add( new Tuple<Long, String>( 32L, "V200" ) );
listTuples.add( new Tuple<Long, String>( -29L, "V201" ) );
listTuples.add( new Tuple<Long, String>( -16L, "V202" ) );
listTuples.add( new Tuple<Long, String>( 9L, "V203" ) );
listTuples.add( new Tuple<Long, String>( 25L, "V204" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V205" ) );
listTuples.add( new Tuple<Long, String>( 4L, "V206" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V207" ) );
listTuples.add( new Tuple<Long, String>( 4L, "V208" ) );
listTuples.add( new Tuple<Long, String>( 23L, "V209" ) );
listTuples.add( new Tuple<Long, String>( 31L, "V210" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V211" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V212" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V213" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V214" ) );
listTuples.add( new Tuple<Long, String>( 8L, "V215" ) );
listTuples.add( new Tuple<Long, String>( -5L, "V216" ) );
listTuples.add( new Tuple<Long, String>( 13L, "V217" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V218" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V219" ) );
listTuples.add( new Tuple<Long, String>( 22L, "V220" ) );
listTuples.add( new Tuple<Long, String>( -2L, "V221" ) );
listTuples.add( new Tuple<Long, String>( -3L, "V222" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V223" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V224" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V225" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V226" ) );
listTuples.add( new Tuple<Long, String>( -8L, "V227" ) );
listTuples.add( new Tuple<Long, String>( 1L, "V228" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V229" ) );
listTuples.add( new Tuple<Long, String>( 25L, "V230" ) );
listTuples.add( new Tuple<Long, String>( 22L, "V231" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V232" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V233" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V234" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V235" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V236" ) );
listTuples.add( new Tuple<Long, String>( -15L, "V237" ) );
listTuples.add( new Tuple<Long, String>( 3L, "V238" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V239" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V240" ) );
listTuples.add( new Tuple<Long, String>( -17L, "V241" ) );
listTuples.add( new Tuple<Long, String>( -18L, "V242" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V243" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V244" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V245" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V246" ) );
listTuples.add( new Tuple<Long, String>( -31L, "V247" ) );
listTuples.add( new Tuple<Long, String>( 18L, "V248" ) );
listTuples.add( new Tuple<Long, String>( -28L, "V249" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V250" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V251" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V252" ) );
listTuples.add( new Tuple<Long, String>( -15L, "V253" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V254" ) );
listTuples.add( new Tuple<Long, String>( 11L, "V255" ) );
listTuples.add( new Tuple<Long, String>( 30L, "V256" ) );
listTuples.add( new Tuple<Long, String>( -27L, "V257" ) );
listTuples.add( new Tuple<Long, String>( 30L, "V258" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V259" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V260" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V261" ) );
listTuples.add( new Tuple<Long, String>( 7L, "V262" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V263" ) );
listTuples.add( new Tuple<Long, String>( -4L, "V264" ) );
listTuples.add( new Tuple<Long, String>( 29L, "V265" ) );
listTuples.add( new Tuple<Long, String>( 26L, "V266" ) );
listTuples.add( new Tuple<Long, String>( -7L, "V267" ) );
listTuples.add( new Tuple<Long, String>( -24L, "V268" ) );
listTuples.add( new Tuple<Long, String>( 4L, "V269" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V270" ) );
listTuples.add( new Tuple<Long, String>( -18L, "V271" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V272" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V273" ) );
listTuples.add( new Tuple<Long, String>( 24L, "V274" ) );
listTuples.add( new Tuple<Long, String>( -13L, "V275" ) );
listTuples.add( new Tuple<Long, String>( 31L, "V276" ) );
listTuples.add( new Tuple<Long, String>( -21L, "V277" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V278" ) );
listTuples.add( new Tuple<Long, String>( -5L, "V279" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V280" ) );
listTuples.add( new Tuple<Long, String>( -17L, "V281" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V282" ) );
listTuples.add( new Tuple<Long, String>( -1L, "V283" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V284" ) );
listTuples.add( new Tuple<Long, String>( -29L, "V285" ) );
listTuples.add( new Tuple<Long, String>( 1L, "V286" ) );
listTuples.add( new Tuple<Long, String>( -15L, "V287" ) );
listTuples.add( new Tuple<Long, String>( 14L, "V288" ) );
listTuples.add( new Tuple<Long, String>( -15L, "V289" ) );
listTuples.add( new Tuple<Long, String>( -6L, "V290" ) );
listTuples.add( new Tuple<Long, String>( -26L, "V291" ) );
listTuples.add( new Tuple<Long, String>( 24L, "V292" ) );
listTuples.add( new Tuple<Long, String>( -22L, "V293" ) );
listTuples.add( new Tuple<Long, String>( 2L, "V294" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V295" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V296" ) );
listTuples.add( new Tuple<Long, String>( 11L, "V297" ) );
listTuples.add( new Tuple<Long, String>( 28L, "V298" ) );
listTuples.add( new Tuple<Long, String>( 15L, "V299" ) );
listTuples.add( new Tuple<Long, String>( 17L, "V300" ) );
listTuples.add( new Tuple<Long, String>( -25L, "V301" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V302" ) );
listTuples.add( new Tuple<Long, String>( -20L, "V303" ) );
listTuples.add( new Tuple<Long, String>( -12L, "V304" ) );
listTuples.add( new Tuple<Long, String>( -10L, "V305" ) );
listTuples.add( new Tuple<Long, String>( -9L, "V306" ) );
listTuples.add( new Tuple<Long, String>( 16L, "V307" ) );
listTuples.add( new Tuple<Long, String>( -25L, "V308" ) );
listTuples.add( new Tuple<Long, String>( 6L, "V309" ) );
listTuples.add( new Tuple<Long, String>( 20L, "V310" ) );
listTuples.add( new Tuple<Long, String>( -31L, "V311" ) );
listTuples.add( new Tuple<Long, String>( -17L, "V312" ) );
listTuples.add( new Tuple<Long, String>( -19L, "V313" ) );
listTuples.add( new Tuple<Long, String>( 0L, "V314" ) );
listTuples.add( new Tuple<Long, String>( -32L, "V315" ) );
listTuples.add( new Tuple<Long, String>( 21L, "V316" ) );
listTuples.add( new Tuple<Long, String>( 19L, "V317" ) );
listTuples.add( new Tuple<Long, String>( -31L, "V318" ) );
File file = File.createTempFile( "managedbtreebuilder", ".data" );
file.deleteOnExit();
try
{
RecordManager rm = new RecordManager( file.getAbsolutePath() );
PersistedBTree<Long, String> btree = ( PersistedBTree<Long, String> ) rm.addBTree( "test",
LongSerializer.INSTANCE, StringSerializer.INSTANCE, false );
// btree.valueThresholdUp = 8;
Iterator<Tuple<Long, String>> tupleIterator = new Iterator<Tuple<Long, String>>()
{
private int pos = 0;
@Override
public Tuple<Long, String> next()
{
Tuple<Long, String> tuple = listTuples.get( pos++ );
return tuple;
}
@Override
public boolean hasNext()
{
return pos < listTuples.size();
}
@Override
public void remove()
{
}
};
long t0 = System.currentTimeMillis();
BTree<Long, String> result = null;
result = BulkLoader.load( btree, tupleIterator, 128 );
TupleCursor<Long, String> cursor = result.browse();
int nbFetched = 0;
Tuple<Long, String> prev = null;
Tuple<Long, String> elem = null;
long t2 = System.currentTimeMillis();
try
{
while ( cursor.hasNext() )
{
prev = elem;
elem = cursor.next();
nbFetched++;
}
}
catch ( Exception e )
{
System.out.println( "--->" + prev );
e.printStackTrace();
}
long t3 = System.currentTimeMillis();
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}