/// <summary>Creates a new node with the right part of this node.</summary> /// <remarks> /// Creates a new node with the right part of this node. This should only be /// called on a full node /// </remarks> public virtual NeoDatis.Btree.IBTreeNode ExtractRightPart() { if (!IsFull()) { throw new NeoDatis.Btree.Exception.BTreeException("extract right part called on non full node" ); } // Creates an empty new node NeoDatis.Btree.IBTreeNode rightPart = btree.BuildNode(); int j = 0; for (int i = degree; i < maxNbKeys; i++) { rightPart.SetKeyAndValueAt(keys[i], values[i], j, false, false); keys[i] = null; values[i] = null; rightPart.SetChildAt(this, i, j, false); // TODO must we load all nodes to set new parent NeoDatis.Btree.IBTreeNode c = rightPart.GetChildAt(j, false); if (c != null) { c.SetParent(rightPart); } // rightPart.setChildAt(getChildAt(i,false), j); SetNullChildAt(i); j++; } // rightPart.setChildAt(getLastPositionChild(), j); rightPart.SetChildAt(this, GetMaxNbChildren() - 1, j, false); // correct father id NeoDatis.Btree.IBTreeNode c1 = rightPart.GetChildAt(j, false); if (c1 != null) { c1.SetParent(rightPart); } SetNullChildAt(maxNbChildren - 1); // resets last child keys[degree - 1] = null; // resets median element values[degree - 1] = null; // set numbers nbKeys = degree - 1; int originalNbChildren = nbChildren; nbChildren = System.Math.Min(nbChildren, degree); rightPart.SetNbKeys(degree - 1); rightPart.SetNbChildren(originalNbChildren - nbChildren); NeoDatis.Btree.Tool.BTreeValidator.ValidateNode(this); NeoDatis.Btree.Tool.BTreeValidator.ValidateNode(rightPart); NeoDatis.Btree.Tool.BTreeValidator.CheckDuplicateChildren(this, rightPart); return(rightPart); }
public virtual void Insert(System.IComparable key, object value) { // check if root is full if (root.IsFull()) { NeoDatis.Btree.IBTreeNode newRoot = BuildNode(); NeoDatis.Btree.IBTreeNode oldRoot = root; newRoot.SetChildAt(root, 0); newRoot.SetNbChildren(1); root = newRoot; Split(newRoot, oldRoot, 0); height++; persister.SaveNode(oldRoot); // TODO Remove the save of the new root : the save on the btree // should do the save on the new root(after introspector // refactoring) persister.SaveNode(newRoot); persister.SaveBTree(this); NeoDatis.Btree.Tool.BTreeValidator.ValidateNode(newRoot, true); } InsertNonFull(root, key, value); size++; persister.SaveBTree(this); }