Example #1
0
        public object Execute(VariableContext context = null)
        {
            var funcName = _function.Execute(context);

            if (funcName is Variable outFuncVar && outFuncVar.ValueType == DataTypeEnum.Function)
            {
                if (_parameters is PositionalParameters)
                {
                    var lVars = RetrieveListOfParameters(context);
                    return(outFuncVar.UserFunction.Execute(lVars, context));
                }
                if (_parameters is NamedParameters nParams)
                {
                    return(outFuncVar.UserFunction.Execute(null, context, nParams));
                }
            }

            if (funcName is Variable outFuncName && outFuncName.ValueType == DataTypeEnum.String)
            {
                List <Variable> lVars = new List <Variable> ();

                if (_parameters is PositionalParameters)
                {
                    lVars = RetrieveListOfParameters(context);
                    if (VariableContextHelper.RetrieveBkm(outFuncName, context, out var bkmMeta))
                    {
                        return(DMNDoerHelper.EvalBkm(bkmMeta.BKMModel, context, lVars));
                    }
                    if (context.DecisionServiceMetaByName.TryGetValue(outFuncName, out var decisionService))
                    {
                        return(DMNDoerHelper.EvalDecisionService(decisionService, context, lVars));
                    }
                }

                if (_parameters is NamedParameters namedParam)
                {
                    if (VariableContextHelper.RetrieveBkm(outFuncName, context, out var bkmMeta))
                    {
                        lVars = BKMConvertNamedParameter(namedParam, bkmMeta.BKMModel, context);
                        return(DMNDoerHelper.EvalBkm(bkmMeta.BKMModel, context, lVars));
                    }
                    if (context.DecisionServiceMetaByName.TryGetValue(outFuncName, out var decisionService))
                    {
                        lVars = DecisionServiceConvertNamedParameter(namedParam, decisionService, context);
                        return(DMNDoerHelper.EvalDecisionService(decisionService, context, lVars));
                    }
                }

                var funcMeta = BuiltInFactory.GetFunc(outFuncName);

                if (_parameters is NamedParameters nParam)
                {
                    lVars = BuiltInFactory.ConvertNamedParameter(nParam, funcMeta.Item2, context);
                }

                return(funcMeta.Item1.Execute(lVars));
            }

            throw new FEELException("Function name is not a variable of string type");
        }