Exemplo n.º 1
0
        public static IEnumerable <Commit <byte[]> > Execute(DocumentTransaction tx, ReadEventsByCommitIds command)
        {
            if (!command.Ids.Any())
            {
                return(Enumerable.Empty <Commit <byte[]> >());
            }

            var parameters = new DynamicParameters();

            foreach (var param in command.Ids.Select((value, i) => (name: $"@p{i}", value: value)))
            {
                parameters.Add(param.name, param.value);
            }

            var sql = $@"
                SELECT Position, EventId, CommitId, StreamId, SequenceNumber, Name, Generation, Metadata, Data
                FROM {tx.Store.Database.FormatTableNameAndEscape(command.Table.Name)}
                WHERE CommitId IN ({string.Join(", ", parameters.ParameterNames.Select(x => $"@{x}"))})
                ORDER BY Position";

            var commits = new[] { Commit.Empty <byte[]>() }.Concat(
                from row in tx.SqlConnection.Query <Row>(sql, parameters, tx.SqlTransaction)
                group row by row.CommitId
                into grouping
                let last = grouping.Last()
                           select Commit.Create(grouping.Key, last.Generation, last.Position, grouping.Select(Row.ToEvent).ToList())
                ).ToList();

            return
                (from id in command.Ids
                 join commit in commits on id equals commit.Id into cs
                 from commit in cs.DefaultIfEmpty()
                 select commit);
        }