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 51bccc47e426be..b92843f7e532d8 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.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 00000000000000..c65bc97b12bc85 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/MapAgg.java @@ -0,0 +1,92 @@ +// 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.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.MapType; +import org.apache.doris.nereids.types.coercion.AnyDataType; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import org.apache.doris.nereids.types.coercion.FollowToAnyDataType; + +import java.util.List; + +/** + * AggregateFunction 'map_agg'. This class is generated by GenerateFunction. + */ +public class MapAgg extends NullableAggregateFunction + implements BinaryExpression, ExplicitlyCastableSignature { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(MapType.of(new FollowToAnyDataType(0), new FollowToAnyDataType(1))) + .args(AnyDataType.INSTANCE_WITHOUT_INDEX, AnyDataType.INSTANCE_WITHOUT_INDEX) + ); + + /** + * constructor with 2 arguments. + */ + public MapAgg(Expression arg0, Expression arg1) { + this(false, false, arg0, arg1); + } + + /** + * constructor with 2 arguments. + */ + public MapAgg(boolean distinct, Expression arg0, Expression arg1) { + this(distinct, false, arg0, arg1); + } + + private MapAgg(boolean distinct, boolean alwaysNullable, Expression arg0, Expression arg1) { + super("map_agg", distinct, false, arg0, arg1); + } + + @Override + public FunctionSignature computeSignature(FunctionSignature signature) { + signature = signature.withReturnType(MapType.of(getArgumentType(0), getArgumentType(1))); + return super.computeSignature(signature); + } + + /** + * withDistinctAndChildren. + */ + @Override + public MapAgg withDistinctAndChildren(boolean distinct, List children) { + Preconditions.checkArgument(children.size() == 2); + return new MapAgg(distinct, alwaysNullable, children.get(0), children.get(1)); + } + + @Override + public MapAgg withAlwaysNullable(boolean alwaysNullable) { + return new MapAgg(distinct, alwaysNullable, children.get(0), children.get(1)); + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitMapAgg(this, context); + } + + @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 012906bdf5289d..65ff7af8e26ab9 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.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; @@ -283,4 +284,8 @@ default R visitUnionCombinator(UnionCombinator combinator, C context) { default R visitJavaUdaf(JavaUdaf javaUdaf, C context) { return visitAggregateFunction(javaUdaf, context); } + + default R visitMapAgg(MapAgg mapAgg, C context) { + return visitNullableAggregateFunction(mapAgg, context); + } }