You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2013/12/16 12:46:33 UTC
svn commit: r1551187 [1/2] - in /directory/mavibot/trunk/mavibot/src:
main/java/org/apache/directory/mavibot/btree/
main/java/org/apache/directory/mavibot/btree/memory/
main/java/org/apache/directory/mavibot/btree/persisted/
test/java/org/apache/direct...
Author: elecharny
Date: Mon Dec 16 11:46:32 2013
New Revision: 1551187
URL: http://svn.apache.org/r1551187
Log:
o Fixed a NPE in the Array holding for values
o Added a PageHolder common class for in-memory and persisted btrees
o The abstract in-memory and persisted page class have been removed
o The in-memory/persisted Leaf classes have been removed to InMemoryLeaf/PersistedLeaf
Added:
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PageHolder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryLeaf.java
- copied, changed from r1551071, directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Leaf.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PersistedLeaf.java
- copied, changed from r1551070, directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/Leaf.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PersistedPageHolder.java
- copied, changed from r1551070, directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PageHolder.java
Removed:
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/AbstractInMemoryPage.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Leaf.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/AbstractPersistedPage.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/Leaf.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PageHolder.java
Modified:
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTupleCursor.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/BTreeFactory.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTree.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeBuilder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryValueHolder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Node.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/TupleCursorImpl.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/BTreeFactory.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/Node.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PersistedBTree.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PersistedBTreeBuilder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/PersistedValueHolder.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/RecordManager.java
directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/TupleCursorImpl.java
directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeTest.java
directory/mavibot/trunk/mavibot/src/test/java/org/apache/directory/mavibot/btree/memory/LeafTest.java
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractPage.java Mon Dec 16 11:46:32 2013
@@ -20,6 +20,9 @@
package org.apache.directory.mavibot.btree;
+import java.io.IOException;
+import java.lang.reflect.Array;
+
import org.apache.directory.mavibot.btree.KeyHolder;
import org.apache.directory.mavibot.btree.Page;
import org.apache.directory.mavibot.btree.exception.KeyNotFoundException;
@@ -42,6 +45,9 @@ public abstract class AbstractPage<K, V>
/** Keys of children nodes */
protected KeyHolder<K>[] keys;
+ /** Children pages associated with keys. */
+ protected PageHolder<K, V>[] children;
+
/** The number of current values in the Page */
protected int nbElems;
@@ -69,6 +75,19 @@ public abstract class AbstractPage<K, V>
}
/**
+ * Internal constructor used to create Page instance used when a page is being copied or overflow
+ */
+ @SuppressWarnings("unchecked")
+ // Cannot create an array of generic objects
+ protected AbstractPage( BTree<K, V> btree, long revision, int nbElems )
+ {
+ this.btree = btree;
+ this.revision = revision;
+ this.nbElems = nbElems;
+ this.keys = ( KeyHolder[] ) Array.newInstance( KeyHolder.class, nbElems );
+ }
+
+ /**
* {@inheritDoc}
*/
public int getNbElems()
@@ -102,6 +121,76 @@ public abstract class AbstractPage<K, V>
/**
* {@inheritDoc}
*/
+ public Page<K, V> getPage( int pos )
+ {
+ if ( ( pos >= 0 ) && ( pos < children.length ) )
+ {
+ return children[pos].getValue();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setPageHolder( int pos, PageHolder<K, V> pageHolder )
+ {
+ if ( ( pos >= 0 ) && ( pos < children.length ) )
+ {
+ children[pos] = pageHolder;
+ }
+ }
+
+
+ /**
+ * Selects the sibling (the previous or next page with the same parent) which has
+ * the more element assuming it's above N/2
+ *
+ * @param parent The parent of the current page
+ * @param The position of the current page reference in its parent
+ * @return The position of the sibling, or -1 if we have'nt found any sibling
+ * @throws IOException If we have an error while trying to access the page
+ */
+ protected int selectSibling( Page<K, V> parent, int parentPos ) throws IOException
+ {
+ if ( parentPos == 0 )
+ {
+ // The current page is referenced on the left of its parent's page :
+ // we will not have a previous page with the same parent
+ return 1;
+ }
+
+ if ( parentPos == parent.getNbElems() )
+ {
+ // The current page is referenced on the right of its parent's page :
+ // we will not have a next page with the same parent
+ return parentPos - 1;
+ }
+
+ Page<K, V> prevPage = ((AbstractPage<K, V>)parent).getPage( parentPos - 1 );
+ Page<K, V> nextPage = ((AbstractPage<K, V>)parent).getPage( parentPos + 1 );
+
+ int prevPageSize = prevPage.getNbElems();
+ int nextPageSize = nextPage.getNbElems();
+
+ if ( prevPageSize >= nextPageSize )
+ {
+ return parentPos - 1;
+ }
+ else
+ {
+ return parentPos + 1;
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
public K getLeftMostKey()
{
return keys[0].getKey();
@@ -163,6 +252,18 @@ public abstract class AbstractPage<K, V>
/**
+ * Sets the key at a give position
+ *
+ * @param pos The position in the keys array
+ * @param key the key to inject
+ */
+ public void setKey( int pos, KeyHolder<K> key )
+ {
+ keys[pos] = key;
+ }
+
+
+ /**
* @param revision the keys to set
*/
public void setKeys( KeyHolder<K>[] keys )
@@ -311,6 +412,15 @@ public abstract class AbstractPage<K, V>
/**
+ * @return the btree
+ */
+ public BTree<K, V> getBtree()
+ {
+ return btree;
+ }
+
+
+ /**
* {@inheritDoc}
*/
public String dumpPage( String tabs )
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTupleCursor.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTupleCursor.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTupleCursor.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractTupleCursor.java Mon Dec 16 11:46:32 2013
@@ -60,56 +60,6 @@ public abstract class AbstractTupleCurso
/**
* {@inheritDoc}
- *
- public void afterLast() throws IOException
- {
- // First check that we have elements in the BTree
- if ( ( stack == null ) || ( stack.length == 0 ) )
- {
- return;
- }
-
- Page<K, V> child = null;
-
- for ( int i = 0; i < depth; i++ )
- {
- ParentPos<K, V> parentPos = stack[i];
-
- if ( child != null )
- {
- parentPos.page = child;
- parentPos.pos = child.getNbElems();
- }
- else
- {
- // We have N+1 children if the page is a Node, so we don't decrement the nbElems field
- parentPos.pos = parentPos.page.getNbElems();
- }
-
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos];
- }
-
- // and leaf
- ParentPos<K, V> parentPos = stack[depth];
-
- if ( child == null )
- {
- parentPos.pos = parentPos.page.getNbElems() - 1;
- }
- else
- {
- parentPos.page = child;
- parentPos.pos = child.getNbElems() - 1;
- }
-
- parentPos.valueCursor = ((Leaf<K, V>)parentPos.page).values[parentPos.pos].getCursor();
- parentPos.valueCursor.afterLast();
- parentPos.pos = AFTER_LAST;
- }
-
-
- /**
- * {@inheritDoc}
*/
public void close()
{
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractValueHolder.java Mon Dec 16 11:46:32 2013
@@ -48,6 +48,9 @@ public abstract class AbstractValueHolde
protected int valueThresholdUp = 1;
protected int valueThresholdLow = 1;
+ protected int nbArrayElems;
+
+
/**
* {@inheritDoc}
*/
@@ -272,7 +275,7 @@ public abstract class AbstractValueHolde
private void addInArray( V value )
{
// We have to check that we have reached the threshold or not
- if ( valueArray.length >= valueThresholdUp )
+ if ( size() >= valueThresholdUp )
{
// Ok, transform the array into a btree
createSubTree();
@@ -287,6 +290,7 @@ public abstract class AbstractValueHolde
}
// We can delete the array now
+ nbArrayElems = 0;
valueArray = null;
// And inject the new value
@@ -300,27 +304,37 @@ public abstract class AbstractValueHolde
}
else
{
- // First check that the value is not already present in the ValueHolder
- int pos = findPos( value );
-
- if ( pos >= 0 )
+ // Create the array if it's null
+ if ( valueArray == null )
{
- // The value exists : nothing to do
- return;
+ valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), 1 );
+ nbArrayElems = 1;
+ valueArray[0] = value;
+ }
+ else
+ {
+ // check that the value is not already present in the ValueHolder
+ int pos = findPos( value );
+
+ if ( pos >= 0 )
+ {
+ // The value exists : nothing to do
+ return;
+ }
+
+ // Ok, we just have to insert the new element at the right position
+ // We transform the position to a positive value
+ pos = -( pos + 1 );
+ // First, copy the array
+ V[] newValueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), valueArray.length + 1 );
+
+ System.arraycopy( valueArray, 0, newValueArray, 0, pos );
+ newValueArray[pos] = value;
+ System.arraycopy( valueArray, pos, newValueArray, pos + 1, valueArray.length - pos );
+
+ // And switch the arrays
+ valueArray = newValueArray;
}
-
- // Ok, we just have to insert the new element at the right position
- // We transform the position to a positive value
- pos = -( pos + 1 );
- // First, copy the array
- V[] newValueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), valueArray.length + 1 );
-
- System.arraycopy( valueArray, 0, newValueArray, 0, pos );
- newValueArray[pos] = value;
- System.arraycopy( valueArray, pos, newValueArray, pos + 1, valueArray.length - pos );
-
- // And switch the arrays
- valueArray = newValueArray;
}
}
@@ -347,7 +361,7 @@ public abstract class AbstractValueHolde
*/
public void add( V value )
{
- if ( valueArray != null )
+ if ( valueBtree == null )
{
addInArray( value );
}
Added: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PageHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PageHolder.java?rev=1551187&view=auto
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PageHolder.java (added)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/PageHolder.java Mon Dec 16 11:46:32 2013
@@ -0,0 +1,55 @@
+/*
+ * 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 java.io.IOException;
+
+import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
+
+public class PageHolder<K, V>
+{
+ /** The BTree */
+ protected BTree<K, V> btree;
+
+ /** The stored page */
+ private Page<K, V> page;
+
+ /**
+ * Create a new holder storing an offset and a SoftReference containing the element.
+ *
+ * @param page The element to store into a SoftReference
+ **/
+ public PageHolder( BTree<K, V> btree, Page<K, V> page )
+ {
+ this.btree = btree;
+ this.page = page;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ * @throws IOException
+ * @throws EndOfFileExceededException
+ */
+ public Page<K, V> getValue()
+ {
+ return page;
+ }
+}
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/BTreeFactory.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/BTreeFactory.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/BTreeFactory.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/BTreeFactory.java Mon Dec 16 11:46:32 2013
@@ -23,8 +23,11 @@ package org.apache.directory.mavibot.btr
import java.io.IOException;
import java.util.LinkedList;
+import org.apache.directory.mavibot.btree.AbstractPage;
import org.apache.directory.mavibot.btree.BTree;
+import org.apache.directory.mavibot.btree.KeyHolder;
import org.apache.directory.mavibot.btree.Page;
+import org.apache.directory.mavibot.btree.PageHolder;
import org.apache.directory.mavibot.btree.ParentPos;
import org.apache.directory.mavibot.btree.ValueHolder;
import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
@@ -77,9 +80,9 @@ public class BTreeFactory
* @param nbElems The number or elements in this leaf
* @return A Leaf instance
*/
- public static <K, V> Leaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
+ public static <K, V> InMemoryLeaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
{
- Leaf<K, V> leaf = new Leaf<K, V>( btree, revision, nbElems );
+ InMemoryLeaf<K, V> leaf = new InMemoryLeaf<K, V>( btree, revision, nbElems );
return leaf;
}
@@ -192,7 +195,8 @@ public class BTreeFactory
*/
public static <K, V> void setKey( Page<K, V> page, int pos, K key )
{
- ( ( AbstractInMemoryPage<K, V> ) page ).setKey( pos, key );
+ KeyHolder<K> keyHolder = new KeyHolder<K>( key );
+ ( ( AbstractPage<K, V> ) page ).setKey( pos, keyHolder );
}
@@ -201,7 +205,7 @@ public class BTreeFactory
* @param pos The position in the values array
* @param value the value to inject
*/
- public static <K, V> void setValue( Leaf<K, V> page, int pos, InMemoryValueHolder<V> value )
+ public static <K, V> void setValue( InMemoryLeaf<K, V> page, int pos, InMemoryValueHolder<V> value )
{
page.setValue( pos, value );
}
@@ -212,9 +216,9 @@ public class BTreeFactory
* @param pos The position in the values array
* @param value the value to inject
*/
- public static <K, V> void setValue( Node<K, V> page, int pos, Page<K, V> value )
+ public static <K, V> void setValue( BTree<K, V> btree, Node<K, V> page, int pos, Page<K, V> value )
{
- page.children[pos] = value;
+ page.setPageHolder( pos, new PageHolder<K, V>( btree, value ) );
}
@@ -232,9 +236,9 @@ public class BTreeFactory
ParentPos<K, V> last = new ParentPos<K, V>( btree.getRootPage(), btree.getRootPage().getNbElems() );
stack.push( last );
- if ( btree.getRootPage() instanceof Leaf )
+ if ( btree.getRootPage() instanceof InMemoryLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( btree.getRootPage() );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( btree.getRootPage() );
ValueHolder<V> valueHolder = leaf.values[last.pos];
last.valueCursor = valueHolder.getCursor();
}
@@ -244,14 +248,14 @@ public class BTreeFactory
while ( true )
{
- Page<K, V> p = node.children[node.getNbElems()];
+ Page<K, V> p = node.getPage( node.getNbElems() );
last = new ParentPos<K, V>( p, p.getNbElems() );
stack.push( last );
- if ( p instanceof Leaf )
+ if ( p instanceof InMemoryLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( last.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( last.page );
ValueHolder<V> valueHolder = leaf.values[last.pos];
last.valueCursor = valueHolder.getCursor();
break;
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTree.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTree.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTree.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTree.java Mon Dec 16 11:46:32 2013
@@ -154,7 +154,7 @@ public class InMemoryBTree<K, V> extends
// Create the first root page, with revision 0L. It will be empty
// and increment the revision at the same time
- rootPage = new Leaf<K, V>( this );
+ rootPage = new InMemoryLeaf<K, V>( this );
// Now, initialize the BTree
init();
@@ -265,7 +265,7 @@ public class InMemoryBTree<K, V> extends
// Create the first root page, with revision 0L. It will be empty
// and increment the revision at the same time
- rootPage = new Leaf<K, V>( this );
+ rootPage = new InMemoryLeaf<K, V>( this );
// Now, call the init() method
init();
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeBuilder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeBuilder.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeBuilder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryBTreeBuilder.java Mon Dec 16 11:46:32 2013
@@ -36,6 +36,7 @@ import org.apache.directory.mavibot.btre
import org.apache.directory.mavibot.btree.BTree;
import org.apache.directory.mavibot.btree.KeyHolder;
import org.apache.directory.mavibot.btree.Page;
+import org.apache.directory.mavibot.btree.PageHolder;
import org.apache.directory.mavibot.btree.Tuple;
import org.apache.directory.mavibot.btree.ValueHolder;
import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
@@ -77,7 +78,7 @@ public class InMemoryBTreeBuilder<K, V>
int totalTupleCount = 0;
- Leaf<K, V> leaf1 = createLeaf( btree, 0, numKeysInNode );
+ InMemoryLeaf<K, V> leaf1 = createLeaf( btree, 0, numKeysInNode );
lstLeaves.add( leaf1 );
int leafIndex = 0;
@@ -107,7 +108,7 @@ public class InMemoryBTreeBuilder<K, V>
}
// remove null keys and values from the last leaf and resize
- Leaf<K, V> lastLeaf = ( Leaf<K, V> ) lstLeaves.get( lstLeaves.size() - 1 );
+ InMemoryLeaf<K, V> lastLeaf = ( InMemoryLeaf<K, V> ) lstLeaves.get( lstLeaves.size() - 1 );
for ( int i = 0; i < lastLeaf.getNbElems(); i++ )
{
if ( lastLeaf.getKeys()[i] == null )
@@ -161,7 +162,7 @@ public class InMemoryBTreeBuilder<K, V>
setKey( node, i - 1, p.getLeftMostKey() );
}
- node.children[i] = p;
+ node.setPageHolder( i, new PageHolder<K, V>( btree, p ) );
i++;
totalNodes++;
Copied: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryLeaf.java (from r1551071, directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Leaf.java)
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryLeaf.java?p2=directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryLeaf.java&p1=directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Leaf.java&r1=1551071&r2=1551187&rev=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Leaf.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryLeaf.java Mon Dec 16 11:46:32 2013
@@ -23,11 +23,13 @@ package org.apache.directory.mavibot.btr
import java.io.IOException;
import java.lang.reflect.Array;
+import org.apache.directory.mavibot.btree.AbstractPage;
import org.apache.directory.mavibot.btree.BTree;
import org.apache.directory.mavibot.btree.BorrowedFromLeftResult;
import org.apache.directory.mavibot.btree.BorrowedFromRightResult;
import org.apache.directory.mavibot.btree.DeleteResult;
import org.apache.directory.mavibot.btree.InsertResult;
+import org.apache.directory.mavibot.btree.KeyHolder;
import org.apache.directory.mavibot.btree.ModifyResult;
import org.apache.directory.mavibot.btree.NotPresentResult;
import org.apache.directory.mavibot.btree.Page;
@@ -51,7 +53,7 @@ import org.apache.directory.mavibot.btre
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
-/* No qualifier */class Leaf<K, V> extends AbstractInMemoryPage<K, V>
+/* No qualifier */class InMemoryLeaf<K, V> extends AbstractPage<K, V>
{
/** Values associated with keys */
protected ValueHolder<V>[] values;
@@ -62,7 +64,7 @@ import org.apache.directory.mavibot.btre
*
* @param btree The BTree this page belongs to.
*/
- /* No qualifier */Leaf( BTree<K, V> btree )
+ InMemoryLeaf( BTree<K, V> btree )
{
super( btree );
}
@@ -76,8 +78,7 @@ import org.apache.directory.mavibot.btre
* @param nbElems The number of elements this page will contain
*/
@SuppressWarnings("unchecked")
- // Cannot create an array of generic objects
- /* No qualifier */Leaf( BTree<K, V> btree, long revision, int nbElems )
+ InMemoryLeaf( BTree<K, V> btree, long revision, int nbElems )
{
super( btree, revision, nbElems );
@@ -193,15 +194,15 @@ import org.apache.directory.mavibot.btre
}
}
- Leaf<K, V> newLeaf = null;
+ InMemoryLeaf<K, V> newLeaf = null;
if ( keyRemoved )
{
- newLeaf = new Leaf<K, V>( btree, revision, nbElems - 1 );
+ newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems - 1 );
}
else
{
- newLeaf = new Leaf<K, V>( btree, revision, nbElems );
+ newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems );
}
// Create the result
@@ -231,7 +232,7 @@ import org.apache.directory.mavibot.btre
// Check in both next and previous page, if they have the same parent
// and select the biggest page with the same parent to borrow an element.
int siblingPos = selectSibling( ( Node<K, V> ) parent, parentPos );
- Leaf<K, V> sibling = ( Leaf<K, V> ) ( ( ( Node<K, V> ) parent ).children[siblingPos] );
+ InMemoryLeaf<K, V> sibling = ( InMemoryLeaf<K, V> ) ( ( ( Node<K, V> ) parent ).getPage( siblingPos ) );
if ( sibling.getNbElems() == halfSize )
{
@@ -298,13 +299,13 @@ import org.apache.directory.mavibot.btre
* @return The new created leaf containing the sibling and the old page.
* @throws IOException If we have an error while trying to access the page
*/
- private DeleteResult<K, V> mergeWithSibling( Tuple<K, V> removedElement, long revision, Leaf<K, V> sibling,
+ private DeleteResult<K, V> mergeWithSibling( Tuple<K, V> removedElement, long revision, InMemoryLeaf<K, V> sibling,
boolean isLeft, int pos )
throws EndOfFileExceededException, IOException
{
// Create the new page. It will contain N - 1 elements (the maximum number)
// as we merge two pages that contain N/2 elements minus the one we remove
- Leaf<K, V> newLeaf = new Leaf<K, V>( btree, revision, btree.getPageSize() - 1 );
+ InMemoryLeaf<K, V> newLeaf = new InMemoryLeaf<K, V>( btree, revision, btree.getPageSize() - 1 );
if ( isLeft )
{
@@ -359,7 +360,7 @@ import org.apache.directory.mavibot.btre
* @return The resulting pages
* @throws IOException If we have an error while trying to access the page
*/
- private DeleteResult<K, V> borrowFromLeft( Tuple<K, V> removedElement, long revision, Leaf<K, V> sibling, int pos )
+ private DeleteResult<K, V> borrowFromLeft( Tuple<K, V> removedElement, long revision, InMemoryLeaf<K, V> sibling, int pos )
throws IOException
{
// The sibling is on the left, borrow the rightmost element
@@ -367,14 +368,14 @@ import org.apache.directory.mavibot.btre
ValueHolder<V> siblingValue = sibling.values[sibling.getNbElems() - 1];
// Create the new sibling, with one less element at the end
- Leaf<K, V> newSibling = ( Leaf<K, V> ) sibling.copy( revision, sibling.getNbElems() - 1 );
+ InMemoryLeaf<K, V> newSibling = ( InMemoryLeaf<K, V> ) sibling.copy( revision, sibling.getNbElems() - 1 );
// Create the new page and add the new element at the beginning
// First copy the current page, with the same size
- Leaf<K, V> newLeaf = new Leaf<K, V>( btree, revision, nbElems );
+ InMemoryLeaf<K, V> newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems );
// Insert the borrowed element
- newLeaf.setKey( 0, siblingKey );
+ newLeaf.setKey( 0, new KeyHolder<K>( siblingKey ) );
newLeaf.values[0] = siblingValue;
// Copy the keys and the values up to the insertion position,
@@ -406,7 +407,7 @@ import org.apache.directory.mavibot.btre
* @return The resulting pages
* @throws IOException If we have an error while trying to access the page
*/
- private DeleteResult<K, V> borrowFromRight( Tuple<K, V> removedElement, long revision, Leaf<K, V> sibling, int pos )
+ private DeleteResult<K, V> borrowFromRight( Tuple<K, V> removedElement, long revision, InMemoryLeaf<K, V> sibling, int pos )
throws IOException
{
// The sibling is on the left, borrow the rightmost element
@@ -414,7 +415,7 @@ import org.apache.directory.mavibot.btre
ValueHolder<V> siblingHolder = sibling.values[0];
// Create the new sibling
- Leaf<K, V> newSibling = new Leaf<K, V>( btree, revision, sibling.getNbElems() - 1 );
+ InMemoryLeaf<K, V> newSibling = new InMemoryLeaf<K, V>( btree, revision, sibling.getNbElems() - 1 );
// Copy the keys and the values from 1 to N in the new sibling
System.arraycopy( sibling.getKeys(), 1, newSibling.getKeys(), 0, sibling.nbElems - 1 );
@@ -422,10 +423,10 @@ import org.apache.directory.mavibot.btre
// Create the new page and add the new element at the end
// First copy the current page, with the same size
- Leaf<K, V> newLeaf = new Leaf<K, V>( btree, revision, nbElems );
+ InMemoryLeaf<K, V> newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems );
// Insert the borrowed element at the end
- newLeaf.setKey( nbElems - 1, siblingKey );
+ newLeaf.setKey( nbElems - 1, new KeyHolder<K>( siblingKey ) );
newLeaf.values[nbElems - 1] = siblingHolder;
// Copy the keys and the values up to the deletion position,
@@ -454,7 +455,7 @@ import org.apache.directory.mavibot.btre
* @param pos The position into the page of the element to remove
* @throws IOException If we have an error while trying to access the page
*/
- private void copyAfterRemovingElement( boolean keyRemoved, Leaf<K, V> newLeaf, int pos ) throws IOException
+ private void copyAfterRemovingElement( boolean keyRemoved, InMemoryLeaf<K, V> newLeaf, int pos ) throws IOException
{
if ( keyRemoved )
{
@@ -703,7 +704,7 @@ import org.apache.directory.mavibot.btre
*/
private Page<K, V> copy( long revision, int nbElems )
{
- Leaf<K, V> newLeaf = new Leaf<K, V>( btree, revision, nbElems );
+ InMemoryLeaf<K, V> newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems );
// Copy the keys and the values
System.arraycopy( getKeys(), 0, newLeaf.getKeys(), 0, nbElems );
@@ -726,12 +727,12 @@ import org.apache.directory.mavibot.btre
private InsertResult<K, V> replaceElement( long revision, K key, V value, int pos )
throws IOException
{
- Leaf<K, V> newLeaf = this;
+ InMemoryLeaf<K, V> newLeaf = this;
if ( this.revision != revision )
{
// The page hasn't been modified yet, we need to copy it first
- newLeaf = ( Leaf<K, V> ) copy( revision, nbElems );
+ newLeaf = ( InMemoryLeaf<K, V> ) copy( revision, nbElems );
}
// Get the previous value from the leaf (it's a copy)
@@ -773,7 +774,7 @@ import org.apache.directory.mavibot.btre
private Page<K, V> addElement( long revision, K key, V value, int pos )
{
// First copy the current page, but add one element in the copied page
- Leaf<K, V> newLeaf = new Leaf<K, V>( btree, revision, nbElems + 1 );
+ InMemoryLeaf<K, V> newLeaf = new InMemoryLeaf<K, V>( btree, revision, nbElems + 1 );
// Atm, store the value in memory
InMemoryValueHolder<V> valueHolder = new InMemoryValueHolder<V>( btree, value );
@@ -781,7 +782,7 @@ import org.apache.directory.mavibot.btre
// Deal with the special case of an empty page
if ( nbElems == 0 )
{
- newLeaf.setKey( 0, key );
+ newLeaf.setKey( 0, new KeyHolder<K>( key ) );
newLeaf.values[0] = valueHolder;
}
else
@@ -791,7 +792,7 @@ import org.apache.directory.mavibot.btre
System.arraycopy( values, 0, newLeaf.values, 0, pos );
// Add the new element
- newLeaf.setKey( pos, key );
+ newLeaf.setKey( pos, new KeyHolder<K>( key ) );
newLeaf.values[pos] = valueHolder;
// And copy the remaining elements
@@ -821,22 +822,22 @@ import org.apache.directory.mavibot.btre
private InsertResult<K, V> addAndSplit( long revision, K key, V value, int pos )
{
int middle = btree.getPageSize() >> 1;
- Leaf<K, V> leftLeaf = null;
- Leaf<K, V> rightLeaf = null;
+ InMemoryLeaf<K, V> leftLeaf = null;
+ InMemoryLeaf<K, V> rightLeaf = null;
InMemoryValueHolder<V> valueHolder = new InMemoryValueHolder<V>( btree, value );
// Determinate where to store the new value
if ( pos <= middle )
{
// The left page will contain the new value
- leftLeaf = new Leaf<K, V>( btree, revision, middle + 1 );
+ leftLeaf = new InMemoryLeaf<K, V>( btree, revision, middle + 1 );
// Copy the keys and the values up to the insertion position
System.arraycopy( getKeys(), 0, leftLeaf.getKeys(), 0, pos );
System.arraycopy( values, 0, leftLeaf.values, 0, pos );
// Add the new element
- leftLeaf.setKey( pos, key );
+ leftLeaf.setKey( pos, new KeyHolder<K>( key ) );
leftLeaf.values[pos] = valueHolder;
// And copy the remaining elements
@@ -844,7 +845,7 @@ import org.apache.directory.mavibot.btre
System.arraycopy( values, pos, leftLeaf.values, pos + 1, middle - pos );
// Now, create the right page
- rightLeaf = new Leaf<K, V>( btree, revision, middle );
+ rightLeaf = new InMemoryLeaf<K, V>( btree, revision, middle );
// Copy the keys and the values in the right page
System.arraycopy( getKeys(), middle, rightLeaf.getKeys(), 0, middle );
@@ -853,14 +854,14 @@ import org.apache.directory.mavibot.btre
else
{
// Create the left page
- leftLeaf = new Leaf<K, V>( btree, revision, middle );
+ leftLeaf = new InMemoryLeaf<K, V>( btree, revision, middle );
// Copy all the element into the left page
System.arraycopy( getKeys(), 0, leftLeaf.getKeys(), 0, middle );
System.arraycopy( values, 0, leftLeaf.values, 0, middle );
// Now, create the right page
- rightLeaf = new Leaf<K, V>( btree, revision, middle + 1 );
+ rightLeaf = new InMemoryLeaf<K, V>( btree, revision, middle + 1 );
int rightPos = pos - middle;
@@ -869,7 +870,7 @@ import org.apache.directory.mavibot.btre
System.arraycopy( values, middle, rightLeaf.values, 0, rightPos );
// Add the new element
- rightLeaf.setKey( rightPos, key );
+ rightLeaf.setKey( rightPos, new KeyHolder<K>( key ) );
rightLeaf.values[rightPos] = valueHolder;
// And copy the remaining elements
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryValueHolder.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryValueHolder.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryValueHolder.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/InMemoryValueHolder.java Mon Dec 16 11:46:32 2013
@@ -29,6 +29,7 @@ import org.apache.directory.mavibot.btre
import org.apache.directory.mavibot.btree.BTree;
import org.apache.directory.mavibot.btree.Tuple;
import org.apache.directory.mavibot.btree.exception.EndOfFileExceededException;
+import org.apache.directory.mavibot.btree.persisted.PersistedBTree;
/**
@@ -51,12 +52,17 @@ public class InMemoryValueHolder<V> exte
InMemoryValueHolder( BTree<?, V> parentBtree, int nbValues )
{
valueSerializer = parentBtree.getValueSerializer();
+
+ if ( nbValues <= 1 )
+ {
+ valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), nbValues );
+ }
}
/**
* Creates a new instance of a ValueHolder, containing Values. This constructor is called
- * whe we need to create a new ValueHolder with deserialized values.
+ * when we need to create a new ValueHolder with deserialized values.
*
* @param parentBtree The parent BTree
* @param values The Values stored in the ValueHolder
@@ -69,10 +75,12 @@ public class InMemoryValueHolder<V> exte
{
int nbValues = values.length;
- if ( nbValues < 2 )
+ if ( nbValues == 1 )
{
// Store the value
- valueArray = values;
+ valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), nbValues );
+ valueArray[0] = values[0];
+ nbArrayElems = nbValues;
}
else
{
@@ -107,7 +115,7 @@ public class InMemoryValueHolder<V> exte
}
else
{
- return 1;
+ return nbArrayElems;
}
}
@@ -191,6 +199,7 @@ public class InMemoryValueHolder<V> exte
{
valueArray = ( V[] ) Array.newInstance( valueSerializer.getType(), 1 );
valueArray[0] = valueBtree.browse().next().getKey();
+ nbArrayElems = 1;
valueBtree.close();
valueBtree = null;
}
@@ -226,7 +235,7 @@ public class InMemoryValueHolder<V> exte
else
{
V returnedValue = valueArray[0];
- valueArray[0] = null;
+ nbArrayElems = 0;
return returnedValue;
}
@@ -278,7 +287,12 @@ public class InMemoryValueHolder<V> exte
else
{
sb.append( ", {" );
- sb.append( valueArray[0] );
+
+ if ( size() != 0 )
+ {
+ sb.append( valueArray[0] );
+ }
+
sb.append( "}" );
}
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Node.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Node.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Node.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/Node.java Mon Dec 16 11:46:32 2013
@@ -24,6 +24,7 @@ import java.io.IOException;
import java.lang.reflect.Array;
import java.util.List;
+import org.apache.directory.mavibot.btree.AbstractPage;
import org.apache.directory.mavibot.btree.BTree;
import org.apache.directory.mavibot.btree.BorrowedFromLeftResult;
import org.apache.directory.mavibot.btree.BorrowedFromRightResult;
@@ -34,6 +35,7 @@ import org.apache.directory.mavibot.btre
import org.apache.directory.mavibot.btree.ModifyResult;
import org.apache.directory.mavibot.btree.NotPresentResult;
import org.apache.directory.mavibot.btree.Page;
+import org.apache.directory.mavibot.btree.PageHolder;
import org.apache.directory.mavibot.btree.ParentPos;
import org.apache.directory.mavibot.btree.RemoveResult;
import org.apache.directory.mavibot.btree.SplitResult;
@@ -54,12 +56,8 @@ import org.apache.directory.mavibot.btre
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
-/* No qualifier */class Node<K, V> extends AbstractInMemoryPage<K, V>
+/* No qualifier */class Node<K, V> extends AbstractPage<K, V>
{
- /** Children pages associated with keys. */
- protected Page<K, V>[] children;
-
-
/**
* Creates a new Node which will contain only one key, with references to
* a left and right page. This is a specific constructor used by the btree
@@ -75,7 +73,7 @@ import org.apache.directory.mavibot.btre
super( btree, revision, nbElems );
// Create the children array
- children = ( Page<K, V>[] ) Array.newInstance( Page.class, nbElems + 1 );
+ children = ( PageHolder<K, V>[] ) Array.newInstance( PageHolder.class, nbElems + 1 );
}
@@ -96,18 +94,17 @@ import org.apache.directory.mavibot.btre
super( btree, revision, 1 );
// Create the children array, and store the left and right children
- children = ( Page[] ) Array.newInstance( Page.class,
- btree.getPageSize() + 1 );
+ children = ( PageHolder[] ) Array.newInstance( PageHolder.class, btree.getPageSize() + 1 );
- children[0] = leftPage;
- children[1] = rightPage;
+ children[0] = new PageHolder<K, V>( btree, leftPage );
+ children[1] = new PageHolder<K, V>( btree, rightPage );
// Create the keys array and store the pivot into it
// We get the type of array to create from the btree
// Yes, this is an hack...
setKeys( ( KeyHolder<K>[] ) Array.newInstance( KeyHolder.class, btree.getPageSize() ) );
- setKey( 0, key );
+ setKey( 0, new KeyHolder<K>( key ) );
}
@@ -127,7 +124,7 @@ import org.apache.directory.mavibot.btre
}
// Get the child page into which we will insert the <K, V> tuple
- Page<K, V> child = children[pos];
+ Page<K, V> child = children[pos].getValue();
// and insert the <K, V> into this child
InsertResult<K, V> result = child.insert( revision, key, value );
@@ -190,16 +187,16 @@ import org.apache.directory.mavibot.btre
if ( found )
{
- newPage.children[index + 1] = modifiedPage;
+ newPage.children[index + 1] = new PageHolder<K, V>( btree, modifiedPage );
}
else
{
- newPage.children[index] = modifiedPage;
+ newPage.children[index] = new PageHolder<K, V>( btree, modifiedPage );
}
if ( pos < 0 )
{
- newPage.setKey( index, removeResult.getModifiedPage().getLeftMostKey() );
+ newPage.setKey( index, new KeyHolder<K>( removeResult.getModifiedPage().getLeftMostKey() ) );
}
// Modify the result and return
@@ -261,7 +258,7 @@ import org.apache.directory.mavibot.btre
// Create the new sibling, with one less element at the beginning
Node<K, V> newSibling = new Node<K, V>( btree, revision, sibling.getNbElems() - 1 );
- K siblingKey = sibling.children[0].getLeftMostKey();
+ K siblingKey = sibling.children[0].getValue().getLeftMostKey();
// Copy the keys and children of the old sibling in the new sibling
System.arraycopy( sibling.getKeys(), 1, newSibling.getKeys(), 0, newSibling.getNbElems() );
@@ -275,7 +272,7 @@ import org.apache.directory.mavibot.btre
int index = Math.abs( pos );
// Copy the key and children from sibling
- newNode.setKey( nbElems - 1, siblingKey ); // 1
+ newNode.setKey( nbElems - 1, new KeyHolder<K>( siblingKey ) ); // 1
newNode.children[nbElems] = sibling.children[0]; // 8
if ( index < 2 )
@@ -285,7 +282,7 @@ import org.apache.directory.mavibot.btre
// Inject the modified page
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[0] = modifiedPage;
+ newNode.children[0] = new PageHolder<K, V>( btree, modifiedPage );
// Copy the children
System.arraycopy( children, 2, newNode.children, 1, nbElems - 1 );
@@ -299,7 +296,7 @@ import org.apache.directory.mavibot.btre
}
// Inject the new modified page key
- newNode.setKey( index - 2, mergedResult.getModifiedPage().getLeftMostKey() ); // 2
+ newNode.setKey( index - 2, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) ); // 2
if ( index < nbElems )
{
@@ -315,7 +312,7 @@ import org.apache.directory.mavibot.btre
// Inject the modified page
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[index - 1] = modifiedPage; // 6
+ newNode.children[index - 1] = new PageHolder<K, V>( btree, modifiedPage ); // 6
}
// Create the result
@@ -344,7 +341,7 @@ import org.apache.directory.mavibot.btre
Node<K, V> sibling, int pos ) throws IOException
{
// The sibling is on the left, borrow the rightmost element
- Page<K, V> siblingChild = sibling.children[sibling.nbElems];
+ Page<K, V> siblingChild = sibling.children[sibling.nbElems].getValue();
// Create the new sibling, with one less element at the end
Node<K, V> newSibling = new Node<K, V>( btree, revision, sibling.getNbElems() - 1 );
@@ -358,23 +355,23 @@ import org.apache.directory.mavibot.btre
Node<K, V> newNode = new Node<K, V>( btree, revision, nbElems );
// Sets the first children
- newNode.children[0] = siblingChild; //1
+ newNode.children[0] = new PageHolder<K, V>( btree, siblingChild ); //1
int index = Math.abs( pos );
if ( index < 2 )
{
- newNode.setKey( 0, mergedResult.getModifiedPage().getLeftMostKey() );
+ newNode.setKey( 0, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) );
System.arraycopy( getKeys(), 1, newNode.getKeys(), 1, nbElems - 1 );
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[1] = modifiedPage;
+ newNode.children[1] = new PageHolder<K, V>( btree, modifiedPage );
System.arraycopy( children, 2, newNode.children, 2, nbElems - 1 );
}
else
{
// Set the first key
- newNode.setKey( 0, children[0].getLeftMostKey() ); //2
+ newNode.setKey( 0, new KeyHolder<K>( children[0].getValue().getLeftMostKey() ) ); //2
if ( index > 2 )
{
@@ -383,7 +380,7 @@ import org.apache.directory.mavibot.btre
}
// Inject the modified key
- newNode.setKey( index - 1, mergedResult.getModifiedPage().getLeftMostKey() ); // 3
+ newNode.setKey( index - 1, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) ); // 3
if ( index < nbElems )
{
@@ -399,7 +396,7 @@ import org.apache.directory.mavibot.btre
// Insert the modified page
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[index] = modifiedPage; // 7
+ newNode.children[index] = new PageHolder<K, V>( btree, modifiedPage ); // 7
}
// Create the result
@@ -445,18 +442,18 @@ import org.apache.directory.mavibot.btre
// Then copy all the elements up to the deletion point
if ( index < 2 )
{
- newNode.setKey( half, mergedResult.getModifiedPage().getLeftMostKey() );
+ newNode.setKey( half, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) );
System.arraycopy( getKeys(), 1, newNode.getKeys(), half + 1, half - 1 );
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[half + 1] = modifiedPage;
+ newNode.children[half + 1] = new PageHolder<K, V>( btree, modifiedPage );
System.arraycopy( children, 2, newNode.children, half + 2, half - 1 );
}
else
{
// Copy the left part of the node keys up to the deletion point
// Insert the new key
- newNode.setKey( half, children[0].getLeftMostKey() ); // 3
+ newNode.setKey( half, new KeyHolder<K>( children[0].getValue().getLeftMostKey() ) ); // 3
if ( index > 2 )
{
@@ -464,7 +461,7 @@ import org.apache.directory.mavibot.btre
}
// Inject the new merged key
- newNode.setKey( half + index - 1, mergedResult.getModifiedPage().getLeftMostKey() ); //5
+ newNode.setKey( half + index - 1, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) ); //5
if ( index < half )
{
@@ -477,7 +474,7 @@ import org.apache.directory.mavibot.btre
// Inject the new merged child
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[half + index] = modifiedPage; //8
+ newNode.children[half + index] = new PageHolder<K, V>( btree, modifiedPage ); //8
}
}
else
@@ -490,7 +487,7 @@ import org.apache.directory.mavibot.btre
// Insert the first child
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[0] = modifiedPage;
+ newNode.children[0] = new PageHolder<K, V>( btree, modifiedPage );
// Copy the node children
System.arraycopy( children, 2, newNode.children, 1, half - 1 );
@@ -508,11 +505,11 @@ import org.apache.directory.mavibot.btre
System.arraycopy( children, 0, newNode.children, 0, index - 1 ); //6
// Inject the modified key
- newNode.setKey( index - 2, mergedResult.getModifiedPage().getLeftMostKey() ); //2
+ newNode.setKey( index - 2, new KeyHolder<K>( mergedResult.getModifiedPage().getLeftMostKey() ) ); //2
// Inject the modified children
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[index - 1] = modifiedPage; // 7
+ newNode.children[index - 1] = new PageHolder<K, V>( btree, modifiedPage ); // 7
// Add the remaining node's key if needed
if ( index < half )
@@ -525,7 +522,7 @@ import org.apache.directory.mavibot.btre
}
// Inject the new key from sibling
- newNode.setKey( half - 1, sibling.findLeftMost().getKey() ); //3
+ newNode.setKey( half - 1, new KeyHolder<K>( sibling.findLeftMost().getKey() ) ); //3
// Copy the sibling keys
System.arraycopy( sibling.getKeys(), 0, newNode.getKeys(), half, half );
@@ -562,12 +559,12 @@ import org.apache.directory.mavibot.btre
if ( found )
{
index = -( pos + 1 );
- child = children[-pos];
+ child = children[-pos].getValue();
deleteResult = child.delete( revision, key, value, this, -pos );
}
else
{
- child = children[pos];
+ child = children[pos].getValue();
deleteResult = child.delete( revision, key, value, this, pos );
}
@@ -631,7 +628,7 @@ import org.apache.directory.mavibot.btre
// a sibling, or we will have to merge two pages
int siblingPos = selectSibling( ( Node<K, V> ) parent, parentPos );
- Node<K, V> sibling = ( Node<K, V> ) ( ( ( Node<K, V> ) parent ).children[siblingPos] );
+ Node<K, V> sibling = ( Node<K, V> ) ( ( ( Node<K, V> ) parent ).children[siblingPos].getValue() );
if ( sibling.getNbElems() > halfSize )
{
@@ -690,21 +687,21 @@ import org.apache.directory.mavibot.btre
if ( borrowedResult.isFromRight() )
{
// Update the keys
- newPage.setKey( pos, modifiedPage.findLeftMost().getKey() );
- newPage.setKey( pos + 1, modifiedSibling.findLeftMost().getKey() );
+ newPage.setKey( pos, new KeyHolder<K>( modifiedPage.findLeftMost().getKey() ) );
+ newPage.setKey( pos + 1, new KeyHolder<K>( modifiedSibling.findLeftMost().getKey() ) );
// Update the children
- newPage.children[pos + 1] = modifiedPage;
- newPage.children[pos + 2] = modifiedSibling;
+ newPage.children[pos + 1] = new PageHolder<K, V>( btree, modifiedPage );
+ newPage.children[pos + 2] = new PageHolder<K, V>( btree, modifiedSibling );
}
else
{
// Update the keys
- newPage.setKey( pos, modifiedPage.findLeftMost().getKey() );
+ newPage.setKey( pos, new KeyHolder<K>( modifiedPage.findLeftMost().getKey() ) );
// Update the children
- newPage.children[pos] = modifiedSibling;
- newPage.children[pos + 1] = modifiedPage;
+ newPage.children[pos] = new PageHolder<K, V>( btree, modifiedSibling );
+ newPage.children[pos + 1] = new PageHolder<K, V>( btree, modifiedPage );
}
}
else
@@ -712,20 +709,20 @@ import org.apache.directory.mavibot.btre
if ( borrowedResult.isFromRight() )
{
// Update the keys
- newPage.setKey( pos, modifiedSibling.findLeftMost().getKey() );
+ newPage.setKey( pos, new KeyHolder<K>( modifiedSibling.findLeftMost().getKey() ) );
// Update the children
- newPage.children[pos] = modifiedPage;
- newPage.children[pos + 1] = modifiedSibling;
+ newPage.children[pos] = new PageHolder<K, V>( btree, modifiedPage );
+ newPage.children[pos + 1] = new PageHolder<K, V>( btree, modifiedSibling );
}
else
{
// Update the keys
- newPage.setKey( pos - 1, modifiedPage.findLeftMost().getKey() );
+ newPage.setKey( pos - 1, new KeyHolder<K>( modifiedPage.findLeftMost().getKey() ) );
// Update the children
- newPage.children[pos - 1] = modifiedSibling;
- newPage.children[pos] = modifiedPage;
+ newPage.children[pos - 1] = new PageHolder<K, V>( btree, modifiedSibling );
+ newPage.children[pos] = new PageHolder<K, V>( btree, modifiedPage );
}
}
@@ -762,7 +759,7 @@ import org.apache.directory.mavibot.btre
// Copy the keys and the children
System.arraycopy( getKeys(), 1, newNode.getKeys(), 0, newNode.nbElems );
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[0] = modifiedPage;
+ newNode.children[0] = new PageHolder<K, V>( btree, modifiedPage );
System.arraycopy( children, 2, newNode.children, 1, nbElems - 1 );
}
else
@@ -773,7 +770,7 @@ import org.apache.directory.mavibot.btre
System.arraycopy( getKeys(), 0, newNode.getKeys(), 0, index );
}
- newNode.setKey( index, mergedResult.getModifiedPage().findLeftMost().getKey() );
+ newNode.setKey( index, new KeyHolder<K>( mergedResult.getModifiedPage().findLeftMost().getKey() ) );
if ( index < nbElems - 2 )
{
@@ -784,7 +781,7 @@ import org.apache.directory.mavibot.btre
System.arraycopy( children, 0, newNode.children, 0, index + 1 );
Page<K, V> modifiedPage = mergedResult.getModifiedPage();
- newNode.children[index + 1] = modifiedPage;
+ newNode.children[index + 1] = new PageHolder<K, V>( btree, modifiedPage );
if ( index < nbElems - 2 )
{
@@ -813,11 +810,11 @@ import org.apache.directory.mavibot.btre
{
// Here, if we have found the key in the node, then we must go down into
// the right child, not the left one
- return children[-pos].get( key );
+ return children[-pos].getValue().get( key );
}
else
{
- return children[pos].get( key );
+ return children[pos].getValue().get( key );
}
}
@@ -834,11 +831,11 @@ import org.apache.directory.mavibot.btre
{
// Here, if we have found the key in the node, then we must go down into
// the right child, not the left one
- return children[-pos].getValues( key );
+ return children[-pos].getValue().getValues( key );
}
else
{
- return children[pos].getValues( key );
+ return children[pos].getValue().getValues( key );
}
}
@@ -855,11 +852,11 @@ import org.apache.directory.mavibot.btre
{
// Here, if we have found the key in the node, then we must go down into
// the right child, not the left one
- return children[-pos].hasKey( key );
+ return children[-pos].getValue().hasKey( key );
}
else
{
- Page<K, V> page = children[pos];
+ Page<K, V> page = children[pos].getValue();
if ( page == null )
{
@@ -883,11 +880,11 @@ import org.apache.directory.mavibot.btre
{
// Here, if we have found the key in the node, then we must go down into
// the right child, not the left one
- return children[-pos].contains( key, value );
+ return children[-pos].getValue().contains( key, value );
}
else
{
- return children[pos].contains( key, value );
+ return children[pos].getValue().contains( key, value );
}
}
@@ -900,7 +897,7 @@ import org.apache.directory.mavibot.btre
*/
public void setValue( int pos, Page<K, V> value )
{
- children[pos] = value;
+ children[pos] = new PageHolder<K, V>( btree, value );
}
@@ -911,7 +908,7 @@ import org.apache.directory.mavibot.btre
{
if ( pos < nbElems + 1 )
{
- return children[pos];
+ return children[pos].getValue();
}
else
{
@@ -936,7 +933,7 @@ import org.apache.directory.mavibot.btre
// We first stack the current page
stack[depth++] = new ParentPos<K, V>( this, pos );
- Page<K, V> page = children[pos];
+ Page<K, V> page = children[pos].getValue();
return page.browse( key, transaction, stack, depth );
}
@@ -950,7 +947,7 @@ import org.apache.directory.mavibot.btre
{
stack[depth++] = new ParentPos<K, V>( this, 0 );
- Page<K, V> page = children[0];
+ Page<K, V> page = children[0].getValue();
return page.browse( transaction, stack, depth );
}
@@ -976,7 +973,7 @@ import org.apache.directory.mavibot.btre
// to point on the modified child
Page<K, V> modifiedPage = result.getModifiedPage();
- ( ( Node<K, V> ) newPage ).children[pos] = modifiedPage;
+ ( ( Node<K, V> ) newPage ).children[pos] = new PageHolder<K, V>( btree, modifiedPage );
// We can return the result, where we update the modifiedPage,
// to avoid the creation of a new object
@@ -1016,12 +1013,12 @@ import org.apache.directory.mavibot.btre
}
// Add the new key and children
- newNode.setKey( pos, key );
+ newNode.setKey( pos, new KeyHolder<K>( key ) );
// If the BTree is managed, we now have to write the modified page on disk
// and to add this page to the list of modified pages
- newNode.children[pos] = leftPage;
- newNode.children[pos + 1] = rightPage;
+ newNode.children[pos] = new PageHolder<K, V>( btree, leftPage );
+ newNode.children[pos + 1] = new PageHolder<K, V>( btree, rightPage );
// And copy the remaining keys and children
if ( nbElems > 0 )
@@ -1075,9 +1072,9 @@ import org.apache.directory.mavibot.btre
System.arraycopy( children, 0, newLeftPage.children, 0, pos );
// Add the new element
- newLeftPage.setKey( pos, pivot );
- newLeftPage.children[pos] = leftPage;
- newLeftPage.children[pos + 1] = rightPage;
+ newLeftPage.setKey( pos, new KeyHolder<K>( pivot ) );
+ newLeftPage.children[pos] = new PageHolder<K, V>( btree, leftPage );
+ newLeftPage.children[pos + 1] = new PageHolder<K, V>( btree, rightPage );
// And copy the remaining elements minus the new pivot
System.arraycopy( getKeys(), pos, newLeftPage.getKeys(), pos + 1, middle - pos - 1 );
@@ -1100,12 +1097,12 @@ import org.apache.directory.mavibot.btre
// Copy the keys and the children up to the insertion position (here, middle)
System.arraycopy( getKeys(), 0, newLeftPage.getKeys(), 0, middle );
System.arraycopy( children, 0, newLeftPage.children, 0, middle );
- newLeftPage.children[middle] = leftPage;
+ newLeftPage.children[middle] = new PageHolder<K, V>( btree, leftPage );
// And process the right page now
System.arraycopy( getKeys(), middle, newRightPage.getKeys(), 0, middle );
System.arraycopy( children, middle + 1, newRightPage.children, 1, middle );
- newRightPage.children[0] = rightPage;
+ newRightPage.children[0] = new PageHolder<K, V>( btree, rightPage );
// Create the result
InsertResult<K, V> result = new SplitResult<K, V>( copiedPages, pivot, newLeftPage, newRightPage );
@@ -1124,9 +1121,9 @@ import org.apache.directory.mavibot.btre
System.arraycopy( children, middle + 1, newRightPage.children, 0, pos - middle - 1 );
// Add the new element
- newRightPage.setKey( pos - middle - 1, pivot );
- newRightPage.children[pos - middle - 1] = leftPage;
- newRightPage.children[pos - middle] = rightPage;
+ newRightPage.setKey( pos - middle - 1, new KeyHolder<K>( pivot ) );
+ newRightPage.children[pos - middle - 1] = new PageHolder<K, V>( btree, leftPage );
+ newRightPage.children[pos - middle] = new PageHolder<K, V>( btree, rightPage );
// And copy the remaining elements minus the new pivot
System.arraycopy( getKeys(), pos, newRightPage.getKeys(), pos - middle, nbElems - pos );
@@ -1166,7 +1163,7 @@ import org.apache.directory.mavibot.btre
*/
public K getLeftMostKey()
{
- return children[0].getLeftMostKey();
+ return children[0].getValue().getLeftMostKey();
}
@@ -1179,10 +1176,10 @@ import org.apache.directory.mavibot.btre
if ( children[index] != null )
{
- return children[index].getRightMostKey();
+ return children[index].getValue().getRightMostKey();
}
- return children[nbElems - 1].getRightMostKey();
+ return children[nbElems - 1].getValue().getRightMostKey();
}
@@ -1191,7 +1188,7 @@ import org.apache.directory.mavibot.btre
*/
public Tuple<K, V> findLeftMost() throws EndOfFileExceededException, IOException
{
- return children[0].findLeftMost();
+ return children[0].getValue().findLeftMost();
}
@@ -1200,7 +1197,7 @@ import org.apache.directory.mavibot.btre
*/
public Tuple<K, V> findRightMost() throws EndOfFileExceededException, IOException
{
- return children[nbElems].findRightMost();
+ return children[nbElems].getValue().findRightMost();
}
@@ -1224,7 +1221,7 @@ import org.apache.directory.mavibot.btre
}
else
{
- sb.append( 'r' ).append( children[0].getRevision() );
+ sb.append( 'r' ).append( children[0].getValue().getRevision() );
}
for ( int i = 0; i < nbElems; i++ )
@@ -1237,7 +1234,7 @@ import org.apache.directory.mavibot.btre
}
else
{
- sb.append( 'r' ).append( children[i + 1].getRevision() );
+ sb.append( 'r' ).append( children[i + 1].getValue().getRevision() );
}
}
}
@@ -1258,14 +1255,14 @@ import org.apache.directory.mavibot.btre
if ( nbElems > 0 )
{
// Start with the first child
- sb.append( children[0].dumpPage( tabs + " " ) );
+ sb.append( children[0].getValue().dumpPage( tabs + " " ) );
for ( int i = 0; i < nbElems; i++ )
{
sb.append( tabs );
sb.append( "<" );
sb.append( getKey( i ) ).append( ">\n" );
- sb.append( children[i + 1].dumpPage( tabs + " " ) );
+ sb.append( children[i + 1].getValue().dumpPage( tabs + " " ) );
}
}
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/TupleCursorImpl.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/TupleCursorImpl.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/TupleCursorImpl.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/memory/TupleCursorImpl.java Mon Dec 16 11:46:32 2013
@@ -86,7 +86,7 @@ public class TupleCursorImpl<K, V> exten
parentPos.pos = parentPos.page.getNbElems();
}
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.pos );
}
// and leaf
@@ -102,7 +102,7 @@ public class TupleCursorImpl<K, V> exten
parentPos.pos = child.getNbElems() - 1;
}
- parentPos.valueCursor = ((Leaf<K, V>)parentPos.page).values[parentPos.pos].getCursor();
+ parentPos.valueCursor = ((InMemoryLeaf<K, V>)parentPos.page).values[parentPos.pos].getCursor();
parentPos.valueCursor.afterLast();
parentPos.pos = AFTER_LAST;
}
@@ -131,7 +131,7 @@ public class TupleCursorImpl<K, V> exten
parentPos.page = child;
}
- child = ((Node<K, V>)parentPos.page).children[0];
+ child = ((Node<K, V>)parentPos.page).getPage( 0 );
}
// and leaf
@@ -145,7 +145,7 @@ public class TupleCursorImpl<K, V> exten
if ( parentPos.valueCursor != null )
{
- parentPos.valueCursor = ((Leaf<K, V>)parentPos.page).values[0].getCursor();
+ parentPos.valueCursor = ((InMemoryLeaf<K, V>)parentPos.page).values[0].getCursor();
parentPos.valueCursor.beforeFirst();
}
}
@@ -185,7 +185,7 @@ public class TupleCursorImpl<K, V> exten
{
// We can pick the next element at this level
parentPos.pos++;
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.pos );
// and go down the tree through the nodes
while ( currentDepth < depth - 1 )
@@ -194,14 +194,14 @@ public class TupleCursorImpl<K, V> exten
parentPos = stack[currentDepth];
parentPos.pos = 0;
parentPos.page = child;
- child = ((Node<K, V>)child).children[0];
+ child = ((Node<K, V>)child).getPage( 0 );
}
// and the leaf
parentPos = stack[depth];
parentPos.page = child;
parentPos.pos = 0;
- parentPos.valueCursor = ((Leaf<K, V>)child).values[0].getCursor();
+ parentPos.valueCursor = ((InMemoryLeaf<K, V>)child).values[0].getCursor();
return parentPos;
}
@@ -245,7 +245,7 @@ public class TupleCursorImpl<K, V> exten
{
// We can pick the next element at this level
parentPos.pos--;
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.pos );
// and go down the tree through the nodes
while ( currentDepth < depth - 1 )
@@ -254,14 +254,14 @@ public class TupleCursorImpl<K, V> exten
parentPos = stack[currentDepth];
parentPos.pos = child.getNbElems();
parentPos.page = child;
- child = ((Node<K, V>)parentPos.page).children[parentPos.page.getNbElems()];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.page.getNbElems() );
}
// and the leaf
parentPos = stack[depth];
parentPos.pos = child.getNbElems() - 1;
parentPos.page = child;
- ValueHolder<V> valueHolder = ((Leaf<K, V>)parentPos.page).values[parentPos.pos];
+ ValueHolder<V> valueHolder = ((InMemoryLeaf<K, V>)parentPos.page).values[parentPos.pos];
parentPos.valueCursor = valueHolder.getCursor();
parentPos.valueCursor.afterLast();
@@ -402,13 +402,13 @@ public class TupleCursorImpl<K, V> exten
else
{
// We can pick the next element at this level
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos + 1];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.pos + 1 );
// and go down the tree through the nodes
while ( currentDepth < depth - 1 )
{
currentDepth++;
- child = ((Node<K, V>)child).children[0];
+ child = ((Node<K, V>)child).getPage( 0 );
}
return true;
@@ -548,13 +548,13 @@ public class TupleCursorImpl<K, V> exten
else
{
// We can pick the previous element at this level
- child = ((Node<K, V>)parentPos.page).children[parentPos.pos - 1];
+ child = ((Node<K, V>)parentPos.page).getPage( parentPos.pos - 1 );
// and go down the tree through the nodes
while ( currentDepth < depth - 1 )
{
currentDepth++;
- child = ((Node<K, V>)child).children[child.getNbElems()];
+ child = ((Node<K, V>)child).getPage( child.getNbElems() );
}
return true;
@@ -630,7 +630,7 @@ public class TupleCursorImpl<K, V> exten
try
{
- ValueHolder<V> valueHolder = ( ( Leaf<K, V> ) parentPos.page ).getValue( parentPos.pos );
+ ValueHolder<V> valueHolder = ( ( InMemoryLeaf<K, V> ) parentPos.page ).getValue( parentPos.pos );
parentPos.valueCursor = valueHolder.getCursor();
@@ -642,7 +642,7 @@ public class TupleCursorImpl<K, V> exten
}
}
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( parentPos.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( parentPos.page );
tuple.setKey( leaf.getKey( parentPos.pos ) );
tuple.setValue( value );
@@ -681,7 +681,7 @@ public class TupleCursorImpl<K, V> exten
if ( ( newParentPos == null ) || ( newParentPos.page == null ) )
{
// This is the end : no more value
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( parentPos.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( parentPos.page );
ValueHolder<V> valueHolder = leaf.values[parentPos.pos];
parentPos.pos = AFTER_LAST;
parentPos.valueCursor = valueHolder.getCursor();
@@ -701,7 +701,7 @@ public class TupleCursorImpl<K, V> exten
}
// The key
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( parentPos.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( parentPos.page );
tuple.setKey( leaf.getKey( parentPos.pos ) );
// The value
@@ -778,7 +778,7 @@ public class TupleCursorImpl<K, V> exten
try
{
- ValueHolder<V> valueHolder = ( ( Leaf<K, V> ) parentPos.page ).getValue( parentPos.pos );
+ ValueHolder<V> valueHolder = ( ( InMemoryLeaf<K, V> ) parentPos.page ).getValue( parentPos.pos );
parentPos.valueCursor = valueHolder.getCursor();
parentPos.valueCursor.afterLast();
@@ -793,7 +793,7 @@ public class TupleCursorImpl<K, V> exten
}
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( parentPos.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( parentPos.page );
tuple.setKey( leaf.getKey( parentPos.pos ) );
tuple.setValue( value );
@@ -846,7 +846,7 @@ public class TupleCursorImpl<K, V> exten
}
// Update the Tuple
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( parentPos.page );
+ InMemoryLeaf<K, V> leaf = ( InMemoryLeaf<K, V> ) ( parentPos.page );
// The key
tuple.setKey( leaf.getKey( parentPos.pos ) );
Modified: directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/BTreeFactory.java
URL: http://svn.apache.org/viewvc/directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/BTreeFactory.java?rev=1551187&r1=1551186&r2=1551187&view=diff
==============================================================================
--- directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/BTreeFactory.java (original)
+++ directory/mavibot/trunk/mavibot/src/main/java/org/apache/directory/mavibot/btree/persisted/BTreeFactory.java Mon Dec 16 11:46:32 2013
@@ -23,7 +23,9 @@ package org.apache.directory.mavibot.btr
import java.io.IOException;
import java.util.LinkedList;
+import org.apache.directory.mavibot.btree.AbstractPage;
import org.apache.directory.mavibot.btree.BTree;
+import org.apache.directory.mavibot.btree.KeyHolder;
import org.apache.directory.mavibot.btree.Page;
import org.apache.directory.mavibot.btree.ParentPos;
import org.apache.directory.mavibot.btree.ValueHolder;
@@ -90,9 +92,9 @@ public class BTreeFactory
* @param nbElems The number or elements in this leaf
* @return A Leaf instance
*/
- public static <K, V> Leaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
+ public static <K, V> PersistedLeaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
{
- Leaf<K, V> leaf = new Leaf<K, V>( btree, revision, nbElems );
+ PersistedLeaf<K, V> leaf = new PersistedLeaf<K, V>( btree, revision, nbElems );
return leaf;
}
@@ -232,9 +234,10 @@ public class BTreeFactory
* @param pos The position in the keys array
* @param key the key to inject
*/
- public static <K, V> void setKey( Page<K, V> page, int pos, K key )
+ public static <K, V> void setKey( BTree<K, V> btree, Page<K, V> page, int pos, K key )
{
- ( ( AbstractPersistedPage<K, V> ) page ).setKey( pos, key );
+ KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), key );
+ ( ( AbstractPage<K, V> ) page ).setKey( pos, keyHolder );
}
@@ -244,9 +247,10 @@ public class BTreeFactory
* @param pos the position of this key in the page
* @param buffer the byte[] containing the serialized key
*/
- public static <K, V> void setKey( Page<K, V> page, int pos, byte[] buffer )
+ public static <K, V> void setKey( BTree<K, V> btree, Page<K, V> page, int pos, byte[] buffer )
{
- ( ( AbstractPersistedPage<K, V> ) page ).setKey( pos, buffer );
+ KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), buffer );
+ ( ( AbstractPage<K, V> ) page ).setKey( pos, keyHolder );
}
@@ -255,7 +259,7 @@ public class BTreeFactory
* @param pos The position in the values array
* @param value the value to inject
*/
- public static <K, V> void setValue( Leaf<K, V> page, int pos, PersistedValueHolder<V> value )
+ public static <K, V> void setValue( PersistedLeaf<K, V> page, int pos, PersistedValueHolder<V> value )
{
page.setValue( pos, value );
}
@@ -266,7 +270,7 @@ public class BTreeFactory
* @param pos The position in the values array
* @param value the value to inject
*/
- public static <K, V> void setValue( Node<K, V> page, int pos, PageHolder<K, V> value )
+ public static <K, V> void setValue( Node<K, V> page, int pos, PersistedPageHolder<K, V> value )
{
page.setValue( pos, value );
}
@@ -286,9 +290,9 @@ public class BTreeFactory
ParentPos<K, V> last = new ParentPos<K, V>( btree.getRootPage(), btree.getRootPage().getNbElems() );
stack.push( last );
- if ( btree.getRootPage() instanceof Leaf )
+ if ( btree.getRootPage() instanceof PersistedLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( btree.getRootPage() );
+ PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) ( btree.getRootPage() );
ValueHolder<V> valueHolder = leaf.values[last.pos];
last.valueCursor = valueHolder.getCursor();
}
@@ -298,14 +302,14 @@ public class BTreeFactory
while ( true )
{
- Page<K, V> p = node.children[node.getNbElems()].getValue( btree );
+ Page<K, V> p = node.children[node.getNbElems()].getValue();
last = new ParentPos<K, V>( p, p.getNbElems() );
stack.push( last );
- if ( p instanceof Leaf )
+ if ( p instanceof PersistedLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( last.page );
+ PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) ( last.page );
ValueHolder<V> valueHolder = leaf.values[last.pos];
last.valueCursor = valueHolder.getCursor();
break;
@@ -331,9 +335,9 @@ public class BTreeFactory
ParentPos<K, V> first = new ParentPos<K, V>( btree.getRootPage(), 0 );
stack.push( first );
- if ( btree.getRootPage() instanceof Leaf )
+ if ( btree.getRootPage() instanceof PersistedLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( btree.getRootPage() );
+ PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) ( btree.getRootPage() );
ValueHolder<V> valueHolder = leaf.values[first.pos];
first.valueCursor = valueHolder.getCursor();
}
@@ -343,14 +347,14 @@ public class BTreeFactory
while ( true )
{
- Page<K, V> page = node.children[0].getValue( btree );
+ Page<K, V> page = node.children[0].getValue();
first = new ParentPos<K, V>( page, 0 );
stack.push( first );
- if ( page instanceof Leaf )
+ if ( page instanceof PersistedLeaf )
{
- Leaf<K, V> leaf = ( Leaf<K, V> ) ( page );
+ PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) ( page );
ValueHolder<V> valueHolder = leaf.values[first.pos];
first.valueCursor = valueHolder.getCursor();
break;