From 2ddd2e50797b888ce1a35e96d2e2f95d15f3500f Mon Sep 17 00:00:00 2001 From: Liqf <109049295+LemonLiTree@users.noreply.github.com> Date: Wed, 18 Oct 2023 19:44:36 +0800 Subject: [PATCH] [feature](Nereids) add map_agg function (#25246) --- docs/sidebars.json | 3 +- .../catalog/BuiltinAggregateFunctions.java | 2 + .../expressions/functions/agg/MapAgg.java | 72 +++++++++++++++++++ .../visitor/AggregateFunctionVisitor.java | 6 ++ .../nereids_function_p0/agg_function/agg.out | 29 ++++++++ .../agg_function/agg.groovy | 6 ++ 6 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAgg.java diff --git a/docs/sidebars.json b/docs/sidebars.json index b1ba566c56..29e01e7455 100644 --- a/docs/sidebars.json +++ b/docs/sidebars.json @@ -566,7 +566,8 @@ "sql-manual/sql-functions/aggregate-functions/grouping", "sql-manual/sql-functions/aggregate-functions/grouping-id", "sql-manual/sql-functions/aggregate-functions/count-by-enum", - "sql-manual/sql-functions/aggregate-functions/histogram" + "sql-manual/sql-functions/aggregate-functions/histogram", + "sql-manual/sql-functions/aggregate-functions/map-agg" ] }, { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java index 51bccc47e4..b92843f7e5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinAggregateFunctions.java @@ -38,6 +38,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.Histogram; import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnion; import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnionAgg; import org.apache.doris.nereids.trees.expressions.functions.agg.IntersectCount; +import org.apache.doris.nereids.trees.expressions.functions.agg.MapAgg; import org.apache.doris.nereids.trees.expressions.functions.agg.Max; import org.apache.doris.nereids.trees.expressions.functions.agg.MaxBy; import org.apache.doris.nereids.trees.expressions.functions.agg.Min; @@ -101,6 +102,7 @@ public class BuiltinAggregateFunctions implements FunctionHelper { agg(HllUnion.class, "hll_raw_agg", "hll_union"), agg(HllUnionAgg.class, "hll_union_agg"), agg(IntersectCount.class, "intersect_count"), + agg(MapAgg.class, "map_agg"), agg(Max.class, "max"), agg(MaxBy.class, "max_by"), agg(Min.class, "min"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAgg.java new file mode 100644 index 0000000000..36cf5ef7ed --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAgg.java @@ -0,0 +1,72 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.nereids.trees.expressions.functions.agg; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; +import org.apache.doris.nereids.types.MapType; +import org.apache.doris.nereids.types.coercion.AnyDataType; +import org.apache.doris.nereids.types.coercion.FollowToAnyDataType; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * AggregateFunction 'map_agg'. This class is generated by GenerateFunction. + */ +public class MapAgg extends AggregateFunction + implements BinaryExpression, ExplicitlyCastableSignature, AlwaysNotNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(MapType.of(new FollowToAnyDataType(0), new FollowToAnyDataType(1))) + .args(new AnyDataType(0), new AnyDataType(1)) + ); + + /**FunctionSignature + * constructor with 2 arguments. + */ + public MapAgg(Expression arg0, Expression arg1) { + this(false, arg0, arg1); + } + + /** + * constructor with 2 arguments. + */ + private MapAgg(boolean distinct, Expression arg0, Expression arg1) { + super("map_agg", distinct, arg0, arg1); + } + + /** + * withDistinctAndChildren. + */ + @Override + public MapAgg withDistinctAndChildren(boolean distinct, List children) { + Preconditions.checkArgument(children.size() == 2); + return new MapAgg(distinct, children.get(0), children.get(1)); + } + + @Override + public List getSignatures() { + return SIGNATURES; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java index 012906bdf5..d172225401 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/AggregateFunctionVisitor.java @@ -39,6 +39,7 @@ import org.apache.doris.nereids.trees.expressions.functions.agg.Histogram; import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnion; import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnionAgg; import org.apache.doris.nereids.trees.expressions.functions.agg.IntersectCount; +import org.apache.doris.nereids.trees.expressions.functions.agg.MapAgg; import org.apache.doris.nereids.trees.expressions.functions.agg.Max; import org.apache.doris.nereids.trees.expressions.functions.agg.MaxBy; import org.apache.doris.nereids.trees.expressions.functions.agg.Min; @@ -176,6 +177,10 @@ public interface AggregateFunctionVisitor { return visitAggregateFunction(intersectCount, context); } + default R visitMapAgg(MapAgg mapAgg, C context) { + return visitAggregateFunction(mapAgg, context); + } + default R visitMax(Max max, C context) { return visitNullableAggregateFunction(max, context); } @@ -283,4 +288,5 @@ public interface AggregateFunctionVisitor { default R visitJavaUdaf(JavaUdaf javaUdaf, C context) { return visitAggregateFunction(javaUdaf, context); } + } diff --git a/regression-test/data/nereids_function_p0/agg_function/agg.out b/regression-test/data/nereids_function_p0/agg_function/agg.out index 78573751cb..f3df5bb914 100644 --- a/regression-test/data/nereids_function_p0/agg_function/agg.out +++ b/regression-test/data/nereids_function_p0/agg_function/agg.out @@ -5990,3 +5990,32 @@ true -- !max_null -- \N +-- !sql_map_agg -- +\N {} +0 {1:"string1"} +1 {2:"string2"} +2 {3:"string3"} +3 {4:"string1"} +4 {5:"string2"} +5 {6:"string3"} +6 {7:"string1"} +7 {8:"string2"} +8 {9:"string3"} +9 {10:"string1"} +10 {11:"string2"} +11 {12:"string3"} + +-- !sql_map_agg_not_nullable -- +0 {1:"string1"} +1 {2:"string2"} +2 {3:"string3"} +3 {4:"string1"} +4 {5:"string2"} +5 {6:"string3"} +6 {7:"string1"} +7 {8:"string2"} +8 {9:"string3"} +9 {10:"string1"} +10 {11:"string2"} +11 {12:"string3"} + diff --git a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy index 870b66d339..98b1685745 100644 --- a/regression-test/suites/nereids_function_p0/agg_function/agg.groovy +++ b/regression-test/suites/nereids_function_p0/agg_function/agg.groovy @@ -2765,4 +2765,10 @@ suite("nereids_agg_fn") { qt_max_null "select max(null) from fn_test;" + qt_sql_map_agg ''' + select id,map_agg(kint,kstr) from fn_test group by id order by id''' + + qt_sql_map_agg_not_nullable ''' + select id,map_agg(kint,kstr) from fn_test_not_nullable group by id order by id''' + }