in table/arrow_utils.go [293:361]
func (c convertToIceberg) Primitive(dt arrow.DataType) (result iceberg.NestedField) {
switch dt := dt.(type) {
case *arrow.DictionaryType:
if _, ok := dt.ValueType.(arrow.NestedType); ok {
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
return c.Primitive(dt.ValueType)
case *arrow.RunEndEncodedType:
if _, ok := dt.Encoded().(arrow.NestedType); ok {
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
return c.Primitive(dt.Encoded())
case *arrow.BooleanType:
result.Type = iceberg.PrimitiveTypes.Bool
case *arrow.Uint8Type, *arrow.Uint16Type, *arrow.Uint32Type,
*arrow.Int8Type, *arrow.Int16Type, *arrow.Int32Type:
result.Type = iceberg.PrimitiveTypes.Int32
case *arrow.Uint64Type, *arrow.Int64Type:
result.Type = iceberg.PrimitiveTypes.Int64
case *arrow.Float16Type, *arrow.Float32Type:
result.Type = iceberg.PrimitiveTypes.Float32
case *arrow.Float64Type:
result.Type = iceberg.PrimitiveTypes.Float64
case *arrow.Decimal32Type, *arrow.Decimal64Type, *arrow.Decimal128Type:
dec := dt.(arrow.DecimalType)
result.Type = iceberg.DecimalTypeOf(int(dec.GetPrecision()), int(dec.GetScale()))
case *arrow.StringType, *arrow.LargeStringType:
result.Type = iceberg.PrimitiveTypes.String
case *arrow.BinaryType, *arrow.LargeBinaryType:
result.Type = iceberg.PrimitiveTypes.Binary
case *arrow.Date32Type:
result.Type = iceberg.PrimitiveTypes.Date
case *arrow.Time64Type:
if dt.Unit == arrow.Microsecond {
result.Type = iceberg.PrimitiveTypes.Time
} else {
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
case *arrow.TimestampType:
if dt.Unit == arrow.Nanosecond {
if !c.downcastTimestamp {
panic(fmt.Errorf("%w: 'ns' timestamp precision not supported", iceberg.ErrType))
}
// TODO: log something
}
if slices.Contains(utcAliases, dt.TimeZone) {
result.Type = iceberg.PrimitiveTypes.TimestampTz
} else if dt.TimeZone == "" {
result.Type = iceberg.PrimitiveTypes.Timestamp
} else {
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
case *arrow.FixedSizeBinaryType:
result.Type = iceberg.FixedTypeOf(dt.ByteWidth)
case arrow.ExtensionType:
if dt.ExtensionName() == "arrow.uuid" {
result.Type = iceberg.PrimitiveTypes.UUID
} else {
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
default:
panic(fmt.Errorf("%w: unsupported arrow type for conversion - %s", iceberg.ErrInvalidSchema, dt))
}
return
}