Exemple #1
0
        private static ProcessingRulEngStore AllOperations(this ProcessingRulEngStore newState, RulEngStore previousState, IOpReqProcessing prescription)
        {
            // First identify RuleResults that have just been processed successfully
            var ruleResultIds = newState.RuleResults
                                .Where(v => v.Detail)
                                .Select(v => v.RuleResultId)
                                .ToList();

            var opType = prescription is OperationMxProcessing
                ? OperationType.CreateUpdate
                : prescription is OperationDxProcessing
                    ? OperationType.Delete
                    : prescription is OperationSxProcessing
                        ? OperationType.Search
                        : OperationType.Unknown; // When the prescription is for requests

            // Find all relevant operations/requests for the identified rule results and then filter down by execution date
            var possibleOps = newState.Operations
                              .Where(a => ruleResultIds.Contains(a.RuleResultId) && a.OperationType == opType).ToList();
            var operationprescriptionsToProcessList = (
                from op in possibleOps
                let rr = newState.RuleResults.First(r => r.RuleResultId == op.RuleResultId)
                         where rr.LastChanged > op.LastExecuted
                         select op)
                                                      .ToList();
            var requestprescriptionsToProcessList = (
                from rq in newState.Requests.Where(a => ruleResultIds.Contains(a.RuleResultId))
                let rr = newState.RuleResults.First(r => r.RuleResultId == rq.RuleResultId)
                         where rr.LastChanged > rq.LastExecuted
                         select rq)
                                                    .ToList();

            // Restrict the Operation/Request Prescriptions to process to those that are guaranteed not to fail
            // Select those for which there is no conflict
            var destinationEntities = new List <TypeKey>();

            foreach (var opPre in operationprescriptionsToProcessList)
            {
                destinationEntities.AddRange(opPre.Operands.Select(o => (TypeKey)o));
            }
            foreach (var rqPre in requestprescriptionsToProcessList)
            {
                destinationEntities.Add(rqPre);
            }

            var groupedDestinations = destinationEntities
                                      .GroupBy(de => new EntMatch {
                EntityId = de.EntityId, EntType = de.EntType
            })
                                      .Select(grp => new { grp.Key, Count = grp.Count() })
                                      .ToList();
            //var conflictDestinations = groupedDestinations
            //    .Where(grp => grp.Count > 1)
            //    .Select(grp => new TypeKey { EntityId = grp.Key.EntityId, EntTags = grp.Key.EntTags, EntType = grp.Key.EntType })
            //    .ToList();
            var acceptableDestinations = groupedDestinations
                                         .Where(grp => grp.Count == 1)
                                         .Select(grp => grp.Key)
                                         .ToList();

            if (prescription is OperationMxProcessing)
            {
                newState = OperationMxProcessing(newState, previousState, ruleResultIds, operationprescriptionsToProcessList, acceptableDestinations);
            }
            if (prescription is OperationDxProcessing)
            {
                newState = OperationDxProcessing(newState, ruleResultIds, operationprescriptionsToProcessList, acceptableDestinations);
            }
            if (prescription is OperationSxProcessing)
            {
                newState = OperationSxProcessing(newState, previousState, ruleResultIds, operationprescriptionsToProcessList, acceptableDestinations);
            }

            return(newState);
        }
Exemple #2
0
        public static RulEngStore ProcessAllOperationsReducer(RulEngStore previousState, IOpReqProcessing prescription)
        {
            // Set up a temporary 'Processing' copy of the Store as our Unit of Work
            var newState = previousState.DeepClone();

            newState = newState.AllOperations(previousState, prescription);

            return(newState.DeepClone());
        }