public IReadOnlyDictionary <IEntityType, HashSet <long> > Filter(TrackedUseCase trackedUseCase)
        {
            var filteredOperations = FilterByIgnoredOperations(trackedUseCase);
            var changes            = FilterByEntityTypes(filteredOperations);

            return(changes);
        }
        protected override AggregatableMessage <ICommand> Process(TrackedUseCase trackedUseCase)
        {
            var commands = _commandFactory.CreateCommands(trackedUseCase).ToList();

            return(new AggregatableMessage <ICommand>
            {
                TargetFlow = MessageFlow,
                Commands = commands,
            });
        }
Example #3
0
        public static TrackedUseCase UpdateFirms()
        {
            var operationIdentity = new StrictOperationIdentity(UpdateIdentity.Instance, new EntitySet(EntityTypeFirm.Instance));
            var changes           = new[]
            {
                ChangeDescriptor.Create(EntityTypeFirm.Instance, 12, ChangeKind.Updated),
                ChangeDescriptor.Create(EntityTypeFirm.Instance, 13, ChangeKind.Updated)
            };

            var operations = new[]
            {
                new OperationDescriptor(Guid.NewGuid(), operationIdentity, new OperationContext(DateTimeOffset.UtcNow, DateTime.UtcNow), new EntityChangesContext(changes))
            };

            var context = new UseCaseContext(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow, 0);
            var useCase = new TrackedUseCase(context, operations[0].Id, operations, new Dictionary <Guid, HashSet <Guid> >());

            return(useCase);
        }
        public static TrackedUseCase UpdateFirms()
        {
            var operationIdentity = new StrictOperationIdentity(UpdateIdentity.Instance, new EntitySet(EntityTypeFirm.Instance));
            var changes = new[]
                          {
                              ChangeDescriptor.Create(EntityTypeFirm.Instance, 12, ChangeKind.Updated),
                              ChangeDescriptor.Create(EntityTypeFirm.Instance, 13, ChangeKind.Updated)
                          };

            var operations = new[]
                             {
                                 new OperationDescriptor(Guid.NewGuid(), operationIdentity, new OperationContext(DateTimeOffset.UtcNow, DateTime.UtcNow), new EntityChangesContext(changes))
                             };

            var context = new UseCaseContext(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow, 0);
            var useCase = new TrackedUseCase(context, operations[0].Id, operations, new Dictionary<Guid, HashSet<Guid>>());

            return useCase;
        }
        private IEnumerable <OperationDescriptor> FilterByIgnoredOperations(TrackedUseCase message)
        {
            var operations = (IEnumerable <OperationDescriptor>)message.Operations;

            var ignoredOperations = operations.Where(x => _operationsRegistry.IsIgnoredOperation(x.OperationIdentity));
            var operationIds      = ignoredOperations.Aggregate(new HashSet <Guid>(), (hashSet, operation) =>
            {
                hashSet.Add(operation.Id);
                hashSet.UnionWith(message.GetNestedOperations(operation.Id).Select(x => x.Id));
                return(hashSet);
            });

            if (operationIds.Any())
            {
                operations = operations.Where(x => !operationIds.Contains(x.Id));
            }

            return(operations);
        }
Example #6
0
        private static IEnumerable <OperationDescriptor> Filter(TrackedUseCase message)
        {
            var operations = (IEnumerable <OperationDescriptor>)message.Operations;

            var disallowedIds        = new HashSet <Guid>();
            var disallowedOperations = operations.Where(x => OperationIdentityMetadata.DisallowedOperationIdentities.Contains(x.OperationIdentity));

            foreach (var disallowedOperation in disallowedOperations)
            {
                disallowedIds.Add(disallowedOperation.Id);
                disallowedIds.UnionWith(message.GetNestedOperations(disallowedOperation.Id).Select(x => x.Id));
            }

            if (disallowedIds.Any())
            {
                operations = operations.Where(x => !disallowedIds.Contains(x.Id));
            }

            return(operations);
        }
Example #7
0
        protected override OperationAggregatableMessage <FactOperation> Process(TrackedUseCase message)
        {
            _tracer.DebugFormat("Processing TUC {0}", message.Id);

            var receivedOperationCount = message.Operations.Sum(x => x.AffectedEntities.Changes.Sum(y => y.Value.Sum(z => z.Value.Count)));

            _telemetryPublisher.Publish <ErmReceivedOperationCountIdentity>(receivedOperationCount);

            var filteredOperations = Filter(message);
            var factOperations     = Convert(filteredOperations).ToArray();

            _telemetryPublisher.Publish <ErmEnqueuedOperationCountIdentity>(factOperations.Length);

            return(new OperationAggregatableMessage <FactOperation>
            {
                TargetFlow = MessageFlow,
                Operations = factOperations,
                OperationTime = message.Context.Finished.UtcDateTime,
            });
        }
Example #8
0
        protected override OperationAggregatableMessage <FactOperation> Process(TrackedUseCase message)
        {
            _tracer.DebugFormat("Processing TUC {0}", message.Id);

            var receivedOperationCount = message.Operations.Sum(x => x.AffectedEntities.Changes.Sum(y => y.Value.Sum(z => z.Value.Count)));

            _telemetryPublisher.Publish <ErmReceivedOperationCountIdentity>(receivedOperationCount);

            var changes = _useCaseFiltrator.Filter(message);

            // TODO: вместо кучи factoperation можно передавать одну с dictionary, где уже всё сгруппировано по entity type
            var factOperations = changes.SelectMany(x => x.Value.Select(y => new FactOperation(_registry.GetEntityType(x.Key), y))).ToList();

            _telemetryPublisher.Publish <ErmEnqueuedOperationCountIdentity>(factOperations.Count);

            return(new OperationAggregatableMessage <FactOperation>
            {
                TargetFlow = MessageFlow,
                Operations = factOperations,
                OperationTime = message.Context.Finished.UtcDateTime,
            });
        }