Exemple #1
0
        private async Task applyProjectionsAsync(DocumentSessionBase session, ICollection <EventProjection> projections, IEnumerable <TView> views)
        {
            var idAssigner = session.Tenant.IdAssignmentFor <TView>();
            var resolver   = session.Tenant.StorageFor <TView>();
            var viewMap    = views.ToDictionary(view => (TId)resolver.IdentityFor(view), view => view);

            foreach (var eventProjection in projections)
            {
                var viewId          = eventProjection.ViewId;
                var hasExistingView = viewMap.TryGetValue(viewId, out var view);
                if (!hasExistingView)
                {
                    if (eventProjection.Type == ProjectionEventType.CreateAndUpdate)
                    {
                        view = newView(session.Tenant, idAssigner, viewId);
                        viewMap.Add(viewId, view);
                        hasExistingView = true;
                    }
                }

                if (eventProjection.Type == ProjectionEventType.CreateAndUpdate ||
                    (eventProjection.Type == ProjectionEventType.UpdateOnly && hasExistingView))
                {
                    session.Store(view);
                    eventProjection.ProjectTo(session, view).Wait();
                }
                else if (eventProjection.Type == ProjectionEventType.Delete &&
                         hasExistingView &&
                         await eventProjection.ShouldDelete(session, view))
                {
                    session.Delete(view);
                }
            }
        }