diff --git a/presto-main/src/main/java/com/facebook/presto/sql/Optimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/Optimizer.java index 2581efb7e46f..992cf84b35f1 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/Optimizer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/Optimizer.java @@ -117,11 +117,7 @@ public Plan validateAndOptimizePlan(PlanNode root, PlanStage stage) PlanOptimizerResult optimizerResult = optimizer.optimize(root, session, TypeProvider.viewOf(variableAllocator.getVariables()), variableAllocator, idAllocator, warningCollector); requireNonNull(optimizerResult, format("%s returned a null plan", optimizer.getClass().getName())); if (enableVerboseRuntimeStats || trackOptimizerRuntime(session, optimizer)) { - String optimizerName = optimizer.getClass().getSimpleName(); - if (optimizer instanceof StatsRecordingPlanOptimizer) { - optimizerName = format("%s:%s", optimizerName, ((StatsRecordingPlanOptimizer) optimizer).getDelegate().getClass().getSimpleName()); - } - session.getRuntimeStats().addMetricValue(String.format("optimizer%sTimeNanos", optimizerName), NANO, System.nanoTime() - start); + session.getRuntimeStats().addMetricValue(String.format("optimizer%sTimeNanos", getOptimizerNameForLog(optimizer)), NANO, System.nanoTime() - start); } TypeProvider types = TypeProvider.viewOf(variableAllocator.getVariables()); @@ -146,11 +142,7 @@ private boolean trackOptimizerRuntime(Session session, PlanOptimizer optimizer) return false; } List optimizers = Splitter.on(",").trimResults().splitToList(optimizerString); - String optimizerName = optimizer.getClass().getSimpleName(); - if (optimizer instanceof StatsRecordingPlanOptimizer) { - optimizerName = ((StatsRecordingPlanOptimizer) optimizer).getDelegate().getClass().getSimpleName(); - } - return optimizers.contains(optimizerName); + return optimizers.contains(getOptimizerNameForLog(optimizer)); } private StatsAndCosts computeStats(PlanNode root, TypeProvider types) @@ -172,7 +164,7 @@ private void collectOptimizerInformation(PlanOptimizer optimizer, PlanNode oldNo return; } - String optimizerName = optimizer.getClass().getSimpleName(); + String optimizerName = getOptimizerNameForLog(optimizer); boolean isTriggered = planOptimizerResult.isOptimizerTriggered(); boolean isApplicable = isTriggered || @@ -192,4 +184,13 @@ private void collectOptimizerInformation(PlanOptimizer optimizer, PlanNode oldNo session.getOptimizerResultCollector().addOptimizerResult(optimizerName, oldNodeStr, newNodeStr); } } + + private String getOptimizerNameForLog(PlanOptimizer optimizer) + { + String optimizerName = optimizer.getClass().getSimpleName(); + if (optimizer instanceof StatsRecordingPlanOptimizer) { + optimizerName = format("%s:%s", optimizerName, ((StatsRecordingPlanOptimizer) optimizer).getDelegate().getClass().getSimpleName()); + } + return optimizerName; + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/IterativeOptimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/IterativeOptimizer.java index a93917bc4419..a840668400be 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/IterativeOptimizer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/IterativeOptimizer.java @@ -34,6 +34,7 @@ import com.facebook.presto.sql.planner.PlannerUtils; import com.facebook.presto.sql.planner.RuleStatsRecorder; import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.iterative.rule.RowExpressionRewriteRuleSet; import com.facebook.presto.sql.planner.optimizations.PlanOptimizer; import com.facebook.presto.sql.planner.optimizations.PlanOptimizerResult; import com.google.common.base.Splitter; @@ -179,7 +180,7 @@ private boolean exploreNode(int group, Context context, Matcher matcher) if (!rule.isEnabled(context.session)) { if (isVerboseOptimizerInfoEnabled(context.session) && isApplicable(node, rule, matcher, context)) { - context.addRulesApplicable(rule.getClass().getSimpleName()); + context.addRulesApplicable(getNameOfOptimizerRule(rule)); } continue; } @@ -198,7 +199,7 @@ private boolean exploreNode(int group, Context context, Matcher matcher) transformedNode = transformedNode.assignStatsEquivalentPlanNode(node.getStatsEquivalentPlanNode()); } } - context.addRulesTriggered(rule.getClass().getSimpleName(), node, transformedNode, rule.isCostBased(context.session), rule.getStatsSource()); + context.addRulesTriggered(getNameOfOptimizerRule(rule), node, transformedNode, rule.isCostBased(context.session), rule.getStatsSource()); node = context.memo.replace(group, transformedNode, rule.getClass().getName()); done = false; @@ -210,6 +211,15 @@ private boolean exploreNode(int group, Context context, Matcher matcher) return progress; } + private String getNameOfOptimizerRule(Rule rule) + { + String ruleName = rule.getClass().getSimpleName(); + if (rule instanceof RowExpressionRewriteRuleSet.RowExpressionRewriteRule) { + ruleName = ((RowExpressionRewriteRuleSet.RowExpressionRewriteRule) rule).getOptimizerNameForLog(); + } + return ruleName; + } + private Rule.Result transform(PlanNode node, Rule rule, Matcher matcher, Context context) { Rule.Result result; @@ -232,7 +242,7 @@ private Rule.Result transform(PlanNode node, Rule rule, Matcher matcher, } stats.record(rule, duration, !result.isEmpty()); if (SystemSessionProperties.isVerboseRuntimeStatsEnabled(context.session) || trackOptimizerRuntime(context.session, rule)) { - context.session.getRuntimeStats().addMetricValue(String.format("rule%sTimeNanos", rule.getClass().getSimpleName()), NANO, duration); + context.session.getRuntimeStats().addMetricValue(String.format("rule%sTimeNanos", getNameOfOptimizerRule(rule)), NANO, duration); } return result; @@ -245,7 +255,7 @@ private boolean trackOptimizerRuntime(Session session, Rule rule) return false; } List optimizers = Splitter.on(",").trimResults().splitToList(optimizerString); - return optimizers.contains(rule.getClass().getSimpleName()); + return optimizers.contains(getNameOfOptimizerRule(rule)); } private boolean isApplicable(PlanNode node, Rule rule, Matcher matcher, Context context) diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RowExpressionRewriteRuleSet.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RowExpressionRewriteRuleSet.java index de3f9ec7ae66..378eebf2ed90 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RowExpressionRewriteRuleSet.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/iterative/rule/RowExpressionRewriteRuleSet.java @@ -55,6 +55,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableMap.builder; +import static java.lang.String.format; import static java.util.Objects.requireNonNull; public class RowExpressionRewriteRuleSet @@ -141,8 +142,18 @@ public Rule aggregationRowExpressionRewriteRule() return new AggregationRowExpressionRewrite(); } + public abstract class RowExpressionRewriteRule + implements Rule + { + public String getOptimizerNameForLog() + { + String rewriterName = rewriter.getClass().getName(); + return format("%s:%s", rewriterName.substring(rewriterName.lastIndexOf('.') + 1), this.getClass().getSimpleName()); + } + } + private final class ProjectRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -177,7 +188,7 @@ public Result apply(ProjectNode projectNode, Captures captures, Context context) } private final class SpatialJoinRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -215,7 +226,7 @@ public Result apply(SpatialJoinNode spatialJoinNode, Captures captures, Context } private final class JoinRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -259,7 +270,7 @@ public Result apply(JoinNode joinNode, Captures captures, Context context) } private final class WindowRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -316,7 +327,7 @@ public Result apply(WindowNode windowNode, Captures captures, Context context) } private final class ApplyRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -366,7 +377,7 @@ private Optional translateAssignments(Assignments assignments, Rule } private final class FilterRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -394,7 +405,7 @@ public Result apply(FilterNode filterNode, Captures captures, Context context) } private final class ValuesRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -432,7 +443,7 @@ public Result apply(ValuesNode valuesNode, Captures captures, Context context) } private final class AggregationRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -480,7 +491,7 @@ public Result apply(AggregationNode node, Captures captures, Context context) } private final class TableFinishRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session) @@ -537,7 +548,7 @@ private Optional translateStatisticAggregation(StatisticA } private final class TableWriterRowExpressionRewrite - implements Rule + extends RowExpressionRewriteRule { @Override public boolean isEnabled(Session session)