/// <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); }
/// <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); }