Exemple #1
0
        /// <summary>
        /// This will execute the compiled rules
        /// </summary>
        /// <param name="workflowName"></param>
        /// <param name="ruleParams"></param>
        /// <returns>list of rule result set</returns>
        private List <RuleResultTree> ExecuteRuleByWorkflow(string workflowName, RuleParameter[] ruleParameters)
        {
            _logger.LogTrace($"Compiled rules found for {workflowName} workflow and executed");

            List <RuleResultTree> result = new List <RuleResultTree>();
            string compileRulesKey       = _rulesCache.GetRulesCacheKey(workflowName);

            foreach (var compiledRule in _rulesCache.GetCompiledRules(compileRulesKey))
            {
                IEnumerable <RuleParameter> evaluatedRuleParams = new List <RuleParameter>(ruleParameters);
                if (compiledRule?.CompiledParameters?.CompiledParameters != null)
                {
                    foreach (var compiledParam in compiledRule?.CompiledParameters?.CompiledParameters)
                    {
                        var evaluatedParam = ruleParamCompiler.EvaluateCompiledParam(compiledParam.Name, compiledParam.Value, evaluatedRuleParams);
                        evaluatedRuleParams = evaluatedRuleParams.Concat(new List <RuleParameter> {
                            evaluatedParam
                        });
                    }
                }

                var inputs     = evaluatedRuleParams.Select(c => c.Value);
                var resultTree = compiledRule.Rule.DynamicInvoke(new List <object>(inputs)
                {
                    new RuleInput()
                }.ToArray()) as RuleResultTree;
                resultTree.RuleEvaluatedParams = evaluatedRuleParams;
                result.Add(resultTree);
            }

            FormatErrorMessages(result?.Where(r => !r.IsSuccess));
            return(result);
        }
        private RuleFunc <RuleResultTree> CompileRule(string workflowName, RuleParameter[] ruleParams, Rule rule)
        {
            if (!_reSettings.EnableLocalParams)
            {
                return(_ruleCompiler.CompileRule(rule, ruleParams));
            }
            var compiledParamsKey = GetCompiledParamsCacheKey(workflowName, rule.RuleName, ruleParams);
            IEnumerable <CompiledParam> compiledParamList = _compiledParamsCache.GetOrCreate(compiledParamsKey, (entry) => _ruleParamCompiler.CompileParamsExpression(rule, ruleParams));
            var compiledRuleParameters = compiledParamList?.Select(c => c.AsRuleParameter()) ?? new List <RuleParameter>();
            var updatedRuleParams      = ruleParams?.Concat(compiledRuleParameters);
            var compiledRule           = _ruleCompiler.CompileRule(rule, updatedRuleParams?.ToArray());

            RuleFunc <RuleResultTree> updatedRule = (RuleParameter[] paramList) =>
            {
                var inputs = paramList.AsEnumerable();
                IEnumerable <CompiledParam> localParams = compiledParamList ?? new List <CompiledParam>();
                var evaluatedParamList = new List <RuleParameter>();
                foreach (var localParam in localParams)
                {
                    var evaluatedLocalParam = _ruleParamCompiler.EvaluateCompiledParam(localParam.Name, localParam.Value, inputs);
                    inputs = inputs.Append(evaluatedLocalParam);
                    evaluatedParamList.Add(evaluatedLocalParam);
                }
                var result = compiledRule(inputs.ToArray());
                result.RuleEvaluatedParams = evaluatedParamList;
                return(result);
            };

            return(updatedRule);
        }
        /// <summary>
        /// This will compile the rules and store them to dictionary
        /// </summary>
        /// <param name="workflowName">workflow name</param>
        /// <param name="ruleParams">The rule parameters.</param>
        /// <returns>
        /// bool result
        /// </returns>
        private bool RegisterRule(string workflowName, params RuleParameter[] ruleParams)
        {
            string compileRulesKey = _rulesCache.GetRulesCacheKey(workflowName);

            if (_rulesCache.ContainsCompiledRules(compileRulesKey))
            {
                return(true);
            }

            var workflowRules = _rulesCache.GetWorkFlowRules(workflowName);

            if (workflowRules != null)
            {
                var lstFunc      = new List <RuleFunc <RuleResultTree> >();
                var ruleCompiler = new RuleCompiler(new RuleExpressionBuilderFactory(_reSettings), _logger);
                foreach (var rule in _rulesCache.GetRules(workflowName))
                {
                    var compiledParamsKey = GetCompiledParamsCacheKey(workflowName, rule);
                    CompiledRuleParam compiledRuleParam = _compiledParamsCache.GetOrCreate(compiledParamsKey, (entry) => ruleParamCompiler.CompileParamsExpression(rule, ruleParams));

                    var updatedRuleParams = compiledRuleParam != null?ruleParams?.Concat(compiledRuleParam?.RuleParameters) : ruleParams;

                    var compiledRule = ruleCompiler.CompileRule(rule, updatedRuleParams?.ToArray());

                    RuleFunc <RuleResultTree> updatedRule = (object[] paramList) => {
                        var inputs = paramList.AsEnumerable();
                        IEnumerable <CompiledParam> localParams = compiledRuleParam?.CompiledParameters ?? new List <CompiledParam>();
                        foreach (var localParam in localParams)
                        {
                            var evaluatedLocalParam = ruleParamCompiler.EvaluateCompiledParam(localParam.Name, localParam.Value, inputs);
                            inputs = inputs.Append(evaluatedLocalParam.Value);
                        }
                        var result = compiledRule(inputs.ToArray());
                        result.RuleEvaluatedParams = compiledRuleParam?.RuleParameters;
                        return(result);
                    };
                    lstFunc.Add(updatedRule);
                }

                _rulesCache.AddOrUpdateCompiledRule(compileRulesKey, lstFunc);
                _logger.LogTrace($"Rules has been compiled for the {workflowName} workflow and added to dictionary");
                return(true);
            }
            else
            {
                return(false);
            }
        }