コード例 #1
0
        /// <summary>
        /// Builds the expression decision definition
        /// </summary>
        /// <returns>Decision definition built</returns>
        /// <exception cref="DmnBuilderException">Throws <see cref="DmnBuilderException"/> when the definition has already been built</exception>
        /// <exception cref="DmnBuilderException">Throws <see cref="DmnBuilderException"/> when the expression or output variable is not defined in builder</exception>
        protected internal override IDmnDecision Build()
        {
            if (IsBuilt)
            {
                throw Logger.Error <DmnBuilderException>("Decision is already built");
            }

            if (OutputVariableInternal == null)
            {
                throw Logger.Error <DmnBuilderException>($"Missing output variable for expression decision {Name}");
            }

            if (string.IsNullOrWhiteSpace(Expression))
            {
                throw Logger.Error <DmnBuilderException>($"Missing expression for expression decision {Name}");
            }

            //create
            var expressionDecision = new DmnExpressionDecision(
                Name,
                Expression,
                OutputVariableInternal.GetResultOrBuild(),
                RequiredInputs.Select(i => Variables[i].GetResultOrBuild()).ToArray(),
                RequiredDecisions.Select(d => Decisions[d].GetResultOrBuild()).ToArray());

            ResultInternal = expressionDecision;
            return(expressionDecision);
        }
コード例 #2
0
        /// <summary>
        /// Validates the <paramref name="sourceDecision"/> within the <see cref="DmnModel"/>
        /// and creates <see cref="DmnExpressionDecision"/>
        /// </summary>
        /// <param name="sourceDecision">Decision source parsed from XML</param>
        /// <param name="decisionName">Unique name of decision</param>
        /// <param name="requiredInputs">Inputs required by decision</param>
        /// <param name="requiredDecisions">Decisions, the decision table depends on</param>
        ///<exception cref="ArgumentNullException"><paramref name="sourceDecision"/>, <paramref name="decisionName"/>, <paramref name="requiredInputs"/> or <paramref name="requiredDecisions"/> is null.</exception>
        ///<exception cref="ArgumentException"><paramref name="decisionName"/> is empty</exception>
        /// <exception cref="DmnParserException">Missing expression for expression decision</exception>
        /// <exception cref="DmnParserException">Missing output variable for expression decision</exception>
        protected DmnExpressionDecision CreateExpressionDecision(
            Decision sourceDecision,
            string decisionName,
            IReadOnlyCollection <IDmnVariable> requiredInputs,
            IReadOnlyCollection <IDmnDecision> requiredDecisions)
        {
            if (sourceDecision == null)
            {
                throw Logger.Fatal <ArgumentNullException>($"{nameof(sourceDecision)} is null");
            }
            if (decisionName == null)
            {
                throw Logger.Fatal <ArgumentNullException>($"{nameof(decisionName)} is null");
            }
            if (string.IsNullOrWhiteSpace(decisionName))
            {
                throw Logger.Fatal <ArgumentException>($"{nameof(decisionName)} is empty");
            }
            if (requiredInputs == null)
            {
                throw Logger.Fatal <ArgumentNullException>($"{nameof(requiredInputs)} is null");
            }
            if (requiredDecisions == null)
            {
                throw Logger.Fatal <ArgumentNullException>($"{nameof(requiredDecisions)} is null");
            }

            //prepare output variable
            if (sourceDecision.OutputVariable == null)
            {
                throw Logger.Fatal <DmnParserException>($"Missing output variable for expression decision {decisionName}");
            }
            var sourceVariableName = !string.IsNullOrWhiteSpace(sourceDecision.OutputVariable.Name)
                ? sourceDecision.OutputVariable.Name
                : sourceDecision.OutputVariable.Id;
            var variableName = DmnVariableDefinition.NormalizeVariableName(sourceVariableName);

            if (!Variables.TryGetValue(variableName, out var variable))
            {
                //create variable
                variable = new DmnVariableDefinition(variableName);
                Variables.Add(variableName, variable);
            }

            variable.AddValueSetter($"Expression Decision {decisionName}");
            CheckAndUpdateVariableType(variable, sourceDecision.OutputVariable.TypeRef);

            //prepare expression
            if (string.IsNullOrWhiteSpace(sourceDecision.Expression.Text))
            {
                throw Logger.Fatal <DmnParserException>($"Missing expression for expression decision {decisionName}");
            }
            var expr = $"{sourceDecision.Expression.Text}";

            //create
            var expressionDecision = new DmnExpressionDecision(decisionName, expr, variable, requiredInputs, requiredDecisions);

            return(expressionDecision);
        }