in pinot-core/src/main/java/org/apache/pinot/core/segment/processing/genericrow/GenericRowDeserializer.java [177:346]
public int compare(long offset1, long offset2, int numFieldsToCompare) {
for (int i = 0; i < numFieldsToCompare; i++) {
if (_isSingleValueFields[i]) {
switch (_storedTypes[i]) {
case INT: {
int result = Integer.compare(_dataBuffer.getInt(offset1), _dataBuffer.getInt(offset2));
if (result != 0) {
return result;
}
offset1 += Integer.BYTES;
offset2 += Integer.BYTES;
break;
}
case LONG: {
int result = Long.compare(_dataBuffer.getLong(offset1), _dataBuffer.getLong(offset2));
if (result != 0) {
return result;
}
offset1 += Long.BYTES;
offset2 += Long.BYTES;
break;
}
case FLOAT: {
int result = Float.compare(_dataBuffer.getFloat(offset1), _dataBuffer.getFloat(offset2));
if (result != 0) {
return result;
}
offset1 += Float.BYTES;
offset2 += Float.BYTES;
break;
}
case DOUBLE: {
int result = Double.compare(_dataBuffer.getDouble(offset1), _dataBuffer.getDouble(offset2));
if (result != 0) {
return result;
}
offset1 += Double.BYTES;
offset2 += Double.BYTES;
break;
}
case STRING: {
int numBytes1 = _dataBuffer.getInt(offset1);
offset1 += Integer.BYTES;
byte[] stringBytes1 = new byte[numBytes1];
_dataBuffer.copyTo(offset1, stringBytes1);
int numBytes2 = _dataBuffer.getInt(offset2);
offset2 += Integer.BYTES;
byte[] stringBytes2 = new byte[numBytes2];
_dataBuffer.copyTo(offset2, stringBytes2);
int result = new String(stringBytes1, UTF_8).compareTo(new String(stringBytes2, UTF_8));
if (result != 0) {
return result;
}
offset1 += numBytes1;
offset2 += numBytes2;
break;
}
case BYTES: {
int numBytes1 = _dataBuffer.getInt(offset1);
offset1 += Integer.BYTES;
byte[] bytes1 = new byte[numBytes1];
_dataBuffer.copyTo(offset1, bytes1);
int numBytes2 = _dataBuffer.getInt(offset2);
offset2 += Integer.BYTES;
byte[] bytes2 = new byte[numBytes2];
_dataBuffer.copyTo(offset2, bytes2);
int result = ByteArray.compare(bytes1, bytes2);
if (result != 0) {
return result;
}
offset1 += numBytes1;
offset2 += numBytes2;
break;
}
case BIG_DECIMAL: {
int numBytes1 = _dataBuffer.getInt(offset1);
offset1 += Integer.BYTES;
byte[] bigDecimalBytes1 = new byte[numBytes1];
_dataBuffer.copyTo(offset1, bigDecimalBytes1);
int numBytes2 = _dataBuffer.getInt(offset2);
offset2 += Integer.BYTES;
byte[] bigDecimalBytes2 = new byte[numBytes2];
_dataBuffer.copyTo(offset2, bigDecimalBytes2);
int result =
BigDecimalUtils.deserialize(bigDecimalBytes1).compareTo(BigDecimalUtils.deserialize(bigDecimalBytes2));
if (result != 0) {
return result;
}
offset1 += numBytes1;
offset2 += numBytes2;
break;
}
default:
throw new IllegalStateException("Unsupported SV stored type: " + _storedTypes[i]);
}
} else {
int numValues = _dataBuffer.getInt(offset1);
int numValues2 = _dataBuffer.getInt(offset2);
if (numValues != numValues2) {
return Integer.compare(numValues, numValues2);
}
offset1 += Integer.BYTES;
offset2 += Integer.BYTES;
switch (_storedTypes[i]) {
case INT:
for (int j = 0; j < numValues; j++) {
int result = Integer.compare(_dataBuffer.getInt(offset1), _dataBuffer.getInt(offset2));
if (result != 0) {
return result;
}
offset1 += Integer.BYTES;
offset2 += Integer.BYTES;
}
break;
case LONG:
for (int j = 0; j < numValues; j++) {
int result = Long.compare(_dataBuffer.getLong(offset1), _dataBuffer.getLong(offset2));
if (result != 0) {
return result;
}
offset1 += Long.BYTES;
offset2 += Long.BYTES;
}
break;
case FLOAT:
for (int j = 0; j < numValues; j++) {
int result = Float.compare(_dataBuffer.getFloat(offset1), _dataBuffer.getFloat(offset2));
if (result != 0) {
return result;
}
offset1 += Float.BYTES;
offset2 += Float.BYTES;
}
break;
case DOUBLE:
for (int j = 0; j < numValues; j++) {
int result = Double.compare(_dataBuffer.getDouble(offset1), _dataBuffer.getDouble(offset2));
if (result != 0) {
return result;
}
offset1 += Double.BYTES;
offset2 += Double.BYTES;
}
break;
case STRING:
for (int j = 0; j < numValues; j++) {
int numBytes1 = _dataBuffer.getInt(offset1);
offset1 += Integer.BYTES;
byte[] stringBytes1 = new byte[numBytes1];
_dataBuffer.copyTo(offset1, stringBytes1);
int numBytes2 = _dataBuffer.getInt(offset2);
offset2 += Integer.BYTES;
byte[] stringBytes2 = new byte[numBytes2];
_dataBuffer.copyTo(offset2, stringBytes2);
int result = new String(stringBytes1, UTF_8).compareTo(new String(stringBytes2, UTF_8));
if (result != 0) {
return result;
}
offset1 += numBytes1;
offset2 += numBytes2;
}
break;
default:
throw new IllegalStateException("Unsupported MV stored type: " + _storedTypes[i]);
}
}
}
return 0;
}