public void generateKeysForBlockNullHandlingEnabled()

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