in vector/src/main/java/org/apache/arrow/vector/TypeLayout.java [58:291]
public static TypeLayout getTypeLayout(final ArrowType arrowType) {
TypeLayout layout =
arrowType.accept(
new ArrowTypeVisitor<TypeLayout>() {
@Override
public TypeLayout visit(Int type) {
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(type.getBitWidth()));
}
@Override
public TypeLayout visit(Union type) {
List<BufferLayout> vectors;
switch (type.getMode()) {
case Dense:
vectors =
asList(
BufferLayout.typeBuffer(),
BufferLayout.offsetBuffer() // offset to find the vector
);
break;
case Sparse:
vectors =
asList(
BufferLayout.typeBuffer() // type of the value at the index or 0 if null
);
break;
default:
throw new UnsupportedOperationException(
"Unsupported Union Mode: " + type.getMode());
}
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(Struct type) {
List<BufferLayout> vectors = asList(BufferLayout.validityVector());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(Timestamp type) {
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(64));
}
@Override
public TypeLayout visit(ArrowType.List type) {
List<BufferLayout> vectors =
asList(BufferLayout.validityVector(), BufferLayout.offsetBuffer());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(ArrowType.ListView type) {
List<BufferLayout> vectors =
asList(
BufferLayout.validityVector(),
BufferLayout.offsetBuffer(),
BufferLayout.sizeBuffer());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(ArrowType.LargeListView type) {
List<BufferLayout> vectors =
asList(
BufferLayout.validityVector(),
BufferLayout.largeOffsetBuffer(),
BufferLayout.largeSizeBuffer());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(ArrowType.LargeList type) {
List<BufferLayout> vectors =
asList(BufferLayout.validityVector(), BufferLayout.largeOffsetBuffer());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(FixedSizeList type) {
List<BufferLayout> vectors = asList(BufferLayout.validityVector());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(Map type) {
List<BufferLayout> vectors =
asList(BufferLayout.validityVector(), BufferLayout.offsetBuffer());
return new TypeLayout(vectors);
}
@Override
public TypeLayout visit(FloatingPoint type) {
int bitWidth;
switch (type.getPrecision()) {
case HALF:
bitWidth = 16;
break;
case SINGLE:
bitWidth = 32;
break;
case DOUBLE:
bitWidth = 64;
break;
default:
throw new UnsupportedOperationException(
"Unsupported Precision: " + type.getPrecision());
}
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(bitWidth));
}
@Override
public TypeLayout visit(Decimal type) {
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(type.getBitWidth()));
}
@Override
public TypeLayout visit(FixedSizeBinary type) {
return newFixedWidthTypeLayout(
new BufferLayout(BufferType.DATA, type.getByteWidth() * 8));
}
@Override
public TypeLayout visit(Bool type) {
return newFixedWidthTypeLayout(BufferLayout.booleanVector());
}
@Override
public TypeLayout visit(Binary type) {
return newVariableWidthTypeLayout();
}
@Override
public TypeLayout visit(ArrowType.BinaryView type) {
return newVariableWidthViewTypeLayout();
}
@Override
public TypeLayout visit(Utf8 type) {
return newVariableWidthTypeLayout();
}
@Override
public TypeLayout visit(Utf8View type) {
return newVariableWidthViewTypeLayout();
}
@Override
public TypeLayout visit(LargeUtf8 type) {
return newLargeVariableWidthTypeLayout();
}
@Override
public TypeLayout visit(LargeBinary type) {
return newLargeVariableWidthTypeLayout();
}
private TypeLayout newVariableWidthTypeLayout() {
return newPrimitiveTypeLayout(
BufferLayout.validityVector(),
BufferLayout.offsetBuffer(),
BufferLayout.byteVector());
}
private TypeLayout newVariableWidthViewTypeLayout() {
return new TypeLayout(
false, BufferLayout.validityVector(), BufferLayout.viewVector());
}
private TypeLayout newLargeVariableWidthTypeLayout() {
// NOTE: only considers the non variadic buffers
return newPrimitiveTypeLayout(
BufferLayout.validityVector(),
BufferLayout.largeOffsetBuffer(),
BufferLayout.byteVector());
}
private TypeLayout newPrimitiveTypeLayout(BufferLayout... vectors) {
return new TypeLayout(asList(vectors));
}
public TypeLayout newFixedWidthTypeLayout(BufferLayout dataVector) {
return newPrimitiveTypeLayout(BufferLayout.validityVector(), dataVector);
}
@Override
public TypeLayout visit(Null type) {
return new TypeLayout(Collections.emptyList());
}
@Override
public TypeLayout visit(Date type) {
switch (type.getUnit()) {
case DAY:
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(32));
case MILLISECOND:
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(64));
default:
throw new UnsupportedOperationException("Unknown unit " + type.getUnit());
}
}
@Override
public TypeLayout visit(Time type) {
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(type.getBitWidth()));
}
@Override
public TypeLayout visit(Interval type) {
switch (type.getUnit()) {
case DAY_TIME:
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(64));
case YEAR_MONTH:
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(32));
case MONTH_DAY_NANO:
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(128));
default:
throw new UnsupportedOperationException("Unknown unit " + type.getUnit());
}
}
@Override
public TypeLayout visit(Duration type) {
return newFixedWidthTypeLayout(BufferLayout.dataBuffer(64));
}
@Override
public TypeLayout visit(RunEndEncoded type) {
return new TypeLayout(Collections.<BufferLayout>emptyList());
}
});
return layout;
}