in gandiva/src/main/java/org/apache/arrow/gandiva/evaluator/Projector.java [317:392]
private synchronized void evaluate(
int numRows,
List<ArrowBuf> buffers,
List<ArrowBuffer> buffersLayout,
int selectionVectorType,
int selectionVectorRecordCount,
long selectionVectorAddr,
long selectionVectorSize,
List<ValueVector> outColumns)
throws GandivaException {
if (this.closed) {
throw new EvaluatorClosedException();
}
if (numExprs != outColumns.size()) {
logger.info("Expected " + numExprs + " columns, got " + outColumns.size());
throw new GandivaException("Incorrect number of columns for the output vector");
}
long[] bufAddrs = new long[buffers.size()];
long[] bufSizes = new long[buffers.size()];
int idx = 0;
for (ArrowBuf buf : buffers) {
bufAddrs[idx++] = buf.memoryAddress();
}
idx = 0;
for (ArrowBuffer bufLayout : buffersLayout) {
bufSizes[idx++] = bufLayout.getSize();
}
boolean hasVariableWidthColumns = false;
BaseVariableWidthVector[] resizableVectors = new BaseVariableWidthVector[outColumns.size()];
long[] outAddrs = new long[3 * outColumns.size()];
long[] outSizes = new long[3 * outColumns.size()];
idx = 0;
int outColumnIdx = 0;
for (ValueVector valueVector : outColumns) {
boolean isFixedWith = valueVector instanceof FixedWidthVector;
boolean isVarWidth = valueVector instanceof VariableWidthVector;
if (!isFixedWith && !isVarWidth) {
throw new UnsupportedTypeException(
"Unsupported value vector type " + valueVector.getField().getFieldType());
}
outAddrs[idx] = valueVector.getValidityBuffer().memoryAddress();
outSizes[idx++] = valueVector.getValidityBuffer().capacity();
if (isVarWidth) {
outAddrs[idx] = valueVector.getOffsetBuffer().memoryAddress();
outSizes[idx++] = valueVector.getOffsetBuffer().capacity();
hasVariableWidthColumns = true;
// save vector to allow for resizing.
resizableVectors[outColumnIdx] = (BaseVariableWidthVector) valueVector;
}
outAddrs[idx] = valueVector.getDataBuffer().memoryAddress();
outSizes[idx++] = valueVector.getDataBuffer().capacity();
valueVector.setValueCount(selectionVectorRecordCount);
outColumnIdx++;
}
wrapper.evaluateProjector(
hasVariableWidthColumns ? new VectorExpander(resizableVectors) : null,
this.moduleId,
numRows,
bufAddrs,
bufSizes,
selectionVectorType,
selectionVectorRecordCount,
selectionVectorAddr,
selectionVectorSize,
outAddrs,
outSizes);
}