You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/11/09 14:55:32 UTC
[doris] 03/39: [feature](Nereids) support query that group by use alias generated in aggregate output (#14030)
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 <10...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org