2323import org .apache .doris .nereids .trees .expressions .OrderExpression ;
2424import org .apache .doris .nereids .trees .expressions .functions .ExplicitlyCastableSignature ;
2525import org .apache .doris .nereids .trees .expressions .visitor .ExpressionVisitor ;
26- import org .apache .doris .nereids .types .CharType ;
27- import org .apache .doris .nereids .types .StringType ;
2826import org .apache .doris .nereids .types .VarcharType ;
2927import org .apache .doris .nereids .types .coercion .AnyDataType ;
3028import org .apache .doris .nereids .util .ExpressionUtils ;
3735/** MultiDistinctGroupConcat */
3836public class MultiDistinctGroupConcat extends NullableAggregateFunction
3937 implements ExplicitlyCastableSignature , MultiDistinction {
40- public static final List <FunctionSignature > SIGNATURES = ImmutableList .of (
41- FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT ).args (VarcharType .SYSTEM_DEFAULT ),
42- FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT ).varArgs (VarcharType .SYSTEM_DEFAULT ,
43- AnyDataType .INSTANCE_WITHOUT_INDEX ),
44- FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT ).varArgs (VarcharType .SYSTEM_DEFAULT ,
45- VarcharType .SYSTEM_DEFAULT , AnyDataType .INSTANCE_WITHOUT_INDEX ),
46-
47- FunctionSignature .ret (StringType .INSTANCE ).args (StringType .INSTANCE ),
48- FunctionSignature .ret (StringType .INSTANCE ).varArgs (StringType .INSTANCE ,
49- AnyDataType .INSTANCE_WITHOUT_INDEX ),
50- FunctionSignature .ret (StringType .INSTANCE ).varArgs (StringType .INSTANCE ,
51- StringType .INSTANCE , AnyDataType .INSTANCE_WITHOUT_INDEX ),
52-
53- FunctionSignature .ret (CharType .SYSTEM_DEFAULT ).args (CharType .SYSTEM_DEFAULT ),
54- FunctionSignature .ret (CharType .SYSTEM_DEFAULT ).varArgs (CharType .SYSTEM_DEFAULT ,
55- AnyDataType .INSTANCE_WITHOUT_INDEX ),
56- FunctionSignature .ret (CharType .SYSTEM_DEFAULT ).varArgs (CharType .SYSTEM_DEFAULT ,
57- CharType .SYSTEM_DEFAULT , AnyDataType .INSTANCE_WITHOUT_INDEX ));
38+ private static final List <FunctionSignature > ONE_ARG = ImmutableList .of (
39+ FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT ).args (VarcharType .SYSTEM_DEFAULT )
40+ );
41+ private static final List <FunctionSignature > ONE_ARG_WITH_ORDER_BY = ImmutableList .of (
42+ FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT )
43+ .varArgs (VarcharType .SYSTEM_DEFAULT , AnyDataType .INSTANCE_WITHOUT_INDEX )
44+ );
45+ private static final List <FunctionSignature > TWO_ARGS = ImmutableList .of (
46+ FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT )
47+ .args (VarcharType .SYSTEM_DEFAULT , VarcharType .SYSTEM_DEFAULT )
48+ );
49+ private static final List <FunctionSignature > TWO_ARGS_WITH_ORDER_BY = ImmutableList .of (
50+ FunctionSignature .ret (VarcharType .SYSTEM_DEFAULT )
51+ .varArgs (VarcharType .SYSTEM_DEFAULT , VarcharType .SYSTEM_DEFAULT , AnyDataType .INSTANCE_WITHOUT_INDEX )
52+ );
5853
5954 private final boolean mustUseMultiDistinctAgg ;
55+ private final int nonOrderArguments ;
6056
6157 /**
6258 * constructor with 1 argument with other arguments.
@@ -79,8 +75,8 @@ private MultiDistinctGroupConcat(boolean alwaysNullable, Expression arg,
7975
8076 private MultiDistinctGroupConcat (boolean mustUseMultiDistinctAgg , boolean alwaysNullable , List <Expression > args ) {
8177 super ("multi_distinct_group_concat" , false , alwaysNullable , args );
82- checkArguments (children );
8378 this .mustUseMultiDistinctAgg = mustUseMultiDistinctAgg ;
79+ this .nonOrderArguments = findOrderExprIndex (children );
8480 }
8581
8682 @ Override
@@ -99,7 +95,6 @@ public MultiDistinctGroupConcat withAlwaysNullable(boolean alwaysNullable) {
9995 */
10096 @ Override
10197 public MultiDistinctGroupConcat withDistinctAndChildren (boolean distinct , List <Expression > children ) {
102- checkArguments (children );
10398 return new MultiDistinctGroupConcat (mustUseMultiDistinctAgg , alwaysNullable , children );
10499 }
105100
@@ -110,10 +105,30 @@ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
110105
111106 @ Override
112107 public List <FunctionSignature > getSignatures () {
113- return SIGNATURES ;
108+ if (nonOrderArguments == 2 ) {
109+ if (arity () >= 3 ) {
110+ return TWO_ARGS_WITH_ORDER_BY ;
111+ }
112+ return TWO_ARGS ;
113+ } else {
114+ if (arity () >= 2 ) {
115+ return ONE_ARG_WITH_ORDER_BY ;
116+ }
117+ return ONE_ARG ;
118+ }
119+ }
120+
121+ @ Override
122+ public boolean mustUseMultiDistinctAgg () {
123+ return mustUseMultiDistinctAgg || children .stream ().anyMatch (OrderExpression .class ::isInstance );
114124 }
115125
116- private void checkArguments (List <Expression > children ) {
126+ @ Override
127+ public Expression withMustUseMultiDistinctAgg (boolean mustUseMultiDistinctAgg ) {
128+ return new MultiDistinctGroupConcat (mustUseMultiDistinctAgg , alwaysNullable , children );
129+ }
130+
131+ private int findOrderExprIndex (List <Expression > children ) {
117132 Preconditions .checkArgument (children ().size () >= 1 , "children's size should >= 1" );
118133 boolean foundOrderExpr = false ;
119134 int firstOrderExrIndex = 0 ;
@@ -133,15 +148,6 @@ private void checkArguments(List<Expression> children) {
133148 throw new AnalysisException (
134149 "multi_distinct_group_concat requires one or two parameters: " + children );
135150 }
136- }
137-
138- @ Override
139- public boolean mustUseMultiDistinctAgg () {
140- return mustUseMultiDistinctAgg || children .stream ().anyMatch (OrderExpression .class ::isInstance );
141- }
142-
143- @ Override
144- public Expression withMustUseMultiDistinctAgg (boolean mustUseMultiDistinctAgg ) {
145- return new MultiDistinctGroupConcat (mustUseMultiDistinctAgg , alwaysNullable , children );
151+ return firstOrderExrIndex ;
146152 }
147153}
0 commit comments