in backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxBackend.scala [399:468]
override def supportWindowExec(windowFunctions: Seq[NamedExpression]): Boolean = {
var allSupported = true
breakable {
windowFunctions.foreach(
func => {
val windowExpression = func match {
case alias: Alias =>
val we = WindowFunctionsBuilder.extractWindowExpression(alias.child)
if (we == null) {
throw new GlutenNotSupportException(s"$func is not supported.")
}
we
case _ => throw new GlutenNotSupportException(s"$func is not supported.")
}
def checkLimitations(swf: SpecifiedWindowFrame, orderSpec: Seq[SortOrder]): Unit = {
def doCheck(bound: Expression): Unit = {
bound match {
case _: SpecialFrameBoundary =>
case e if e.foldable =>
orderSpec.foreach(
order =>
order.direction match {
case Descending =>
throw new GlutenNotSupportException(
"DESC order is not supported when" +
" literal bound type is used!")
case _ =>
})
orderSpec.foreach(
order =>
order.dataType match {
case ByteType | ShortType | IntegerType | LongType | DateType =>
case _ =>
throw new GlutenNotSupportException(
"Only integral type & date type are" +
" supported for sort key when literal bound type is used!")
})
case _ =>
}
}
doCheck(swf.upper)
doCheck(swf.lower)
}
windowExpression.windowSpec.frameSpecification match {
case swf: SpecifiedWindowFrame =>
swf.frameType match {
case RangeFrame =>
checkLimitations(swf, windowExpression.windowSpec.orderSpec)
case _ =>
}
case _ =>
}
windowExpression.windowFunction match {
case _: RowNumber | _: Rank | _: CumeDist | _: DenseRank | _: PercentRank | _: NTile =>
case nv: NthValue if !nv.input.foldable =>
case l: Lag if !l.input.foldable =>
case l: Lead if !l.input.foldable =>
case aggrExpr: AggregateExpression
if !aggrExpr.aggregateFunction.isInstanceOf[ApproximatePercentile]
&& !aggrExpr.aggregateFunction.isInstanceOf[Percentile]
&& !aggrExpr.aggregateFunction.isInstanceOf[HyperLogLogPlusPlus] =>
case _ =>
allSupported = false
}
})
}
allSupported
}