MCPcopy Create free account
hub / github.com/apache/datafusion / remove_unnecessary_nesting

Method remove_unnecessary_nesting

datafusion/sql/src/unparser/expr.rs:971–1031  ·  view source on GitHub ↗

Given an expression of the form `((a + b) * (c * d))`, the parenthesis is redundant if the precedence of the nested expression is already higher than the surrounding operators' precedence. The above expression would become `(a + b) * c * d`. Also note that when fetching the precedence of a nested expression, we ignore other nested expressions, so precedence of expr `(a * (b + c))` equals `*` and

(
        &self,
        expr: ast::Expr,
        left_op: &BinaryOperator,
        right_op: &BinaryOperator,
    )

Source from the content-addressed store, hash-verified

969 /// Also note that when fetching the precedence of a nested expression, we ignore other nested
970 /// expressions, so precedence of expr `(a * (b + c))` equals `*` and not `+`.
971 fn remove_unnecessary_nesting(
972 &self,
973 expr: ast::Expr,
974 left_op: &BinaryOperator,
975 right_op: &BinaryOperator,
976 ) -> ast::Expr {
977 match expr {
978 ast::Expr::Nested(nested) => {
979 let surrounding_precedence = self
980 .sql_op_precedence(left_op)
981 .max(self.sql_op_precedence(right_op));
982
983 let inner_precedence = self.inner_precedence(&nested);
984
985 let not_associative =
986 matches!(left_op, BinaryOperator::Minus | BinaryOperator::Divide);
987
988 if inner_precedence == surrounding_precedence && not_associative {
989 ast::Expr::Nested(Box::new(
990 self.remove_unnecessary_nesting(*nested, LOWEST, LOWEST),
991 ))
992 } else if inner_precedence >= surrounding_precedence {
993 self.remove_unnecessary_nesting(*nested, left_op, right_op)
994 } else {
995 ast::Expr::Nested(Box::new(
996 self.remove_unnecessary_nesting(*nested, LOWEST, LOWEST),
997 ))
998 }
999 }
1000 ast::Expr::BinaryOp { left, op, right } => ast::Expr::BinaryOp {
1001 left: Box::new(self.remove_unnecessary_nesting(*left, left_op, &op)),
1002 right: Box::new(self.remove_unnecessary_nesting(*right, &op, right_op)),
1003 op,
1004 },
1005 ast::Expr::IsTrue(expr) => ast::Expr::IsTrue(Box::new(
1006 self.remove_unnecessary_nesting(*expr, left_op, IS),
1007 )),
1008 ast::Expr::IsNotTrue(expr) => ast::Expr::IsNotTrue(Box::new(
1009 self.remove_unnecessary_nesting(*expr, left_op, IS),
1010 )),
1011 ast::Expr::IsFalse(expr) => ast::Expr::IsFalse(Box::new(
1012 self.remove_unnecessary_nesting(*expr, left_op, IS),
1013 )),
1014 ast::Expr::IsNotFalse(expr) => ast::Expr::IsNotFalse(Box::new(
1015 self.remove_unnecessary_nesting(*expr, left_op, IS),
1016 )),
1017 ast::Expr::IsNull(expr) => ast::Expr::IsNull(Box::new(
1018 self.remove_unnecessary_nesting(*expr, left_op, IS),
1019 )),
1020 ast::Expr::IsNotNull(expr) => ast::Expr::IsNotNull(Box::new(
1021 self.remove_unnecessary_nesting(*expr, left_op, IS),
1022 )),
1023 ast::Expr::IsUnknown(expr) => ast::Expr::IsUnknown(Box::new(
1024 self.remove_unnecessary_nesting(*expr, left_op, IS),
1025 )),
1026 ast::Expr::IsNotUnknown(expr) => ast::Expr::IsNotUnknown(Box::new(
1027 self.remove_unnecessary_nesting(*expr, left_op, IS),
1028 )),

Callers 1

expr_to_sqlMethod · 0.80

Calls 12

newFunction · 0.85
IsTrueClass · 0.85
IsNotTrueClass · 0.85
IsFalseClass · 0.85
IsNotFalseClass · 0.85
IsNullClass · 0.85
IsNotNullClass · 0.85
IsUnknownClass · 0.85
IsNotUnknownClass · 0.85
sql_op_precedenceMethod · 0.80
inner_precedenceMethod · 0.80
maxMethod · 0.45

Tested by

no test coverage detected