예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }