public int compare()

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;
  }