private static TypeDescription convert()

in orc/src/main/java/org/apache/iceberg/orc/ORCSchemaUtil.java [137:252]


  private static TypeDescription convert(Integer fieldId, Type type, boolean isRequired) {
    final TypeDescription orcType;

    switch (type.typeId()) {
      case UNKNOWN:
        return null;
      case BOOLEAN:
        orcType = TypeDescription.createBoolean();
        break;
      case INTEGER:
        orcType = TypeDescription.createInt();
        break;
      case TIME:
        orcType = TypeDescription.createLong();
        orcType.setAttribute(ICEBERG_LONG_TYPE_ATTRIBUTE, LongType.TIME.toString());
        break;
      case LONG:
        orcType = TypeDescription.createLong();
        orcType.setAttribute(ICEBERG_LONG_TYPE_ATTRIBUTE, LongType.LONG.toString());
        break;
      case FLOAT:
        orcType = TypeDescription.createFloat();
        break;
      case DOUBLE:
        orcType = TypeDescription.createDouble();
        break;
      case DATE:
        orcType = TypeDescription.createDate();
        break;
      case TIMESTAMP:
        Types.TimestampType tsType = (Types.TimestampType) type;
        if (tsType.shouldAdjustToUTC()) {
          orcType = TypeDescription.createTimestampInstant();
        } else {
          orcType = TypeDescription.createTimestamp();
        }

        orcType.setAttribute(TIMESTAMP_UNIT, MICROS);
        break;
      case TIMESTAMP_NANO:
        Types.TimestampNanoType tsNanoType = (Types.TimestampNanoType) type;
        if (tsNanoType.shouldAdjustToUTC()) {
          orcType = TypeDescription.createTimestampInstant();
        } else {
          orcType = TypeDescription.createTimestamp();
        }

        orcType.setAttribute(TIMESTAMP_UNIT, NANOS);
        break;
      case STRING:
        orcType = TypeDescription.createString();
        break;
      case UUID:
        orcType = TypeDescription.createBinary();
        orcType.setAttribute(ICEBERG_BINARY_TYPE_ATTRIBUTE, BinaryType.UUID.toString());
        break;
      case FIXED:
        orcType = TypeDescription.createBinary();
        orcType.setAttribute(ICEBERG_BINARY_TYPE_ATTRIBUTE, BinaryType.FIXED.toString());
        orcType.setAttribute(
            ICEBERG_FIELD_LENGTH, Integer.toString(((Types.FixedType) type).length()));
        break;
      case BINARY:
        orcType = TypeDescription.createBinary();
        orcType.setAttribute(ICEBERG_BINARY_TYPE_ATTRIBUTE, BinaryType.BINARY.toString());
        break;
      case DECIMAL:
        {
          Types.DecimalType decimal = (Types.DecimalType) type;
          orcType =
              TypeDescription.createDecimal()
                  .withScale(decimal.scale())
                  .withPrecision(decimal.precision());
          break;
        }
      case VARIANT:
        orcType = TypeDescription.createStruct();
        orcType.addField(VARIANT_METADATA, TypeDescription.createBinary());
        orcType.addField(VARIANT_VALUE, TypeDescription.createBinary());
        orcType.setAttribute(ICEBERG_STRUCT_TYPE_ATTRIBUTE, VARIANT);
        break;
      case STRUCT:
        {
          orcType = TypeDescription.createStruct();
          for (Types.NestedField field : type.asStructType().fields()) {
            TypeDescription childType = convert(field.fieldId(), field.type(), field.isRequired());
            orcType.addField(field.name(), childType);
          }
          break;
        }
      case LIST:
        {
          Types.ListType list = (Types.ListType) type;
          TypeDescription elementType =
              convert(list.elementId(), list.elementType(), list.isElementRequired());
          orcType = TypeDescription.createList(elementType);
          break;
        }
      case MAP:
        {
          Types.MapType map = (Types.MapType) type;
          TypeDescription keyType = convert(map.keyId(), map.keyType(), true);
          TypeDescription valueType =
              convert(map.valueId(), map.valueType(), map.isValueRequired());
          orcType = TypeDescription.createMap(keyType, valueType);
          break;
        }
      default:
        throw new IllegalArgumentException("Unhandled type " + type.typeId());
    }

    // Set Iceberg column attributes for mapping
    orcType.setAttribute(ICEBERG_ID_ATTRIBUTE, String.valueOf(fieldId));
    orcType.setAttribute(ICEBERG_REQUIRED_ATTRIBUTE, String.valueOf(isRequired));
    return orcType;
  }