code: func (a *aggregationPushDownSolver) isDecomposable(fun *aggregation.AggFuncDesc) bool {
  	switch fun.Name {
  	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.HasDistinct
  	default:
  		return false
  	}
  }
docs: // 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.