protected override IStream <AggregationResult <TIn, TMultiKey, TAggrRes> > CreateOutputStream(AggregateMultiKeyArgs <TIn, TAggrRes, TMultiKey> args) { var keyProcessor = GroupProcessor.Create(args.GetKeys); var observableOut = args.InputStream.Observable.Do(keyProcessor.ProcessRow).Last().MultiMap <TIn, AggregationResult <TIn, TMultiKey, TAggrRes> >((i, pushValue) => { foreach (var group in keyProcessor.GetGroups()) { TIn first = default; TAggrRes aggrRes = default; foreach (var item in group.Value) { if (first != null) { first = item; aggrRes = args.CreateEmptyAggregation(first); } aggrRes = args.Aggregate(aggrRes, item); } pushValue(new AggregationResult <TIn, TMultiKey, TAggrRes> { Aggregation = aggrRes, FirstValue = first, Key = group.Key }); } }); return(CreateUnsortedStream(observableOut)); }
protected override IStream <TOut> CreateOutputStream(ReKeyArgs <TIn, TOut, TMultiKey> args) { var keyProcessor = GroupProcessor.Create(args.GetKeys); var observableOut = args.InputStream.Observable.Do(keyProcessor.ProcessRow).Last().MultiMap <TIn, TOut>((i, pushValue) => { var groups = keyProcessor.GetGroups(); foreach (var elt in groups.SelectMany(g => g.Value.Select(v => new { Row = v, g.Key }))) { pushValue(args.ResultSelector(elt.Row, elt.Key)); } }); return(CreateUnsortedStream(observableOut)); }