private Task <StreamEventsPage> ReadSteamBackwards(string streamId, int start, int count) { var connection = _getConnection(); var results = connection.Table <SqliteEvent>() .Where(e => e.StreamId == streamId) .OrderByDescending(e => e.SequenceNumber) .Skip(start) .Take(count) // Must enumerate the results before selecting a StreamEvent else activation // exception from Sqlite.Net trying create a StreamEvent. Comment out the // line below if you want to see the test(s) fail. .ToArray() .Select(@event => @event.ToStreamEvent()) .ToArray(); var streamEventsPage = new StreamEventsPage( streamId: streamId, status: PageReadStatus.Success, fromStreamVersion: start, nextStreamVersion: results[0].StreamVersion - 1, lastStreamVersion: results[0].StreamVersion, direction: ReadDirection.Backward, isEndOfStream: true, events: results); return(Task.FromResult(streamEventsPage)); }
public ReadStreamTheory( string streamId, int start, int pageSize, StreamEventsPage expectedStreamEventsPage) { StreamId = streamId; Start = start; PageSize = pageSize; ExpectedStreamEventsPage = expectedStreamEventsPage; }
protected override Task <StreamEventsPage> ReadStreamBackwardsInternal( string streamId, int fromVersionInclusive, int count, CancellationToken cancellationToken = new CancellationToken()) { if (_isDisposed) { throw new ObjectDisposedException(nameof(InMemoryEventStore)); } _lock.EnterReadLock(); try { InMemoryStream stream; if (!_streams.TryGetValue(streamId, out stream)) { var notFound = new StreamEventsPage(streamId, PageReadStatus.StreamNotFound, fromVersionInclusive, -1, -1, ReadDirection.Backward, true); return(Task.FromResult(notFound)); } if (stream.IsDeleted) { var deleted = new StreamEventsPage(streamId, PageReadStatus.StreamDeleted, fromVersionInclusive, 0, 0, ReadDirection.Backward, true); return(Task.FromResult(deleted)); } var events = new List <StreamEvent>(); var i = fromVersionInclusive == StreamVersion.End ? stream.Events.Count - 1 : fromVersionInclusive; while (i >= 0 && count > 0) { var inMemoryStreamEvent = stream.Events[i]; var streamEvent = new StreamEvent( streamId, inMemoryStreamEvent.EventId, inMemoryStreamEvent.StreamVersion, inMemoryStreamEvent.Checkpoint, inMemoryStreamEvent.Created, inMemoryStreamEvent.Type, inMemoryStreamEvent.JsonData, inMemoryStreamEvent.JsonMetadata); events.Add(streamEvent); i--; count--; } var lastStreamVersion = stream.Events.Last().StreamVersion; var nextStreamVersion = events.Last().StreamVersion - 1; var endOfStream = nextStreamVersion < 0; var page = new StreamEventsPage( streamId, PageReadStatus.Success, fromVersionInclusive, nextStreamVersion, lastStreamVersion, ReadDirection.Backward, endOfStream, events.ToArray()); return(Task.FromResult(page)); } finally { _lock.ExitReadLock(); } }