0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 package org.apache.spark.sql.execution;
0019
0020 import org.apache.spark.unsafe.Platform;
0021 import org.apache.spark.util.collection.unsafe.sort.RecordComparator;
0022
0023 import java.nio.ByteOrder;
0024
0025 public final class RecordBinaryComparator extends RecordComparator {
0026
0027 private static final boolean LITTLE_ENDIAN =
0028 ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN);
0029
0030 @Override
0031 public int compare(
0032 Object leftObj, long leftOff, int leftLen, Object rightObj, long rightOff, int rightLen) {
0033 int i = 0;
0034
0035
0036 if (leftLen != rightLen) {
0037 return leftLen - rightLen;
0038 }
0039
0040
0041
0042
0043
0044 if ((leftOff % 8) == (rightOff % 8)) {
0045 while ((leftOff + i) % 8 != 0 && i < leftLen) {
0046 final int v1 = Platform.getByte(leftObj, leftOff + i);
0047 final int v2 = Platform.getByte(rightObj, rightOff + i);
0048 if (v1 != v2) {
0049 return (v1 & 0xff) > (v2 & 0xff) ? 1 : -1;
0050 }
0051 i += 1;
0052 }
0053 }
0054
0055 if (Platform.unaligned() || (((leftOff + i) % 8 == 0) && ((rightOff + i) % 8 == 0))) {
0056 while (i <= leftLen - 8) {
0057 long v1 = Platform.getLong(leftObj, leftOff + i);
0058 long v2 = Platform.getLong(rightObj, rightOff + i);
0059 if (v1 != v2) {
0060 if (LITTLE_ENDIAN) {
0061
0062
0063
0064 v1 = Long.reverseBytes(v1);
0065 v2 = Long.reverseBytes(v2);
0066 }
0067 return Long.compareUnsigned(v1, v2);
0068 }
0069 i += 8;
0070 }
0071 }
0072
0073
0074 while (i < leftLen) {
0075 final int v1 = Platform.getByte(leftObj, leftOff + i);
0076 final int v2 = Platform.getByte(rightObj, rightOff + i);
0077 if (v1 != v2) {
0078 return (v1 & 0xff) > (v2 & 0xff) ? 1 : -1;
0079 }
0080 i += 1;
0081 }
0082
0083
0084 return 0;
0085 }
0086 }