Пример #1
0
        Record ReuseEmptyRecord(int minimumLength, int maximumLength)
        {
            if (!_recordReuseEnabled)
            {
                return(null);
            }
            var walker = this.EmptyRecordIndex.GetWalker();

            var range = new BTreeWalkerRange <EmptyRecordIndexKey>();

            range.SetStartAt(new EmptyRecordIndexKey {
                S = minimumLength, A = 0
            });
            range.SetEndAt(new EmptyRecordIndexKey {
                S = maximumLength, A = Int64.MaxValue
            });
            walker.SetRange(range);

            var entry = walker.Next();

            while (entry != null && _reusedRecords.ContainsKey(entry.Pointer))
            {
                entry = walker.Next();
            }
            if (entry != null)
            {
                _reusedRecords[entry.Pointer] = entry.Key;
                return(GetRecord(entry.Pointer));
            }
            return(null);
        }
Пример #2
0
        internal override CollectionEnumerator <TObj, ValueWithAddressIndexKey <TAttribute> > BuildEnumerator(bool descending)
        {
            var startKey = new ValueWithAddressIndexKey <TAttribute> {
                V = this.StartAt
            };
            var endKey = new ValueWithAddressIndexKey <TAttribute> {
                V = this.EndAt
            };

            BTreeWalkerRange <ValueWithAddressIndexKey <TAttribute> > range;

            if (!descending)
            {
                range = new BTreeWalkerRange <ValueWithAddressIndexKey <TAttribute> >(startKey, endKey);
                range.IncludeStartAt = this.IncludeStartAt;
                range.IncludeEndAt   = this.IncludeEndAt;
            }
            else
            {
                //start and end are reversed
                range = new BTreeWalkerRange <ValueWithAddressIndexKey <TAttribute> >(endKey, startKey);
                range.IncludeStartAt = this.IncludeEndAt;
                range.IncludeEndAt   = this.IncludeStartAt;
            }

            return(this.IndexedValue.BuildEnumerator(range, descending));
        }
Пример #3
0
        public void Ignores_All_Non_Included()
        {
            var rootNode = _mockDataProvider.GetRootNode(_degree);

            rootNode.EntryList.Add(new Entry <int> {
                Key = 1, Pointer = 1
            });
            rootNode.EntryList.Add(new Entry <int> {
                Key = 1, Pointer = 2
            });
            rootNode.EntryList.Add(new Entry <int> {
                Key = 2, Pointer = 3
            });
            rootNode.EntryList.Add(new Entry <int> {
                Key = 3, Pointer = 4
            });
            rootNode.EntryList.Add(new Entry <int> {
                Key = 3, Pointer = 5
            });
            rootNode.EntryList.Add(new Entry <int> {
                Key = 4, Pointer = 6
            });


            var walkedPointers = new List <Int64>();
            var range          = new  BTreeWalkerRange <int>(1, 4);

            range.IncludeStartAt = false;
            range.IncludeEndAt   = false;
            _walker.SetRange(range);

            var result = _walker.Next();

            while (result != null)
            {
                walkedPointers.Add(result.Pointer);
                result = _walker.Next();
            }

            Assert.AreEqual(walkedPointers, new List <int> {
                3, 4, 5
            });
        }
Пример #4
0
        internal override CollectionEnumerator <TObj, ValueWithAddressIndexKey <TAttribute> > BuildEnumerator(bool descending)
        {
            var startKey = new ValueWithAddressIndexKey <TAttribute> {
                V = (TAttribute)this.Value
            };
            var range = new BTreeWalkerRange <ValueWithAddressIndexKey <TAttribute> >();

            if (!descending)
            {
                range.SetStartAt(startKey);
                range.IncludeStartAt = this.OrEqual;
            }
            else
            {
                range.SetEndAt(startKey);
                range.IncludeEndAt = this.OrEqual;
            }

            return(this.IndexedValue.BuildEnumerator(range, descending));
        }
Пример #5
0
        Record ReuseRecycledRecord(int minimumLength)
        {
            return(UsingEmptyRecordIndex(() => {
                var walker = this.EmptyRecordIndex.GetWalker();

                var range = new BTreeWalkerRange <EmptyRecordIndexKey>();
                range.SetStartAt(new EmptyRecordIndexKey {
                    S = minimumLength, A = 0
                });
                walker.SetRange(range);

                var entry = walker.Next();

                if (entry != null)
                {
                    this.EmptyRecordIndex.UnRegister(entry.Key);
                    return GetRecord(entry.Pointer);
                }

                return null;
            }));
        }
Пример #6
0
        public void Walks_Items_Above()
        {
            BuildTestTree();
            var walkedKeys = new List <int>();

            var range = new BTreeWalkerRange <int>();

            range.SetStartAt(3);
            range.IncludeStartAt = false;
            _walker.SetRange(range);

            var entry = _walker.Next();

            while (entry != null)
            {
                walkedKeys.Add(entry.Key);
                entry = _walker.Next();
            }

            var expected = Enumerable.Range(4, 14);

            Assert.AreEqual(expected, walkedKeys);
        }
Пример #7
0
 public void SetRange(BTreeWalkerRange <TKey> range)
 {
     this.Range = range;
 }
 internal void SetRange(BTreeWalkerRange <TKey> range)
 {
     this.Range = range;
 }