public static TypeLayout getTypeLayout()

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