private void processProjectionBlock()

in pinot-core/src/main/java/org/apache/pinot/core/operator/dociditerators/ExpressionScanDocIdIterator.java [151:410]


  private void processProjectionBlock(ProjectionBlock projectionBlock, BitmapDataProvider matchingDocIds) {
    int numDocs = projectionBlock.getNumDocs();
    TransformResultMetadata resultMetadata = _transformFunction.getResultMetadata();
    if (resultMetadata.isSingleValue()) {
      _numEntriesScanned += numDocs;
      RoaringBitmap nullBitmap = null;
      if (_predicateEvaluationResult == PredicateEvaluationResult.NULL) {
        nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
        if (nullBitmap != null) {
          for (int i : nullBitmap) {
            matchingDocIds.add(_docIdBuffer[i]);
          }
        }
        return;
      }
      boolean predicateEvaluationResult = _predicateEvaluationResult == PredicateEvaluationResult.TRUE;
      assert (_predicateEvaluator != null);
      if (resultMetadata.hasDictionary()) {
        int[] dictIds = _transformFunction.transformToDictIdsSV(projectionBlock);
        if (_nullHandlingEnabled) {
          nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
        }
        if (nullBitmap != null && !nullBitmap.isEmpty()) {
          for (int i = 0; i < numDocs; i++) {
            if (_predicateEvaluator.applySV(dictIds[i]) == predicateEvaluationResult && !nullBitmap.contains(i)) {
              matchingDocIds.add(_docIdBuffer[i]);
            }
          }
        } else {
          for (int i = 0; i < numDocs; i++) {
            if (_predicateEvaluator.applySV(dictIds[i]) == predicateEvaluationResult) {
              matchingDocIds.add(_docIdBuffer[i]);
            }
          }
        }
      } else {
        switch (resultMetadata.getDataType().getStoredType()) {
          case INT:
            int[] intValues = _transformFunction.transformToIntValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(intValues[i]) == predicateEvaluationResult && !nullBitmap.contains(i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(intValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case LONG:
            long[] longValues = _transformFunction.transformToLongValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(longValues[i]) == predicateEvaluationResult && !nullBitmap.contains(
                    i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(longValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case FLOAT:
            float[] floatValues = _transformFunction.transformToFloatValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(floatValues[i]) == predicateEvaluationResult && !nullBitmap.contains(
                    i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(floatValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case DOUBLE:
            double[] doubleValues = _transformFunction.transformToDoubleValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(doubleValues[i]) == predicateEvaluationResult && !nullBitmap.contains(
                    i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(doubleValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case STRING:
            String[] stringValues = _transformFunction.transformToStringValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(stringValues[i]) == predicateEvaluationResult && !nullBitmap.contains(
                    i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(stringValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case BYTES:
            byte[][] bytesValues = _transformFunction.transformToBytesValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(bytesValues[i]) == predicateEvaluationResult && !nullBitmap.contains(
                    i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(bytesValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          case BIG_DECIMAL:
            BigDecimal[] bigDecimalValues = _transformFunction.transformToBigDecimalValuesSV(projectionBlock);
            if (_nullHandlingEnabled) {
              nullBitmap = _transformFunction.getNullBitmap(projectionBlock);
            }
            if (nullBitmap != null && !nullBitmap.isEmpty()) {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(bigDecimalValues[i]) == predicateEvaluationResult
                    && !nullBitmap.contains(i)) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            } else {
              for (int i = 0; i < numDocs; i++) {
                if (_predicateEvaluator.applySV(bigDecimalValues[i]) == predicateEvaluationResult) {
                  matchingDocIds.add(_docIdBuffer[i]);
                }
              }
            }
            break;
          default:
            throw new IllegalStateException();
        }
      }
    } else {
      // TODO(https://github.com/apache/pinot/issues/10882): support NULL for multi-value.
      if (_predicateEvaluationResult == PredicateEvaluationResult.NULL) {
        return;
      }
      boolean predicateEvaluationResult = _predicateEvaluationResult == PredicateEvaluationResult.TRUE;
      assert (_predicateEvaluator != null);
      if (resultMetadata.hasDictionary()) {
        int[][] dictIdsArray = _transformFunction.transformToDictIdsMV(projectionBlock);
        for (int i = 0; i < numDocs; i++) {
          int[] dictIds = dictIdsArray[i];
          int numDictIds = dictIds.length;
          _numEntriesScanned += numDictIds;
          if (_predicateEvaluator.applyMV(dictIds, numDictIds) == predicateEvaluationResult) {
            matchingDocIds.add(_docIdBuffer[i]);
          }
        }
      } else {
        switch (resultMetadata.getDataType().getStoredType()) {
          case INT:
            int[][] intValuesArray = _transformFunction.transformToIntValuesMV(projectionBlock);
            for (int i = 0; i < numDocs; i++) {
              int[] values = intValuesArray[i];
              int numValues = values.length;
              _numEntriesScanned += numValues;
              if (_predicateEvaluator.applyMV(values, numValues) == predicateEvaluationResult) {
                matchingDocIds.add(_docIdBuffer[i]);
              }
            }
            break;
          case LONG:
            long[][] longValuesArray = _transformFunction.transformToLongValuesMV(projectionBlock);
            for (int i = 0; i < numDocs; i++) {
              long[] values = longValuesArray[i];
              int numValues = values.length;
              _numEntriesScanned += numValues;
              if (_predicateEvaluator.applyMV(values, numValues) == predicateEvaluationResult) {
                matchingDocIds.add(_docIdBuffer[i]);
              }
            }
            break;
          case FLOAT:
            float[][] floatValuesArray = _transformFunction.transformToFloatValuesMV(projectionBlock);
            for (int i = 0; i < numDocs; i++) {
              float[] values = floatValuesArray[i];
              int numValues = values.length;
              _numEntriesScanned += numValues;
              if (_predicateEvaluator.applyMV(values, numValues) == predicateEvaluationResult) {
                matchingDocIds.add(_docIdBuffer[i]);
              }
            }
            break;
          case DOUBLE:
            double[][] doubleValuesArray = _transformFunction.transformToDoubleValuesMV(projectionBlock);
            for (int i = 0; i < numDocs; i++) {
              double[] values = doubleValuesArray[i];
              int numValues = values.length;
              _numEntriesScanned += numValues;
              if (_predicateEvaluator.applyMV(values, numValues) == predicateEvaluationResult) {
                matchingDocIds.add(_docIdBuffer[i]);
              }
            }
            break;
          case STRING:
            String[][] valuesArray = _transformFunction.transformToStringValuesMV(projectionBlock);
            for (int i = 0; i < numDocs; i++) {
              String[] values = valuesArray[i];
              int numValues = values.length;
              _numEntriesScanned += numValues;
              if (_predicateEvaluator.applyMV(values, numValues) == predicateEvaluationResult) {
                matchingDocIds.add(_docIdBuffer[i]);
              }
            }
            break;
          default:
            throw new IllegalStateException();
        }
      }
    }
  }