in modules/spark-ext/spark/src/main/scala/org/apache/ignite/spark/impl/optimization/AggregateExpressions.scala [53:102]
override def toString(expr: Expression, childToString: Expression ⇒ String, useQualifier: Boolean,
useAlias: Boolean, caseSensitive:Boolean): Option[String] = expr match {
case AggregateExpression(aggregateFunction, _, isDistinct, _, _) ⇒
aggregateFunction match {
case Count(children) ⇒
if (isDistinct)
Some(s"COUNT(DISTINCT ${children.map(childToString(_)).mkString(" ")})")
else
Some(s"COUNT(${children.map(childToString(_)).mkString(" ")})")
case sum: Sum ⇒
if (isDistinct)
Some(castSum(
s"SUM(DISTINCT ${sum.children.map(childToString(_)).mkString(" ")})", sum.dataType))
else
Some(castSum(s"SUM(${sum.children.map(childToString(_)).mkString(" ")})", sum.dataType))
case _ ⇒
Some(childToString(aggregateFunction))
}
case Average(child, _) ⇒
child.dataType match {
case DecimalType() | DoubleType ⇒
Some(s"AVG(${childToString(child)})")
case _ ⇒
//Spark `AVG` return type is always a double or a decimal.
//See [[org.apache.spark.sql.catalyst.expressions.aggregate.Average]]
//But Ignite `AVG` return type for a integral types is integral.
//To preserve query correct results has to cast column to double.
Some(s"AVG(CAST(${childToString(child)} AS DOUBLE))")
}
case Count(children) ⇒
Some(s"COUNT(${children.map(childToString(_)).mkString(" ")})")
case Max(child) ⇒
Some(s"MAX(${childToString(child)})")
case Min(child) ⇒
Some(s"MIN(${childToString(child)})")
case sum: Sum ⇒
Some(castSum(s"SUM(${childToString(sum.child)})", sum.dataType))
case _ ⇒
None
}