public async Task If_events_have_been_processed_then_the_correct_number_of_remaining_events_is_returned() { //arrange EventHandlerProgress progress = null; Events.Write(5); var eventsProcessed = 0; IUpdateProjectionWhen <IEvent> projector = null; projector = CreateProjector <IEvent>(e => { if (eventsProcessed == 4) { progress = CalculateProgressFor(projector); } eventsProcessed++; }); //act await RunCatchupSingleBatch(projector); //assert progress.BatchRemainingEvents .Should() .Be(1); }
public async Task If_events_have_been_processed_after_initial_catchup_then_the_remaining_time_is_estimated_correctly() { //arrange Events.Write(10); EventHandlerProgress progress = null; var eventsProcessed = 0; IUpdateProjectionWhen <IEvent> projector = null; projector = CreateProjector <IEvent>(e => { if (eventsProcessed == 15) { progress = CalculateProgressFor(projector); } VirtualClock.Current.AdvanceBy(TimeSpan.FromSeconds(1)); eventsProcessed++; }); await RunCatchupSingleBatch(projector); //new set of events come in Events.Write(10); //act await RunCatchupSingleBatch(projector); progress.BatchTimeRemaining .Should() .Be(TimeSpan.FromSeconds(5)); }
public async Task During_initial_catchup_the_percent_completed_is_estimated_correctly() { //arrange Events.Write(10); var eventCount = EventStoreDbContext().DisposeAfter(_ => _.Events.Count()); var eventsProcessed = 0; EventHandlerProgress progress = null; IUpdateProjectionWhen <IEvent> projector = null; projector = CreateProjector <IEvent>(e => { if (eventsProcessed == eventCount / 10 + 1) { VirtualClock.Current.AdvanceBy(10.Minutes()); progress = CalculateProgressFor(projector); } eventsProcessed++; }); //act // catch up enough events to hit the if block in the projector var batchSize = eventCount / 8; await RunCatchupSingleBatch(projector, startAtEventId : 0, batchSize : batchSize); // assert progress.InitialCatchupPercentageCompleted .Should() .BeInRange(10, 11); }
public EventHandlerWrapper(IUpdateProjectionWhen <TEvent> projector) { if (projector == null) { throw new ArgumentNullException(nameof(projector)); } InnerHandler = projector; IsConsequenter = false; handle = (@event, handler) => projector.UpdateProjection(@event); }
public static IUpdateProjectionWhen <TEvent> Named <TEvent>(this IUpdateProjectionWhen <TEvent> projector, string name) where TEvent : IEvent { var named = projector as AnonymousProjector <TEvent>; if (named == null) { throw new NotImplementedException(string.Format("Handlers of type {0} do not support naming yet.", projector)); } named.Name = name; return(projector); }
private static EventHandlerProgress CalculateProgressFor <T>( IUpdateProjectionWhen <T> projector) where T : IEvent { var projectorName = EventHandler.FullName(projector); var progress = CalculateProgress( () => ReadModelDbContext(), filter: i => i.Name == projectorName) .Single(); Console.WriteLine(progress.ToJson(Formatting.Indented)); return(progress); }
public async Task During_initial_catchup_the_remaining_time_is_estimated_correctly_across_multiple_batches() { //arrange Events.Write(20, randomEventTypes: true); var eventCount = EventStoreDbContext().DisposeAfter(_ => _.Events.Count()); var eventsProcessed = 0; EventHandlerProgress progress = null; IUpdateProjectionWhen <IEvent> projector = null; var numberOfEventsToProcessBeforeCalculating = eventCount / 100; projector = CreateProjector <IEvent>(e => { eventsProcessed++; if (eventsProcessed == numberOfEventsToProcessBeforeCalculating) { VirtualClock.Current.AdvanceBy(1.Minutes()); progress = CalculateProgressFor(projector); } }); //act var batchSize = eventCount / 1000; for (var i = 0; i < 13; i++) { await RunCatchupSingleBatch(projector, startAtEventId : 0, batchSize : batchSize); } // assert var expectedTimeRemaining = TimeRemaining( 1.Minutes(), eventsProcessed: numberOfEventsToProcessBeforeCalculating, eventsRemaining: eventCount - numberOfEventsToProcessBeforeCalculating); Console.WriteLine(new { eventCount, batchSize, eventsProcessed, numberOfEventsToProcessBeforeCalculating, expectedTimeRemaining }); progress.InitialCatchupTimeRemaining .Should() .BeCloseTo(expectedTimeRemaining, precision: (int)6.Minutes().TotalMilliseconds); }
private async Task RunCatchup( IUpdateProjectionWhen <IEvent> projector, int batchSize = 100, long?startAtEventId = null) { if (projector == null) { throw new ArgumentNullException(nameof(projector)); } using (var catchup = CreateReadModelCatchup( batchSize: batchSize, projectors: projector, startAtEventId: startAtEventId)) { await catchup.Run(); } }