Ejemplo n.º 1
0
        private async Task <EventPage> buildEventPage(long lastEncountered, NpgsqlCommand cmd)
        {
            IList <IEvent> events    = null;
            IList <long>   sequences = new List <long>();

            using (var reader = await cmd.ExecuteReaderAsync(_token).ConfigureAwait(false))
            {
                while (await reader.ReadAsync(_token).ConfigureAwait(false))
                {
                    var seq = await reader.GetFieldValueAsync <long>(0, _token).ConfigureAwait(false);

                    sequences.Add(seq);
                }

                if (sequences.Any())
                {
                    await reader.NextResultAsync(_token).ConfigureAwait(false);

                    events = await _selector.ReadAsync(reader, _map, null, _token).ConfigureAwait(false);
                }
                else
                {
                    events = new List <IEvent>();
                }
            }

            return(new EventPage(lastEncountered, sequences, events)
            {
                Count = events.Count
            });
        }
Ejemplo n.º 2
0
        private async Task <EventPage> buildEventPage(long @from, NpgsqlCommand cmd)
        {
            IList <IEvent> events    = null;
            IList <long>   sequences = new List <long>();

            long nextKnown = 0;
            long lastKnown = 0;

            using (var reader = await cmd.ExecuteReaderAsync(_token).ConfigureAwait(false))
            {
                while (await reader.ReadAsync(_token).ConfigureAwait(false))
                {
                    var seq = await reader.GetFieldValueAsync <long>(0, _token).ConfigureAwait(false);

                    sequences.Add(seq);
                }

                if (sequences.Any())
                {
                    await reader.NextResultAsync(_token).ConfigureAwait(false);

                    events = await _selector.ReadAsync(reader, _map, null, _token).ConfigureAwait(false);
                }
                else
                {
                    await reader.NextResultAsync(_token).ConfigureAwait(false);

                    events = new List <IEvent>();
                }

                nextKnown = await getLong(reader).ConfigureAwait(false);

                lastKnown = await getLong(reader).ConfigureAwait(false);
            }

            return(new EventPage(@from, sequences, events)
            {
                Count = events.Count,
                NextKnownSequence = nextKnown,
                LastKnownSequence = lastKnown
            });
        }
Ejemplo n.º 3
0
        public async Task <EventPage> FetchNextPage(long lastEncountered)
        {
            var lastPossible = lastEncountered + _options.PageSize;
            var sql          = $@"
select max(seq_id) from mt_events where seq_id > :last and seq_id <= :limit;
{_selector.ToSelectClause(null)} where seq_id > :last and seq_id <= :limit and type = ANY(:types) order by seq_id;       
";

            var cmd = _conn.CreateCommand().Sql(sql)
                      .With("last", lastEncountered)
                      .With("limit", lastPossible)
                      .With("types", _options.EventTypeNames, NpgsqlDbType.Array | NpgsqlDbType.Varchar);



            long           furthestExtant;
            IList <IEvent> events = null;

            using (var reader = await cmd.ExecuteReaderAsync(Cancellation).ConfigureAwait(false))
            {
                await reader.ReadAsync(Cancellation).ConfigureAwait(false);

                furthestExtant = await reader.GetFieldValueAsync <long>(0, Cancellation).ConfigureAwait(false);

                await reader.NextResultAsync(Cancellation).ConfigureAwait(false);

                events = await _selector.ReadAsync(reader, _map, Cancellation).ConfigureAwait(false);
            }


            var streams = events.GroupBy(x => x.StreamId).Select(group =>
            {
                return(new EventStream(group.Key, group.OrderBy(x => x.Version).ToArray(), false));
            }).ToArray();

            return(new EventPage(lastEncountered, furthestExtant, streams));
        }