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