@@ -32,7 +32,7 @@ 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
34
import org .apache .spark .sql .catalyst .plans .physical ._
35
- import org .apache .spark .sql .catalyst .util .CharVarcharCodegenUtils
35
+ import org .apache .spark .sql .catalyst .util .{ CharVarcharCodegenUtils , GenericArrayData }
36
36
import org .apache .spark .sql .catalyst .util .ResolveDefaultColumns .getExistenceDefaultValues
37
37
import org .apache .spark .sql .comet ._
38
38
import org .apache .spark .sql .comet .execution .shuffle .CometShuffleExchangeExec
@@ -56,6 +56,7 @@ import org.apache.comet.objectstore.NativeConfig
56
56
import org .apache .comet .serde .ExprOuterClass .{AggExpr , DataType => ProtoDataType , Expr , ScalarFunc }
57
57
import org .apache .comet .serde .ExprOuterClass .DataType ._
58
58
import org .apache .comet .serde .OperatorOuterClass .{AggregateMode => CometAggregateMode , BuildSide , JoinType , Operator }
59
+ import org .apache .comet .serde .Types .ListLiteral
59
60
import org .apache .comet .shims .CometExprShim
60
61
61
62
/**
@@ -118,6 +119,52 @@ object QueryPlanSerde extends Logging with CometExprShim {
118
119
false
119
120
}
120
121
122
+ // def convertArrayToProtoLiteral(array: Seq[Any], arrayType: ArrayType): Literal = {
123
+ // val elementType = arrayType.elementType
124
+ // val listLiteralBuilder = ListLiteral.newBuilder()
125
+ //
126
+ // elementType match {
127
+ // case BooleanType =>
128
+ // listLiteralBuilder.addAllBooleanValues(array.map(_.asInstanceOf[Boolean]).asJava)
129
+ //
130
+ // case ByteType =>
131
+ // listLiteralBuilder.addAllByteValues(array.map(_.asInstanceOf[Byte].toInt).asJava)
132
+ //
133
+ // case ShortType =>
134
+ // listLiteralBuilder.addAllShortValues(array.map(_.asInstanceOf[Short].toInt).asJava)
135
+ //
136
+ // case IntegerType =>
137
+ // listLiteralBuilder.addAllIntValues(array.map(_.asInstanceOf[Int]).asJava)
138
+ //
139
+ // case LongType =>
140
+ // listLiteralBuilder.addAllLongValues(array.map(_.asInstanceOf[Long]).asJava)
141
+ //
142
+ // case FloatType =>
143
+ // listLiteralBuilder.addAllFloatValues(array.map(_.asInstanceOf[Float]).asJava)
144
+ //
145
+ // case DoubleType =>
146
+ // listLiteralBuilder.addAllDoubleValues(array.map(_.asInstanceOf[Double]).asJava)
147
+ //
148
+ // case StringType =>
149
+ // listLiteralBuilder.addAllStringValues(array.map(_.asInstanceOf[String]).asJava)
150
+ //
151
+ // case BinaryType =>
152
+ // listLiteralBuilder.addAllBytesValues
153
+ // (array.map(x => com.google.protobuf
154
+ // .ByteString.copyFrom(x.asInstanceOf[Array[Byte]])).asJava)
155
+ //
156
+ // case nested: ArrayType =>
157
+ // val nestedListLiterals = array.map {
158
+ // case null => ListLiteral.newBuilder().build() // or handle nulls appropriately
159
+ // case seq: Seq[_] => convertArrayToProtoLiteral(seq, nested).getListVal
160
+ // }
161
+ // listLiteralBuilder.addAllListValues(nestedListLiterals.asJava)
162
+ //
163
+ // case _ =>
164
+ // throw new UnsupportedOperationException(s"Unsupported element type: $elementType")
165
+ // }
166
+ // }
167
+
121
168
/**
122
169
* Serializes Spark datatype to protobuf. Note that, a datatype can be serialized by this method
123
170
* doesn't mean it is supported by Comet native execution, i.e., `supportedDataType` may return
@@ -815,8 +862,7 @@ object QueryPlanSerde extends Logging with CometExprShim {
815
862
binding,
816
863
(builder, binaryExpr) => builder.setLtEq(binaryExpr))
817
864
818
- case Literal (value, dataType)
819
- if supportedDataType(dataType, allowComplex = value == null ) =>
865
+ case Literal (value, dataType) if supportedDataType(dataType, allowComplex = true ) =>
820
866
val exprBuilder = ExprOuterClass .Literal .newBuilder()
821
867
822
868
if (value == null ) {
@@ -845,6 +891,28 @@ object QueryPlanSerde extends Logging with CometExprShim {
845
891
com.google.protobuf.ByteString .copyFrom(value.asInstanceOf [Array [Byte ]])
846
892
exprBuilder.setBytesVal(byteStr)
847
893
case _ : DateType => exprBuilder.setIntVal(value.asInstanceOf [Int ])
894
+ case a : ArrayType =>
895
+ val listLiteralBuilder = ListLiteral .newBuilder()
896
+ val array = value.asInstanceOf [GenericArrayData ].array
897
+ a.elementType match {
898
+ case BooleanType =>
899
+ listLiteralBuilder.addAllBooleanValues(
900
+ array.map(_.asInstanceOf [java.lang.Boolean ]).toIterable.asJava)
901
+ case ByteType =>
902
+ listLiteralBuilder.addAllByteValues(
903
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
904
+ case ShortType =>
905
+ listLiteralBuilder.addAllShortValues(
906
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
907
+ case IntegerType =>
908
+ listLiteralBuilder.addAllIntValues(
909
+ array.map(_.asInstanceOf [java.lang.Integer ]).toIterable.asJava)
910
+ case LongType =>
911
+ listLiteralBuilder.addAllLongValues(
912
+ array.map(_.asInstanceOf [java.lang.Long ]).toIterable.asJava)
913
+ }
914
+ exprBuilder.setListVal(listLiteralBuilder.build())
915
+ exprBuilder.setDatatype(serializeDataType(dataType).get)
848
916
case dt =>
849
917
logWarning(s " Unexpected datatype ' $dt' for literal value ' $value' " )
850
918
}
0 commit comments