in mavibot/src/main/java/org/apache/directory/mavibot/btree/PersistedBTreeBuilder.java [64:146]
public BTree<K, V> build( Iterator<Tuple<K, V>> sortedTupleItr ) throws Exception
{
BTree<K, V> btree = BTreeFactory.createPersistedBTree( name, keySerializer, valueSerializer );
rm.manage( btree );
List<Page<K, V>> lstLeaves = new ArrayList<Page<K, V>>();
int totalTupleCount = 0;
PersistedLeaf<K, V> leaf1 = ( PersistedLeaf<K, V> ) BTreeFactory.createLeaf( btree, 0, numKeysInNode );
lstLeaves.add( leaf1 );
int leafIndex = 0;
while ( sortedTupleItr.hasNext() )
{
Tuple<K, V> tuple = sortedTupleItr.next();
BTreeFactory.setKey( btree, leaf1, leafIndex, tuple.getKey() );
PersistedValueHolder<V> eh = new PersistedValueHolder<V>( btree, tuple.getValue() );
BTreeFactory.setValue( btree, leaf1, leafIndex, eh );
leafIndex++;
totalTupleCount++;
if ( ( totalTupleCount % numKeysInNode ) == 0 )
{
leafIndex = 0;
PageHolder<K, V> pageHolder = rm.writePage( btree, leaf1, 1 );
leaf1 = ( PersistedLeaf<K, V> ) BTreeFactory.createLeaf( btree, 0, numKeysInNode );
lstLeaves.add( leaf1 );
}
//TODO build the whole tree in chunks rather than processing *all* leaves at first
}
if ( lstLeaves.isEmpty() )
{
return btree;
}
// remove null keys and values from the last leaf and resize
PersistedLeaf<K, V> lastLeaf = ( PersistedLeaf<K, V> ) lstLeaves.get( lstLeaves.size() - 1 );
for ( int i = 0; i < lastLeaf.getNbElems(); i++ )
{
if ( lastLeaf.getKey( i ) == null )
{
int n = i;
lastLeaf.setNbElems( n );
KeyHolder<K>[] keys = lastLeaf.getKeys();
lastLeaf.setKeys( ( KeyHolder[] ) Array.newInstance( PersistedKeyHolder.class, n ) );
System.arraycopy( keys, 0, lastLeaf.getKeys(), 0, n );
ValueHolder<V>[] values = lastLeaf.values;
lastLeaf.values = ( PersistedValueHolder<V>[] ) Array.newInstance( PersistedValueHolder.class, n );
System.arraycopy( values, 0, lastLeaf.values, 0, n );
PageHolder<K, V> pageHolder = rm.writePage( btree, lastLeaf, 1 );
break;
}
}
// make sure either one of the root pages is reclaimed, cause when we call rm.manage()
// there is already a root page created
Page<K, V> rootPage = attachNodes( lstLeaves, btree );
//System.out.println("built rootpage : " + rootPage);
( ( PersistedBTree<K, V> ) btree ).setNbElems( totalTupleCount );
rm.updateBtreeHeader( btree, ( ( AbstractPage<K, V> ) rootPage ).getOffset() );
rm.freePages( btree, btree.getRootPage().getRevision(), Arrays.asList( btree.getRootPage() ) );
( ( AbstractBTree<K, V> ) btree ).setRootPage( rootPage );
return btree;
}