static LevelInfo computeLevel()

in mavibot/src/main/java/org/apache/directory/mavibot/btree/BulkLoader.java [333:436]


    /* no qualifier*/static <K, V> LevelInfo<K, V> computeLevel( BTree<K, V> btree, int nbElems, LevelEnum levelType )
    {
        int pageSize = btree.getPageSize();
        int incrementNode = 0;

        if ( levelType == LevelEnum.NODE )
        {
            incrementNode = 1;
        }

        LevelInfo<K, V> level = new LevelInfo<K, V>();
        level.setType( ( levelType == LevelEnum.NODE ) );
        level.setNbElems( nbElems );
        level.setNbPages( nbElems / ( pageSize + incrementNode ) );
        level.setLevelNumber( 0 );
        level.setNbAddedElems( 0 );
        level.setCurrentPos( 0 );

        // Create the first level page
        if ( nbElems <= pageSize + incrementNode )
        {
            if ( nbElems % ( pageSize + incrementNode ) != 0 )
            {
                level.setNbPages( 1 );
            }

            level.setNbElemsLimit( nbElems );

            if ( level.isNode() )
            {
                level.setCurrentPage( BTreeFactory.createNode( btree, 0L, nbElems - 1 ) );
            }
            else
            {
                level.setCurrentPage( BTreeFactory.createLeaf( btree, 0L, nbElems ) );
            }
        }
        else
        {
            int remaining = nbElems % ( pageSize + incrementNode );

            if ( remaining == 0 )
            {
                level.setNbElemsLimit( nbElems );

                if ( level.isNode() )
                {
                    level.setCurrentPage( BTreeFactory.createNode( btree, 0L, pageSize ) );
                }
                else
                {
                    level.setCurrentPage( BTreeFactory.createLeaf( btree, 0L, pageSize ) );
                }
            }
            else
            {
                level.incNbPages();

                if ( remaining < ( pageSize / 2 ) + incrementNode )
                {
                    level.setNbElemsLimit( nbElems - remaining - ( pageSize + incrementNode ) );

                    if ( level.getNbElemsLimit() > 0 )
                    {
                        if ( level.isNode() )
                        {
                            level.setCurrentPage( BTreeFactory.createNode( btree, 0L, pageSize ) );
                        }
                        else
                        {
                            level.setCurrentPage( BTreeFactory.createLeaf( btree, 0L, pageSize ) );
                        }
                    }
                    else
                    {
                        if ( level.isNode() )
                        {
                            level
                                .setCurrentPage( BTreeFactory.createNode( btree, 0L, ( pageSize / 2 ) + remaining - 1 ) );
                        }
                        else
                        {
                            level.setCurrentPage( BTreeFactory.createLeaf( btree, 0L, ( pageSize / 2 ) + remaining ) );
                        }
                    }
                }
                else
                {
                    level.setNbElemsLimit( nbElems - remaining );

                    if ( level.isNode() )
                    {
                        level.setCurrentPage( BTreeFactory.createNode( btree, 0L, pageSize ) );
                    }
                    else
                    {
                        level.setCurrentPage( BTreeFactory.createLeaf( btree, 0L, pageSize ) );
                    }
                }
            }
        }

        return level;
    }