Search in sources :

Example 91 with BaseNode

use of org.kie.dmn.feel.lang.ast.BaseNode in project drools by kiegroup.

the class DMNDTAnalyser method toIntervals.

private List<Interval> toIntervals(List<BaseNode> elements, boolean isNegated, Interval minMax, List discreteValues, int rule, int col) {
    List<Interval> results = new ArrayList<>();
    if (elements.size() == 1 && elements.get(0) instanceof UnaryTestNode && ((UnaryTestNode) elements.get(0)).getValue() instanceof NullNode) {
        return Collections.emptyList();
    }
    if (discreteValues != null && !discreteValues.isEmpty() && areAllEQUnaryTest(elements) && elements.size() > 1) {
        // JDK BitSet size will always be larger.
        int bitsetLogicalSize = discreteValues.size();
        BitSet hitValues = new BitSet(bitsetLogicalSize);
        for (BaseNode n : elements) {
            Comparable<?> thisValue = valueFromNode(((UnaryTestNode) n).getValue());
            int indexOf = discreteValues.indexOf(thisValue);
            if (indexOf < 0) {
                throw new IllegalStateException("Unable to determine discreteValue index for: " + n);
            }
            hitValues.set(indexOf);
        }
        if (isNegated) {
            hitValues.flip(0, bitsetLogicalSize);
        }
        int lowerBoundIdx = -1;
        int upperBoundIdx = -1;
        for (int i = 0; i < hitValues.length(); i++) {
            boolean curValue = hitValues.get(i);
            if (curValue) {
                if (lowerBoundIdx < 0) {
                    lowerBoundIdx = i;
                    upperBoundIdx = i;
                } else {
                    upperBoundIdx = i;
                }
            } else {
                if (lowerBoundIdx >= 0 && upperBoundIdx >= 0) {
                    results.add(createIntervalOfRule(discreteValues, rule, col, lowerBoundIdx, upperBoundIdx));
                    lowerBoundIdx = -1;
                    upperBoundIdx = -1;
                }
            }
        }
        if (lowerBoundIdx >= 0 && upperBoundIdx >= 0) {
            results.add(createIntervalOfRule(discreteValues, rule, col, lowerBoundIdx, upperBoundIdx));
        }
    } else {
        for (BaseNode n : elements) {
            if (n instanceof DashNode) {
                results.add(new Interval(minMax.getLowerBound().getBoundaryType(), minMax.getLowerBound().getValue(), minMax.getUpperBound().getValue(), minMax.getUpperBound().getBoundaryType(), rule, col));
                continue;
            }
            UnaryTestNode ut = (UnaryTestNode) n;
            Interval interval = utnToInterval(ut, minMax, discreteValues, rule, col);
            if (isNegated) {
                results.addAll(Interval.invertOverDomain(interval, minMax));
            } else {
                results.add(interval);
            }
        }
    }
    return results;
}
Also used : UnaryTestNode(org.kie.dmn.feel.lang.ast.UnaryTestNode) ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) DashNode(org.kie.dmn.feel.lang.ast.DashNode) NullNode(org.kie.dmn.feel.lang.ast.NullNode) Interval(org.kie.dmn.validation.dtanalysis.model.Interval)

Example 92 with BaseNode

use of org.kie.dmn.feel.lang.ast.BaseNode in project drools by kiegroup.

the class ASTCompilerVisitor method visit.

@Override
public DirectCompilerResult visit(UnaryTestListNode n) {
    MethodCallExpr expr = Expressions.list();
    HashSet<FieldDeclaration> fds = new HashSet<>();
    for (BaseNode e : n.getElements()) {
        DirectCompilerResult r = e.accept(this);
        fds.addAll(r.getFieldDeclarations());
        expr.addArgument(r.getExpression());
    }
    if (n.isNegated()) {
        Expressions.NamedLambda negated = Expressions.namedUnaryLambda(Expressions.notExists(expr), n.getText());
        fds.add(negated.field());
        return DirectCompilerResult.of(Expressions.list(negated.name()), BuiltInType.LIST, fds);
    } else {
        return DirectCompilerResult.of(expr, BuiltInType.LIST, fds);
    }
}
Also used : BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) FieldDeclaration(com.github.javaparser.ast.body.FieldDeclaration) MethodCallExpr(com.github.javaparser.ast.expr.MethodCallExpr) HashSet(java.util.HashSet)

Example 93 with BaseNode

use of org.kie.dmn.feel.lang.ast.BaseNode in project drools by kiegroup.

the class ASTCompilerVisitor method visit.

@Override
public DirectCompilerResult visit(PathExpressionNode n) {
    DirectCompilerResult expr = n.getExpression().accept(this);
    BaseNode nameNode = n.getName();
    if (nameNode instanceof QualifiedNameNode) {
        QualifiedNameNode qualifiedNameNode = (QualifiedNameNode) n.getName();
        List<Expression> exprs = qualifiedNameNode.getParts().stream().map(name -> new StringLiteralExpr(name.getText())).collect(Collectors.toList());
        return DirectCompilerResult.of(Expressions.path(expr.getExpression(), exprs), // here we could still try to infer the result type, but presently use ANY
        BuiltInType.UNKNOWN).withFD(expr);
    } else {
        return DirectCompilerResult.of(Expressions.path(expr.getExpression(), new StringLiteralExpr(nameNode.getText())), // here we could still try to infer the result type, but presently use ANY
        BuiltInType.UNKNOWN).withFD(expr);
    }
}
Also used : QuantifiedExpressionNode(org.kie.dmn.feel.lang.ast.QuantifiedExpressionNode) SimpleType(org.kie.dmn.feel.lang.SimpleType) Visitor(org.kie.dmn.feel.lang.ast.Visitor) ListNode(org.kie.dmn.feel.lang.ast.ListNode) ContextNode(org.kie.dmn.feel.lang.ast.ContextNode) FunctionInvocationNode(org.kie.dmn.feel.lang.ast.FunctionInvocationNode) NullLiteralExpr(com.github.javaparser.ast.expr.NullLiteralExpr) InNode(org.kie.dmn.feel.lang.ast.InNode) BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) Duration(java.time.Duration) Map(java.util.Map) Msg(org.kie.dmn.feel.util.Msg) NumberNode(org.kie.dmn.feel.lang.ast.NumberNode) Expression(com.github.javaparser.ast.expr.Expression) BinaryExpr(com.github.javaparser.ast.expr.BinaryExpr) ForExpressionNode(org.kie.dmn.feel.lang.ast.ForExpressionNode) IfExpressionNode(org.kie.dmn.feel.lang.ast.IfExpressionNode) UnknownType(com.github.javaparser.ast.type.UnknownType) DashNode(org.kie.dmn.feel.lang.ast.DashNode) MethodCallExpr(com.github.javaparser.ast.expr.MethodCallExpr) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) TypeNode(org.kie.dmn.feel.lang.ast.TypeNode) ASTNode(org.kie.dmn.feel.lang.ast.ASTNode) Collectors(java.util.stream.Collectors) StringLiteralExpr(com.github.javaparser.ast.expr.StringLiteralExpr) EnclosedExpr(com.github.javaparser.ast.expr.EnclosedExpr) List(java.util.List) StaticJavaParser(com.github.javaparser.StaticJavaParser) InfixOpNode(org.kie.dmn.feel.lang.ast.InfixOpNode) QualifiedNameNode(org.kie.dmn.feel.lang.ast.QualifiedNameNode) Entry(java.util.Map.Entry) NullNode(org.kie.dmn.feel.lang.ast.NullNode) CTypeNode(org.kie.dmn.feel.lang.ast.CTypeNode) FieldAccessExpr(com.github.javaparser.ast.expr.FieldAccessExpr) FunctionTypeNode(org.kie.dmn.feel.lang.ast.FunctionTypeNode) ChronoPeriod(java.time.chrono.ChronoPeriod) FunctionDefNode(org.kie.dmn.feel.lang.ast.FunctionDefNode) EvalHelper(org.kie.dmn.feel.util.EvalHelper) ScopeHelper(org.kie.dmn.feel.parser.feel11.ScopeHelper) ContextEntryNode(org.kie.dmn.feel.lang.ast.ContextEntryNode) NamedParameterNode(org.kie.dmn.feel.lang.ast.NamedParameterNode) LambdaExpr(com.github.javaparser.ast.expr.LambdaExpr) NameRefNode(org.kie.dmn.feel.lang.ast.NameRefNode) MapBackedType(org.kie.dmn.feel.lang.impl.MapBackedType) ConditionalExpr(com.github.javaparser.ast.expr.ConditionalExpr) UnaryTestNode(org.kie.dmn.feel.lang.ast.UnaryTestNode) NameDefNode(org.kie.dmn.feel.lang.ast.NameDefNode) Parameter(com.github.javaparser.ast.body.Parameter) HashMap(java.util.HashMap) IterationContextNode(org.kie.dmn.feel.lang.ast.IterationContextNode) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) CompositeType(org.kie.dmn.feel.lang.CompositeType) TemporalConstantNode(org.kie.dmn.feel.lang.ast.TemporalConstantNode) BooleanNode(org.kie.dmn.feel.lang.ast.BooleanNode) Type(org.kie.dmn.feel.lang.Type) AtLiteralNode(org.kie.dmn.feel.lang.ast.AtLiteralNode) ListTypeNode(org.kie.dmn.feel.lang.ast.ListTypeNode) BooleanLiteralExpr(com.github.javaparser.ast.expr.BooleanLiteralExpr) UnaryTestListNode(org.kie.dmn.feel.lang.ast.UnaryTestListNode) RangeNode(org.kie.dmn.feel.lang.ast.RangeNode) FormalParameterNode(org.kie.dmn.feel.lang.ast.FormalParameterNode) NameExpr(com.github.javaparser.ast.expr.NameExpr) PathExpressionNode(org.kie.dmn.feel.lang.ast.PathExpressionNode) FieldDeclaration(com.github.javaparser.ast.body.FieldDeclaration) DirectCompilerResult.mergeFDs(org.kie.dmn.feel.codegen.feel11.DirectCompilerResult.mergeFDs) SignedUnaryNode(org.kie.dmn.feel.lang.ast.SignedUnaryNode) TypeAndFn(org.kie.dmn.feel.lang.ast.AtLiteralNode.TypeAndFn) BetweenNode(org.kie.dmn.feel.lang.ast.BetweenNode) ContextTypeNode(org.kie.dmn.feel.lang.ast.ContextTypeNode) FilterExpressionNode(org.kie.dmn.feel.lang.ast.FilterExpressionNode) IntegerLiteralExpr(com.github.javaparser.ast.expr.IntegerLiteralExpr) InstanceOfNode(org.kie.dmn.feel.lang.ast.InstanceOfNode) StringNode(org.kie.dmn.feel.lang.ast.StringNode) Expression(com.github.javaparser.ast.expr.Expression) BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) StringLiteralExpr(com.github.javaparser.ast.expr.StringLiteralExpr) QualifiedNameNode(org.kie.dmn.feel.lang.ast.QualifiedNameNode)

Example 94 with BaseNode

use of org.kie.dmn.feel.lang.ast.BaseNode in project drools by kiegroup.

the class FEELImpl method parseTest.

@Override
public String parseTest(final String value) {
    final FEEL_1_1Parser parser = FEELParser.parse(null, value, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList(), Collections.emptyList(), null);
    final ParseTree tree = parser.expression();
    final ASTBuilderVisitor v = new ASTBuilderVisitor(Collections.emptyMap(), null);
    final BaseNode expr = v.visit(tree);
    return expr.getText() + " - " + expr.getResultType() + " - " + expr.toString();
}
Also used : ASTBuilderVisitor(org.kie.dmn.feel.parser.feel11.ASTBuilderVisitor) BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) FEEL_1_1Parser(org.kie.dmn.feel.parser.feel11.FEEL_1_1Parser) ParseTree(org.antlr.v4.runtime.tree.ParseTree)

Example 95 with BaseNode

use of org.kie.dmn.feel.lang.ast.BaseNode in project drools by kiegroup.

the class ASTBuilderVisitor method visitQuantExprSome.

@Override
public BaseNode visitQuantExprSome(FEEL_1_1Parser.QuantExprSomeContext ctx) {
    ListNode list = (ListNode) visit(ctx.iterationContexts());
    BaseNode expr = visit(ctx.expression());
    return ASTBuilderFactory.newQuantifiedExpression(ctx, QuantifiedExpressionNode.Quantifier.SOME, list, expr);
}
Also used : BaseNode(org.kie.dmn.feel.lang.ast.BaseNode) ListNode(org.kie.dmn.feel.lang.ast.ListNode) UnaryTestListNode(org.kie.dmn.feel.lang.ast.UnaryTestListNode)

Aggregations

BaseNode (org.kie.dmn.feel.lang.ast.BaseNode)108 Test (org.junit.Test)60 ListNode (org.kie.dmn.feel.lang.ast.ListNode)16 InfixOpNode (org.kie.dmn.feel.lang.ast.InfixOpNode)12 IterationContextNode (org.kie.dmn.feel.lang.ast.IterationContextNode)9 NameDefNode (org.kie.dmn.feel.lang.ast.NameDefNode)9 UnaryTestListNode (org.kie.dmn.feel.lang.ast.UnaryTestListNode)9 FEEL_1_1Parser (org.kie.dmn.feel.parser.feel11.FEEL_1_1Parser)9 ParseTree (org.antlr.v4.runtime.tree.ParseTree)8 ContextEntryNode (org.kie.dmn.feel.lang.ast.ContextEntryNode)8 ContextNode (org.kie.dmn.feel.lang.ast.ContextNode)8 FunctionInvocationNode (org.kie.dmn.feel.lang.ast.FunctionInvocationNode)8 ArrayList (java.util.ArrayList)6 RangeNode (org.kie.dmn.feel.lang.ast.RangeNode)6 ASTBuilderVisitor (org.kie.dmn.feel.parser.feel11.ASTBuilderVisitor)6 InNode (org.kie.dmn.feel.lang.ast.InNode)5 PathExpressionNode (org.kie.dmn.feel.lang.ast.PathExpressionNode)5 SignedUnaryNode (org.kie.dmn.feel.lang.ast.SignedUnaryNode)5 MethodCallExpr (com.github.javaparser.ast.expr.MethodCallExpr)4 Type (org.kie.dmn.feel.lang.Type)4