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:
parent
b25cb7de4c
commit
5c78074c9b
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.*;
|
||||
|
|
Loading…
Reference in New Issue