Example #1
0
        public IEnumerable <KeyValuePair <IData, IData> > Forward(IData from, bool hasFrom, IData to, bool hasTo)
        {
            if (hasFrom && hasTo && Locator.KeyComparer.Compare(from, to) > 0)
            {
                throw new ArgumentException("from > to");
            }

            Flush();

            StorageEngine.FullKey nearFullKey;
            bool hasNearFullKey;

            WTree.FullKey lastVisitedFullKey = default(WTree.FullKey);
            IOrderedSet <IData, IData> records;

            records = (IOrderedSet <IData, IData>)StorageEngine.FindData(Locator, Locator, hasFrom ? from : null, Direction.Forward, out nearFullKey, out hasNearFullKey, ref lastVisitedFullKey);

            if (records == null)
            {
                if (!hasNearFullKey || !nearFullKey.Locator.Equals(Locator))
                {
                    yield break;
                }

                records = (IOrderedSet <IData, IData>)StorageEngine.FindData(Locator, nearFullKey.Locator, nearFullKey.Key, Direction.Forward, out nearFullKey, out hasNearFullKey, ref lastVisitedFullKey);
            }

            while (records != null)
            {
                Task task = null;
                IOrderedSet <IData, IData> recs = null;

                if (hasNearFullKey && nearFullKey.Locator.Equals(Locator))
                {
                    if (hasTo && records.Count > 0 && Locator.KeyComparer.Compare(records.First.Key, to) > 0)
                    {
                        break;
                    }

                    task = Task.Factory.StartNew(() =>
                    {
                        recs = (IOrderedSet <IData, IData>)StorageEngine.FindData(Locator, nearFullKey.Locator, nearFullKey.Key, Direction.Forward, out nearFullKey, out hasNearFullKey, ref lastVisitedFullKey);
                    });
                }

                foreach (var record in records.Forward(from, hasFrom, to, hasTo))
                {
                    yield return(record);
                }

                if (task != null)
                {
                    task.Wait();
                }

                records = recs;
            }
        }
Example #2
0
        public bool TryGet(IData key, out IData record)
        {
            Flush();

            StorageEngine.FullKey nearFullKey;
            bool haveNearLocator;

            WTree.FullKey lastVisitedFullKey = default(WTree.FullKey);
            var           records            = (IOrderedSet <IData, IData>)StorageEngine.FindData(Locator, Locator, key, Direction.Forward, out nearFullKey, out haveNearLocator, ref lastVisitedFullKey);

            if (records == null)
            {
                record = default(IData);
                return(false);
            }

            return(records.TryGetValue(key, out record));
        }
Example #3
0
        public bool TryGet(IData key, out IData record)
        {
            lock (SyncRoot)
            {
                Flush();

                WTree.FullKey nearFullKey;
                bool          hasNearLocator;
                WTree.FullKey lastVisitedFullKey = default(WTree.FullKey);

                var records = Tree.FindData(Locator, Locator, key, Direction.Forward, out nearFullKey, out hasNearLocator, ref lastVisitedFullKey);
                if (records == null)
                {
                    record = default(IData);
                    return(false);
                }

                lock (records)
                {
                    return(records.TryGetValue(key, out record));
                }
            }
        }
Example #4
0
        public IEnumerable <KeyValuePair <IData, IData> > Backward(IData to, bool hasTo, IData from, bool hasFrom)
        {
            lock (SyncRoot)
            {
                var keyComparer = Locator.KeyComparer;

                if (hasFrom && hasTo && keyComparer.Compare(from, to) > 0)
                {
                    throw new ArgumentException("from > to");
                }

                Flush();

                WTree.FullKey nearFullKey;
                bool          hasNearFullKey;
                IOrderedSet <IData, IData> records;

                WTree.FullKey lastVisitedFullKey = new WTree.FullKey(Locator, to);
                records = Tree.FindData(Locator, Locator, hasTo ? to : null, Direction.Backward, out nearFullKey, out hasNearFullKey, ref lastVisitedFullKey);

                if (records == null)
                {
                    yield break;
                }

                while (records != null)
                {
                    Task task = null;
                    IOrderedSet <IData, IData> recs = null;

                    //if (records.Count > 0)
                    //    lastVisitedFullKey = new WTree.FullKey(Locator, records.First.Key);

                    if (hasNearFullKey)
                    {
                        lock (records)
                        {
                            if (hasFrom && records.Count > 0 && keyComparer.Compare(records.Last.Key, from) < 0)
                            {
                                break;
                            }
                        }

                        task = Task.Factory.StartNew(() =>
                        {
                            recs = Tree.FindData(Locator, nearFullKey.Locator, nearFullKey.Key, Direction.Backward, out nearFullKey, out hasNearFullKey, ref lastVisitedFullKey);
                        });
                    }

                    lock (records)
                    {
                        foreach (var record in records.Backward(to, hasTo, from, hasFrom))
                        {
                            yield return(record);
                        }
                    }

                    if (task != null)
                    {
                        task.Wait();
                    }

                    if (recs == null)
                    {
                        break;
                    }

                    lock (records)
                    {
                        lock (recs)
                        {
                            if (recs.Count > 0 && records.Count > 0)
                            {
                                if (keyComparer.Compare(recs.First.Key, records.First.Key) >= 0)
                                {
                                    break;
                                }
                            }
                        }
                    }

                    records = recs;
                }
            }
        }