This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new a7af869bfd [opt](Nereids) group_concat to support more cases (#15815)
a7af869bfd is described below
commit a7af869bfd3c9b4fce51efb0e992235302010d9d
Author: mch_ucchi <[email protected]>
AuthorDate: Fri Jan 13 00:41:13 2023 +0800
[opt](Nereids) group_concat to support more cases (#15815)
enhance group_concat to support group_concat(cast(slot), ...) and support
call it with 1 argument.
---
.../doris/nereids/trees/expressions/OrderExpression.java | 4 ++++
.../trees/expressions/functions/agg/GroupConcat.java | 11 +++++++----
.../org/apache/doris/nereids/util/ExpressionUtils.java | 14 ++++++++++++++
.../suites/nereids_syntax_p0/group_concat.groovy | 10 ++++++++++
4 files changed, 35 insertions(+), 4 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java
index fa03ce45d7..da80d2e7a3 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java
@@ -48,6 +48,10 @@ public class OrderExpression extends Expression implements
UnaryExpression, Prop
return orderKey.isNullFirst();
}
+ public OrderKey getOrderKey() {
+ return orderKey;
+ }
+
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitOrderExpression(this, context);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java
index 48d531bb45..08c6f64d0f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java
@@ -33,6 +33,7 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.stream.Collectors;
/**
* AggregateFunction 'group_concat'. This class is generated by
GenerateFunction.
@@ -41,13 +42,14 @@ public class GroupConcat extends AggregateFunction
implements ExplicitlyCastableSignature, PropagateNullable {
public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT),
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
.varArgs(VarcharType.SYSTEM_DEFAULT, AnyDataType.INSTANCE),
FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
.varArgs(VarcharType.SYSTEM_DEFAULT,
VarcharType.SYSTEM_DEFAULT, AnyDataType.INSTANCE)
);
- private int nonOrderArguments;
+ private final int nonOrderArguments;
/**
* constructor with 1 argument.
@@ -103,8 +105,10 @@ public class GroupConcat extends AggregateFunction
*/
@Override
public GroupConcat withDistinctAndChildren(boolean distinct,
List<Expression> children) {
- Preconditions.checkArgument(children().size() > 1);
+ Preconditions.checkArgument(children().size() >= 1);
+ // in type coercion, the orderExpression will be the child of cast, we
should push down cast.
+ children =
children.stream().map(ExpressionUtils::pushDownCastInOrderExpression).collect(Collectors.toList());
boolean foundOrderExpr = false;
int firstOrderExrIndex = 0;
for (int i = 0; i < children.size(); i++) {
@@ -118,11 +122,10 @@ public class GroupConcat extends AggregateFunction
}
}
+ List<OrderExpression> orders = (List)
children.subList(firstOrderExrIndex, children.size());
if (firstOrderExrIndex == 1) {
- List<OrderExpression> orders = (List)
children.subList(firstOrderExrIndex, children.size());
return new GroupConcat(distinct, children.get(0),
orders.toArray(new OrderExpression[0]));
} else if (firstOrderExrIndex == 2) {
- List<OrderExpression> orders = (List)
children.subList(firstOrderExrIndex, children.size());
return new GroupConcat(distinct, children.get(0), children.get(1),
orders.toArray(new OrderExpression[0]));
} else {
throw new AnalysisException("group_concat requires one or two
parameters: " + children);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
index 7a7ed01f30..3490ec284f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
@@ -28,6 +28,7 @@ import org.apache.doris.nereids.trees.expressions.InPredicate;
import org.apache.doris.nereids.trees.expressions.IsNull;
import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.Or;
+import org.apache.doris.nereids.trees.expressions.OrderExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
@@ -466,4 +467,17 @@ public class ExpressionUtils {
.flatMap(expr -> expr.getInputSlots().stream())
.collect(ImmutableSet.toImmutableSet());
}
+
+ /**
+ * cast push down in order expression
+ */
+ public static Expression pushDownCastInOrderExpression(Expression
expression) {
+ if (expression instanceof Cast
+ && ((Cast) expression).child() instanceof OrderExpression) {
+ Cast cast = ((Cast) expression);
+ OrderExpression order = ((OrderExpression) cast.child());
+ return
order.withChildren(cast.withChildren(order.getOrderKey().getExpr()));
+ }
+ return expression;
+ }
}
diff --git a/regression-test/suites/nereids_syntax_p0/group_concat.groovy
b/regression-test/suites/nereids_syntax_p0/group_concat.groovy
index 87fd62b281..0f16089cbd 100644
--- a/regression-test/suites/nereids_syntax_p0/group_concat.groovy
+++ b/regression-test/suites/nereids_syntax_p0/group_concat.groovy
@@ -34,4 +34,14 @@ suite("group_concat") {
from numbers('number'='10')"""
result([["0,1,2,3,4,5,6,7,8,9"]])
}
+
+ test {
+ sql "select group_concat(cast(number as string)) from
numbers('number'='10')"
+ result([["0, 1, 2, 3, 4, 5, 6, 7, 8, 9"]])
+ }
+
+ test {
+ sql "select group_concat(cast(number as string), ' : ') from
numbers('number'='10')"
+ result([["0 : 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9"]])
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]