use std::collections::HashMap;
use arrow_schema::{Field, SchemaRef};
pub(crate) fn compare_schema(a: &SchemaRef, b: &SchemaRef) -> bool {
if a.fields().len() != b.fields().len() {
return false;
}
let b_by_name: HashMap<&str, &Field> = b
.fields()
.iter()
.map(|f| (f.name().as_str(), f.as_ref()))
.collect();
a.fields().iter().all(|fa| {
b_by_name.get(fa.name().as_str()).is_some_and(|fb| {
fa.data_type() == fb.data_type() && fa.is_nullable() == fb.is_nullable()
})
})
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use arrow_schema::{DataType, Field, Schema, SchemaRef};
use super::compare_schema;
fn schema(fields: Vec<Field>) -> SchemaRef {
Arc::new(Schema::new(fields))
}
#[test]
fn identical_schemas_match() {
let a = schema(vec![
Field::new("id", DataType::UInt64, false),
Field::new("title", DataType::LargeUtf8, false),
]);
let b = a.clone();
assert!(compare_schema(&a, &b));
}
#[test]
fn reordered_columns_match() {
let a = schema(vec![
Field::new("id", DataType::UInt64, false),
Field::new("title", DataType::LargeUtf8, false),
]);
let b = schema(vec![
Field::new("title", DataType::LargeUtf8, false),
Field::new("id", DataType::UInt64, false),
]);
assert!(compare_schema(&a, &b));
}
#[test]
fn differing_field_count_mismatches() {
let a = schema(vec![Field::new("id", DataType::UInt64, false)]);
let b = schema(vec![
Field::new("id", DataType::UInt64, false),
Field::new("title", DataType::LargeUtf8, false),
]);
assert!(!compare_schema(&a, &b));
}
#[test]
fn renamed_column_mismatches() {
let a = schema(vec![Field::new("id", DataType::UInt64, false)]);
let b = schema(vec![Field::new("ident", DataType::UInt64, false)]);
assert!(!compare_schema(&a, &b));
}
#[test]
fn differing_type_mismatches() {
let a = schema(vec![Field::new("id", DataType::UInt64, false)]);
let b = schema(vec![Field::new("id", DataType::Int64, false)]);
assert!(!compare_schema(&a, &b));
}
#[test]
fn differing_nullability_mismatches() {
let a = schema(vec![Field::new("id", DataType::UInt64, false)]);
let b = schema(vec![Field::new("id", DataType::UInt64, true)]);
assert!(!compare_schema(&a, &b));
}
}