public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands) { // db accessors var syncDataObjectCommands = commands.OfType <ISyncDataObjectCommand>().ToList(); if (syncDataObjectCommands.Count != 0) { foreach (var accessor in CreateAccessors(_query).Select(AddTenancy)) { var specification = accessor.GetFindSpecification(syncDataObjectCommands); var source = accessor.GetSource().WhereMatched(specification); var target = _query.For <EntityName>() .Where(new FindSpecification <EntityName>(x => x.TenantId == _tenantProvider.Current)) .WhereMatched(specification); var changes = _dataChangesDetector.DetectChanges(source, target); _bulkRepository.Delete(changes.Complement); _bulkRepository.Create(changes.Difference); _bulkRepository.Update(changes.Intersection); } } // memory accessors var syncInMemoryDataObjectCommands = commands.OfType <ISyncInMemoryDataObjectCommand>().ToList(); if (syncInMemoryDataObjectCommands.Count != 0) { foreach (var accessor in CreateMemoryAccessors()) { var specification = accessor.GetFindSpecification(syncInMemoryDataObjectCommands); var source = accessor.GetDataObjects(syncInMemoryDataObjectCommands); var target = _query.For <EntityName>().WhereMatched(specification); var changes = _dataChangesDetector.DetectChanges(source, target); _bulkRepository.Delete(changes.Complement); _bulkRepository.Create(changes.Difference); _bulkRepository.Update(changes.Intersection); } } return(Array.Empty <IEvent>()); }
public IReadOnlyCollection <IEvent> ExecuteCommands(IReadOnlyCollection <ICommand> commands) { // db accessors var syncDataObjectCommands = commands.OfType <ISyncDataObjectCommand>().ToList(); if (syncDataObjectCommands.Count != 0) { foreach (var accessor in CreateAccessors(_query)) { var specification = accessor.GetFindSpecification(syncDataObjectCommands); var dataChangesDetector = new TwoPhaseDataChangesDetector <EntityName>( spec => accessor.GetSource().WhereMatched(spec), spec => _query.For <EntityName>().WhereMatched(spec), _identityComparer, _completeComparer); var changes = dataChangesDetector.DetectChanges(specification); _bulkRepository.Delete(changes.Complement); _bulkRepository.Create(changes.Difference); _bulkRepository.Update(changes.Intersection); } } // memory accessors var replaceDataObjectCommands = commands.OfType <IReplaceDataObjectCommand>().ToList(); if (replaceDataObjectCommands.Count != 0) { foreach (var accessor in CreateMemoryAccessors()) { var specification = accessor.GetFindSpecification(replaceDataObjectCommands); var dataChangesDetector = new TwoPhaseDataChangesDetector <EntityName>( _ => accessor.GetDataObjects(replaceDataObjectCommands), spec => _query.For <EntityName>().WhereMatched(spec), _identityComparer, _completeComparer); var changes = dataChangesDetector.DetectChanges(specification); _bulkRepository.Delete(changes.Complement); _bulkRepository.Create(changes.Difference); _bulkRepository.Update(changes.Intersection); } } return(Array.Empty <IEvent>()); }