public BTree build()

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;
    }