internal void ProcessEvents(DocumentSessionBase session) { if (!session.WorkTracker.Streams.Any()) { return; } if (Options.AutoCreateSchemaObjects != AutoCreate.None) { session.Database.EnsureStorageExists(typeof(IEvent)); } var storage = session.EventStorage(); var fetcher = new EventSequenceFetcher(this, session.WorkTracker.Streams.Sum(x => x.Events.Count)); var sequences = session.ExecuteHandler(fetcher); foreach (var stream in session.WorkTracker.Streams.Where(x => x.Events.Any())) { stream.TenantId ??= session.TenantId; if (stream.ActionType == StreamActionType.Start) { stream.PrepareEvents(0, this, sequences, session); session.QueueOperation(storage.InsertStream(stream)); } else { var handler = storage.QueryForStream(stream); var state = session.ExecuteHandler(handler); if (state == null) { stream.PrepareEvents(0, this, sequences, session); session.QueueOperation(storage.InsertStream(stream)); } else { if (state.IsArchived) { throw new InvalidStreamOperationException($"Attempted to append event to archived stream with Id '{state.Id}'."); } stream.PrepareEvents(state.Version, this, sequences, session); session.QueueOperation(storage.UpdateStreamVersion(stream)); } } foreach (var @event in stream.Events) { session.QueueOperation(storage.AppendEvent(this, session, stream, @event)); } } foreach (var projection in _inlineProjections.Value) { projection.Apply(session, session.WorkTracker.Streams.ToList()); } }
public IReadOnlyList <IEvent> FetchStream(Guid streamId, long version = 0, DateTime?timestamp = null) { var selector = _store.Events.EnsureAsGuidStorage(_session); var statement = new EventStatement(selector) { StreamId = streamId, Version = version, Timestamp = timestamp, TenantId = _tenant.TenantId }; IQueryHandler <IReadOnlyList <IEvent> > handler = new ListQueryHandler <IEvent>(statement, selector); return(_session.ExecuteHandler(handler)); }
internal void ProcessEvents(DocumentSessionBase session) { if (!session.WorkTracker.Streams.Any()) { return; } var storage = session.EventStorage(); // TODO -- we'll optimize this later to batch up queries to the database var fetcher = new EventSequenceFetcher(this, session.WorkTracker.Streams.Sum(x => x.Events.Count)); var sequences = session.ExecuteHandler(fetcher); foreach (var stream in session.WorkTracker.Streams) { stream.TenantId ??= session.Tenant.TenantId; if (stream.ActionType == StreamActionType.Start) { stream.PrepareEvents(0, this, sequences, session); session.QueueOperation(storage.InsertStream(stream)); } else { var handler = storage.QueryForStream(stream); var state = session.ExecuteHandler(handler); if (state == null) { stream.PrepareEvents(0, this, sequences, session); session.QueueOperation(storage.InsertStream(stream)); } else { stream.PrepareEvents(state.Version, this, sequences, session); session.QueueOperation(storage.UpdateStreamVersion(stream)); } } foreach (var @event in stream.Events) { session.QueueOperation(storage.AppendEvent(this, session, stream, @event)); } } foreach (var projection in _inlineProjections.Value) { projection.Apply(session, session.WorkTracker.Streams.ToList()); } }
public IReadOnlyList <IEvent> FetchStream(Guid streamId, int version = 0, DateTime?timestamp = null) { ensureAsGuidStorage(); var handler = new EventQueryHandler <Guid>(_selector, streamId, version, timestamp, _store.Events.TenancyStyle, _tenant.TenantId); return(_session.ExecuteHandler(handler)); }
public IReadOnlyList <IEvent> FetchStream(Guid streamId, int version = 0, DateTime?timestamp = null) { // TODO -- do this later by just delegating to Load<StreamState>(streamId) var selector = _store.Events.EnsureAsGuidStorage(_session); var handler = new EventQueryHandler <Guid>(selector, streamId, version, timestamp, _store.Events.TenancyStyle, _tenant.TenantId); return(_session.ExecuteHandler(handler)); }