Github user kiszk commented on a diff in the pull request:
https://github.com/apache/spark/pull/21021#discussion_r184284276
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala
---
@@ -191,24 +163,85 @@ case class SortArray(base: Expression,
ascendingOrder: Expression)
if (o1 == null && o2 == null) {
0
} else if (o1 == null) {
- 1
+ 1 * nullOrder
} else if (o2 == null) {
- -1
+ -1 * nullOrder
} else {
-ordering.compare(o1, o2)
}
}
}
}
- override def nullSafeEval(array: Any, ascending: Any): Any = {
- val elementType = base.dataType.asInstanceOf[ArrayType].elementType
+ def sortEval(array: Any, ascending: Boolean): Any = {
+ val elementType =
arrayExpression.dataType.asInstanceOf[ArrayType].elementType
val data = array.asInstanceOf[ArrayData].toArray[AnyRef](elementType)
if (elementType != NullType) {
- java.util.Arrays.sort(data, if (ascending.asInstanceOf[Boolean]) lt
else gt)
+ java.util.Arrays.sort(data, if (ascending) lt else gt)
}
new GenericArrayData(data.asInstanceOf[Array[Any]])
}
+}
+
+object ArraySortUtil {
+ type NullOrder = Int
+ object NullOrder {
+ val Least: NullOrder = -1
+ val Greatest: NullOrder = 1
+ }
+}
+
+/**
+ * Sorts the input array in ascending / descending order according to the
natural ordering of
+ * the array elements and returns it.
+ */
+// scalastyle:off line.size.limit
+@ExpressionDescription(
+ usage = """
+ _FUNC_(array[, ascendingOrder]) - Sorts the input array in ascending
or descending order
+ according to the natural ordering of the array elements. Null
elements will be placed
+ at the beginning of the returned array in ascending order or at the
end of the returned
+ array in descending order.
+ """,
+ examples = """
+ Examples:
+ > SELECT _FUNC_(array('b', 'd', null, 'c', 'a'), true);
+ [null,"a","b","c","d"]
+ """)
+// scalastyle:on line.size.limit
+case class SortArray(base: Expression, ascendingOrder: Expression)
+ extends BinaryExpression with ArraySortUtil {
+
+ def this(e: Expression) = this(e, Literal(true))
+
+ override def left: Expression = base
+ override def right: Expression = ascendingOrder
+ override def dataType: DataType = base.dataType
+ override def inputTypes: Seq[AbstractDataType] = Seq(ArrayType,
BooleanType)
+
+ override def arrayExpression: Expression = base
+ override def nullOrder: Int = NullOrder.Greatest
--- End diff --
Good catch, thanks
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]