@@ -31,7 +31,8 @@ import org.apache.spark.sql.catalyst.expressions.aggregate._
31
31
import org .apache .spark .sql .catalyst .expressions .objects .StaticInvoke
32
32
import org .apache .spark .sql .catalyst .optimizer .{BuildLeft , BuildRight , NormalizeNaNAndZero }
33
33
import org .apache .spark .sql .catalyst .plans ._
34
- import org .apache .spark .sql .catalyst .util .CharVarcharCodegenUtils
34
+ import org .apache .spark .sql .catalyst .plans .physical ._
35
+ import org .apache .spark .sql .catalyst .util .{CharVarcharCodegenUtils , GenericArrayData }
35
36
import org .apache .spark .sql .catalyst .util .ResolveDefaultColumns .getExistenceDefaultValues
36
37
import org .apache .spark .sql .comet ._
37
38
import org .apache .spark .sql .comet .execution .shuffle .CometShuffleExchangeExec
@@ -56,6 +57,7 @@ import org.apache.comet.serde.ExprOuterClass.{AggExpr, DataType => ProtoDataType
56
57
import org .apache .comet .serde .ExprOuterClass .DataType ._
57
58
import org .apache .comet .serde .OperatorOuterClass .{AggregateMode => CometAggregateMode , BuildSide , JoinType , Operator }
58
59
import org .apache .comet .serde .QueryPlanSerde .{exprToProtoInternal , optExprWithInfo , scalarFunctionExprToProto }
60
+ import org .apache .comet .serde .Types .ListLiteral
59
61
import org .apache .comet .shims .CometExprShim
60
62
61
63
/**
@@ -142,6 +144,52 @@ object QueryPlanSerde extends Logging with CometExprShim {
142
144
false
143
145
}
144
146
147
+ // def convertArrayToProtoLiteral(array: Seq[Any], arrayType: ArrayType): Literal = {
148
+ // val elementType = arrayType.elementType
149
+ // val listLiteralBuilder = ListLiteral.newBuilder()
150
+ //
151
+ // elementType match {
152
+ // case BooleanType =>
153
+ // listLiteralBuilder.addAllBooleanValues(array.map(_.asInstanceOf[Boolean]).asJava)
154
+ //
155
+ // case ByteType =>
156
+ // listLiteralBuilder.addAllByteValues(array.map(_.asInstanceOf[Byte].toInt).asJava)
157
+ //
158
+ // case ShortType =>
159
+ // listLiteralBuilder.addAllShortValues(array.map(_.asInstanceOf[Short].toInt).asJava)
160
+ //
161
+ // case IntegerType =>
162
+ // listLiteralBuilder.addAllIntValues(array.map(_.asInstanceOf[Int]).asJava)
163
+ //
164
+ // case LongType =>
165
+ // listLiteralBuilder.addAllLongValues(array.map(_.asInstanceOf[Long]).asJava)
166
+ //
167
+ // case FloatType =>
168
+ // listLiteralBuilder.addAllFloatValues(array.map(_.asInstanceOf[Float]).asJava)
169
+ //
170
+ // case DoubleType =>
171
+ // listLiteralBuilder.addAllDoubleValues(array.map(_.asInstanceOf[Double]).asJava)
172
+ //
173
+ // case StringType =>
174
+ // listLiteralBuilder.addAllStringValues(array.map(_.asInstanceOf[String]).asJava)
175
+ //
176
+ // case BinaryType =>
177
+ // listLiteralBuilder.addAllBytesValues
178
+ // (array.map(x => com.google.protobuf
179
+ // .ByteString.copyFrom(x.asInstanceOf[Array[Byte]])).asJava)
180
+ //
181
+ // case nested: ArrayType =>
182
+ // val nestedListLiterals = array.map {
183
+ // case null => ListLiteral.newBuilder().build() // or handle nulls appropriately
184
+ // case seq: Seq[_] => convertArrayToProtoLiteral(seq, nested).getListVal
185
+ // }
186
+ // listLiteralBuilder.addAllListValues(nestedListLiterals.asJava)
187
+ //
188
+ // case _ =>
189
+ // throw new UnsupportedOperationException(s"Unsupported element type: $elementType")
190
+ // }
191
+ // }
192
+
145
193
/**
146
194
* Serializes Spark datatype to protobuf. Note that, a datatype can be serialized by this method
147
195
* doesn't mean it is supported by Comet native execution, i.e., `supportedDataType` may return
@@ -837,8 +885,7 @@ object QueryPlanSerde extends Logging with CometExprShim {
837
885
binding,
838
886
(builder, binaryExpr) => builder.setLtEq(binaryExpr))
839
887
840
- case Literal (value, dataType)
841
- if supportedDataType(dataType, allowComplex = value == null ) =>
888
+ case Literal (value, dataType) if supportedDataType(dataType, allowComplex = true ) =>
842
889
val exprBuilder = ExprOuterClass .Literal .newBuilder()
843
890
844
891
if (value == null ) {
@@ -867,6 +914,28 @@ object QueryPlanSerde extends Logging with CometExprShim {
867
914
com.google.protobuf.ByteString .copyFrom(value.asInstanceOf [Array [Byte ]])
868
915
exprBuilder.setBytesVal(byteStr)
869
916
case _ : DateType => exprBuilder.setIntVal(value.asInstanceOf [Int ])
917
+ case a : ArrayType =>
918
+ val listLiteralBuilder = ListLiteral .newBuilder()
919
+ val array = value.asInstanceOf [GenericArrayData ].array
920
+ a.elementType match {
921
+ case BooleanType =>
922
+ listLiteralBuilder.addAllBooleanValues(
923
+ array.map(_.asInstanceOf [java.lang.Boolean ]).toIterable.asJava)
924
+ case ByteType =>
925
+ listLiteralBuilder.addAllByteValues(
926
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
927
+ case ShortType =>
928
+ listLiteralBuilder.addAllShortValues(
929
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
930
+ case IntegerType =>
931
+ listLiteralBuilder.addAllIntValues(
932
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
933
+ case LongType =>
934
+ listLiteralBuilder.addAllLongValues(
935
+ array.map(_.asInstanceOf [java.lang.Long ]).toIterable.asJava)
936
+ }
937
+ exprBuilder.setListVal(listLiteralBuilder.build())
938
+ exprBuilder.setDatatype(serializeDataType(dataType).get)
870
939
case dt =>
871
940
logWarning(s " Unexpected datatype ' $dt' for literal value ' $value' " )
872
941
}
0 commit comments