Skip to content

Commit 17aa150

Browse files
committed
Support reverse function with ArrayType input
1 parent 0d2c5fc commit 17aa150

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,8 @@ object QueryPlanSerde extends Logging with CometExprShim {
915915
case l @ Length(child) if child.dataType == BinaryType =>
916916
withInfo(l, "Length on BinaryType is not supported")
917917
None
918+
case r @ Reverse(child) if child.dataType.isInstanceOf[ArrayType] =>
919+
convert(r, CometArrayReverse)
918920
case expr =>
919921
QueryPlanSerde.exprSerdeMap.get(expr.getClass) match {
920922
case Some(handler) =>

spark/src/main/scala/org/apache/comet/serde/arrays.scala

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@
2020
package org.apache.comet.serde
2121

2222
import scala.annotation.tailrec
23-
24-
import org.apache.spark.sql.catalyst.expressions.{ArrayAppend, ArrayContains, ArrayDistinct, ArrayExcept, ArrayInsert, ArrayIntersect, ArrayJoin, ArrayMax, ArrayMin, ArrayRemove, ArrayRepeat, ArraysOverlap, ArrayUnion, Attribute, CreateArray, ElementAt, Expression, Flatten, GetArrayItem, Literal}
23+
import org.apache.spark.sql.catalyst.expressions.{ArrayAppend, ArrayContains, ArrayDistinct, ArrayExcept, ArrayInsert, ArrayIntersect, ArrayJoin, ArrayMax, ArrayMin, ArrayRemove, ArrayRepeat, ArrayUnion, ArraysOverlap, Attribute, CreateArray, ElementAt, Expression, Flatten, GetArrayItem, Literal, Reverse}
2524
import org.apache.spark.sql.internal.SQLConf
2625
import org.apache.spark.sql.types._
27-
2826
import org.apache.comet.CometSparkSessionExtensions.withInfo
2927
import org.apache.comet.serde.QueryPlanSerde._
3028
import org.apache.comet.shims.CometExprShim
@@ -432,6 +430,25 @@ object CometGetArrayItem extends CometExpressionSerde[GetArrayItem] {
432430
}
433431
}
434432

433+
object CometArrayReverse extends CometExpressionSerde[Reverse] with ArraysBase {
434+
override def convert(
435+
expr: Reverse,
436+
inputs: Seq[Attribute],
437+
binding: Boolean): Option[ExprOuterClass.Expr] = {
438+
val inputTypes = expr.children.map(_.dataType).toSet
439+
for (dt <- inputTypes) {
440+
if (!isTypeSupported(dt)) {
441+
withInfo(expr, s"data type not supported: $dt")
442+
return None
443+
}
444+
}
445+
val reverseExprProto = exprToProto(expr.child, inputs, binding)
446+
val reverseScalarExpr = scalarFunctionExprToProto("array_reverse", reverseExprProto)
447+
optExprWithInfo(reverseScalarExpr, expr, expr.children: _*)
448+
}
449+
450+
}
451+
435452
object CometElementAt extends CometExpressionSerde[ElementAt] {
436453

437454
override def convert(

spark/src/test/scala/org/apache/comet/CometArrayExpressionSuite.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,4 +708,11 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
708708
}
709709
}
710710
}
711+
712+
test("test reverse function") {
713+
withTable("t1") {
714+
sql("create table t1 using parquet as select sequence(id, 10) as c1 from range(10)")
715+
checkSparkAnswerAndOperator("select reverse(c1) AS x FROM t1 ORDER BY c1")
716+
}
717+
}
711718
}

0 commit comments

Comments
 (0)