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