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 <41606806+sohardforan...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to