@@ -31,7 +31,7 @@ import org.apache.spark.sql.catalyst.expressions.objects.StaticInvoke
3131import org .apache .spark .sql .catalyst .optimizer .{BuildLeft , BuildRight , NormalizeNaNAndZero }
3232import org .apache .spark .sql .catalyst .plans ._
3333import org .apache .spark .sql .catalyst .plans .physical ._
34- import org .apache .spark .sql .catalyst .util .CharVarcharCodegenUtils
34+ import org .apache .spark .sql .catalyst .util .{ CharVarcharCodegenUtils , GenericArrayData }
3535import org .apache .spark .sql .catalyst .util .ResolveDefaultColumns .getExistenceDefaultValues
3636import org .apache .spark .sql .comet ._
3737import org .apache .spark .sql .comet .execution .shuffle .CometShuffleExchangeExec
@@ -55,6 +55,7 @@ import org.apache.comet.objectstore.NativeConfig
5555import org .apache .comet .serde .ExprOuterClass .{AggExpr , DataType => ProtoDataType , Expr , ScalarFunc }
5656import org .apache .comet .serde .ExprOuterClass .DataType ._
5757import org .apache .comet .serde .OperatorOuterClass .{AggregateMode => CometAggregateMode , BuildSide , JoinType , Operator }
58+ import org .apache .comet .serde .Types .ListLiteral
5859import org .apache .comet .shims .CometExprShim
5960
6061/**
@@ -115,6 +116,52 @@ object QueryPlanSerde extends Logging with CometExprShim {
115116 false
116117 }
117118
119+ // def convertArrayToProtoLiteral(array: Seq[Any], arrayType: ArrayType): Literal = {
120+ // val elementType = arrayType.elementType
121+ // val listLiteralBuilder = ListLiteral.newBuilder()
122+ //
123+ // elementType match {
124+ // case BooleanType =>
125+ // listLiteralBuilder.addAllBooleanValues(array.map(_.asInstanceOf[Boolean]).asJava)
126+ //
127+ // case ByteType =>
128+ // listLiteralBuilder.addAllByteValues(array.map(_.asInstanceOf[Byte].toInt).asJava)
129+ //
130+ // case ShortType =>
131+ // listLiteralBuilder.addAllShortValues(array.map(_.asInstanceOf[Short].toInt).asJava)
132+ //
133+ // case IntegerType =>
134+ // listLiteralBuilder.addAllIntValues(array.map(_.asInstanceOf[Int]).asJava)
135+ //
136+ // case LongType =>
137+ // listLiteralBuilder.addAllLongValues(array.map(_.asInstanceOf[Long]).asJava)
138+ //
139+ // case FloatType =>
140+ // listLiteralBuilder.addAllFloatValues(array.map(_.asInstanceOf[Float]).asJava)
141+ //
142+ // case DoubleType =>
143+ // listLiteralBuilder.addAllDoubleValues(array.map(_.asInstanceOf[Double]).asJava)
144+ //
145+ // case StringType =>
146+ // listLiteralBuilder.addAllStringValues(array.map(_.asInstanceOf[String]).asJava)
147+ //
148+ // case BinaryType =>
149+ // listLiteralBuilder.addAllBytesValues
150+ // (array.map(x => com.google.protobuf
151+ // .ByteString.copyFrom(x.asInstanceOf[Array[Byte]])).asJava)
152+ //
153+ // case nested: ArrayType =>
154+ // val nestedListLiterals = array.map {
155+ // case null => ListLiteral.newBuilder().build() // or handle nulls appropriately
156+ // case seq: Seq[_] => convertArrayToProtoLiteral(seq, nested).getListVal
157+ // }
158+ // listLiteralBuilder.addAllListValues(nestedListLiterals.asJava)
159+ //
160+ // case _ =>
161+ // throw new UnsupportedOperationException(s"Unsupported element type: $elementType")
162+ // }
163+ // }
164+
118165 /**
119166 * Serializes Spark datatype to protobuf. Note that, a datatype can be serialized by this method
120167 * doesn't mean it is supported by Comet native execution, i.e., `supportedDataType` may return
@@ -812,8 +859,7 @@ object QueryPlanSerde extends Logging with CometExprShim {
812859 binding,
813860 (builder, binaryExpr) => builder.setLtEq(binaryExpr))
814861
815- case Literal (value, dataType)
816- if supportedDataType(dataType, allowComplex = value == null ) =>
862+ case Literal (value, dataType) if supportedDataType(dataType, allowComplex = true ) =>
817863 val exprBuilder = ExprOuterClass .Literal .newBuilder()
818864
819865 if (value == null ) {
@@ -842,6 +888,28 @@ object QueryPlanSerde extends Logging with CometExprShim {
842888 com.google.protobuf.ByteString .copyFrom(value.asInstanceOf [Array [Byte ]])
843889 exprBuilder.setBytesVal(byteStr)
844890 case _ : DateType => exprBuilder.setIntVal(value.asInstanceOf [Int ])
891+ case a : ArrayType =>
892+ val listLiteralBuilder = ListLiteral .newBuilder()
893+ val array = value.asInstanceOf [GenericArrayData ].array
894+ a.elementType match {
895+ case BooleanType =>
896+ listLiteralBuilder.addAllBooleanValues(
897+ array.map(_.asInstanceOf [java.lang.Boolean ]).toIterable.asJava)
898+ case ByteType =>
899+ listLiteralBuilder.addAllByteValues(
900+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
901+ case ShortType =>
902+ listLiteralBuilder.addAllShortValues(
903+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
904+ case IntegerType =>
905+ listLiteralBuilder.addAllIntValues(
906+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
907+ case LongType =>
908+ listLiteralBuilder.addAllLongValues(
909+ array.map(_.asInstanceOf [java.lang.Long ]).toIterable.asJava)
910+ }
911+ exprBuilder.setListVal(listLiteralBuilder.build())
912+ exprBuilder.setDatatype(serializeDataType(dataType).get)
845913 case dt =>
846914 logWarning(s " Unexpected datatype ' $dt' for literal value ' $value' " )
847915 }
0 commit comments