public void generateKeysForBlock()

in pinot-core/src/main/java/org/apache/pinot/core/query/aggregation/groupby/NoDictionaryMultiColumnGroupKeyGenerator.java [291:419]


  public void generateKeysForBlock(ValueBlock valueBlock, int[][] groupKeys) {
    int numDocs = valueBlock.getNumDocs();
    int[][][] keys = new int[numDocs][_numGroupByExpressions][];
    for (int i = 0; i < _numGroupByExpressions; i++) {
      BlockValSet blockValSet = valueBlock.getBlockValueSet(_groupByExpressions[i]);
      if (_dictionaries[i] != null) {
        if (_isSingleValueExpressions[i]) {
          int[] dictIds = blockValSet.getDictionaryIdsSV();
          for (int j = 0; j < numDocs; j++) {
            keys[j][i] = new int[]{dictIds[j]};
          }
        } else {
          int[][] dictIds = blockValSet.getDictionaryIdsMV();
          for (int j = 0; j < numDocs; j++) {
            keys[j][i] = dictIds[j];
          }
        }
      } else {
        ValueToIdMap onTheFlyDictionary = _onTheFlyDictionaries[i];
        if (_isSingleValueExpressions[i]) {
          switch (_storedTypes[i]) {
            case INT:
              int[] intValues = blockValSet.getIntValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(intValues[j])};
              }
              break;
            case LONG:
              long[] longValues = blockValSet.getLongValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(longValues[j])};
              }
              break;
            case FLOAT:
              float[] floatValues = blockValSet.getFloatValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(floatValues[j])};
              }
              break;
            case DOUBLE:
              double[] doubleValues = blockValSet.getDoubleValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(doubleValues[j])};
              }
              break;
            case STRING:
              String[] stringValues = blockValSet.getStringValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(stringValues[j])};
              }
              break;
            case BYTES:
              byte[][] bytesValues = blockValSet.getBytesValuesSV();
              for (int j = 0; j < numDocs; j++) {
                keys[j][i] = new int[]{onTheFlyDictionary.put(new ByteArray(bytesValues[j]))};
              }
              break;
            default:
              throw new IllegalArgumentException(
                  "Illegal data type for no-dictionary key generator: " + _storedTypes[i]);
          }
        } else {
          switch (_storedTypes[i]) {
            case INT:
              int[][] intValues = blockValSet.getIntValuesMV();
              for (int j = 0; j < numDocs; j++) {
                int mvSize = intValues[j].length;
                int[] mvKeys = new int[mvSize];
                for (int k = 0; k < mvSize; k++) {
                  mvKeys[k] = onTheFlyDictionary.put(intValues[j][k]);
                }
                keys[j][i] = mvKeys;
              }
              break;
            case LONG:
              long[][] longValues = blockValSet.getLongValuesMV();
              for (int j = 0; j < numDocs; j++) {
                int mvSize = longValues[j].length;
                int[] mvKeys = new int[mvSize];
                for (int k = 0; k < mvSize; k++) {
                  mvKeys[k] = onTheFlyDictionary.put(longValues[j][k]);
                }
                keys[j][i] = mvKeys;
              }
              break;
            case FLOAT:
              float[][] floatValues = blockValSet.getFloatValuesMV();
              for (int j = 0; j < numDocs; j++) {
                int mvSize = floatValues[j].length;
                int[] mvKeys = new int[mvSize];
                for (int k = 0; k < mvSize; k++) {
                  mvKeys[k] = onTheFlyDictionary.put(floatValues[j][k]);
                }
                keys[j][i] = mvKeys;
              }
              break;
            case DOUBLE:
              double[][] doubleValues = blockValSet.getDoubleValuesMV();
              for (int j = 0; j < numDocs; j++) {
                int mvSize = doubleValues[j].length;
                int[] mvKeys = new int[mvSize];
                for (int k = 0; k < mvSize; k++) {
                  mvKeys[k] = onTheFlyDictionary.put(doubleValues[j][k]);
                }
                keys[j][i] = mvKeys;
              }
              break;
            case STRING:
              String[][] stringValues = blockValSet.getStringValuesMV();
              for (int j = 0; j < numDocs; j++) {
                int mvSize = stringValues[j].length;
                int[] mvKeys = new int[mvSize];
                for (int k = 0; k < mvSize; k++) {
                  mvKeys[k] = onTheFlyDictionary.put(stringValues[j][k]);
                }
                keys[j][i] = mvKeys;
              }
              break;
            default:
              throw new IllegalArgumentException(
                  "Illegal data type for no-dictionary key generator: " + _storedTypes[i]);
          }
        }
      }
    }
    for (int i = 0; i < numDocs; i++) {
      groupKeys[i] = getGroupIdsForKeys(keys[i]);
    }
  }