/** * same as {@link #addElement(long, Object, Object, int)} except the values are not copied. * This method is only used while inserting an element into a sub-BTree. */ private Page<K, V> addSubTreeElement( long revision, K key, int pos ) { // First copy the current page, but add one element in the copied page PersistedLeaf<K, V> newLeaf = new PersistedLeaf<K, V>( btree, revision, nbElems + 1 ); // Deal with the special case of an empty page if ( nbElems == 0 ) { newLeaf.keys[0] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); } else { // Copy the keys and the values up to the insertion position System.arraycopy( keys, 0, newLeaf.keys, 0, pos ); // Add the new element newLeaf.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); // And copy the remaining elements System.arraycopy( keys, pos, newLeaf.keys, pos + 1, keys.length - pos ); } return newLeaf; }
/** * Set the key at a give position * * @param btree The B-tree to update * @param page The page to update * @param pos The position of this key in the page * @param buffer The byte[] containing the serialized key */ /* no qualifier*/static <K, V> void setKey( BTree<K, V> btree, Page<K, V> page, int pos, byte[] buffer ) { if ( btree instanceof PersistedBTree ) { KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), buffer ); ( ( AbstractPage<K, V> ) page ).setKey( pos, keyHolder ); } else { throw new IllegalArgumentException( "The B-tree must be a PersistedBTree" ); } }
newLeaf.keys[0] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); newLeaf.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); newLeaf.values[pos] = valueHolder;
/** * 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 * when the root was full when we added a new value. * * @param btree the parent BTree * @param revision the Node revision * @param key The new key * @param leftPage The left page * @param rightPage The right page */ @SuppressWarnings("unchecked") PersistedNode( BTree<K, V> btree, long revision, K key, PageHolder<K, V> leftPage, PageHolder<K, V> rightPage ) { super( btree, revision, 1 ); // Create the children array, and store the left and right children children = ( PageHolder<K, V>[] ) Array.newInstance( PageHolder.class, btree.getPageSize() + 1 ); children[0] = leftPage; children[1] = rightPage; // Create the keys array and store the pivot into it keys = ( KeyHolder[] ) Array.newInstance( KeyHolder.class, btree.getPageSize() ); keys[0] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); }
byte[] bytesKey = btree.getKeySerializer().serialize( tuple.key ); fos.write( IntSerializer.serialize( bytesKey.length ) ); fos.write( bytesKey );
K key = btree.getKeySerializer().fromBytes( keyBytes ); tuple.key = key;
newNode.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key );
byte[] bytesKey = btree.getKeySerializer().serialize( tuple.key ); fos.write( IntSerializer.serialize( bytesKey.length ) ); fos.write( bytesKey );
/** * 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 * when the root was full when we added a new value. * * @param btree the parent BTree * @param revision the Node revision * @param key The new key * @param leftPage The left page * @param rightPage The right page */ @SuppressWarnings("unchecked") PersistedNode( BTree<K, V> btree, long revision, K key, Page<K, V> leftPage, Page<K, V> rightPage ) { super( btree, revision, 1 ); // Create the children array, and store the left and right children children = ( PersistedPageHolder<K, V>[] ) Array.newInstance( PersistedPageHolder.class, btree.getPageSize() + 1 ); children[0] = new PersistedPageHolder<K, V>( btree, leftPage ); children[1] = new PersistedPageHolder<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... keys = ( KeyHolder<K>[] ) Array.newInstance( PersistedKeyHolder.class, btree.getPageSize() ); keys[0] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); }
leftLeaf.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); rightLeaf.keys[rightPos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), key );
/** * Set the key at a give position * * @param btree The B-tree to update * @param page The page to update * @param pos The position in the keys array * @param key The key to inject */ /* no qualifier*/static <K, V> void setKey( BTree<K, V> btree, Page<K, V> page, int pos, K key ) { KeyHolder<K> keyHolder; if ( btree.getType() != BTreeTypeEnum.IN_MEMORY ) { keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), key ); } else { keyHolder = new KeyHolder<K>( key ); } ( ( AbstractPage<K, V> ) page ).setKey( pos, keyHolder ); }
newLeaf.keys[nbElems - 1] = new PersistedKeyHolder<K>( btree.getKeySerializer(), siblingKey ); if ( isNotSubTree )
newNode.keys[index] = new PersistedKeyHolder<K>( btree.getKeySerializer(), mergedResult.getModifiedPage() .findLeftMost().getKey() );
newNode.keys[nbElems - 1] = new PersistedKeyHolder<K>( btree.getKeySerializer(), siblingKey ); // 1 newNode.children[nbElems] = sibling.children[0]; // 8 newNode.keys[index - 2] = new PersistedKeyHolder<K>( btree.getKeySerializer(), mergedResult .getModifiedPage()
newLeaf.keys[0] = new PersistedKeyHolder<K>( btree.getKeySerializer(), siblingKey ); if ( isNotSubTree )
K key = btree.getKeySerializer().deserialize( byteBuffer );
/** * Inject a tuple into a leaf */ private static <K, V> void injectInLeaf( BTree<K, V> btree, Tuple<K, Set<V>> tuple, LevelInfo<K, V> leafLevel ) { PersistedLeaf<K, V> leaf = ( PersistedLeaf<K, V> ) leafLevel.getCurrentPage(); KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), tuple.getKey() ); leaf.setKey( leafLevel.getCurrentPos(), keyHolder ); if ( btree.getType() != BTreeTypeEnum.PERSISTED_SUB ) { ValueHolder<V> valueHolder = new PersistedValueHolder<V>( btree, ( V[] ) tuple.getValue().toArray() ); leaf.setValue( leafLevel.getCurrentPos(), valueHolder ); } leafLevel.incCurrentPos(); }
KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), tuple.getKey() ); keys[pos] = keyHolder;
newPage.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), modifiedPage.findLeftMost() .getKey() ); newPage.keys[pos + 1] = new PersistedKeyHolder<K>( btree.getKeySerializer(), modifiedSibling .findLeftMost() .getKey() ); newPage.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), modifiedPage.findLeftMost() .getKey() ); newPage.keys[pos] = new PersistedKeyHolder<K>( btree.getKeySerializer(), modifiedSibling.findLeftMost() .getKey() ); newPage.keys[pos - 1] = new PersistedKeyHolder<K>( btree.getKeySerializer(), modifiedPage .findLeftMost() .getKey() );
KeyHolder<K> keyHolder = new PersistedKeyHolder<K>( btree.getKeySerializer(), page.getLeftMostKey() ); node.setKey( level.getCurrentPos(), keyHolder ); level.incCurrentPos();