Github user kiszk commented on a diff in the pull request:

    https://github.com/apache/spark/pull/22439#discussion_r218090048
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/complexTypeCreator.scala
 ---
    @@ -75,87 +74,60 @@ case class CreateArray(children: Seq[Expression]) 
extends Expression {
     
     private [sql] object GenArrayData {
       /**
    -   * Return Java code pieces based on DataType and isPrimitive to allocate 
ArrayData class
    +   * Return Java code pieces based on DataType and array size to allocate 
ArrayData class
        *
        * @param ctx a [[CodegenContext]]
        * @param elementType data type of underlying array elements
    -   * @param elementsCode concatenated set of [[ExprCode]] for each element 
of an underlying array
    +   * @param elementsExpr concatenated set of [[Expression]] for each 
element of an underlying array
        * @param isMapKey if true, throw an exception when the element is null
    -   * @return (code pre-assignments, concatenated assignments to each array 
elements,
    -   *           code post-assignments, arrayData name)
    +   * @param functionName string to include in the error message
    +   * @return (array allocation, concatenated assignments to each array 
elements, arrayData name)
        */
       def genCodeToCreateArrayData(
           ctx: CodegenContext,
           elementType: DataType,
    -      elementsCode: Seq[ExprCode],
    -      isMapKey: Boolean): (String, String, String, String) = {
    +      elementsExpr: Seq[Expression],
    +      isMapKey: Boolean,
    +      functionName: String): (String, String, String) = {
         val arrayDataName = ctx.freshName("arrayData")
    -    val numElements = elementsCode.length
    +    val numElements = s"${elementsExpr.length}L"
     
    -    if (!CodeGenerator.isPrimitiveType(elementType)) {
    -      val arrayName = ctx.freshName("arrayObject")
    -      val genericArrayClass = classOf[GenericArrayData].getName
    +    val initialization = CodeGenerator.createArrayData(
    +      arrayDataName, elementType, numElements, s" $functionName failed.")
     
    -      val assignments = elementsCode.zipWithIndex.map { case (eval, i) =>
    -        val isNullAssignment = if (!isMapKey) {
    -          s"$arrayName[$i] = null;"
    -        } else {
    -          "throw new RuntimeException(\"Cannot use null as map key!\");"
    -        }
    -        eval.code + s"""
    -         if (${eval.isNull}) {
    -           $isNullAssignment
    -         } else {
    -           $arrayName[$i] = ${eval.value};
    -         }
    -       """
    -      }
    -      val assignmentString = ctx.splitExpressionsWithCurrentInputs(
    -        expressions = assignments,
    -        funcName = "apply",
    -        extraArguments = ("Object[]", arrayName) :: Nil)
    -
    -      (s"Object[] $arrayName = new Object[$numElements];",
    -       assignmentString,
    -       s"final ArrayData $arrayDataName = new 
$genericArrayClass($arrayName);",
    -       arrayDataName)
    -    } else {
    -      val arrayName = ctx.freshName("array")
    -      val unsafeArraySizeInBytes =
    -        UnsafeArrayData.calculateHeaderPortionInBytes(numElements) +
    -        
ByteArrayMethods.roundNumberOfBytesToNearestWord(elementType.defaultSize * 
numElements)
    -      val baseOffset = Platform.BYTE_ARRAY_OFFSET
    -
    -      val primitiveValueTypeName = 
CodeGenerator.primitiveTypeName(elementType)
    -      val assignments = elementsCode.zipWithIndex.map { case (eval, i) =>
    +    val assignments = elementsExpr.zipWithIndex.map { case (expr, i) =>
    +      val eval = expr.genCode(ctx)
    +      val setArrayElement = CodeGenerator.setArrayElement(
    +        arrayDataName, elementType, i.toString, eval.value)
    +
    +      val assignment = if (!expr.nullable || eval.isNull == FalseLiteral) {
    --- End diff --
    
    I see, looks redudant


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to