Github user ericl commented on a diff in the pull request:
https://github.com/apache/spark/pull/14842#discussion_r77221570
--- Diff:
core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java
---
@@ -69,49 +100,161 @@ public static long computePrefix(double value) {
* ordering they define is compatible with radix sort.
*/
public abstract static class RadixSortSupport extends PrefixComparator {
+
/** @return Whether the sort should be descending in binary sort
order. */
public abstract boolean sortDescending();
/** @return Whether the sort should take into account the sign bit. */
public abstract boolean sortSigned();
+
+ /** @return Whether the sort should put null first or last. */
+ public abstract NullOrder nullOrder();
}
//
// Standard prefix comparator implementations
//
+ // unsigned asc null first (default)
public static final class UnsignedPrefixComparator extends
RadixSortSupport {
@Override public boolean sortDescending() { return false; }
@Override public boolean sortSigned() { return false; }
- @Override
+ @Override public NullOrder nullOrder() { return NullOrder.FIRST; }
public int compare(long aPrefix, long bPrefix) {
+ if (aPrefix == 0L && bPrefix == 0L) {
+ return 0;
+ }
+ if (aPrefix == 0L) {
+ return -1;
+ } else if (bPrefix == 0L) {
+ return 1;
+ }
return UnsignedLongs.compare(aPrefix, bPrefix);
}
}
+ // unsigned asc null last
+ public static final class UnsignedPrefixComparatorNullLast extends
RadixSortSupport {
+ @Override public boolean sortDescending() { return false; }
+ @Override public boolean sortSigned() { return false; }
+ @Override public NullOrder nullOrder() { return NullOrder.LAST; }
+ public int compare(long aPrefix, long bPrefix) {
+ if (aPrefix == 0L && bPrefix == 0L) {
+ return 0;
+ }
+ if (aPrefix == 0L) {
+ return 1;
+ } else if (bPrefix == 0L) {
+ return -1;
+ }
+ return UnsignedLongs.compare(aPrefix, bPrefix);
+ }
+ }
+
+ // unsigned desc null first
+ public static final class UnsignedPrefixComparatorDescNullFirst extends
RadixSortSupport {
+ @Override public boolean sortDescending() { return true; }
+ @Override public boolean sortSigned() { return false; }
+ @Override public NullOrder nullOrder() { return NullOrder.FIRST; }
+ public int compare(long bPrefix, long aPrefix) {
+ if (aPrefix == 0L && bPrefix == 0L) {
+ return 0;
+ }
+ if (bPrefix == 0L) {
+ return -1;
+ } else if (aPrefix == 0L) {
+ return 1;
+ }
+ return UnsignedLongs.compare(aPrefix, bPrefix);
+ }
+ }
+
+ // unsigned desc null last (default)
public static final class UnsignedPrefixComparatorDesc extends
RadixSortSupport {
@Override public boolean sortDescending() { return true; }
@Override public boolean sortSigned() { return false; }
- @Override
+ @Override public NullOrder nullOrder() { return NullOrder.LAST; }
public int compare(long bPrefix, long aPrefix) {
+ if (aPrefix == 0L && bPrefix == 0L) {
+ return 0;
+ }
+ if (bPrefix == 0L) {
+ return 1;
+ } else if (aPrefix == 0L) {
+ return -1;
+ }
return UnsignedLongs.compare(aPrefix, bPrefix);
}
}
+ // signed asc null first (default)
public static final class SignedPrefixComparator extends
RadixSortSupport {
@Override public boolean sortDescending() { return false; }
@Override public boolean sortSigned() { return true; }
- @Override
+ @Override public NullOrder nullOrder() { return NullOrder.FIRST; }
+ public int compare(long a, long b) {
+ if (a == Long.MIN_VALUE && b == Long.MIN_VALUE) {
+ return 0;
+ }
+ if (a == Long.MIN_VALUE) {
+ return -1;
+ } else if (b == Long.MIN_VALUE) {
+ return 1;
+ }
+ return (a < b) ? -1 : (a > b) ? 1 : 0;
+ }
+ }
+
+ // signed asc null last
+ public static final class SignedPrefixComparatorNullLast extends
RadixSortSupport {
+ @Override public boolean sortDescending() { return false; }
+ @Override public boolean sortSigned() { return true; }
+ @Override public NullOrder nullOrder() { return NullOrder.LAST; }
public int compare(long a, long b) {
+ if (a == Long.MIN_VALUE && b == Long.MIN_VALUE) {
+ return 0;
+ }
+ if (a == Long.MIN_VALUE) {
+ return 1;
+ } else if (b == Long.MIN_VALUE) {
+ return -1;
+ }
+ return (a < b) ? -1 : (a > b) ? 1 : 0;
+ }
+ }
+
+ // signed desc null first
+ public static final class SignedPrefixComparatorDescNullFirst extends
RadixSortSupport {
+ @Override public boolean sortDescending() { return true; }
+ @Override public boolean sortSigned() { return true; }
+ @Override public NullOrder nullOrder() { return NullOrder.FIRST; }
+ public int compare(long b, long a) {
+ if (a == Long.MIN_VALUE && b == Long.MIN_VALUE) {
--- End diff --
Isn't the MIN_VALUE overloaded, so it could be either a null or a literal
min?
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]