This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch branch-1.2-unstable in repository https://gitbox.apache.org/repos/asf/doris.git
commit 5db650f961730e9eb6082dd19cb0905656297961 Author: morrySnow <101034200+morrys...@users.noreply.github.com> AuthorDate: Tue Nov 8 11:02:42 2022 +0800 [feature](Nereids) support query that group by use alias generated in aggregate output (#14030) support query having alias in group by list, such as: SELECT c1 AS a, SUM(c2) FROM t GROUP BY a; --- .../nereids/rules/analysis/BindSlotReference.java | 34 ++++++++++++++++------ .../datasets/clickbench/AnalyzeClickBenchTest.java | 24 +++++++-------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java index 56ef1f887c..07b1763afa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java @@ -27,6 +27,7 @@ import org.apache.doris.nereids.memo.Memo; import org.apache.doris.nereids.properties.OrderKey; import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.trees.UnaryNode; import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Exists; import org.apache.doris.nereids.trees.expressions.Expression; @@ -58,6 +59,7 @@ import org.apache.commons.lang.StringUtils; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -67,14 +69,11 @@ import java.util.stream.Stream; /** * BindSlotReference. */ +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public class BindSlotReference implements AnalysisRuleFactory { private final Optional<Scope> outerScope; - public BindSlotReference() { - this(Optional.empty()); - } - public BindSlotReference(Optional<Scope> outerScope) { this.outerScope = Objects.requireNonNull(outerScope, "outerScope cannot be null"); } @@ -122,10 +121,27 @@ public class BindSlotReference implements AnalysisRuleFactory { RuleType.BINDING_AGGREGATE_SLOT.build( logicalAggregate().when(Plan::canBind).thenApply(ctx -> { LogicalAggregate<GroupPlan> agg = ctx.root; - List<Expression> groupBy = - bind(agg.getGroupByExpressions(), agg.children(), agg, ctx.cascadesContext); List<NamedExpression> output = bind(agg.getOutputExpressions(), agg.children(), agg, ctx.cascadesContext); + final Map<String, Expression> substitutions = output.stream() + .filter(ne -> ne instanceof Alias) + .map(Alias.class::cast) + .collect(Collectors.toMap(Alias::getName, UnaryNode::child)); + List<Expression> replacedGroupBy = agg.getGroupByExpressions().stream() + .map(g -> { + if (g instanceof UnboundSlot) { + UnboundSlot unboundSlot = (UnboundSlot) g; + if (unboundSlot.getNameParts().size() == 1) { + String name = unboundSlot.getNameParts().get(0); + if (substitutions.containsKey(name)) { + return substitutions.get(name); + } + } + } + return g; + }).collect(Collectors.toList()); + + List<Expression> groupBy = bind(replacedGroupBy, agg.children(), agg, ctx.cascadesContext); return agg.withGroupByAndOutput(groupBy, output); }) ), @@ -301,14 +317,14 @@ public class BindSlotReference implements AnalysisRuleFactory { return new BoundStar(getScope().getSlots()); case 1: // select table.* case 2: // select db.table.* - return bindQualifiedStar(qualifier, context); + return bindQualifiedStar(qualifier); default: throw new AnalysisException("Not supported qualifier: " + StringUtils.join(qualifier, ".")); } } - private BoundStar bindQualifiedStar(List<String> qualifierStar, PlannerContext context) { + private BoundStar bindQualifiedStar(List<String> qualifierStar) { // FIXME: compatible with previous behavior: // https://github.com/apache/doris/pull/10415/files/3fe9cb0c3f805ab3a9678033b281b16ad93ec60a#r910239452 List<Slot> slots = getScope().getSlots().stream().filter(boundSlot -> { @@ -544,7 +560,7 @@ public class BindSlotReference implements AnalysisRuleFactory { public boolean hasGroupBy() { if (rootIsAgg()) { - return !((LogicalAggregate) logicalPlan).getGroupByExpressions().isEmpty(); + return !((LogicalAggregate<? extends Plan>) logicalPlan).getGroupByExpressions().isEmpty(); } return false; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/clickbench/AnalyzeClickBenchTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/clickbench/AnalyzeClickBenchTest.java index 0493582d74..65a18b8591 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/clickbench/AnalyzeClickBenchTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/datasets/clickbench/AnalyzeClickBenchTest.java @@ -110,10 +110,10 @@ public class AnalyzeClickBenchTest extends ClickBenchTestBase { checkAnalyze(ClickBenchUtils.Q17); } - // @Test - // public void q18() { - // checkAnalyze(ClickBenchUtils.Q18); - // } + @Test + public void q18() { + checkAnalyze(ClickBenchUtils.Q18); + } @Test public void q19() { @@ -160,10 +160,10 @@ public class AnalyzeClickBenchTest extends ClickBenchTestBase { checkAnalyze(ClickBenchUtils.Q27); } - // @Test - // public void q28() { - // checkAnalyze(ClickBenchUtils.Q28); - // } + @Test + public void q28() { + checkAnalyze(ClickBenchUtils.Q28); + } @Test public void q29() { @@ -215,10 +215,10 @@ public class AnalyzeClickBenchTest extends ClickBenchTestBase { checkAnalyze(ClickBenchUtils.Q38); } - // @Test - // public void q39() { - // checkAnalyze(ClickBenchUtils.Q39); - // } + @Test + public void q39() { + checkAnalyze(ClickBenchUtils.Q39); + } @Test public void q40() { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org