public async Task <IReadOnlyCollection <StorageEvent> > ReadStreamForwards(string streamId, int startPosition, int numberOfEventsToRead) { int endPosition = numberOfEventsToRead == int.MaxValue ? int.MaxValue : startPosition + numberOfEventsToRead; var eventsQuery = this.client.CreateDocumentQuery <DocumentDbStorageEvent>(commitsLink) .Where(x => x.StreamId == streamId && x.EventNumber >= startPosition && x.EventNumber <= endPosition) .OrderBy(x => x.EventNumber) .AsDocumentQuery(); var events = new List <StorageEvent>(); while (eventsQuery.HasMoreResults) { var response = await eventsQuery.ExecuteNextAsync <DocumentDbStorageEvent>(); loggingOptions.OnSuccess(ResponseInformation.FromReadResponse(nameof(ReadStreamForwards), response)); foreach (var e in response) { events.Add(e.ToStorageEvent(this.typeMap)); } } return(events.AsReadOnly()); }
public async Task <IReadOnlyCollection <StorageEvent> > ReadStreamForwardsFromLast(string streamId, Predicate <StorageEvent> readFromHere) { using (var eventsQuery = client.CreateDocumentQuery <DocumentDbStorageEvent>(commitsLink) .Where(x => x.StreamId == streamId) .OrderByDescending(x => x.EventNumber) .AsDocumentQuery()) { var eventsInReverseOrder = new List <StorageEvent>(); var finished = false; while (!finished && eventsQuery.HasMoreResults) { var response = await eventsQuery.ExecuteNextAsync <DocumentDbStorageEvent>(); loggingOptions.OnSuccess(ResponseInformation.FromReadResponse(nameof(ReadStreamForwardsFromLast), response)); foreach (var e in response) { var storageEvent = e.ToStorageEvent(typeMap); eventsInReverseOrder.Add(storageEvent); if (readFromHere(storageEvent)) { finished = true; break; } } } return(eventsInReverseOrder .Reverse <StorageEvent>() .ToList() .AsReadOnly()); } }