private void addColumnMinMaxValueWithoutDictionary()

in pinot-segment-local/src/main/java/org/apache/pinot/segment/local/segment/index/loader/columnminmaxvalue/ColumnMinMaxValueGenerator.java [200:384]


  private void addColumnMinMaxValueWithoutDictionary(ColumnMetadata columnMetadata)
      throws IOException {
    String columnName = columnMetadata.getColumnName();
    DataType dataType = columnMetadata.getDataType();
    DataType storedType = dataType.getStoredType();
    boolean isSingleValue = columnMetadata.isSingleValue();
    PinotDataBuffer rawIndexBuffer = _segmentWriter.getIndexFor(columnName, StandardIndexes.forward());
    try (ForwardIndexReader rawIndexReader = ForwardIndexReaderFactory.createRawIndexReader(rawIndexBuffer, storedType,
        isSingleValue); ForwardIndexReaderContext readerContext = rawIndexReader.createContext()) {
      int numDocs = columnMetadata.getTotalDocs();
      Object minValue;
      Object maxValue;
      switch (storedType) {
        case INT: {
          int min = Integer.MAX_VALUE;
          int max = Integer.MIN_VALUE;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              int value = rawIndexReader.getInt(docId, readerContext);
              min = Math.min(min, value);
              max = Math.max(max, value);
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              int[] values = rawIndexReader.getIntMV(docId, readerContext);
              for (int value : values) {
                min = Math.min(min, value);
                max = Math.max(max, value);
              }
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case LONG: {
          long min = Long.MAX_VALUE;
          long max = Long.MIN_VALUE;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              long value = rawIndexReader.getLong(docId, readerContext);
              min = Math.min(min, value);
              max = Math.max(max, value);
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              long[] values = rawIndexReader.getLongMV(docId, readerContext);
              for (long value : values) {
                min = Math.min(min, value);
                max = Math.max(max, value);
              }
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case FLOAT: {
          float min = Float.POSITIVE_INFINITY;
          float max = Float.NEGATIVE_INFINITY;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              float value = rawIndexReader.getFloat(docId, readerContext);
              min = Math.min(min, value);
              max = Math.max(max, value);
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              float[] values = rawIndexReader.getFloatMV(docId, readerContext);
              for (float value : values) {
                min = Math.min(min, value);
                max = Math.max(max, value);
              }
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case DOUBLE: {
          double min = Double.POSITIVE_INFINITY;
          double max = Double.NEGATIVE_INFINITY;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              double value = rawIndexReader.getDouble(docId, readerContext);
              min = Math.min(min, value);
              max = Math.max(max, value);
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              double[] values = rawIndexReader.getDoubleMV(docId, readerContext);
              for (double value : values) {
                min = Math.min(min, value);
                max = Math.max(max, value);
              }
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case BIG_DECIMAL: {
          Preconditions.checkState(isSingleValue, "Unsupported multi-value BIG_DECIMAL column: %s", columnName);
          BigDecimal min = null;
          BigDecimal max = null;
          for (int docId = 0; docId < numDocs; docId++) {
            BigDecimal value = rawIndexReader.getBigDecimal(docId, readerContext);
            if (min == null || min.compareTo(value) > 0) {
              min = value;
            }
            if (max == null || max.compareTo(value) < 0) {
              max = value;
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case STRING: {
          String min = null;
          String max = null;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              String value = rawIndexReader.getString(docId, readerContext);
              if (min == null || StringUtils.compare(min, value) > 0) {
                min = value;
              }
              if (max == null || StringUtils.compare(max, value) < 0) {
                max = value;
              }
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              String[] values = rawIndexReader.getStringMV(docId, readerContext);
              for (String value : values) {
                if (min == null || StringUtils.compare(min, value) > 0) {
                  min = value;
                }
                if (max == null || StringUtils.compare(max, value) < 0) {
                  max = value;
                }
              }
            }
          }
          minValue = min;
          maxValue = max;
          break;
        }
        case BYTES: {
          byte[] min = null;
          byte[] max = null;
          if (isSingleValue) {
            for (int docId = 0; docId < numDocs; docId++) {
              byte[] value = rawIndexReader.getBytes(docId, readerContext);
              if (min == null || ByteArray.compare(value, min) > 0) {
                min = value;
              }
              if (max == null || ByteArray.compare(value, max) < 0) {
                max = value;
              }
            }
          } else {
            for (int docId = 0; docId < numDocs; docId++) {
              byte[][] values = rawIndexReader.getBytesMV(docId, readerContext);
              for (byte[] value : values) {
                if (min == null || ByteArray.compare(value, min) > 0) {
                  min = value;
                }
                if (max == null || ByteArray.compare(value, max) < 0) {
                  max = value;
                }
              }
            }
          }
          minValue = new ByteArray(min);
          maxValue = new ByteArray(max);
          break;
        }
        default:
          throw new IllegalStateException("Unsupported data type: " + dataType + " for column: " + columnName);
      }
      SegmentColumnarIndexCreator.addColumnMinMaxValueInfo(_segmentProperties, columnName, minValue, maxValue,
          storedType);
    }
  }