use of io.camunda.zeebe.engine.processing.deployment.model.element.ExecutableCalledDecision in project zeebe by zeebe-io.
the class BpmnDecisionBehavior method evaluateDecision.
/**
* Evaluate a decision during the processing of a bpmn element.
*
* @param element the called decision of the current bpmn element
* @param context process instance-related data of the element that is executed
* @return either an evaluated decision's result or a failure
*/
public Either<Failure, DecisionEvaluationResult> evaluateDecision(final ExecutableCalledDecision element, final BpmnElementContext context) {
final var scopeKey = context.getElementInstanceKey();
final var decisionIdOrFailure = evalDecisionIdExpression(element, scopeKey);
if (decisionIdOrFailure.isLeft()) {
return Either.left(decisionIdOrFailure.getLeft());
}
final var decisionId = decisionIdOrFailure.get();
// todo(#8571): avoid parsing drg every time
final var decisionOrFailure = findDecisionById(decisionId);
final var resultOrFailure = decisionOrFailure.flatMap(this::findDrgByDecision).mapLeft(failure -> new Failure("Expected to evaluate decision '%s', but %s".formatted(decisionId, failure.getMessage()))).flatMap(drg -> parseDrg(drg.getResource())).mapLeft(f -> new Failure(f.getMessage(), ErrorType.CALLED_DECISION_ERROR, scopeKey)).flatMap(drg -> {
final var evaluationResult = evaluateDecisionInDrg(drg, decisionId, scopeKey);
final var decision = decisionOrFailure.get();
writeDecisionEvaluationEvent(decision, evaluationResult, context);
if (evaluationResult.isFailure()) {
metrics.increaseFailedEvaluatedDmnElements(evaluationResult.getEvaluatedDecisions().size());
return Either.left(new Failure(evaluationResult.getFailureMessage(), ErrorType.DECISION_EVALUATION_ERROR, scopeKey));
} else {
metrics.increaseSuccessfullyEvaluatedDmnElements(evaluationResult.getEvaluatedDecisions().size());
return Either.right(evaluationResult);
}
});
resultOrFailure.ifRight(result -> {
// The output mapping behavior determines what to do with the decision result. Since the
// output mapping may fail and raise an incident, we need to write the variable to a
// record. This is because we want to evaluate the decision on element activation, while
// the output mapping happens on element completion. We don't want to re-evaluate the
// decision for output mapping related incidents.
triggerProcessEventWithResultVariable(context, element.getResultVariable(), result);
});
return resultOrFailure;
}
Aggregations