|
19 | 19 |
|
20 | 20 | package org.apache.comet.serde |
21 | 21 |
|
| 22 | +import scala.jdk.CollectionConverters._ |
| 23 | + |
22 | 24 | import org.apache.spark.sql.catalyst.expressions._ |
23 | 25 | import org.apache.spark.sql.types.{ArrayType, MapType} |
24 | 26 |
|
25 | | -import org.apache.comet.serde.QueryPlanSerde.{exprToProto, exprToProtoInternal, optExprWithInfo, scalarFunctionExprToProto, scalarFunctionExprToProtoWithReturnType} |
| 27 | +import org.apache.comet.CometSparkSessionExtensions.withInfo |
| 28 | +import org.apache.comet.serde.QueryPlanSerde.{exprToProtoInternal, optExprWithInfo, scalarFunctionExprToProto, scalarFunctionExprToProtoWithReturnType} |
26 | 29 |
|
27 | 30 | object CometMapKeys extends CometExpressionSerde[MapKeys] { |
28 | 31 |
|
@@ -95,23 +98,22 @@ object CometCreateMap extends CometExpressionSerde[CreateMap] { |
95 | 98 | expr: CreateMap, |
96 | 99 | inputs: Seq[Attribute], |
97 | 100 | binding: Boolean): Option[ExprOuterClass.Expr] = { |
98 | | - val keys = CreateArray(expr.keys) |
99 | | - val values = CreateArray(expr.values) |
100 | | - val keysProtoExpr = exprToProtoInternal(keys, inputs, binding) |
101 | | - val valuesProtoExpr = exprToProtoInternal(values, inputs, binding) |
102 | | - // scalastyle:off println |
103 | | - println(keysProtoExpr) |
104 | | - // scalastyle:on println line=102 column=4 |
105 | | - // scalastyle:off println |
106 | | - // println(valuesProtoExpr) |
107 | | - // scalastyle:on println line=103 column=4 |
108 | | - val createMapScalarExpr = |
109 | | - scalarFunctionExprToProtoWithReturnType( |
110 | | - "map", |
111 | | - expr.dataType, |
112 | | - false, |
113 | | - keysProtoExpr, |
114 | | - valuesProtoExpr) |
115 | | - optExprWithInfo(createMapScalarExpr, expr, expr.children: _*) |
| 101 | + val keysProtoExpr = expr.keys.map(exprToProtoInternal(_, inputs, binding)) |
| 102 | + val valuesProtoExpr = expr.values.map(exprToProtoInternal(_, inputs, binding)) |
| 103 | + if (keysProtoExpr.forall(_.isDefined) && valuesProtoExpr.forall(_.isDefined)) { |
| 104 | + val createMapProtoExpr = ExprOuterClass.CreateMap |
| 105 | + .newBuilder() |
| 106 | + .addAllValues(keysProtoExpr.map(_.get).asJava) |
| 107 | + .addAllValues(valuesProtoExpr.map(_.get).asJava) |
| 108 | + .build() |
| 109 | + Some( |
| 110 | + ExprOuterClass.Expr |
| 111 | + .newBuilder() |
| 112 | + .setCreateMap(createMapProtoExpr) |
| 113 | + .build()) |
| 114 | + } else { |
| 115 | + withInfo(expr, expr.children: _*) |
| 116 | + None |
| 117 | + } |
116 | 118 | } |
117 | 119 | } |
0 commit comments