Github user cloud-fan commented on a diff in the pull request: https://github.com/apache/spark/pull/22745#discussion_r227431215 --- Diff: sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala --- @@ -1787,3 +1788,79 @@ case class ValidateExternalType(child: Expression, expected: DataType) ev.copy(code = code, isNull = input.isNull) } } + +object GetKeyArrayFromMap { + + /** + * Construct an instance of GetArrayFromMap case class + * extracting a key array from a Map expression. + * + * @param child a Map expression to extract a key array from + */ + def apply(child: Expression): Expression = { + GetArrayFromMap( + child, + "keyArray", + _.keyArray(), + { case MapType(kt, _, _) => kt }) + } +} + +object GetValueArrayFromMap { + + /** + * Construct an instance of GetArrayFromMap case class + * extracting a value array from a Map expression. + * + * @param child a Map expression to extract a value array from + */ + def apply(child: Expression): Expression = { + GetArrayFromMap( + child, + "valueArray", + _.valueArray(), + { case MapType(_, vt, _) => vt }) + } +} + +/** + * Extracts a key/value array from a Map expression. + * + * @param child a Map expression to extract an array from + * @param functionName name of the function that is invoked to extract an array + * @param arrayGetter function extracting `ArrayData` from `MapData` + * @param elementTypeGetter function extracting array element `DataType` from `MapType` + */ +case class GetArrayFromMap private( + child: Expression, + functionName: String, + arrayGetter: MapData => ArrayData, + elementTypeGetter: MapType => DataType) extends UnaryExpression with NonSQLExpression { + + private lazy val encodedFunctionName: String = TermName(functionName).encodedName.toString + + lazy val dataType: DataType = { + val mt: MapType = child.dataType.asInstanceOf[MapType] + ArrayType(elementTypeGetter(mt)) + } + + override def checkInputDataTypes(): TypeCheckResult = { + child.dataType match { + case MapType(_, _, _) => --- End diff -- shall we just use if-else? ``` if (isinstanceOf[MapType]) ... else ... ```
--- --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org