Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/21830#discussion_r205336425
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
---
@@ -1244,46 +1244,50 @@ case class Reverse(child: Expression) extends
UnaryExpression with ImplicitCastI
}
private def arrayCodeGen(ctx: CodegenContext, ev: ExprCode, childName:
String): String = {
- val length = ctx.freshName("length")
- val javaElementType = CodeGenerator.javaType(elementType)
+
val isPrimitiveType = CodeGenerator.isPrimitiveType(elementType)
+ val numElements = ctx.freshName("numElements")
+ val arrayData = ctx.freshName("arrayData")
+
val initialization = if (isPrimitiveType) {
- s"$childName.copy()"
+ ctx.createUnsafeArray(arrayData, numElements, elementType, s"
$prettyName failed.")
} else {
- s"new ${classOf[GenericArrayData].getName()}(new Object[$length])"
- }
-
- val numberOfIterations = if (isPrimitiveType) s"$length / 2" else
length
-
- val swapAssigments = if (isPrimitiveType) {
- val setFunc = "set" + CodeGenerator.primitiveTypeName(elementType)
- val getCall = (index: String) => CodeGenerator.getValue(ev.value,
elementType, index)
- s"""|boolean isNullAtK = ${ev.value}.isNullAt(k);
- |boolean isNullAtL = ${ev.value}.isNullAt(l);
- |if(!isNullAtK) {
- | $javaElementType el = ${getCall("k")};
- | if(!isNullAtL) {
- | ${ev.value}.$setFunc(k, ${getCall("l")});
- | } else {
- | ${ev.value}.setNullAt(k);
- | }
- | ${ev.value}.$setFunc(l, el);
- |} else if (!isNullAtL) {
- | ${ev.value}.$setFunc(k, ${getCall("l")});
- | ${ev.value}.setNullAt(l);
- |}""".stripMargin
+ val arrayDataClass = classOf[GenericArrayData].getName
+ s"$arrayDataClass $arrayData = new $arrayDataClass(new
Object[$numElements]);"
+ }
+
+ val i = ctx.freshName("i")
+ val j = ctx.freshName("j")
+
+ val getValue = CodeGenerator.getValue(childName, elementType, i)
+
+ val setFunc = if (isPrimitiveType) {
+ s"set${CodeGenerator.primitiveTypeName(elementType)}"
+ } else {
+ "update"
+ }
+
+ val assignment = if (isPrimitiveType &&
dataType.asInstanceOf[ArrayType].containsNull) {
--- End diff --
nit: we can simplify the code if we do `override def dataType: ArrayType =
child.dataType.asInstanceOf[ArrayType]`
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]