in mavibot/src/main/java/org/apache/directory/mavibot/btree/TupleCursor.java [267:345]
public Tuple<K, V> next() throws EndOfFileExceededException, IOException
{
// First check that we have elements in the BTree
if ( ( stack == null ) || ( stack.length == 0 ) )
{
throw new NoSuchElementException( "No tuple present" );
}
ParentPos<K, V> parentPos = stack[depth];
if ( ( parentPos.page == null ) || ( parentPos.pos == AFTER_LAST ) )
{
// This is the end : no more value
throw new NoSuchElementException( "No more tuples present" );
}
if ( parentPos.pos == parentPos.page.getNbElems() )
{
// End of the leaf. We have to go back into the stack up to the
// parent, and down to the leaf
parentPos = findNextParentPos();
// we also need to check for the type of page cause
// findNextParentPos will never return a null ParentPos
if ( ( parentPos == null ) || ( parentPos.page == null ) )
{
// This is the end : no more value
throw new NoSuchElementException( "No more tuples present" );
}
}
V value = null;
if ( parentPos.valueCursor.hasNext() )
{
// Deal with the BeforeFirst case
if ( parentPos.pos == BEFORE_FIRST )
{
parentPos.pos++;
}
value = parentPos.valueCursor.next();
}
else
{
if ( parentPos.pos == parentPos.page.getNbElems() - 1 )
{
parentPos = findNextParentPos();
if ( ( parentPos == null ) || ( parentPos.page == null ) )
{
// This is the end : no more value
throw new NoSuchElementException( "No more tuples present" );
}
}
else
{
parentPos.pos++;
}
try
{
ValueHolder<V> valueHolder = ( ( AbstractPage<K, V> ) parentPos.page ).getValue( parentPos.pos );
parentPos.valueCursor = valueHolder.getCursor();
value = parentPos.valueCursor.next();
}
catch ( IllegalArgumentException e )
{
e.printStackTrace();
}
}
AbstractPage<K, V> leaf = ( AbstractPage<K, V> ) ( parentPos.page );
Tuple<K, V> tuple = new Tuple<K, V>( leaf.getKey( parentPos.pos ), value );
return tuple;
}