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); }
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()); }