public static void ProjectReiAnswer(IMongoCollection<REI> coll, ReportingEntityInstance rei) { var entity = new REI(rei.ReportingEntityId, rei.FormDefinitionId, rei.ControlAnswers.Select(a => new Answer(a.Value.ControlId, a.Value.Values))); if(coll.AsQueryable().Any(r => r.Id == rei.ReportingEntityId)) { //update coll.ReplaceOne(r => r.Id == entity.Id, entity); } else { coll.InsertOne(entity); } }
private static void PerfLoadNewRei(Guid formId, String rei, Int32 snapInterval, ControlCatalog catalog, IEnumerable<ControlRule> rules) { var newInstance = new ReportingEntityInstance(formId, rei); var fields = new String[]{ "FirstName", "LastName", "Age", "Email", "FavoriteFood" }; Stopwatch sw = new Stopwatch(); Console.WriteLine($"Starting the creation of {rei}"); sw.Start(); for (int i = 0; i < 10000; i++) { var field = fields[i % 5]; newInstance.AddAnswer(field, catalog, rules, "answer" + i.ToString()); EventStore.PersistEvents(_eventCollection, newInstance); if (i > 0 && i%snapInterval == 0) { var snap = newInstance.TakeSnapshot(); EventStore.TakeSnapshot(_snapshotCollection, snap); } } sw.Stop(); Console.WriteLine($"Took {sw.ElapsedMilliseconds} ms to write 10000 answers with interval of {snapInterval}"); sw.Reset(); sw.Start(); var fullInstance = new ReportingEntityInstance(formId, rei); EventStore.LoadDomain(_eventCollection, fullInstance, formId, rei); sw.Stop(); Console.WriteLine($"Took {sw.ElapsedMilliseconds} ms to load domain by replaying events"); sw.Reset(); sw.Start(); var snapInstance = new ReportingEntityInstance(formId, rei); snapInstance.LoadSnapshot(EventStore.GetSnapshot(_snapshotCollection, rei)); EventStore.LoadDomainStartingAtVersion(_eventCollection, snapInstance, formId, rei, snapInstance.Version); sw.Stop(); Console.WriteLine($"Took {sw.ElapsedMilliseconds} ms to load domain from snapshot"); Console.WriteLine("Replay instance status: "); DisplayDomainStatus(fullInstance); Console.WriteLine("Snapshot instance status: "); DisplayDomainStatus(snapInstance); }
private static void PersistEvents(ReportingEntityInstance instance) { EventStore.PersistEvents(_eventCollection, instance); Console.WriteLine("PERSISTED!"); EventProjector.ProjectReiAnswer(_reiProjection, instance); Console.WriteLine("PROJECTED"); Console.WriteLine(""); }
private static ReportingEntityInstance LoadDomainUpToVersion(Guid formId, String rei, Int64 maxVersion, ControlCatalog catalog) { var instance = new ReportingEntityInstance(formId, rei); EventStore.LoadDomainUpToVersion(_eventCollection, instance, formId, rei, maxVersion); return instance; }
private static void DisplayDomainStatus(ReportingEntityInstance instance) { Console.WriteLine("Current validation status for all controls..."); var status = instance.GetStatus(); foreach (var stat in status) { Console.WriteLine($"{stat.ControlId} {stat.State} {stat.Validator} {stat.Message}"); } Console.WriteLine(""); Console.WriteLine("Current answers for all controls..."); var answers = instance.GetAnswers(); foreach (var answer in answers) { Console.WriteLine($"{answer.ControlId} has value(s) {String.Join(", ", answer.Values)} with timestamp {answer.Timestamp}"); } Console.WriteLine(""); }
private static ReportingEntityInstance LoadFromSnapshot(Guid formId, String rei) { var snapshot = EventStore.GetSnapshot(_snapshotCollection, rei); var instance = new ReportingEntityInstance(formId, rei); instance.LoadSnapshot(snapshot); EventStore.LoadDomainStartingAtVersion(_eventCollection, instance, instance.FormDefinitionId, instance.ReportingEntityId, instance.Version); return instance; }