private synchronized void evaluate()

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