@@ -95,6 +95,8 @@ object QueryPlanSerde extends Logging with CometExprShim {
9595 classOf [ArraysOverlap ] -> CometArraysOverlap ,
9696 classOf [ArrayUnion ] -> CometArrayUnion ,
9797 classOf [CreateArray ] -> CometCreateArray ,
98+ classOf [GetArrayItem ] -> CometGetArrayItem ,
99+ classOf [ElementAt ] -> CometElementAt ,
98100 classOf [Ascii ] -> CometScalarFunction (" ascii" ),
99101 classOf [ConcatWs ] -> CometScalarFunction (" concat_ws" ),
100102 classOf [Chr ] -> CometScalarFunction (" char" ),
@@ -170,6 +172,10 @@ object QueryPlanSerde extends Logging with CometExprShim {
170172 classOf [DateSub ] -> CometDateSub ,
171173 classOf [TruncDate ] -> CometTruncDate ,
172174 classOf [TruncTimestamp ] -> CometTruncTimestamp ,
175+ classOf [CreateNamedStruct ] -> CometCreateNamedStruct ,
176+ classOf [GetStructField ] -> CometGetStructField ,
177+ classOf [GetArrayStructFields ] -> CometGetArrayStructFields ,
178+ classOf [StructsToJson ] -> CometStructsToJson ,
173179 classOf [Flatten ] -> CometFlatten ,
174180 classOf [Atan2 ] -> CometAtan2 ,
175181 classOf [Ceil ] -> CometCeil ,
@@ -922,66 +928,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
922928 None
923929 }
924930
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-
985931 case SortOrder (child, direction, nullOrdering, _) =>
986932 val childExpr = exprToProtoInternal(child, inputs, binding)
987933
@@ -1336,110 +1282,6 @@ object QueryPlanSerde extends Logging with CometExprShim {
13361282 withInfo(expr, bloomFilter, value)
13371283 None
13381284 }
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- }
14431285 case af @ ArrayFilter (_, func) if func.children.head.isInstanceOf [IsNotNull ] =>
14441286 convert(af, CometArrayCompact )
14451287 case expr =>
0 commit comments