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; } }
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)); }
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)); } } }
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; } } }