Exemplo n.º 1
0
        public void Initialize(IReadOnlyCollection <InitializeAggregate> commands)
        {
            var specification = _findSpecificationProvider.Create(commands);
            var mergeResult   = _aggregateChangesDetector.DetectChanges(specification);

            _repository.Create(mergeResult.Difference);

            ApplyChangesToValueObjects(commands);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 8
0
        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);
        }