in pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/groupby/NoDictionaryMultiColumnGroupKeyGenerator.java [114:288]
public void generateKeysForBlock(ValueBlock valueBlock, int[] groupKeys) {
int numDocs = valueBlock.getNumDocs();
Object[] values = new Object[_numGroupByExpressions];
for (int i = 0; i < _numGroupByExpressions; i++) {
BlockValSet blockValSet = valueBlock.getBlockValueSet(_groupByExpressions[i]);
if (_dictionaries[i] != null) {
values[i] = blockValSet.getDictionaryIdsSV();
} else {
switch (_storedTypes[i]) {
case INT:
values[i] = blockValSet.getIntValuesSV();
break;
case LONG:
values[i] = blockValSet.getLongValuesSV();
break;
case FLOAT:
values[i] = blockValSet.getFloatValuesSV();
break;
case DOUBLE:
values[i] = blockValSet.getDoubleValuesSV();
break;
case BIG_DECIMAL:
values[i] = blockValSet.getBigDecimalValuesSV();
break;
case STRING:
values[i] = blockValSet.getStringValuesSV();
break;
case BYTES:
values[i] = blockValSet.getBytesValuesSV();
break;
default:
throw new IllegalArgumentException("Illegal data type for no-dictionary key generator: " + _storedTypes[i]);
}
}
}
int[] keyValues = new int[_numGroupByExpressions];
// note that we are mutating its backing array for memory efficiency
FixedIntArray flyweightKey = new FixedIntArray(keyValues);
if (_nullHandlingEnabled) {
RoaringBitmap[] nullBitmaps = new RoaringBitmap[_numGroupByExpressions];
for (int i = 0; i < _numGroupByExpressions; i++) {
nullBitmaps[i] = valueBlock.getBlockValueSet(_groupByExpressions[i]).getNullBitmap();
}
for (int row = 0; row < numDocs; row++) {
int numGroups = _groupKeyMap.size();
boolean hasInvalidKeyValue = false;
if (numGroups < _numGroupsLimit) {
for (int col = 0; col < _numGroupByExpressions; col++) {
if (nullBitmaps[col] != null && nullBitmaps[col].contains(row)) {
keyValues[col] = ID_FOR_NULL;
} else {
Object columnValues = values[col];
ValueToIdMap onTheFlyDictionary = _onTheFlyDictionaries[col];
int keyValue;
if (columnValues instanceof int[]) {
keyValue = onTheFlyDictionary.put(((int[]) columnValues)[row]);
} else if (columnValues instanceof long[]) {
keyValue = onTheFlyDictionary.put(((long[]) columnValues)[row]);
} else if (columnValues instanceof float[]) {
keyValue = onTheFlyDictionary.put(((float[]) columnValues)[row]);
} else if (columnValues instanceof double[]) {
keyValue = onTheFlyDictionary.put(((double[]) columnValues)[row]);
} else if (columnValues instanceof byte[][]) {
keyValue = onTheFlyDictionary.put(new ByteArray(((byte[][]) columnValues)[row]));
} else {
keyValue = onTheFlyDictionary.put(((Object[]) columnValues)[row]);
}
keyValues[col] = keyValue;
}
}
} else {
for (int col = 0; col < _numGroupByExpressions; col++) {
if (nullBitmaps[col] != null && nullBitmaps[col].contains(row)) {
keyValues[col] = ID_FOR_NULL;
} else {
Object columnValues = values[col];
ValueToIdMap onTheFlyDictionary = _onTheFlyDictionaries[col];
int keyValue;
if (columnValues instanceof int[]) {
keyValue = onTheFlyDictionary.getId(((int[]) columnValues)[row]);
} else if (columnValues instanceof long[]) {
keyValue = onTheFlyDictionary.getId(((long[]) columnValues)[row]);
} else if (columnValues instanceof float[]) {
keyValue = onTheFlyDictionary.getId(((float[]) columnValues)[row]);
} else if (columnValues instanceof double[]) {
keyValue = onTheFlyDictionary.getId(((double[]) columnValues)[row]);
} else if (columnValues instanceof byte[][]) {
keyValue = onTheFlyDictionary.getId(new ByteArray(((byte[][]) columnValues)[row]));
} else {
keyValue = onTheFlyDictionary.getId(((Object[]) columnValues)[row]);
}
if (keyValue == INVALID_ID) {
hasInvalidKeyValue = true;
break;
}
}
}
}
if (hasInvalidKeyValue) {
groupKeys[row] = INVALID_ID;
} else {
int groupId = getGroupIdForKey(flyweightKey);
if (groupId == numGroups) {
// When a new group is added, create a new FixedIntArray
keyValues = new int[_numGroupByExpressions];
flyweightKey = new FixedIntArray(keyValues);
}
groupKeys[row] = groupId;
}
}
} else {
for (int row = 0; row < numDocs; row++) {
int numGroups = _groupKeyMap.size();
boolean hasInvalidKeyValue = false;
if (numGroups < _numGroupsLimit) {
for (int col = 0; col < _numGroupByExpressions; col++) {
Object columnValues = values[col];
ValueToIdMap onTheFlyDictionary = _onTheFlyDictionaries[col];
int keyValue;
if (columnValues instanceof int[]) {
int columnValue = ((int[]) columnValues)[row];
keyValue = onTheFlyDictionary != null ? onTheFlyDictionary.put(columnValue) : columnValue;
} else if (columnValues instanceof long[]) {
keyValue = onTheFlyDictionary.put(((long[]) columnValues)[row]);
} else if (columnValues instanceof float[]) {
keyValue = onTheFlyDictionary.put(((float[]) columnValues)[row]);
} else if (columnValues instanceof double[]) {
keyValue = onTheFlyDictionary.put(((double[]) columnValues)[row]);
} else if (columnValues instanceof byte[][]) {
keyValue = onTheFlyDictionary.put(new ByteArray(((byte[][]) columnValues)[row]));
} else {
keyValue = onTheFlyDictionary.put(((Object[]) columnValues)[row]);
}
keyValues[col] = keyValue;
}
} else {
for (int col = 0; col < _numGroupByExpressions; col++) {
Object columnValues = values[col];
ValueToIdMap onTheFlyDictionary = _onTheFlyDictionaries[col];
int keyValue;
if (columnValues instanceof int[]) {
int columnValue = ((int[]) columnValues)[row];
keyValue = onTheFlyDictionary != null ? onTheFlyDictionary.getId(columnValue) : columnValue;
} else if (columnValues instanceof long[]) {
keyValue = onTheFlyDictionary.getId(((long[]) columnValues)[row]);
} else if (columnValues instanceof float[]) {
keyValue = onTheFlyDictionary.getId(((float[]) columnValues)[row]);
} else if (columnValues instanceof double[]) {
keyValue = onTheFlyDictionary.getId(((double[]) columnValues)[row]);
} else if (columnValues instanceof byte[][]) {
keyValue = onTheFlyDictionary.getId(new ByteArray(((byte[][]) columnValues)[row]));
} else {
keyValue = onTheFlyDictionary.getId(((Object[]) columnValues)[row]);
}
if (keyValue == INVALID_ID) {
hasInvalidKeyValue = true;
break;
}
keyValues[col] = keyValue;
}
}
if (hasInvalidKeyValue) {
groupKeys[row] = INVALID_ID;
} else {
int groupId = getGroupIdForKey(flyweightKey);
if (groupId == numGroups) {
// When a new group is added, create a new FixedIntArray
keyValues = new int[_numGroupByExpressions];
flyweightKey = new FixedIntArray(keyValues);
}
groupKeys[row] = groupId;
}
}
}
}