Search in sources :

Example 21 with DecisionNode

use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.

the class DMNRuntimeImpl method createResult.

private DMNResultImpl createResult(DMNModel model, DMNContext context) {
    DMNResultImpl result = new DMNResultImpl(model);
    result.setContext(context.clone());
    for (DecisionNode decision : model.getDecisions()) {
        result.setDecisionResult(decision.getId(), new DMNDecisionResultImpl(decision.getId(), decision.getName()));
    }
    return result;
}
Also used : DecisionNode(org.kie.dmn.api.core.ast.DecisionNode)

Example 22 with DecisionNode

use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.

the class DMNScenarioRunnerHelperTest method commonExtractResultMetadata.

public void commonExtractResultMetadata(List<DMNMessage> messages) {
    Set<DecisionNode> decisions = new HashSet<>();
    IntStream.range(0, 5).forEach(index -> decisions.add(createDecisionMock("decision" + index)));
    when(dmnModelMock.getDecisions()).thenReturn(decisions);
    List<DMNDecisionResult> decisionResults = new ArrayList<>();
    decisionResults.add(createDecisionResultMock("decision2", true, messages));
    decisionResults.add(createDecisionResultMock("decision3", false, messages));
    when(dmnResultMock.getDecisionResults()).thenReturn(decisionResults);
    ScenarioWithIndex scenarioWithIndex = new ScenarioWithIndex(1, scenario1);
    ScenarioResultMetadata scenarioResultMetadata = runnerHelper.extractResultMetadata(requestContextMock, scenarioWithIndex);
    assertEquals(scenarioWithIndex, scenarioResultMetadata.getScenarioWithIndex());
    assertEquals(5, scenarioResultMetadata.getAvailable().size());
    assertTrue(scenarioResultMetadata.getAvailable().contains("decision1"));
    assertEquals(1, scenarioResultMetadata.getExecuted().size());
    assertTrue(scenarioResultMetadata.getExecuted().contains("decision2"));
    assertFalse(scenarioResultMetadata.getExecuted().contains("decision3"));
    final List<AuditLogLine> auditLogLines = scenarioResultMetadata.getAuditLogLines();
    assertNotNull(auditLogLines);
    if (messages == null) {
        assertEquals(decisionResults.size(), auditLogLines.size());
        for (int i = 0; i < decisionResults.size(); i++) {
            commonCheckAuditLogLine(auditLogLines.get(i), decisionResults.get(i).getDecisionName(), decisionResults.get(i).getEvaluationStatus().name(), null);
        }
    } else {
        List<String> expectedDecisions = Arrays.asList("decision2", "decision3");
        List<String> expectedResults = Arrays.asList(DecisionEvaluationStatus.SUCCEEDED.toString(), DecisionEvaluationStatus.FAILED.toString());
        int expectedLines = messages.size() * expectedDecisions.size();
        assertEquals(expectedLines, auditLogLines.size());
        for (int i = 0; i < auditLogLines.size(); i++) {
            int messagesIndex = i < messages.size() ? i : i - messages.size();
            String decisionName = i < messages.size() ? expectedDecisions.get(0) : expectedDecisions.get(1);
            String expectedResultName = i < messages.size() ? expectedResults.get(0) : expectedResults.get(1);
            commonCheckAuditLogLine(auditLogLines.get(i), decisionName, expectedResultName, messages.get(messagesIndex).getLevel().name() + ": " + messages.get(messagesIndex).getText());
        }
    }
}
Also used : AuditLogLine(org.drools.scenariosimulation.api.model.AuditLogLine) TestUtils.commonCheckAuditLogLine(org.drools.scenariosimulation.backend.TestUtils.commonCheckAuditLogLine) ArrayList(java.util.ArrayList) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode) Mockito.anyString(org.mockito.Mockito.anyString) ScenarioResultMetadata(org.drools.scenariosimulation.backend.runner.model.ScenarioResultMetadata) DMNDecisionResult(org.kie.dmn.api.core.DMNDecisionResult) ScenarioWithIndex(org.drools.scenariosimulation.api.model.ScenarioWithIndex) HashSet(java.util.HashSet)

Example 23 with DecisionNode

use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.

the class DMNRuntimeImpl method evaluateAll.

@Override
public DMNResult evaluateAll(DMNModel model, DMNContext context) {
    Objects.requireNonNull(model, () -> MsgUtil.createMessage(Msg.PARAM_CANNOT_BE_NULL, "model"));
    Objects.requireNonNull(context, () -> MsgUtil.createMessage(Msg.PARAM_CANNOT_BE_NULL, "context"));
    boolean performRuntimeTypeCheck = performRuntimeTypeCheck(model);
    DMNResultImpl result = createResult(model, context);
    DMNRuntimeEventManagerUtils.fireBeforeEvaluateAll(eventManager, model, result);
    // the engine should evaluate all Decisions belonging to the "local" model namespace, not imported decision explicitly.
    Set<DecisionNode> decisions = model.getDecisions().stream().filter(d -> d.getModelNamespace().equals(model.getNamespace())).collect(Collectors.toSet());
    for (DecisionNode decision : decisions) {
        evaluateDecision(context, result, decision, performRuntimeTypeCheck);
    }
    DMNRuntimeEventManagerUtils.fireAfterEvaluateAll(eventManager, model, result);
    return result;
}
Also used : MsgUtil(org.kie.dmn.core.util.MsgUtil) DMNType(org.kie.dmn.api.core.DMNType) DMNMessage(org.kie.dmn.api.core.DMNMessage) DMNResult(org.kie.dmn.api.core.DMNResult) LoggerFactory(org.slf4j.LoggerFactory) DMNDecisionServiceEvaluator(org.kie.dmn.core.ast.DMNDecisionServiceEvaluator) DMNOption(org.kie.dmn.core.compiler.DMNOption) EVALUATING(org.kie.dmn.api.core.DMNDecisionResult.DecisionEvaluationStatus.EVALUATING) DecisionServiceNodeImpl(org.kie.dmn.core.ast.DecisionServiceNodeImpl) KieRuntimeFactory(org.kie.api.runtime.KieRuntimeFactory) DMNModel(org.kie.dmn.api.core.DMNModel) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode) FEELFunction(org.kie.dmn.feel.runtime.FEELFunction) DMNBaseNode(org.kie.dmn.core.ast.DMNBaseNode) Map(java.util.Map) BiConsumer(java.util.function.BiConsumer) EvaluatorResult(org.kie.dmn.core.api.EvaluatorResult) DMNRuntime(org.kie.dmn.api.core.DMNRuntime) InputDataNodeImpl(org.kie.dmn.core.ast.InputDataNodeImpl) DMNProfile(org.kie.dmn.core.compiler.DMNProfile) InternalKnowledgeBase(org.drools.kiesession.rulebase.InternalKnowledgeBase) BeforeEvaluateDecisionEvent(org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent) DMNRuntimeEventListener(org.kie.dmn.api.core.event.DMNRuntimeEventListener) DMNFactory(org.kie.dmn.core.api.DMNFactory) Logger(org.slf4j.Logger) DMNNode(org.kie.dmn.api.core.ast.DMNNode) BusinessKnowledgeModelNodeImpl(org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl) DMNFunctionWithReturnType(org.kie.dmn.core.ast.DMNFunctionWithReturnType) SKIPPED(org.kie.dmn.api.core.DMNDecisionResult.DecisionEvaluationStatus.SKIPPED) Collection(java.util.Collection) Set(java.util.Set) FAILED(org.kie.dmn.api.core.DMNDecisionResult.DecisionEvaluationStatus.FAILED) Collectors(java.util.stream.Collectors) BusinessKnowledgeModelNode(org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode) RuntimeTypeCheckOption(org.kie.dmn.core.compiler.RuntimeTypeCheckOption) Objects(java.util.Objects) List(java.util.List) DMNContext(org.kie.dmn.api.core.DMNContext) Optional(java.util.Optional) DecisionServiceNode(org.kie.dmn.api.core.ast.DecisionServiceNode) InputDataNode(org.kie.dmn.api.core.ast.InputDataNode) QName(javax.xml.namespace.QName) Msg(org.kie.dmn.core.util.Msg) DMNDecisionResult(org.kie.dmn.api.core.DMNDecisionResult) DecisionNodeImpl(org.kie.dmn.core.ast.DecisionNodeImpl) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode)

Example 24 with DecisionNode

use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.

the class DMNRuntimeImpl method evaluateDecision.

private boolean evaluateDecision(DMNContext context, DMNResultImpl result, DecisionNode d, boolean typeCheck) {
    DecisionNodeImpl decision = (DecisionNodeImpl) d;
    String decisionId = d.getModelNamespace().equals(result.getModel().getNamespace()) ? decision.getId() : decision.getModelNamespace() + "#" + decision.getId();
    if (isNodeValueDefined(result, decision, decision)) {
        // already resolved
        return true;
    } else {
        // check if the decision was already evaluated before and returned error
        DMNDecisionResult.DecisionEvaluationStatus status = Optional.ofNullable(result.getDecisionResultById(decisionId)).map(DMNDecisionResult::getEvaluationStatus).orElse(// it might be an imported Decision.
        DMNDecisionResult.DecisionEvaluationStatus.NOT_EVALUATED);
        if (FAILED == status || SKIPPED == status || EVALUATING == status) {
            return false;
        }
    }
    BeforeEvaluateDecisionEvent beforeEvaluateDecisionEvent = null;
    try {
        beforeEvaluateDecisionEvent = DMNRuntimeEventManagerUtils.fireBeforeEvaluateDecision(eventManager, decision, result);
        boolean missingInput = false;
        DMNDecisionResultImpl dr = (DMNDecisionResultImpl) result.getDecisionResultById(decisionId);
        if (dr == null) {
            // an imported Decision now evaluated, requires the creation of the decision result:
            String decisionResultName = d.getName();
            Optional<String> importAliasFor = ((DMNModelImpl) result.getModel()).getImportAliasFor(d.getModelNamespace(), d.getModelName());
            if (importAliasFor.isPresent()) {
                decisionResultName = importAliasFor.get() + "." + d.getName();
            }
            dr = new DMNDecisionResultImpl(decisionId, decisionResultName);
            if (importAliasFor.isPresent()) {
                // otherwise is a transitive, skipped and not to be added to the results:
                result.addDecisionResult(dr);
            }
        }
        dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.EVALUATING);
        for (DMNNode dep : decision.getDependencies().values()) {
            try {
                if (typeCheck && !checkDependencyValueIsValid(dep, result)) {
                    missingInput = true;
                    DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, ((DMNBaseNode) dep).getSource(), result, null, null, Msg.ERROR_EVAL_NODE_DEP_WRONG_TYPE, getIdentifier(decision), getDependencyIdentifier(decision, dep), MsgUtil.clipString(Objects.toString(result.getContext().get(dep.getName())), 50), ((DMNBaseNode) dep).getType());
                    reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
                }
            } catch (Exception e) {
                MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, ((DMNBaseNode) dep).getSource(), result, e, null, Msg.ERROR_CHECKING_ALLOWED_VALUES, getDependencyIdentifier(decision, dep), e.getMessage());
            }
            if (!isNodeValueDefined(result, decision, dep)) {
                boolean walkingIntoScope = walkIntoImportScope(result, decision, dep);
                if (dep instanceof DecisionNode) {
                    if (!evaluateDecision(context, result, (DecisionNode) dep, typeCheck)) {
                        missingInput = true;
                        DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.UNABLE_TO_EVALUATE_DECISION_REQ_DEP, getIdentifier(decision), getDependencyIdentifier(decision, dep));
                        reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
                    }
                } else if (dep instanceof BusinessKnowledgeModelNode) {
                    evaluateBKM(context, result, (BusinessKnowledgeModelNode) dep, typeCheck);
                } else if (dep instanceof DecisionServiceNode) {
                    evaluateDecisionService(context, result, (DecisionServiceNode) dep, typeCheck);
                } else {
                    missingInput = true;
                    DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.REQ_DEP_NOT_FOUND_FOR_NODE, getDependencyIdentifier(decision, dep), getIdentifier(decision));
                    reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
                }
                if (walkingIntoScope) {
                    result.getContext().popScope();
                }
            }
        }
        if (missingInput) {
            return false;
        }
        if (decision.getEvaluator() == null) {
            DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.WARN, decision.getSource(), result, null, null, Msg.MISSING_EXPRESSION_FOR_DECISION, getIdentifier(decision));
            reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.SKIPPED);
            return false;
        }
        try {
            EvaluatorResult er = decision.getEvaluator().evaluate(this, result);
            if (er.getResultType() == EvaluatorResult.ResultType.SUCCESS) {
                Object value = er.getResult();
                if (!decision.getResultType().isCollection() && value instanceof Collection && ((Collection) value).size() == 1) {
                    // spec defines that "a=[a]", i.e., singleton collections should be treated as the single element
                    // and vice-versa
                    value = ((Collection) value).toArray()[0];
                }
                try {
                    if (typeCheck && !d.getResultType().isAssignableValue(value)) {
                        DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, null, null, Msg.ERROR_EVAL_NODE_RESULT_WRONG_TYPE, getIdentifier(decision), decision.getResultType(), value);
                        reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.FAILED);
                        return false;
                    }
                } catch (Exception e) {
                    MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, e, null, Msg.ERROR_CHECKING_ALLOWED_VALUES, getIdentifier(decision), e.getMessage());
                    return false;
                }
                result.getContext().set(decision.getDecision().getVariable().getName(), value);
                dr.setResult(value);
                dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.SUCCEEDED);
            } else {
                dr.setEvaluationStatus(DMNDecisionResult.DecisionEvaluationStatus.FAILED);
                return false;
            }
        } catch (Throwable t) {
            DMNMessage message = MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, decision.getSource(), result, t, null, Msg.ERROR_EVAL_DECISION_NODE, getIdentifier(decision), t.getMessage());
            reportFailure(dr, message, DMNDecisionResult.DecisionEvaluationStatus.FAILED);
        }
        return true;
    } finally {
        DMNRuntimeEventManagerUtils.fireAfterEvaluateDecision(eventManager, decision, result, beforeEvaluateDecisionEvent);
    }
}
Also used : EvaluatorResult(org.kie.dmn.core.api.EvaluatorResult) BeforeEvaluateDecisionEvent(org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent) DecisionServiceNode(org.kie.dmn.api.core.ast.DecisionServiceNode) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode) BusinessKnowledgeModelNode(org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode) DecisionNodeImpl(org.kie.dmn.core.ast.DecisionNodeImpl) DMNMessage(org.kie.dmn.api.core.DMNMessage) DMNBaseNode(org.kie.dmn.core.ast.DMNBaseNode) DMNDecisionResult(org.kie.dmn.api.core.DMNDecisionResult) Collection(java.util.Collection) DMNNode(org.kie.dmn.api.core.ast.DMNNode)

Example 25 with DecisionNode

use of org.kie.dmn.api.core.ast.DecisionNode in project drools by kiegroup.

the class DMNTypeSafeTypeGenerator method processTypes.

public DMNTypeSafeTypeGenerator processTypes() {
    Set<InputDataNode> inputs = dmnModel.getInputs();
    DMNInputSetType inputSetType = new DMNInputSetType(index, codeGenConfig);
    for (InputDataNode i : inputs) {
        inputSetType.addField(i.getName(), i.getType());
    }
    inputSetType.initFields();
    inputSetType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of all the InputData and other DRG Requirement of the whole DMN '").append(dmnModel.getName()).append("' inputs.").toString(), dmnModel));
    types.add(inputSetType);
    Set<DecisionNode> decisions = dmnModel.getDecisions();
    Collection<DecisionServiceNode> decisionServices = dmnModel.getDecisionServices();
    Set<BusinessKnowledgeModelNode> bkms = dmnModel.getBusinessKnowledgeModels();
    DMNOutputSetType outputSetType = new DMNOutputSetType(index, codeGenConfig);
    for (InputDataNode i : inputs) {
        // OutputSet also contains inputs
        outputSetType.addField(i.getName(), i.getType());
    }
    for (DecisionNode d : decisions) {
        outputSetType.addField(d.getName(), d.getResultType());
    }
    for (DecisionServiceNode ds : decisionServices) {
        outputSetType.addField(ds.getName(), dmnModel.getTypeRegistry().unknown());
    }
    for (BusinessKnowledgeModelNode bkm : bkms) {
        outputSetType.addField(bkm.getName(), dmnModel.getTypeRegistry().unknown());
    }
    outputSetType.initFields();
    outputSetType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of all the OutputData of the whole DMN '").append(dmnModel.getName()).append("' outputs.").toString(), dmnModel));
    types.add(outputSetType);
    for (DMNType type : index.typesToGenerateByNS(dmnModel.getNamespace())) {
        // this generator shall only be concerned with the types belonging to this generator dmnModel.
        DMNDeclaredType dmnDeclaredType = new DMNDeclaredType(index, type, codeGenConfig);
        dmnDeclaredType.setJavadoc(postfixToJavadoc(new StringBuilder("A representation of the DMN defined ItemDefinition type '").append(type.getName()).append("'.").toString(), dmnModel));
        types.add(dmnDeclaredType);
    }
    return this;
}
Also used : DecisionServiceNode(org.kie.dmn.api.core.ast.DecisionServiceNode) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode) BusinessKnowledgeModelNode(org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode) InputDataNode(org.kie.dmn.api.core.ast.InputDataNode) DMNType(org.kie.dmn.api.core.DMNType)

Aggregations

DecisionNode (org.kie.dmn.api.core.ast.DecisionNode)32 InputDataNode (org.kie.dmn.api.core.ast.InputDataNode)16 DMNType (org.kie.dmn.api.core.DMNType)12 BusinessKnowledgeModelNode (org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode)10 DecisionServiceNode (org.kie.dmn.api.core.ast.DecisionServiceNode)9 DecisionNodeImpl (org.kie.dmn.core.ast.DecisionNodeImpl)9 DMNMessage (org.kie.dmn.api.core.DMNMessage)7 DMNModel (org.kie.dmn.api.core.DMNModel)7 DMNDecisionResult (org.kie.dmn.api.core.DMNDecisionResult)6 DMNNode (org.kie.dmn.api.core.ast.DMNNode)6 Optional (java.util.Optional)5 DMNContext (org.kie.dmn.api.core.DMNContext)5 DMNResult (org.kie.dmn.api.core.DMNResult)5 DMNRuntime (org.kie.dmn.api.core.DMNRuntime)5 DMNBaseNode (org.kie.dmn.core.ast.DMNBaseNode)5 DecisionServiceNodeImpl (org.kie.dmn.core.ast.DecisionServiceNodeImpl)5 ArrayList (java.util.ArrayList)4 Collection (java.util.Collection)4 List (java.util.List)4 HashMap (java.util.HashMap)3