@@ -31,7 +31,7 @@ import org.apache.spark.sql.catalyst.expressions.objects.StaticInvoke
31
31
import org .apache .spark .sql .catalyst .optimizer .{BuildLeft , BuildRight , NormalizeNaNAndZero }
32
32
import org .apache .spark .sql .catalyst .plans ._
33
33
import 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 }
35
35
import org .apache .spark .sql .catalyst .util .ResolveDefaultColumns .getExistenceDefaultValues
36
36
import org .apache .spark .sql .comet ._
37
37
import org .apache .spark .sql .comet .execution .shuffle .CometShuffleExchangeExec
@@ -55,6 +55,7 @@ import org.apache.comet.objectstore.NativeConfig
55
55
import org .apache .comet .serde .ExprOuterClass .{AggExpr , DataType => ProtoDataType , Expr , ScalarFunc }
56
56
import org .apache .comet .serde .ExprOuterClass .DataType ._
57
57
import org .apache .comet .serde .OperatorOuterClass .{AggregateMode => CometAggregateMode , BuildSide , JoinType , Operator }
58
+ import org .apache .comet .serde .Types .ListLiteral
58
59
import org .apache .comet .shims .CometExprShim
59
60
60
61
/**
@@ -115,6 +116,52 @@ object QueryPlanSerde extends Logging with CometExprShim {
115
116
false
116
117
}
117
118
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
+
118
165
/**
119
166
* Serializes Spark datatype to protobuf. Note that, a datatype can be serialized by this method
120
167
* 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 {
812
859
binding,
813
860
(builder, binaryExpr) => builder.setLtEq(binaryExpr))
814
861
815
- case Literal (value, dataType)
816
- if supportedDataType(dataType, allowComplex = value == null ) =>
862
+ case Literal (value, dataType) if supportedDataType(dataType, allowComplex = true ) =>
817
863
val exprBuilder = ExprOuterClass .Literal .newBuilder()
818
864
819
865
if (value == null ) {
@@ -842,6 +888,28 @@ object QueryPlanSerde extends Logging with CometExprShim {
842
888
com.google.protobuf.ByteString .copyFrom(value.asInstanceOf [Array [Byte ]])
843
889
exprBuilder.setBytesVal(byteStr)
844
890
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)
845
913
case dt =>
846
914
logWarning(s " Unexpected datatype ' $dt' for literal value ' $value' " )
847
915
}
0 commit comments