private async ValueTask <IReadOnlyList <TenantSliceGroup <TDoc, TId> > > groupByConjoinedTenancy(IQuerySession querySession, List <IEvent> events) { var byTenant = events.GroupBy(x => x.TenantId); var groupTasks = byTenant.Select(async tGroup => { var tenant = new Tenant(tGroup.Key, querySession.Database); var tenantSession = querySession.ForTenant(tGroup.Key); var group = new TenantSliceGroup <TDoc, TId>(tenant); await GroupEvents(@group, tenantSession, tGroup.ToList()).ConfigureAwait(false); return(@group); }); var list = new List <TenantSliceGroup <TDoc, TId> >(); foreach (var groupTask in groupTasks) { list.Add(await groupTask.ConfigureAwait(false)); } return(list); }
public ValueTask <IReadOnlyList <EventSlice <UserGroupsAssignment, Guid> > > SliceInlineActions(IQuerySession querySession, IEnumerable <StreamAction> streams, ITenancy tenancy) { var allEvents = streams.SelectMany(x => x.Events).ToList(); var group = new TenantSliceGroup <UserGroupsAssignment, Guid>(tenancy.Default); group.AddEvents <UserRegistered>(@event => @event.UserId, allEvents); group.AddEvents <MultipleUsersAssignedToGroup>(@event => @event.UserIds, allEvents); return(new(group.Slices.ToList())); }
private async ValueTask <IReadOnlyList <TenantSliceGroup <TDoc, TId> > > groupBySingleTenant(IQuerySession querySession, List <IEvent> events) { // This path is for *NOT* conjoined multi-tenanted projections, but we have to respect per-database tenancy var group = new TenantSliceGroup <TDoc, TId>(querySession, Tenancy.DefaultTenantId); await GroupEvents(@group, querySession, events).ConfigureAwait(false); return(new List <TenantSliceGroup <TDoc, TId> > { @group }); }
public ValueTask <IReadOnlyList <TenantSliceGroup <UserGroupsAssignment, Guid> > > SliceAsyncEvents(IQuerySession querySession, List <IEvent> events, ITenancy tenancy) { var group = new TenantSliceGroup <UserGroupsAssignment, Guid>(tenancy.Default); group.AddEvents <UserRegistered>(@event => @event.UserId, events); group.AddEvents <MultipleUsersAssignedToGroup>(@event => @event.UserIds, events); return(new(new List <TenantSliceGroup <UserGroupsAssignment, Guid> > { group })); }
public TenantSliceGroup <T, TId> BuildSlices <T>(ITenant tenant, IReadOnlyList <IFanOutRule> rules) { var slices = buildSlices <T>(tenant); var group = new TenantSliceGroup <T, TId>(tenant, slices); if (rules.Any()) { group.ApplyFanOutRules(rules); } return(group); }
private async Task <TenantSliceGroup <TDoc, TId> > groupSingleTenant(ITenant tenant, IQuerySession querySession, IList <IEvent> events) { var @group = new TenantSliceGroup <TDoc, TId>(tenant); foreach (var grouper in _groupers) { grouper.Apply(events, @group); } foreach (var lookupGrouper in _lookupGroupers) { await lookupGrouper.Group(querySession, events, @group); } return(@group); }
private async Task <TenantSliceGroup <TDoc, TId> > groupSingleTenant(Tenant tenant, IQuerySession querySession, IList <IEvent> events) { var @group = new TenantSliceGroup <TDoc, TId>(tenant); foreach (var grouper in _groupers) { grouper.Apply(events, @group); } foreach (var lookupGrouper in _lookupGroupers) { await lookupGrouper.Group(querySession, events, @group).ConfigureAwait(false); } group.ApplyFanOutRules(_afterGroupingFanoutRules); return(@group); }