Skip to content

Commit 9d00afc

Browse files
committed
Clean up prefix comparators for integral types
1 parent 88aff18 commit 9d00afc

File tree

3 files changed

+38
-75
lines changed

3 files changed

+38
-75
lines changed

core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.google.common.base.Charsets;
2121
import com.google.common.primitives.Longs;
22+
2223
import org.apache.spark.annotation.Private;
2324
import org.apache.spark.unsafe.types.UTF8String;
2425

@@ -27,8 +28,7 @@ public class PrefixComparators {
2728
private PrefixComparators() {}
2829

2930
public static final StringPrefixComparator STRING = new StringPrefixComparator();
30-
public static final IntPrefixComparator INTEGER = new IntPrefixComparator();
31-
public static final LongPrefixComparator LONG = new LongPrefixComparator();
31+
public static final IntegralPrefixComparator INTEGRAL = new IntegralPrefixComparator();
3232
public static final FloatPrefixComparator FLOAT = new FloatPrefixComparator();
3333
public static final DoublePrefixComparator DOUBLE = new DoublePrefixComparator();
3434

@@ -67,22 +67,10 @@ public long computePrefix(String value) {
6767
}
6868
}
6969

70-
public static final class IntPrefixComparator extends PrefixComparator {
71-
@Override
72-
public int compare(long aPrefix, long bPrefix) {
73-
int a = (int) aPrefix;
74-
int b = (int) bPrefix;
75-
return (a < b) ? -1 : (a > b) ? 1 : 0;
76-
}
77-
78-
public final long NULL_PREFIX = computePrefix(Integer.MIN_VALUE);
79-
80-
public long computePrefix(int value) {
81-
return value & 0xffffffffL;
82-
}
83-
}
84-
85-
public static final class LongPrefixComparator extends PrefixComparator {
70+
/**
71+
* Prefix comparator for all integral types (boolean, byte, short, int, long).
72+
*/
73+
public static final class IntegralPrefixComparator extends PrefixComparator {
8674
@Override
8775
public int compare(long a, long b) {
8876
return (a < b) ? -1 : (a > b) ? 1 : 0;

core/src/test/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

sql/core/src/main/scala/org/apache/spark/sql/execution/SortPrefixUtils.scala

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ object SortPrefixUtils {
3838
def getPrefixComparator(sortOrder: SortOrder): PrefixComparator = {
3939
sortOrder.dataType match {
4040
case StringType => PrefixComparators.STRING
41-
case IntegerType => PrefixComparators.INTEGER
42-
case LongType => PrefixComparators.LONG
41+
case BooleanType | ByteType | ShortType | IntegerType | LongType => PrefixComparators.INTEGRAL
4342
case FloatType => PrefixComparators.FLOAT
4443
case DoubleType => PrefixComparators.DOUBLE
4544
case _ => NoOpPrefixComparator
@@ -51,16 +50,37 @@ object SortPrefixUtils {
5150
case StringType => (row: InternalRow) => {
5251
PrefixComparators.STRING.computePrefix(sortOrder.child.eval(row).asInstanceOf[UTF8String])
5352
}
54-
case IntegerType => (row: InternalRow) => {
55-
val exprVal = sortOrder.child.eval(row)
56-
if (exprVal == null) PrefixComparators.INTEGER.NULL_PREFIX
57-
else PrefixComparators.INTEGER.computePrefix(sortOrder.child.eval(row).asInstanceOf[Int])
58-
}
59-
case LongType => (row: InternalRow) => {
60-
val exprVal = sortOrder.child.eval(row)
61-
if (exprVal == null) PrefixComparators.LONG.NULL_PREFIX
62-
else sortOrder.child.eval(row).asInstanceOf[Long]
63-
}
53+
case BooleanType =>
54+
(row: InternalRow) => {
55+
val exprVal = sortOrder.child.eval(row)
56+
if (exprVal == null) PrefixComparators.INTEGRAL.NULL_PREFIX
57+
else if (sortOrder.child.eval(row).asInstanceOf[Boolean]) 1
58+
else 0
59+
}
60+
case ByteType =>
61+
(row: InternalRow) => {
62+
val exprVal = sortOrder.child.eval(row)
63+
if (exprVal == null) PrefixComparators.INTEGRAL.NULL_PREFIX
64+
else sortOrder.child.eval(row).asInstanceOf[Byte]
65+
}
66+
case ShortType =>
67+
(row: InternalRow) => {
68+
val exprVal = sortOrder.child.eval(row)
69+
if (exprVal == null) PrefixComparators.INTEGRAL.NULL_PREFIX
70+
else sortOrder.child.eval(row).asInstanceOf[Short]
71+
}
72+
case IntegerType =>
73+
(row: InternalRow) => {
74+
val exprVal = sortOrder.child.eval(row)
75+
if (exprVal == null) PrefixComparators.INTEGRAL.NULL_PREFIX
76+
else sortOrder.child.eval(row).asInstanceOf[Int]
77+
}
78+
case LongType =>
79+
(row: InternalRow) => {
80+
val exprVal = sortOrder.child.eval(row)
81+
if (exprVal == null) PrefixComparators.INTEGRAL.NULL_PREFIX
82+
else sortOrder.child.eval(row).asInstanceOf[Long]
83+
}
6484
case FloatType => (row: InternalRow) => {
6585
val exprVal = sortOrder.child.eval(row)
6686
if (exprVal == null) PrefixComparators.FLOAT.NULL_PREFIX

0 commit comments

Comments
 (0)