public void AddValueToSelf(BPlusTreeNodeValue value) { int target = 0; for (int i = 0; i < Values.Count; i++) { if (Compare(value.Value, Values[i].Value) < 0) { target = i; break; } } if (target == 0) { target = Values.Count; } Values.Insert(target, value); Dirty = true; if (Values.Count >= MaxSize) { Split(); } }
private void FillNodeFromBlock(BPlusTreeNode <TKeyType> node, Block block) { foreach (Record record in block.GetSortedRecords()) { CustomTuple tuple = new CustomTuple(IndexRelation).FromRecord(record); uint leftPointer = tuple.GetValueFor <uint>("LeftPointer"); uint valuePointer = tuple.GetValueFor <uint>("ValuePointer"); uint rightPointer = tuple.GetValueFor <uint>("RightPointer"); BPlusTreeNodeValue value = new BPlusTreeNodeValue { Value = tuple.GetValueFor <TKeyType>("Value") }; if (leftPointer >= 0) { value.LeftPointer = new Pointer(leftPointer); } if (valuePointer >= 0) { value.Pointer = new Pointer(valuePointer); } if (rightPointer >= 0) { value.RightPointer = new Pointer(rightPointer); } node.Values.Add(value); if (valuePointer > 0) { node.IsLeaf = true; if (leftPointer > 0) { node.LeftSiblingPointer = new Pointer(leftPointer); } if (rightPointer > 0) { node.RightSiblingPointer = new Pointer(rightPointer); } } } if (block.GetSortedRecords().Count == 0) { node.IsLeaf = true; } node.Block = block; }
private void Split() { if (IsRoot) { int half = (int)Math.Ceiling(Values.Count / (double)2); List <BPlusTreeNodeValue> firstHalf = Values.Take(half).ToList(); List <BPlusTreeNodeValue> secondHalf = Values.Skip(half).ToList(); BPlusTreeNode <TKeyType> leftChild = AddChild(); leftChild.Values = firstHalf; leftChild.IsLeaf = IsLeaf; foreach (BPlusTreeNode <TKeyType> k in leftChild.Children) { k.Parent = leftChild; } BPlusTreeNode <TKeyType> rightChild = AddChild(); rightChild.Values = secondHalf.ToList(); rightChild.IsLeaf = IsLeaf; foreach (BPlusTreeNode <TKeyType> k in rightChild.Children) { k.Parent = rightChild; } BPlusTreeNodeValue middle = new BPlusTreeNodeValue { Value = Values[half].Value, LeftPointer = leftChild.Page, RightPointer = rightChild.Page }; Values = new List <BPlusTreeNodeValue> { middle }; if (leftChild.IsLeaf) { leftChild.RightSiblingPointer = rightChild.Page; } if (rightChild.IsLeaf) { rightChild.LeftSiblingPointer = leftChild.Page; } IsLeaf = false; Dirty = true; } else { int half = Values.Count / 2; List <BPlusTreeNodeValue> firstHalf = Values.Take(half).ToList(); List <BPlusTreeNodeValue> secondHalf = Values.Skip(half).ToList(); BPlusTreeNode <TKeyType> rightChild = Parent.AddChild(); rightChild.Values = secondHalf; Values = firstHalf; if (IsLeaf) { RightSiblingPointer = rightChild.Page; rightChild.LeftSiblingPointer = Page; rightChild.IsLeaf = true; } Parent.AddValueToSelf(new BPlusTreeNodeValue { Value = secondHalf.First().Value, LeftPointer = Page, RightPointer = rightChild.Page });; Dirty = true; } }