This reverts commit be3618316f8411ad36d0a77f5b4405f2dbd128fa.
This commit is contained in:
@ -59,12 +59,12 @@ public class PredicatePropagation {
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the left or right child of `equalExpr` to replace the left or right child of `expression`
|
||||
* Use the left or right child of `leftSlotEqualToRightSlot` to replace the left or right child of `expression`
|
||||
* Now only support infer `ComparisonPredicate`.
|
||||
* TODO: We should determine whether `expression` satisfies the condition for replacement
|
||||
* eg: Satisfy `expression` is non-deterministic
|
||||
*/
|
||||
private Expression doInfer(Expression equalExpr, Expression expression) {
|
||||
private Expression doInfer(Expression leftSlotEqualToRightSlot, Expression expression) {
|
||||
return expression.accept(new DefaultExpressionRewriter<Void>() {
|
||||
|
||||
@Override
|
||||
@ -76,43 +76,36 @@ public class PredicatePropagation {
|
||||
public Expression visitComparisonPredicate(ComparisonPredicate cp, Void context) {
|
||||
// we need to get expression covered by cast, because we want to infer different datatype
|
||||
if (ExpressionUtils.isExpressionSlotCoveredByCast(cp.left()) && (cp.right().isConstant())) {
|
||||
return replaceSlot(cp, ExpressionUtils.getDatatypeCoveredByCast(cp.left()), equalExpr);
|
||||
return replaceSlot(cp, ExpressionUtils.getDatatypeCoveredByCast(cp.left()));
|
||||
} else if (ExpressionUtils.isExpressionSlotCoveredByCast(cp.right()) && cp.left().isConstant()) {
|
||||
return replaceSlot(cp, ExpressionUtils.getDatatypeCoveredByCast(cp.right()), equalExpr);
|
||||
return replaceSlot(cp, ExpressionUtils.getDatatypeCoveredByCast(cp.right()));
|
||||
}
|
||||
return super.visit(cp, context);
|
||||
}
|
||||
|
||||
private boolean isDataTypeValid(DataType originDataType, Expression expr) {
|
||||
if ((expr.child(0).getDataType() instanceof IntegralType)
|
||||
&& (expr.child(1).getDataType() instanceof IntegralType)
|
||||
if ((leftSlotEqualToRightSlot.child(0).getDataType() instanceof IntegralType)
|
||||
&& (leftSlotEqualToRightSlot.child(1).getDataType() instanceof IntegralType)
|
||||
&& (originDataType instanceof IntegralType)) {
|
||||
// infer filter can not be lower than original datatype, or dataset would be wrong
|
||||
if (!((IntegralType) originDataType).widerThan(
|
||||
(IntegralType) expr.child(0).getDataType())
|
||||
(IntegralType) leftSlotEqualToRightSlot.child(0).getDataType())
|
||||
&& !((IntegralType) originDataType).widerThan(
|
||||
(IntegralType) expr.child(1).getDataType())) {
|
||||
(IntegralType) leftSlotEqualToRightSlot.child(1).getDataType())) {
|
||||
return true;
|
||||
}
|
||||
} else if (expr.child(0).getDataType().equals(expr.child(1).getDataType())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private Expression replaceSlot(Expression sourcePredicate, DataType originDataType, Expression equal) {
|
||||
if (!isDataTypeValid(originDataType, equal)) {
|
||||
return sourcePredicate;
|
||||
}
|
||||
return sourcePredicate.rewriteUp(e -> {
|
||||
// we can not replace Cast expression to slot because when rewrite up, we have replace child of cast
|
||||
if (e instanceof Cast) {
|
||||
return e;
|
||||
}
|
||||
if (ExpressionUtils.isTwoExpressionEqualWithCast(e, equal.child(0))) {
|
||||
return equal.child(1);
|
||||
} else if (ExpressionUtils.isTwoExpressionEqualWithCast(e, equal.child(1))) {
|
||||
return equal.child(0);
|
||||
private Expression replaceSlot(Expression expr, DataType originDataType) {
|
||||
return expr.rewriteUp(e -> {
|
||||
if (isDataTypeValid(originDataType, leftSlotEqualToRightSlot)) {
|
||||
if (ExpressionUtils.isTwoExpressionEqualWithCast(e, leftSlotEqualToRightSlot.child(0))) {
|
||||
return leftSlotEqualToRightSlot.child(1);
|
||||
} else if (ExpressionUtils.isTwoExpressionEqualWithCast(e, leftSlotEqualToRightSlot.child(1))) {
|
||||
return leftSlotEqualToRightSlot.child(0);
|
||||
}
|
||||
}
|
||||
return e;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user