示例#1
0
        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);
        }
示例#2
0
 public Index(IDataStorage dataStorage) : base(dataStorage)
 {
     Load();
     if (_indexTree == null)
     {
         _indexTree = new BPTreeNode <TKey, DataItem>(15);
     }
 }
示例#3
0
        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;
            }
        }
示例#4
0
        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));
            }
        }
示例#5
0
        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();
            }
        }
示例#6
0
 public void Insert(DataKey key, DataItem value)
 {
     _indexTree = _indexTree.Insert(key.GetKey <TKey>(), value);
 }