public void generateKeysForBlock()

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