public IList <T> Get(V start, V end) { var documents = new List <T>(); var comparer = new SliceComparer(); var docIds = new SortedSet <Slice>(comparer); bool isPrimaryIdLookup = _documentFieldConverter.IsPrimaryIdField(_memberInfo); Slice startSlice = _documentFieldConverter.GetSliceFromMemberInfo(_memberInfo, start, lookupIndex: !isPrimaryIdLookup); Slice endSlice = _documentFieldConverter.GetSliceFromMemberInfo(_memberInfo, end, lookupIndex: !isPrimaryIdLookup); int direction = comparer.Compare(startSlice, endSlice); // Collect doc ids or documents (depending upon lookup type) this.OnEach(startSlice, (k, v) => { int cmp = comparer.Compare(k, endSlice); if (cmp != 0 && cmp != direction) { return(0); } if (isPrimaryIdLookup) { documents.Add(_objectSerializer.Deserialize(v.ToByteArray(deepCopy: false))); } else { docIds.Add(v); } // Keep moving forward for start <= end // Move backwards start > end return(direction > 0 ? 1 : -1); }); // If it's already a primary Id lookup or no items found if (isPrimaryIdLookup || docIds.Count < 0) { return(documents); } return(this.GetMultiple(docIds)); }
public IList <T> GetAll(IEnumerable <V> keys) { var comparer = new SliceComparer(); var docIds = new SortedSet <Slice>(comparer); bool isPrimaryIdLookup = _documentFieldConverter.IsPrimaryIdField(_memberInfo); foreach (var key in keys) { docIds.Add( _documentFieldConverter.GetSliceFromMemberInfo( _memberInfo, key, lookupIndex: !isPrimaryIdLookup ) ); } return(this.GetDocumentsWithLock(docIds)); }
private IList <T> GetDocumentsWithLock(IEnumerable <Slice> documentIds) { List <T> documents = new List <T>(); SliceComparer comparer = new SliceComparer(); foreach (var id in documentIds) { this.WithIterator(iterator => { iterator.Seek(id); if (iterator.Valid() && comparer.Compare(id, iterator.Key()) == 0) { documents.Add(_objectSerializer.Deserialize(iterator.Value().ToByteArray(deepCopy: false))); } else { documents.Add(null); } }); } return(documents); }