From 96d2e3394a23fd115f706b38fa5b851787b85c05 Mon Sep 17 00:00:00 2001 From: seawinde <149132972+seawinde@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:14:15 +0800 Subject: [PATCH] [opt](meta) Improve the performance of getting expr name (#26341) CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name) It's time-consuming when call many times. So lazy call when necessary --- .../java/org/apache/doris/analysis/AnalyticExpr.java | 8 ++++++-- .../java/org/apache/doris/analysis/ColumnRefExpr.java | 9 +++++++-- .../src/main/java/org/apache/doris/analysis/Expr.java | 10 +++++++--- .../org/apache/doris/analysis/FunctionCallExpr.java | 7 +++++-- .../java/org/apache/doris/analysis/LiteralExpr.java | 8 ++++++-- .../main/java/org/apache/doris/analysis/SlotRef.java | 8 ++++++-- .../java/org/apache/doris/analysis/VirtualSlotRef.java | 2 +- .../apache/doris/nereids/analyzer/UnboundFunction.java | 6 +++++- .../nereids/trees/expressions/AggregateExpression.java | 6 +++++- .../trees/expressions/AssertNumRowsElement.java | 6 +++++- .../doris/nereids/trees/expressions/Expression.java | 8 ++++++-- .../nereids/trees/expressions/NamedExpression.java | 6 +++++- .../doris/nereids/trees/expressions/SubqueryExpr.java | 5 ++++- .../trees/expressions/functions/BoundFunction.java | 6 +++++- .../nereids/trees/expressions/literal/Literal.java | 6 +++++- 15 files changed, 78 insertions(+), 23 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java index 37b4684f15..39c428f7fa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java @@ -44,6 +44,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; /** * Representation of an analytic function call with OVER clause. @@ -147,8 +148,11 @@ public class AnalyticExpr extends Expr { } @Override - protected String getExprName() { - return Utils.normalizeName(getFnCall().getExprName(), DEFAULT_EXPR_NAME); + public String getExprName() { + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(getFnCall().getExprName(), DEFAULT_EXPR_NAME)); + } + return this.exprName.get(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java index d980a67076..5a47ab6940 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java @@ -26,6 +26,8 @@ import org.apache.doris.thrift.TExprNodeType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Optional; + public class ColumnRefExpr extends Expr { private static final Logger LOG = LogManager.getLogger(ColumnRefExpr.class); private String columnName; @@ -55,8 +57,11 @@ public class ColumnRefExpr extends Expr { } @Override - protected String getExprName() { - return Utils.normalizeName(getName(), DEFAULT_EXPR_NAME); + public String getExprName() { + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(getName(), DEFAULT_EXPR_NAME)); + } + return this.exprName.get(); } public void setName(String name) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index 5b7479ae2d..09848e3d18 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -69,6 +69,7 @@ import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Optional; import java.util.Set; /** @@ -296,7 +297,7 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl // Flag to indicate whether to wrap this expr's toSql() in parenthesis. Set by parser. // Needed for properly capturing expr precedences in the SQL string. protected boolean printSqlInParens = false; - protected final String exprName = Utils.normalizeName(this.getClass().getSimpleName(), DEFAULT_EXPR_NAME); + protected Optional exprName = Optional.empty(); protected Expr() { super(); @@ -340,8 +341,11 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl // Name of expr, this is used by generating column name automatically when there is no // alias or is not slotRef - protected String getExprName() { - return this.exprName; + public String getExprName() { + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(this.getClass().getSimpleName(), DEFAULT_EXPR_NAME)); + } + return this.exprName.get(); } public Type getType() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 6fbb35aac6..12e471979d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -313,8 +313,11 @@ public class FunctionCallExpr extends Expr { } @Override - protected String getExprName() { - return Utils.normalizeName(this.getFnName().getFunction(), DEFAULT_EXPR_NAME); + public String getExprName() { + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(this.getFnName().getFunction(), DEFAULT_EXPR_NAME)); + } + return this.exprName.get(); } public FunctionCallExpr(String functionName, List params) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java index bbeffe7366..7047a8d900 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java @@ -36,6 +36,7 @@ import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; +import java.util.Optional; public abstract class LiteralExpr extends Expr implements Comparable { private static final Logger LOG = LogManager.getLogger(LiteralExpr.class); @@ -365,8 +366,11 @@ public abstract class LiteralExpr extends Expr implements Comparable implements public static final String DEFAULT_EXPRESSION_NAME = "expression"; // Mask this expression is generated by rule, should be removed. public boolean isGeneratedIsNotNull = false; - protected final String exprName = Utils.normalizeName(this.getClass().getSimpleName(), DEFAULT_EXPRESSION_NAME); + protected Optional exprName = Optional.empty(); private final int depth; private final int width; @@ -97,7 +98,10 @@ public abstract class Expression extends AbstractTreeNode implements // Name of expr, this is used by generating column name automatically when there is no // alias public String getExpressionName() { - return this.exprName; + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(this.getClass().getSimpleName(), DEFAULT_EXPRESSION_NAME)); + } + return this.exprName.get(); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java index 2854704b92..d03669234c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpression.java @@ -21,6 +21,7 @@ import org.apache.doris.nereids.exceptions.UnboundException; import org.apache.doris.nereids.util.Utils; import java.util.List; +import java.util.Optional; /** * Expression in Nereids that having name. @@ -59,6 +60,9 @@ public abstract class NamedExpression extends Expression { @Override public String getExpressionName() { - return Utils.normalizeName(getName(), DEFAULT_EXPRESSION_NAME); + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(getName(), DEFAULT_EXPRESSION_NAME)); + } + return this.exprName.get(); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java index d6876873ed..451fcad677 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SubqueryExpr.java @@ -86,7 +86,10 @@ public abstract class SubqueryExpr extends Expression implements LeafExpression @Override public String getExpressionName() { - return "subquery"; + if (!this.exprName.isPresent()) { + this.exprName = Optional.of("subquery"); + } + return this.exprName.get(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java index e3970161c7..d2089a8d32 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java @@ -27,6 +27,7 @@ import com.google.common.base.Suppliers; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -57,7 +58,10 @@ public abstract class BoundFunction extends Function implements ComputeSignature @Override public String getExpressionName() { - return Utils.normalizeName(getName(), DEFAULT_EXPRESSION_NAME); + if (!this.exprName.isPresent()) { + this.exprName = Optional.of(Utils.normalizeName(getName(), DEFAULT_EXPRESSION_NAME)); + } + return this.exprName.get(); } public FunctionSignature getSignature() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java index c83061f195..fd2b371ea7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java @@ -41,6 +41,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.Locale; import java.util.Objects; +import java.util.Optional; /** * All data type literal expression in Nereids. @@ -133,7 +134,10 @@ public abstract class Literal extends Expression implements LeafExpression, Comp @Override public String getExpressionName() { - return "literal"; + if (!this.exprName.isPresent()) { + this.exprName = Optional.of("literal"); + } + return this.exprName.get(); } @Override