in pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/groupby/NoDictionarySingleColumnGroupKeyGenerator.java [149:229]
public void generateKeysForBlockNullHandlingEnabled(ValueBlock valueBlock, int[] groupKeys,
RoaringBitmap nullBitmap) {
assert nullBitmap != null;
BlockValSet blockValSet = valueBlock.getBlockValueSet(_groupByExpression);
int numDocs = valueBlock.getNumDocs();
switch (_storedType) {
case INT:
int[] intValues = blockValSet.getIntValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = nullBitmap.contains(i) ? getKeyForNullValue() : getKeyForValue(intValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForNullValue());
}
break;
case LONG:
long[] longValues = blockValSet.getLongValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = nullBitmap.contains(i) ? getKeyForNullValue() : getKeyForValue(longValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForNullValue());
}
break;
case FLOAT:
float[] floatValues = blockValSet.getFloatValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = nullBitmap.contains(i) ? getKeyForNullValue() : getKeyForValue(floatValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForNullValue());
}
break;
case DOUBLE:
double[] doubleValues = blockValSet.getDoubleValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = nullBitmap.contains(i) ? getKeyForNullValue() : getKeyForValue(doubleValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForNullValue());
}
break;
case BIG_DECIMAL:
BigDecimal[] bigDecimalValues = blockValSet.getBigDecimalValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = getKeyForValue(nullBitmap.contains(i) ? null : bigDecimalValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForValue((BigDecimal) null));
}
break;
case STRING:
String[] stringValues = blockValSet.getStringValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = getKeyForValue(nullBitmap.contains(i) ? null : stringValues[i]);
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForValue((String) null));
}
break;
case BYTES:
byte[][] bytesValues = blockValSet.getBytesValuesSV();
if (nullBitmap.getCardinality() < numDocs) {
for (int i = 0; i < numDocs; i++) {
groupKeys[i] = getKeyForValue(nullBitmap.contains(i) ? null : new ByteArray(bytesValues[i]));
}
} else if (numDocs > 0) {
Arrays.fill(groupKeys, 0, numDocs, getKeyForValue((ByteArray) null));
}
break;
default:
throw new IllegalArgumentException("Illegal data type for no-dictionary key generator: " + _storedType);
}
}