Search in sources :

Example 6 with BusinessKnowledgeModelNodeImpl

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

the class BusinessKnowledgeModelCompiler method compileNode.

@Override
public void compileNode(DRGElement de, DMNCompilerImpl compiler, DMNModelImpl model) {
    BusinessKnowledgeModel bkm = (BusinessKnowledgeModel) de;
    BusinessKnowledgeModelNodeImpl bkmn = new BusinessKnowledgeModelNodeImpl(bkm);
    DMNType type = null;
    DMNType fnType = null;
    if (bkm.getVariable() == null) {
        DMNCompilerHelper.reportMissingVariable(model, de, bkm, Msg.MISSING_VARIABLE_FOR_BKM);
        return;
    }
    DMNCompilerHelper.checkVariableName(model, bkm, bkm.getName());
    if (bkm.getVariable().getTypeRef() != null) {
        // variable must be present, otherwise error was already reported above.
        type = compiler.resolveTypeRef(model, bkm, bkm.getVariable(), bkm.getVariable().getTypeRef());
        if (type instanceof SimpleFnTypeImpl) {
            fnType = type;
            type = ((SimpleFnTypeImpl) type).getReturnType();
        }
        // consistency checks
        if (bkm.getEncapsulatedLogic() != null && bkm.getEncapsulatedLogic().getTypeRef() != null) {
            DMNType bkmELType = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic(), bkm.getEncapsulatedLogic().getTypeRef());
            if (!areSameDMNType(fnType != null ? fnType : type, bkmELType)) {
                MsgUtil.reportMessage(LOG, DMNMessage.Severity.WARN, bkm.getEncapsulatedLogic(), model, null, null, Msg.VARIABLE_TYPE_MISMATCH_FOR_BKM_EL, bkm.getEncapsulatedLogic().getTypeRef(), bkm.getVariable().getTypeRef());
            }
        }
        if (fnType == null && bkm.getEncapsulatedLogic() != null && bkm.getEncapsulatedLogic().getExpression() != null && bkm.getEncapsulatedLogic().getExpression().getTypeRef() != null) {
            // if fnType != null, this is already taken care of DROOLS-6488 in method checkFnConsistency, further below.
            DMNType elExprType = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic().getExpression(), bkm.getEncapsulatedLogic().getExpression().getTypeRef());
            if (!areSameDMNType(type, elExprType)) {
                MsgUtil.reportMessage(LOG, DMNMessage.Severity.WARN, bkm.getEncapsulatedLogic(), model, null, null, Msg.VARIABLE_TYPE_MISMATCH_FOR_BKM_EL_BODY, bkm.getEncapsulatedLogic().getExpression().getTypeRef(), type.getName());
            }
        }
    } else if (bkm.getVariable().getTypeRef() == null && bkm.getEncapsulatedLogic().getExpression() != null && bkm.getEncapsulatedLogic().getExpression().getTypeRef() != null) {
        type = compiler.resolveTypeRef(model, bkm, bkm.getEncapsulatedLogic().getExpression(), bkm.getEncapsulatedLogic().getExpression().getTypeRef());
    } else {
        // for now the call bellow will return type UNKNOWN
        type = compiler.resolveTypeRef(model, bkm, bkm, null);
    }
    bkmn.setType(fnType);
    bkmn.setResultType(type);
    model.addBusinessKnowledgeModel(bkmn);
}
Also used : BusinessKnowledgeModel(org.kie.dmn.model.api.BusinessKnowledgeModel) BusinessKnowledgeModelNodeImpl(org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl) SimpleFnTypeImpl(org.kie.dmn.core.impl.SimpleFnTypeImpl) DMNType(org.kie.dmn.api.core.DMNType)

Example 7 with BusinessKnowledgeModelNodeImpl

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

the class BusinessKnowledgeModelCompiler method compileEvaluator.

@Override
public void compileEvaluator(DMNNode node, DMNCompilerImpl compiler, DMNCompilerContext ctx, DMNModelImpl model) {
    BusinessKnowledgeModelNodeImpl bkmi = (BusinessKnowledgeModelNodeImpl) node;
    compiler.linkRequirements(model, bkmi);
    ctx.enterFrame();
    try {
        loadInCtx(bkmi, ctx, model);
        // to allow recursive call from inside a BKM node, a variable for self must be available for the compiler context:
        ctx.setVariable(bkmi.getName(), bkmi.getResultType());
        FunctionDefinition funcDef = bkmi.getBusinessKnowledModel().getEncapsulatedLogic();
        if (bkmi.getType() != null && funcDef != null) {
            checkFnConsistency(model, bkmi, bkmi.getType(), funcDef);
        }
        DMNExpressionEvaluator exprEvaluator = compiler.getEvaluatorCompiler().compileExpression(ctx, model, bkmi, bkmi.getName(), funcDef);
        bkmi.setEvaluator(exprEvaluator);
    } finally {
        ctx.exitFrame();
    }
}
Also used : DMNExpressionEvaluator(org.kie.dmn.core.api.DMNExpressionEvaluator) FunctionDefinition(org.kie.dmn.model.api.FunctionDefinition) BusinessKnowledgeModelNodeImpl(org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl)

Aggregations

BusinessKnowledgeModelNodeImpl (org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl)7 BusinessKnowledgeModelNode (org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode)3 DecisionNodeImpl (org.kie.dmn.core.ast.DecisionNodeImpl)3 DMNType (org.kie.dmn.api.core.DMNType)2 DMNNode (org.kie.dmn.api.core.ast.DMNNode)2 DecisionNode (org.kie.dmn.api.core.ast.DecisionNode)2 DecisionServiceNode (org.kie.dmn.api.core.ast.DecisionServiceNode)2 ArrayList (java.util.ArrayList)1 LinkedHashMap (java.util.LinkedHashMap)1 DMNExpressionEvaluator (org.kie.dmn.core.api.DMNExpressionEvaluator)1 EvaluatorResult (org.kie.dmn.core.api.EvaluatorResult)1 DMNFunctionWithReturnType (org.kie.dmn.core.ast.DMNFunctionWithReturnType)1 DecisionServiceNodeImpl (org.kie.dmn.core.ast.DecisionServiceNodeImpl)1 SimpleFnTypeImpl (org.kie.dmn.core.impl.SimpleFnTypeImpl)1 FEELFunction (org.kie.dmn.feel.runtime.FEELFunction)1 BusinessKnowledgeModel (org.kie.dmn.model.api.BusinessKnowledgeModel)1 DRGElement (org.kie.dmn.model.api.DRGElement)1 DecisionService (org.kie.dmn.model.api.DecisionService)1 FunctionDefinition (org.kie.dmn.model.api.FunctionDefinition)1 InformationItem (org.kie.dmn.model.api.InformationItem)1