// isDecomposable checks if an aggregate function is decomposable. An aggregation function $F$ is decomposable // if there exist aggregation functions F_1 and F_2 such that F(S_1 union all S_2) = F_2(F_1(S_1),F_1(S_2)), // where S_1 and S_2 are two sets of values. We call S_1 and S_2 partial groups. // It's easy to see that max, min, first row is decomposable, no matter whether it's distinct, but sum(distinct) and // count(distinct) is not. // Currently we don't support avg and concat. func (a *aggPushDownSolver) isDecomposable(fun expression.AggregationFunction) bool { switch fun.GetName() { case ast.AggFuncAvg, ast.AggFuncGroupConcat: // TODO: Support avg push down. return false case ast.AggFuncMax, ast.AggFuncMin, ast.AggFuncFirstRow: return true case ast.AggFuncSum, ast.AggFuncCount: return !fun.IsDistinct() default: return false } }