Search in sources :

Example 1 with AbstractRepeatedMapVector

use of org.apache.drill.exec.vector.complex.AbstractRepeatedMapVector in project drill by apache.

the class FlattenRecordBatch method getFlattenFieldTransferPair.

/**
 * The data layout is the same for the actual data within a repeated field, as
 * it is in a scalar vector for the same sql type. For example, a repeated int
 * vector has a vector of offsets into a regular int vector to represent the
 * lists. As the data layout for the actual values in the same in the repeated
 * vector as in the scalar vector of the same type, we can avoid making
 * individual copies for the column being flattened, and just use vector
 * copies between the inner vector of the repeated field to the resulting
 * scalar vector from the flatten operation. This is completed after we
 * determine how many records will fit (as we will hit either a batch end, or
 * the end of one of the other vectors while we are copying the data of the
 * other vectors alongside each new flattened value coming out of the repeated
 * field.)
 */
private TransferPair getFlattenFieldTransferPair(FieldReference reference) {
    TypedFieldId fieldId = incoming.getValueVectorId(popConfig.getColumn());
    Class<?> vectorClass = incoming.getSchema().getColumn(fieldId.getFieldIds()[0]).getValueClass();
    ValueVector flattenField = incoming.getValueAccessorById(vectorClass, fieldId.getFieldIds()).getValueVector();
    TransferPair tp = null;
    if (flattenField instanceof AbstractRepeatedMapVector) {
        tp = ((AbstractRepeatedMapVector) flattenField).getTransferPairToSingleMap(reference.getAsNamePart().getName(), oContext.getAllocator());
    } else if (!(flattenField instanceof RepeatedValueVector)) {
        if (incoming.getRecordCount() != 0) {
            throw UserException.unsupportedError().message("Flatten does not support inputs of non-list values.").build(logger);
        }
        logger.error("Cannot cast {} to RepeatedValueVector", flattenField);
        // when incoming recordCount is 0, don't throw exception since the type being seen here is not solid
        ValueVector vv = new RepeatedMapVector(flattenField.getField(), oContext.getAllocator(), null);
        tp = RepeatedValueVector.class.cast(vv).getTransferPair(reference.getAsNamePart().getName(), oContext.getAllocator());
    } else {
        ValueVector vvIn = RepeatedValueVector.class.cast(flattenField).getDataVector();
        // vvIn may be null because of fast schema return for repeated list vectors
        if (vvIn != null) {
            tp = vvIn.getTransferPair(reference.getAsNamePart().getName(), oContext.getAllocator());
        }
    }
    return tp;
}
Also used : RepeatedValueVector(org.apache.drill.exec.vector.complex.RepeatedValueVector) ValueVector(org.apache.drill.exec.vector.ValueVector) TransferPair(org.apache.drill.exec.record.TransferPair) RepeatedValueVector(org.apache.drill.exec.vector.complex.RepeatedValueVector) RepeatedMapVector(org.apache.drill.exec.vector.complex.RepeatedMapVector) AbstractRepeatedMapVector(org.apache.drill.exec.vector.complex.AbstractRepeatedMapVector) TypedFieldId(org.apache.drill.exec.record.TypedFieldId) AbstractRepeatedMapVector(org.apache.drill.exec.vector.complex.AbstractRepeatedMapVector)

Aggregations

TransferPair (org.apache.drill.exec.record.TransferPair)1 TypedFieldId (org.apache.drill.exec.record.TypedFieldId)1 ValueVector (org.apache.drill.exec.vector.ValueVector)1 AbstractRepeatedMapVector (org.apache.drill.exec.vector.complex.AbstractRepeatedMapVector)1 RepeatedMapVector (org.apache.drill.exec.vector.complex.RepeatedMapVector)1 RepeatedValueVector (org.apache.drill.exec.vector.complex.RepeatedValueVector)1