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);
        }
예제 #2
0
        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);
        }