public CalculationModelResponse Calculate(JsonCalculationRequestModel calculationRequestModel) { var assembly = BuildAssembly(calculationRequestModel); var objectInfos = new List <CalculationObjectInfo>(); List <object> calculationObjects = new List <object>(); foreach (var calculationObject in calculationRequestModel.CalculationObjects) { var objectType = assembly.GetType($"Theia.{calculationObject.RootClassName}"); if (calculationObject.Data is JArray) { Type genericListType = typeof(List <>).MakeGenericType(objectType); var listType = Activator.CreateInstance(genericListType).GetType(); calculationObjects.AddRange(((IList)calculationObject.Data.ToObject(listType)).Cast <object>()); } else if (calculationObject.Data is JObject) { calculationObjects.Add(calculationObject.Data.ToObject(objectType)); } objectInfos.Add(new CalculationObjectInfo(calculationObject.RootClassName, objectType)); } var types = objectInfos.Select(x => x.Type).ToList(); var countExequtedRules = Calculate(assembly, types, calculationRequestModel.Rules, calculationObjects); var response = new CalculationModelResponse { FiredRules = countExequtedRules }; foreach (var objectInfo in objectInfos) { var data = calculationObjects.OfType(objectInfo.Type).ToList(); response.CalculationObjects.Add(new CalculationObjectModel <object> { Data = data, RootClassName = objectInfo.RootClassName }); } return(response); }
public bool IsValid(CalculationModelRequest request, out CalculationModelResponse response) { response = new CalculationModelResponse { CorrelationId = _context.CorrelationId }; if (request == null) { response.Errors = new List <ValidationMessage> { new ValidationMessage { Type = ValidationType.Input, Message = _localizer["calculation-model:no-request"].Value, Code = "no_request" } }; return(false); } if (request.Values == null || request.Values.Count < 2) { response.Errors = new List <ValidationMessage> { new ValidationMessage { Type = ValidationType.Input, Message = _localizer["calculation-model:must-contain-more-than-one"].Value, Code = "more_than_one", Parameter = "values" } }; return(false); } return(true); }