fix: parser handles not equals correctly, does not eagerly evaluate when there may be an error

Signed-off-by: Calum Murray <cmurray@redhat.com>
This commit is contained in:
Calum Murray 2024-06-19 09:30:56 -04:00
parent b25cb7de4c
commit 5c78074c9b
No known key found for this signature in database
GPG Key ID: D9837BD1D90C1512
3 changed files with 4 additions and 31 deletions

View File

@ -1,14 +1,12 @@
package io.cloudevents.sql.impl.parser;
import io.cloudevents.SpecVersion;
import io.cloudevents.sql.EvaluationRuntime;
import io.cloudevents.sql.impl.ExpressionInternal;
import io.cloudevents.sql.impl.ExpressionInternalVisitor;
import io.cloudevents.sql.impl.expressions.BaseBinaryExpression;
import io.cloudevents.sql.impl.expressions.BaseUnaryExpression;
import io.cloudevents.sql.impl.expressions.ExistsExpression;
import io.cloudevents.sql.impl.expressions.ValueExpression;
import io.cloudevents.sql.impl.runtime.FailFastExceptionThrower;
public class ConstantFoldingExpressionVisitor implements ExpressionInternalVisitor<ExpressionInternal> {
@ -22,20 +20,6 @@ public class ConstantFoldingExpressionVisitor implements ExpressionInternalVisit
ExpressionInternal left = baseBinaryExpression.getLeftOperand().visit(this);
ExpressionInternal right = baseBinaryExpression.getRightOperand().visit(this);
if (left instanceof ValueExpression && right instanceof ValueExpression) {
// I can do constant folding!
return new ValueExpression(
baseBinaryExpression.expressionInterval(),
baseBinaryExpression.expressionText(),
baseBinaryExpression.evaluate(
EvaluationRuntime.getDefault(),
((ValueExpression) left).getValue(),
((ValueExpression) right).getValue(),
FailFastExceptionThrower.getInstance()
)
);
}
baseBinaryExpression.setLeftOperand(left);
baseBinaryExpression.setRightOperand(right);
return baseBinaryExpression;
@ -54,14 +38,6 @@ public class ConstantFoldingExpressionVisitor implements ExpressionInternalVisit
public ExpressionInternal visitBaseUnaryExpression(BaseUnaryExpression baseUnaryExpression) {
ExpressionInternal inner = baseUnaryExpression.getOperand().visit(this);
if (inner instanceof ValueExpression) {
return new ValueExpression(
baseUnaryExpression.expressionInterval(),
baseUnaryExpression.expressionText(),
baseUnaryExpression.evaluate(EvaluationRuntime.getDefault(), ((ValueExpression) inner).getValue(), FailFastExceptionThrower.getInstance())
);
}
baseUnaryExpression.setOperand(inner);
return baseUnaryExpression;
}

View File

@ -1,9 +1,9 @@
package io.cloudevents.sql.impl.parser;
import io.cloudevents.sql.ExceptionFactory;
import io.cloudevents.sql.Type;
import io.cloudevents.sql.generated.CESQLParserBaseVisitor;
import io.cloudevents.sql.generated.CESQLParserParser;
import io.cloudevents.sql.impl.ExceptionFactory;
import io.cloudevents.sql.impl.ExpressionInternal;
import io.cloudevents.sql.impl.expressions.*;
@ -121,11 +121,11 @@ public class ExpressionTranslatorVisitor extends CESQLParserBaseVisitor<Expressi
if (ctx.EQUAL() != null) {
// Equality operation is ambiguous, we have a specific implementation for it
return new EqualExpression(ctx.getSourceInterval(), ctx.getText(), leftExpression, rightExpression);
return new ComparisonExpression(ctx.getSourceInterval(), ctx.getText(), leftExpression, rightExpression, ComparisonExpression.Comparison.EQUALS);
}
if (ctx.NOT_EQUAL() != null || ctx.LESS_GREATER() != null) {
// Equality operation is ambiguous, we have a specific implementation for it
return new NotExpression(ctx.getSourceInterval(), ctx.getText(), new EqualExpression(ctx.getSourceInterval(), ctx.getText(), leftExpression, rightExpression));
return new ComparisonExpression(ctx.getSourceInterval(), ctx.getText(), leftExpression, rightExpression, ComparisonExpression.Comparison.NOT_EQUALS);
}
// From this onward, just operators defined on integers

View File

@ -1,12 +1,9 @@
package io.cloudevents.sql.impl.parser;
import io.cloudevents.sql.EvaluationException;
import io.cloudevents.sql.Expression;
import io.cloudevents.sql.ParseException;
import io.cloudevents.sql.*;
import io.cloudevents.sql.Parser;
import io.cloudevents.sql.generated.CESQLParserLexer;
import io.cloudevents.sql.generated.CESQLParserParser;
import io.cloudevents.sql.impl.ExceptionFactory;
import io.cloudevents.sql.impl.ExpressionInternal;
import io.cloudevents.sql.impl.runtime.ExpressionImpl;
import org.antlr.v4.runtime.*;