Search in sources :

Example 1 with OpLT

use of cn.taketoday.expression.spel.ast.OpLT in project today-framework by TAKETODAY.

the class InternalSpelExpressionParser method eatRelationalExpression.

// relationalExpression : sumExpression (relationalOperator^ sumExpression)?;
@Nullable
private SpelNodeImpl eatRelationalExpression() {
    SpelNodeImpl expr = eatSumExpression();
    Token relationalOperatorToken = maybeEatRelationalOperator();
    if (relationalOperatorToken != null) {
        // consume relational operator token
        Token t = takeToken();
        SpelNodeImpl rhExpr = eatSumExpression();
        checkOperands(t, expr, rhExpr);
        TokenKind tk = relationalOperatorToken.kind;
        if (relationalOperatorToken.isNumericRelationalOperator()) {
            if (tk == TokenKind.GT) {
                return new OpGT(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.LT) {
                return new OpLT(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.LE) {
                return new OpLE(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.GE) {
                return new OpGE(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.EQ) {
                return new OpEQ(t.startPos, t.endPos, expr, rhExpr);
            }
            Assert.isTrue(tk == TokenKind.NE, "Not-equals token expected");
            return new OpNE(t.startPos, t.endPos, expr, rhExpr);
        }
        if (tk == TokenKind.INSTANCEOF) {
            return new OperatorInstanceof(t.startPos, t.endPos, expr, rhExpr);
        }
        if (tk == TokenKind.MATCHES) {
            return new OperatorMatches(t.startPos, t.endPos, expr, rhExpr);
        }
        Assert.isTrue(tk == TokenKind.BETWEEN, "Between token expected");
        return new OperatorBetween(t.startPos, t.endPos, expr, rhExpr);
    }
    return expr;
}
Also used : SpelNodeImpl(cn.taketoday.expression.spel.ast.SpelNodeImpl) OperatorInstanceof(cn.taketoday.expression.spel.ast.OperatorInstanceof) OpEQ(cn.taketoday.expression.spel.ast.OpEQ) OpGE(cn.taketoday.expression.spel.ast.OpGE) OpGT(cn.taketoday.expression.spel.ast.OpGT) OpLT(cn.taketoday.expression.spel.ast.OpLT) OperatorMatches(cn.taketoday.expression.spel.ast.OperatorMatches) OpNE(cn.taketoday.expression.spel.ast.OpNE) OpLE(cn.taketoday.expression.spel.ast.OpLE) OperatorBetween(cn.taketoday.expression.spel.ast.OperatorBetween) Nullable(cn.taketoday.lang.Nullable)

Example 2 with OpLT

use of cn.taketoday.expression.spel.ast.OpLT in project today-framework by TAKETODAY.

the class SpelCompilationCoverageTests method mixingItUp_propertyAccessIndexerOpLtTernaryRootNull.

@Test
void mixingItUp_propertyAccessIndexerOpLtTernaryRootNull() {
    Payload payload = new Payload();
    expression = parser.parseExpression("DR[0].three");
    Object v = expression.getValue(payload);
    assertThat(getAst().getExitDescriptor()).isEqualTo("Lcn/taketoday/expression/spel/SpelCompilationCoverageTests$Three");
    Expression expression = parser.parseExpression("DR[0].three.four lt 0.1d?#root:null");
    v = expression.getValue(payload);
    SpelExpression sExpr = (SpelExpression) expression;
    Ternary ternary = (Ternary) sExpr.getAST();
    OpLT oplt = (OpLT) ternary.getChild(0);
    CompoundExpression cExpr = (CompoundExpression) oplt.getLeftOperand();
    String cExprExitDescriptor = cExpr.getExitDescriptor();
    assertThat(cExprExitDescriptor).isEqualTo("D");
    assertThat(oplt.getExitDescriptor()).isEqualTo("Z");
    assertCanCompile(expression);
    Object vc = expression.getValue(payload);
    assertThat(v).isEqualTo(payload);
    assertThat(vc).isEqualTo(payload);
    payload.DR[0].three.four = 0.13d;
    vc = expression.getValue(payload);
    assertThat(vc).isNull();
}
Also used : Expression(cn.taketoday.expression.Expression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) Ternary(cn.taketoday.expression.spel.ast.Ternary) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) OpLT(cn.taketoday.expression.spel.ast.OpLT) Test(org.junit.jupiter.api.Test)

Example 3 with OpLT

use of cn.taketoday.expression.spel.ast.OpLT in project today-infrastructure by TAKETODAY.

the class SpelCompilationCoverageTests method mixingItUp_propertyAccessIndexerOpLtTernaryRootNull.

@Test
void mixingItUp_propertyAccessIndexerOpLtTernaryRootNull() {
    Payload payload = new Payload();
    expression = parser.parseExpression("DR[0].three");
    Object v = expression.getValue(payload);
    assertThat(getAst().getExitDescriptor()).isEqualTo("Lcn/taketoday/expression/spel/SpelCompilationCoverageTests$Three");
    Expression expression = parser.parseExpression("DR[0].three.four lt 0.1d?#root:null");
    v = expression.getValue(payload);
    SpelExpression sExpr = (SpelExpression) expression;
    Ternary ternary = (Ternary) sExpr.getAST();
    OpLT oplt = (OpLT) ternary.getChild(0);
    CompoundExpression cExpr = (CompoundExpression) oplt.getLeftOperand();
    String cExprExitDescriptor = cExpr.getExitDescriptor();
    assertThat(cExprExitDescriptor).isEqualTo("D");
    assertThat(oplt.getExitDescriptor()).isEqualTo("Z");
    assertCanCompile(expression);
    Object vc = expression.getValue(payload);
    assertThat(v).isEqualTo(payload);
    assertThat(vc).isEqualTo(payload);
    payload.DR[0].three.four = 0.13d;
    vc = expression.getValue(payload);
    assertThat(vc).isNull();
}
Also used : Expression(cn.taketoday.expression.Expression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) Ternary(cn.taketoday.expression.spel.ast.Ternary) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) CompoundExpression(cn.taketoday.expression.spel.ast.CompoundExpression) OpLT(cn.taketoday.expression.spel.ast.OpLT) Test(org.junit.jupiter.api.Test)

Example 4 with OpLT

use of cn.taketoday.expression.spel.ast.OpLT in project today-infrastructure by TAKETODAY.

the class InternalSpelExpressionParser method eatRelationalExpression.

// relationalExpression : sumExpression (relationalOperator^ sumExpression)?;
@Nullable
private SpelNodeImpl eatRelationalExpression() {
    SpelNodeImpl expr = eatSumExpression();
    Token relationalOperatorToken = maybeEatRelationalOperator();
    if (relationalOperatorToken != null) {
        // consume relational operator token
        Token t = takeToken();
        SpelNodeImpl rhExpr = eatSumExpression();
        checkOperands(t, expr, rhExpr);
        TokenKind tk = relationalOperatorToken.kind;
        if (relationalOperatorToken.isNumericRelationalOperator()) {
            if (tk == TokenKind.GT) {
                return new OpGT(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.LT) {
                return new OpLT(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.LE) {
                return new OpLE(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.GE) {
                return new OpGE(t.startPos, t.endPos, expr, rhExpr);
            }
            if (tk == TokenKind.EQ) {
                return new OpEQ(t.startPos, t.endPos, expr, rhExpr);
            }
            Assert.isTrue(tk == TokenKind.NE, "Not-equals token expected");
            return new OpNE(t.startPos, t.endPos, expr, rhExpr);
        }
        if (tk == TokenKind.INSTANCEOF) {
            return new OperatorInstanceof(t.startPos, t.endPos, expr, rhExpr);
        }
        if (tk == TokenKind.MATCHES) {
            return new OperatorMatches(t.startPos, t.endPos, expr, rhExpr);
        }
        Assert.isTrue(tk == TokenKind.BETWEEN, "Between token expected");
        return new OperatorBetween(t.startPos, t.endPos, expr, rhExpr);
    }
    return expr;
}
Also used : SpelNodeImpl(cn.taketoday.expression.spel.ast.SpelNodeImpl) OperatorInstanceof(cn.taketoday.expression.spel.ast.OperatorInstanceof) OpEQ(cn.taketoday.expression.spel.ast.OpEQ) OpGE(cn.taketoday.expression.spel.ast.OpGE) OpGT(cn.taketoday.expression.spel.ast.OpGT) OpLT(cn.taketoday.expression.spel.ast.OpLT) OperatorMatches(cn.taketoday.expression.spel.ast.OperatorMatches) OpNE(cn.taketoday.expression.spel.ast.OpNE) OpLE(cn.taketoday.expression.spel.ast.OpLE) OperatorBetween(cn.taketoday.expression.spel.ast.OperatorBetween) Nullable(cn.taketoday.lang.Nullable)

Aggregations

OpLT (cn.taketoday.expression.spel.ast.OpLT)4 Expression (cn.taketoday.expression.Expression)2 CompoundExpression (cn.taketoday.expression.spel.ast.CompoundExpression)2 OpEQ (cn.taketoday.expression.spel.ast.OpEQ)2 OpGE (cn.taketoday.expression.spel.ast.OpGE)2 OpGT (cn.taketoday.expression.spel.ast.OpGT)2 OpLE (cn.taketoday.expression.spel.ast.OpLE)2 OpNE (cn.taketoday.expression.spel.ast.OpNE)2 OperatorBetween (cn.taketoday.expression.spel.ast.OperatorBetween)2 OperatorInstanceof (cn.taketoday.expression.spel.ast.OperatorInstanceof)2 OperatorMatches (cn.taketoday.expression.spel.ast.OperatorMatches)2 SpelNodeImpl (cn.taketoday.expression.spel.ast.SpelNodeImpl)2 Ternary (cn.taketoday.expression.spel.ast.Ternary)2 SpelExpression (cn.taketoday.expression.spel.standard.SpelExpression)2 Nullable (cn.taketoday.lang.Nullable)2 Test (org.junit.jupiter.api.Test)2