in arrow-ipc/src/convert.rs [971:1187]
fn convert_schema_round_trip() {
let md: HashMap<String, String> = [("Key".to_string(), "value".to_string())]
.iter()
.cloned()
.collect();
let field_md: HashMap<String, String> = [("k".to_string(), "v".to_string())]
.iter()
.cloned()
.collect();
let schema = Schema::new_with_metadata(
vec![
Field::new("uint8", DataType::UInt8, false).with_metadata(field_md),
Field::new("uint16", DataType::UInt16, true),
Field::new("uint32", DataType::UInt32, false),
Field::new("uint64", DataType::UInt64, true),
Field::new("int8", DataType::Int8, true),
Field::new("int16", DataType::Int16, false),
Field::new("int32", DataType::Int32, true),
Field::new("int64", DataType::Int64, false),
Field::new("float16", DataType::Float16, true),
Field::new("float32", DataType::Float32, false),
Field::new("float64", DataType::Float64, true),
Field::new("null", DataType::Null, false),
Field::new("bool", DataType::Boolean, false),
Field::new("date32", DataType::Date32, false),
Field::new("date64", DataType::Date64, true),
Field::new("time32[s]", DataType::Time32(TimeUnit::Second), true),
Field::new("time32[ms]", DataType::Time32(TimeUnit::Millisecond), false),
Field::new("time64[us]", DataType::Time64(TimeUnit::Microsecond), false),
Field::new("time64[ns]", DataType::Time64(TimeUnit::Nanosecond), true),
Field::new(
"timestamp[s]",
DataType::Timestamp(TimeUnit::Second, None),
false,
),
Field::new(
"timestamp[ms]",
DataType::Timestamp(TimeUnit::Millisecond, None),
true,
),
Field::new(
"timestamp[us]",
DataType::Timestamp(TimeUnit::Microsecond, Some("Africa/Johannesburg".into())),
false,
),
Field::new(
"timestamp[ns]",
DataType::Timestamp(TimeUnit::Nanosecond, None),
true,
),
Field::new(
"interval[ym]",
DataType::Interval(IntervalUnit::YearMonth),
true,
),
Field::new(
"interval[dt]",
DataType::Interval(IntervalUnit::DayTime),
true,
),
Field::new(
"interval[mdn]",
DataType::Interval(IntervalUnit::MonthDayNano),
true,
),
Field::new("utf8", DataType::Utf8, false),
Field::new("utf8_view", DataType::Utf8View, false),
Field::new("binary", DataType::Binary, false),
Field::new("binary_view", DataType::BinaryView, false),
Field::new_list(
"list[u8]",
Field::new_list_field(DataType::UInt8, false),
true,
),
Field::new_fixed_size_list(
"fixed_size_list[u8]",
Field::new_list_field(DataType::UInt8, false),
2,
true,
),
Field::new_list(
"list[struct<float32, int32, bool>]",
Field::new_struct(
"struct",
vec![
Field::new("float32", UInt8, false),
Field::new("int32", Int32, true),
Field::new("bool", Boolean, true),
],
true,
),
false,
),
Field::new_struct(
"struct<dictionary<int32, utf8>>",
vec![Field::new(
"dictionary<int32, utf8>",
Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
false,
)],
false,
),
Field::new_struct(
"struct<int64, list[struct<date32, list[struct<>]>]>",
vec![
Field::new("int64", DataType::Int64, true),
Field::new_list(
"list[struct<date32, list[struct<>]>]",
Field::new_struct(
"struct",
vec![
Field::new("date32", DataType::Date32, true),
Field::new_list(
"list[struct<>]",
Field::new(
"struct",
DataType::Struct(Fields::empty()),
false,
),
false,
),
],
false,
),
false,
),
],
false,
),
Field::new_union(
"union<int64, list[union<date32, list[union<>]>]>",
vec![0, 1],
vec![
Field::new("int64", DataType::Int64, true),
Field::new_list(
"list[union<date32, list[union<>]>]",
Field::new_union(
"union<date32, list[union<>]>",
vec![0, 1],
vec![
Field::new("date32", DataType::Date32, true),
Field::new_list(
"list[union<>]",
Field::new(
"union",
DataType::Union(
UnionFields::empty(),
UnionMode::Sparse,
),
false,
),
false,
),
],
UnionMode::Dense,
),
false,
),
],
UnionMode::Sparse,
),
Field::new("struct<>", DataType::Struct(Fields::empty()), true),
Field::new(
"union<>",
DataType::Union(UnionFields::empty(), UnionMode::Dense),
true,
),
Field::new(
"union<>",
DataType::Union(UnionFields::empty(), UnionMode::Sparse),
true,
),
Field::new(
"union<int32, utf8>",
DataType::Union(
UnionFields::new(
vec![2, 3], // non-default type ids
vec![
Field::new("int32", DataType::Int32, true),
Field::new("utf8", DataType::Utf8, true),
],
),
UnionMode::Dense,
),
true,
),
#[allow(deprecated)]
Field::new_dict(
"dictionary<int32, utf8>",
DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)),
true,
123,
true,
),
#[allow(deprecated)]
Field::new_dict(
"dictionary<uint8, uint32>",
DataType::Dictionary(Box::new(DataType::UInt8), Box::new(DataType::UInt32)),
true,
123,
true,
),
Field::new("decimal<usize, usize>", DataType::Decimal128(10, 6), false),
],
md,
);
let mut dictionary_tracker = DictionaryTracker::new(true);
let fb = IpcSchemaEncoder::new()
.with_dictionary_tracker(&mut dictionary_tracker)
.schema_to_fb(&schema);
// read back fields
let ipc = crate::root_as_schema(fb.finished_data()).unwrap();
let schema2 = fb_to_schema(ipc);
assert_eq!(schema, schema2);
}