private void SplitNode() { var splitIndex = (BranchingFactor - 1) / 2; var left = this; var right = new BPTreeNode <TKey, TData>(BranchingFactor); var splitElem = _data.ElementAt(splitIndex); left.MaxKey = _comparer.Decrement(splitElem.Key); for (int i = _data.Count - 1; i > splitIndex; i--) { var elem = _data.ElementAt(i); right.Insert(elem.Key, elem.Value); _data.RemoveAt(i); } _data.RemoveAt(splitIndex); foreach (var child in _children.Where(c => _comparer.Compare(c.MinKey, splitElem.Key) >= 0).ToList()) { right.Children.Add(child); child.Parent = right; _children.Remove(child); } if (this.Parent == null) { this.Parent = new BPTreeNode <TKey, TData>(BranchingFactor); this.Parent.InsertChildNode(left, splitElem.Key, splitElem.Value); } Parent.InsertChildNode(right, splitElem.Key, splitElem.Value); }
public Index(IDataStorage dataStorage) : base(dataStorage) { Load(); if (_indexTree == null) { _indexTree = new BPTreeNode <TKey, DataItem>(15); } }
private void Load() { var dataBuffer = _dataStorage.ReadToEndOfAddressSpace(0); if (dataBuffer != null && dataBuffer.Length > 0) { var json = ConvertBytesToData(dataBuffer); var index = JsonConvert.DeserializeObject <BPTreeNode <TKey, DataItem> >(json); index.InitialParentsOnNodes(); _indexTree = index; } }
private TKey FindMyMaxKey(BPTreeNode <TKey, TData> node) { var x = _children.SkipWhile(y => _comparer.Compare(y.MinKey, node.MinKey) <= 0).FirstOrDefault(); if (x == null || _comparer.Compare(x.MinKey, node.MinKey) == 0) { if (Parent != null) { return(Parent.FindMyMaxKey(node)); } return(_comparer.MaxKey); } else { return(_comparer.Decrement(x.MinKey)); } }
private void InsertChildNode(BPTreeNode <TKey, TData> node, TKey key, TData data) { _data[key] = data; node.Parent = this; var keyIndex = _data.IndexOfKey(key); var grandChildKey = node.Data.Keys.FirstOrDefault(); if (_comparer.Compare(grandChildKey, key) < 0) { node.MaxKey = _comparer.Decrement(key); if (keyIndex > 0) { node.MinKey = _data.Keys.ElementAt(--keyIndex); } else { node.MinKey = _comparer.MinKey; } } else { node.MinKey = key; if (keyIndex < _data.Count - 1) { node.MaxKey = _comparer.Decrement(_data.Keys.ElementAt(++keyIndex)); } else { node.MaxKey = FindMyMaxKey(node); } } _children.Add(node); if (IsFull) { SplitNode(); } }
public void Insert(DataKey key, DataItem value) { _indexTree = _indexTree.Insert(key.GetKey <TKey>(), value); }