public void Initialize(IReadOnlyCollection <InitializeAggregate> commands) { var specification = _findSpecificationProvider.Create(commands); var mergeResult = _aggregateChangesDetector.DetectChanges(specification); _repository.Create(mergeResult.Difference); ApplyChangesToValueObjects(commands); }
public void Initialize(IReadOnlyCollection <long> ids) { var mergeResult = _aggregateChangesDetector.DetectChanges(Specs.Map.ToIds <T>(), _metadata.FindSpecificationProvider.Invoke(ids), EqualityComparer <long> .Default); var createFilter = _metadata.FindSpecificationProvider.Invoke(mergeResult.Difference.ToArray()); var aggregatesToCreate = _metadata.MapSpecificationProviderForSource.Invoke(createFilter).Map(_query); _repository.Create(aggregatesToCreate); ApplyChangesToValueObjects(ids); }
public IReadOnlyCollection <IOperation> Execute(IReadOnlyCollection <FactOperation> commands) { var spec = _findSpecificationProvider.Create(commands.Select(x => x.FactId).ToArray()); var changes = _changesDetector.DetectChanges(spec); var result = new List <IOperation>(); var factsToCreate = changes.Difference.ToArray(); var factsToUpdate = changes.Intersection.ToArray(); var factsToDelete = changes.Complement.ToArray(); // Create _repository.Create(factsToCreate); result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessCreation(factsToCreate.Select(_identityProvider).ToArray()))); // Update result.AddRange(_indirectDepencencyProcessors.SelectMany(x => x.ProcessUpdating(factsToUpdate.Select(_identityProvider).ToArray()))); _repository.Update(factsToUpdate); result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessUpdating(factsToUpdate.Select(_identityProvider).ToArray()))); // Delete result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessDeletion(factsToDelete.Select(_identityProvider).ToArray()))); _repository.Delete(factsToDelete); return(result); }
public void Execute(IReadOnlyCollection <AggregateOperation> commands) { var spec = _findSpecificationProvider.Create(commands); var mergeResult = _changesDetector.DetectChanges(spec); _repository.Delete(mergeResult.Complement); _repository.Create(mergeResult.Difference); }
public void ApplyChanges(IReadOnlyCollection <long> ids) { var mergeResult = _changesDetector.DetectChanges(Specs.Map.ZeroMapping <T>(), _metadata.FindSpecificationProvider.Invoke(ids), _equalityComparerFactory.CreateIdentityComparer <T>()); _repository.Delete(mergeResult.Complement); _repository.Create(mergeResult.Difference); _repository.Update(mergeResult.Intersection); }
public void Execute(IReadOnlyCollection <RecalculateStatisticsOperation> commands) { var filter = _metadata.FindSpecificationProvider.Invoke(commands.Select(c => c.EntityId).ToArray()); // Сначала сравниением получаем различающиеся записи, // затем получаем те из различающихся, которые совпадают по идентификатору. var intermediateResult = _changesDetector.DetectChanges(filter); var changes = MergeTool.Merge(intermediateResult.Difference, intermediateResult.Complement, _equalityComparerFactory.CreateIdentityComparer <T>()); _repository.Delete(changes.Complement); _repository.Create(changes.Difference); _repository.Update(changes.Intersection); }
public void RecalculateStatistics(long projectId, IReadOnlyCollection <long?> categoryIds) { var filter = _metadata.FindSpecificationProvider.Invoke(projectId, categoryIds); // Сначала сравниением получаем различающиеся записи, // затем получаем те из различающихся, которые совпадают по идентификатору. var intermediateResult = _changesDetector.DetectChanges(Specs.Map.ZeroMapping <T>(), filter, _equalityComparerFactory.CreateCompleteComparer <T>()); var changes = MergeTool.Merge(intermediateResult.Difference, intermediateResult.Complement, _equalityComparerFactory.CreateIdentityComparer <T>()); // Наличие или отсутствие статистики - не повод создавать или удалять рубрики у фирм. // Поэтому только обновление. _repository.Update(changes.Intersection); }
public IReadOnlyCollection <IOperation> ApplyChanges(IReadOnlyCollection <long> ids) { var changes = _changesDetector.DetectChanges(Specs.Map.ToIds <TFact>(), _factMetadata.FindSpecificationProvider.Invoke(ids), EqualityComparer <long> .Default); var result = new List <IOperation>(); var idsToCreate = changes.Difference.ToArray(); var idsToUpdate = changes.Intersection.ToArray(); var idsToDelete = changes.Complement.ToArray(); // Create CreateFact(idsToCreate); result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessCreation(idsToCreate))); // Update result.AddRange(_indirectDepencencyProcessors.SelectMany(x => x.ProcessUpdating(idsToUpdate))); UpdateFact(idsToUpdate); result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessUpdating(idsToUpdate))); // Delete result.AddRange(_depencencyProcessors.SelectMany(x => x.ProcessDeletion(idsToDelete))); DeleteFact(idsToDelete); return(result); }