@@ -95,6 +95,8 @@ object QueryPlanSerde extends Logging with CometExprShim {
95
95
classOf [ArraysOverlap ] -> CometArraysOverlap ,
96
96
classOf [ArrayUnion ] -> CometArrayUnion ,
97
97
classOf [CreateArray ] -> CometCreateArray ,
98
+ classOf [GetArrayItem ] -> CometGetArrayItem ,
99
+ classOf [ElementAt ] -> CometElementAt ,
98
100
classOf [Ascii ] -> CometScalarFunction (" ascii" ),
99
101
classOf [ConcatWs ] -> CometScalarFunction (" concat_ws" ),
100
102
classOf [Chr ] -> CometScalarFunction (" char" ),
@@ -170,6 +172,10 @@ object QueryPlanSerde extends Logging with CometExprShim {
170
172
classOf [DateSub ] -> CometDateSub ,
171
173
classOf [TruncDate ] -> CometTruncDate ,
172
174
classOf [TruncTimestamp ] -> CometTruncTimestamp ,
175
+ classOf [CreateNamedStruct ] -> CometCreateNamedStruct ,
176
+ classOf [GetStructField ] -> CometGetStructField ,
177
+ classOf [GetArrayStructFields ] -> CometGetArrayStructFields ,
178
+ classOf [StructsToJson ] -> CometStructsToJson ,
173
179
classOf [Flatten ] -> CometFlatten ,
174
180
classOf [Atan2 ] -> CometAtan2 ,
175
181
classOf [Ceil ] -> CometCeil ,
@@ -922,66 +928,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
922
928
None
923
929
}
924
930
925
- case StructsToJson (options, child, timezoneId) =>
926
- if (options.nonEmpty) {
927
- withInfo(expr, " StructsToJson with options is not supported" )
928
- None
929
- } else {
930
-
931
- def isSupportedType (dt : DataType ): Boolean = {
932
- dt match {
933
- case StructType (fields) =>
934
- fields.forall(f => isSupportedType(f.dataType))
935
- case DataTypes .BooleanType | DataTypes .ByteType | DataTypes .ShortType |
936
- DataTypes .IntegerType | DataTypes .LongType | DataTypes .FloatType |
937
- DataTypes .DoubleType | DataTypes .StringType =>
938
- true
939
- case DataTypes .DateType | DataTypes .TimestampType =>
940
- // TODO implement these types with tests for formatting options and timezone
941
- false
942
- case _ : MapType | _ : ArrayType =>
943
- // Spark supports map and array in StructsToJson but this is not yet
944
- // implemented in Comet
945
- false
946
- case _ => false
947
- }
948
- }
949
-
950
- val isSupported = child.dataType match {
951
- case s : StructType =>
952
- s.fields.forall(f => isSupportedType(f.dataType))
953
- case _ : MapType | _ : ArrayType =>
954
- // Spark supports map and array in StructsToJson but this is not yet
955
- // implemented in Comet
956
- false
957
- case _ =>
958
- false
959
- }
960
-
961
- if (isSupported) {
962
- exprToProtoInternal(child, inputs, binding) match {
963
- case Some (p) =>
964
- val toJson = ExprOuterClass .ToJson
965
- .newBuilder()
966
- .setChild(p)
967
- .setTimezone(timezoneId.getOrElse(" UTC" ))
968
- .setIgnoreNullFields(true )
969
- .build()
970
- Some (
971
- ExprOuterClass .Expr
972
- .newBuilder()
973
- .setToJson(toJson)
974
- .build())
975
- case _ =>
976
- withInfo(expr, child)
977
- None
978
- }
979
- } else {
980
- withInfo(expr, " Unsupported data type" , child)
981
- None
982
- }
983
- }
984
-
985
931
case SortOrder (child, direction, nullOrdering, _) =>
986
932
val childExpr = exprToProtoInternal(child, inputs, binding)
987
933
@@ -1336,110 +1282,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
1336
1282
withInfo(expr, bloomFilter, value)
1337
1283
None
1338
1284
}
1339
-
1340
- case struct @ CreateNamedStruct (_) =>
1341
- if (struct.names.length != struct.names.distinct.length) {
1342
- withInfo(expr, " CreateNamedStruct with duplicate field names are not supported" )
1343
- return None
1344
- }
1345
-
1346
- val valExprs = struct.valExprs.map(exprToProtoInternal(_, inputs, binding))
1347
-
1348
- if (valExprs.forall(_.isDefined)) {
1349
- val structBuilder = ExprOuterClass .CreateNamedStruct .newBuilder()
1350
- structBuilder.addAllValues(valExprs.map(_.get).asJava)
1351
- structBuilder.addAllNames(struct.names.map(_.toString).asJava)
1352
-
1353
- Some (
1354
- ExprOuterClass .Expr
1355
- .newBuilder()
1356
- .setCreateNamedStruct(structBuilder)
1357
- .build())
1358
- } else {
1359
- withInfo(expr, " unsupported arguments for CreateNamedStruct" , struct.valExprs: _* )
1360
- None
1361
- }
1362
-
1363
- case GetStructField (child, ordinal, _) =>
1364
- exprToProtoInternal(child, inputs, binding).map { childExpr =>
1365
- val getStructFieldBuilder = ExprOuterClass .GetStructField
1366
- .newBuilder()
1367
- .setChild(childExpr)
1368
- .setOrdinal(ordinal)
1369
-
1370
- ExprOuterClass .Expr
1371
- .newBuilder()
1372
- .setGetStructField(getStructFieldBuilder)
1373
- .build()
1374
- }
1375
-
1376
- case GetArrayItem (child, ordinal, failOnError) =>
1377
- val childExpr = exprToProtoInternal(child, inputs, binding)
1378
- val ordinalExpr = exprToProtoInternal(ordinal, inputs, binding)
1379
-
1380
- if (childExpr.isDefined && ordinalExpr.isDefined) {
1381
- val listExtractBuilder = ExprOuterClass .ListExtract
1382
- .newBuilder()
1383
- .setChild(childExpr.get)
1384
- .setOrdinal(ordinalExpr.get)
1385
- .setOneBased(false )
1386
- .setFailOnError(failOnError)
1387
-
1388
- Some (
1389
- ExprOuterClass .Expr
1390
- .newBuilder()
1391
- .setListExtract(listExtractBuilder)
1392
- .build())
1393
- } else {
1394
- withInfo(expr, " unsupported arguments for GetArrayItem" , child, ordinal)
1395
- None
1396
- }
1397
-
1398
- case ElementAt (child, ordinal, defaultValue, failOnError)
1399
- if child.dataType.isInstanceOf [ArrayType ] =>
1400
- val childExpr = exprToProtoInternal(child, inputs, binding)
1401
- val ordinalExpr = exprToProtoInternal(ordinal, inputs, binding)
1402
- val defaultExpr = defaultValue.flatMap(exprToProtoInternal(_, inputs, binding))
1403
-
1404
- if (childExpr.isDefined && ordinalExpr.isDefined &&
1405
- defaultExpr.isDefined == defaultValue.isDefined) {
1406
- val arrayExtractBuilder = ExprOuterClass .ListExtract
1407
- .newBuilder()
1408
- .setChild(childExpr.get)
1409
- .setOrdinal(ordinalExpr.get)
1410
- .setOneBased(true )
1411
- .setFailOnError(failOnError)
1412
-
1413
- defaultExpr.foreach(arrayExtractBuilder.setDefaultValue(_))
1414
-
1415
- Some (
1416
- ExprOuterClass .Expr
1417
- .newBuilder()
1418
- .setListExtract(arrayExtractBuilder)
1419
- .build())
1420
- } else {
1421
- withInfo(expr, " unsupported arguments for ElementAt" , child, ordinal)
1422
- None
1423
- }
1424
-
1425
- case GetArrayStructFields (child, _, ordinal, _, _) =>
1426
- val childExpr = exprToProtoInternal(child, inputs, binding)
1427
-
1428
- if (childExpr.isDefined) {
1429
- val arrayStructFieldsBuilder = ExprOuterClass .GetArrayStructFields
1430
- .newBuilder()
1431
- .setChild(childExpr.get)
1432
- .setOrdinal(ordinal)
1433
-
1434
- Some (
1435
- ExprOuterClass .Expr
1436
- .newBuilder()
1437
- .setGetArrayStructFields(arrayStructFieldsBuilder)
1438
- .build())
1439
- } else {
1440
- withInfo(expr, " unsupported arguments for GetArrayStructFields" , child)
1441
- None
1442
- }
1443
1285
case af @ ArrayFilter (_, func) if func.children.head.isInstanceOf [IsNotNull ] =>
1444
1286
convert(af, CometArrayCompact )
1445
1287
case expr =>
0 commit comments