@Nullable
  @Override
  public RoaringBitmap getNullBitmap(ValueBlock valueBlock) {
    int length = valueBlock.getNumDocs();
    RoaringBitmap result = new RoaringBitmap();
    RoaringBitmap mainFunctionNullBitmap = _mainFunction.getNullBitmap(valueBlock);
    if (mainFunctionNullBitmap != null) {
      result.or(mainFunctionNullBitmap);
      if (result.getCardinality() == length) {
        return result;
      }
    }
    int[] intValuesSV = transformToIntValuesSV(valueBlock);
    if (_valueSet == null) {
      RoaringBitmap valueFunctionsContainNull = new RoaringBitmap();
      RoaringBitmap[] valueFunctionNullBitmaps = new RoaringBitmap[_valueFunctions.length];
      for (int i = 0; i < _valueFunctions.length; i++) {
        valueFunctionNullBitmaps[i] = _valueFunctions[i].getNullBitmap(valueBlock);
      }
      for (int i = 0; i < length; i++) {
        for (int j = 0; j < _valueFunctions.length; j++) {
          if (valueFunctionNullBitmaps[j] != null && valueFunctionNullBitmaps[j].contains(i)) {
            valueFunctionsContainNull.add(i);
            break;
          }
        }
      }
      for (int i = 0; i < length; i++) {
        if (mainFunctionNotContainedInValues(intValuesSV[i]) && valueFunctionsContainNull.contains(i)) {
          result.add(i);
        }
      }
    } else {
      for (int i = 0; i < length; i++) {
        if (mainFunctionNotContainedInValues(intValuesSV[i]) && _valueSetContainsNull) {
          result.add(i);
        }
      }
    }
    return result;
  }
@Test
  public void testInTransformFunctionIdentifierNotInAllLiteralValuesThatContainNullReturnsNull() {
    String expressionStr =
        String.format("%s IN (%s, %s, NULL)", INT_SV_COLUMN, _intSVValues[0] + 1, _intSVValues[0] + 2);
    ExpressionContext expression = RequestContextUtils.getExpression(expressionStr);
    TransformFunction transformFunction = TransformFunctionFactory.get(expression, _dataSourceMap);

    assertTrue(transformFunction.getNullBitmap(_projectionBlock).contains(0));
  }