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 863057988e..0b2774acf1 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 @@ -17,6 +17,7 @@ package org.apache.doris.catalog; +import org.apache.doris.nereids.trees.expressions.functions.agg.ApproxCountDistinct; import org.apache.doris.nereids.trees.expressions.functions.agg.Avg; import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapIntersect; import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapUnion; @@ -59,8 +60,8 @@ public class BuiltinAggregateFunctions implements FunctionHelper { agg(GroupBitAnd.class, "group_bit_and"), agg(GroupBitOr.class, "group_bit_or"), agg(GroupBitXor.class, "group_bit_xor"), - agg(Ndv.class) - + agg(Ndv.class), + agg(ApproxCountDistinct.class, "approx_count_distinct") ); public static final BuiltinAggregateFunctions INSTANCE = new BuiltinAggregateFunctions(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ApproxCountDistinct.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ApproxCountDistinct.java new file mode 100644 index 0000000000..161465ac18 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/ApproxCountDistinct.java @@ -0,0 +1,76 @@ +// 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.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.BigIntType; +import org.apache.doris.nereids.types.DataType; +import org.apache.doris.nereids.util.ExpressionUtils; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** MultiDistinctCount */ +public class ApproxCountDistinct extends AggregateFunction + implements AlwaysNotNullable, ExplicitlyCastableSignature { + public ApproxCountDistinct(Expression arg0, Expression... varArgs) { + super("approx_count_distinct", false, ExpressionUtils.mergeArguments(arg0, varArgs)); + } + + public ApproxCountDistinct(boolean isDistinct, Expression arg0, Expression... varArgs) { + super("approx_count_distinct", false, ExpressionUtils.mergeArguments(arg0, varArgs)); + } + + @Override + public List getSignatures() { + List argumentsTypes = getArgumentsTypes(); + return ImmutableList.of(FunctionSignature.of(BigIntType.INSTANCE, (List) argumentsTypes)); + } + + @Override + public ApproxCountDistinct withChildren(List children) { + Preconditions.checkArgument(children.size() > 0); + if (children.size() > 1) { + return new ApproxCountDistinct(children.get(0), + children.subList(1, children.size()).toArray(new Expression[0])); + } else { + return new ApproxCountDistinct(children.get(0)); + } + } + + @Override + public ApproxCountDistinct withDistinctAndChildren(boolean isDistinct, List children) { + if (children.size() > 1) { + return new ApproxCountDistinct(isDistinct, children.get(0), + children.subList(1, children.size()).toArray(new Expression[0])); + } else { + return new ApproxCountDistinct(isDistinct, children.get(0)); + } + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitApproxCountDistinct(this, context); + } +} 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 b31f6d1811..3ff809b119 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 @@ -18,6 +18,7 @@ package org.apache.doris.nereids.trees.expressions.visitor; import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction; +import org.apache.doris.nereids.trees.expressions.functions.agg.ApproxCountDistinct; import org.apache.doris.nereids.trees.expressions.functions.agg.Avg; import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapUnionCount; import org.apache.doris.nereids.trees.expressions.functions.agg.Count; @@ -92,4 +93,8 @@ public interface AggregateFunctionVisitor { default R visitHllUnion(HllUnion hllUnion, C context) { return visitAggregateFunction(hllUnion, context); } + + default R visitApproxCountDistinct(ApproxCountDistinct approxCountDistinct, C context) { + return visitAggregateFunction(approxCountDistinct, context); + } } diff --git a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.out b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.out index 3c35d5b230..4fa3df87bd 100644 --- a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.out +++ b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.out @@ -2,3 +2,6 @@ -- !select -- 15 +-- !select -- +15 + diff --git a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.groovy b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.groovy index 2eb6fa4495..d966bb042c 100644 --- a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.groovy +++ b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_approx_count_distinct.groovy @@ -17,4 +17,8 @@ suite("test_approx_count_distinct") { qt_select "select approx_count_distinct(k1) from test_query_db.baseall" + sql 'set enable_vectorized_engine=true;' + sql 'set enable_fallback_to_original_planner=false' + sql 'set enable_nereids_planner=true' + qt_select "select approx_count_distinct(k1) from test_query_db.baseall" }