Skip to content

Commit

Permalink
Don't Skip Serializing Empty Metadata (#3082) (#3126)
Browse files Browse the repository at this point in the history
* remove skip_serializing_if to please postcard

* add serde postcard roundtrip tests

* fix formatting issues

* use bincode for serialization tests

Co-authored-by: askoa <askoa@local>
  • Loading branch information
askoa and askoa committed Nov 21, 2022
1 parent 870f0fa commit 528a072
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 12 deletions.
1 change: 1 addition & 0 deletions arrow-schema/Cargo.toml
Expand Up @@ -45,3 +45,4 @@ default = []

[dev-dependencies]
serde_json = "1.0"
bincode = { version = "1.3.3", default-features = false }
8 changes: 4 additions & 4 deletions arrow-schema/src/datatype.rs
Expand Up @@ -415,11 +415,11 @@ mod tests {
assert_eq!(
"{\"Struct\":[\
{\"name\":\"first_name\",\"data_type\":\"Utf8\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false,\"metadata\":{\"k\":\"v\"}},\
{\"name\":\"last_name\",\"data_type\":\"Utf8\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false},\
{\"name\":\"last_name\",\"data_type\":\"Utf8\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false,\"metadata\":{}},\
{\"name\":\"address\",\"data_type\":{\"Struct\":\
[{\"name\":\"street\",\"data_type\":\"Utf8\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false},\
{\"name\":\"zip\",\"data_type\":\"UInt16\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false}\
]},\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false}]}",
[{\"name\":\"street\",\"data_type\":\"Utf8\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false,\"metadata\":{}},\
{\"name\":\"zip\",\"data_type\":\"UInt16\",\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false,\"metadata\":{}}\
]},\"nullable\":false,\"dict_id\":0,\"dict_is_ordered\":false,\"metadata\":{}}]}",
serialized
);

Expand Down
37 changes: 33 additions & 4 deletions arrow-schema/src/field.rs
Expand Up @@ -35,10 +35,6 @@ pub struct Field {
dict_id: i64,
dict_is_ordered: bool,
/// A map of key-value pairs containing additional custom meta data.
#[cfg_attr(
feature = "serde",
serde(skip_serializing_if = "HashMap::is_empty", default)
)]
metadata: HashMap<String, String>,
}

Expand Down Expand Up @@ -654,4 +650,37 @@ mod test {
assert!(!field1.contains(&field2));
assert!(!field2.contains(&field1));
}

#[cfg(feature = "serde")]
fn assert_binary_serde_round_trip(field: Field) {
let serialized = bincode::serialize(&field).unwrap();
let deserialized: Field = bincode::deserialize(&serialized).unwrap();
assert_eq!(field, deserialized)
}

#[cfg(feature = "serde")]
#[test]
fn test_field_without_metadata_serde() {
let field = Field::new("name", DataType::Boolean, true);
assert_binary_serde_round_trip(field)
}

#[cfg(feature = "serde")]
#[test]
fn test_field_with_empty_metadata_serde() {
let field =
Field::new("name", DataType::Boolean, false).with_metadata(HashMap::new());

assert_binary_serde_round_trip(field)
}

#[cfg(feature = "serde")]
#[test]
fn test_field_with_nonempty_metadata_serde() {
let mut metadata = HashMap::new();
metadata.insert("hi".to_owned(), "".to_owned());
let field = Field::new("name", DataType::Boolean, false).with_metadata(metadata);

assert_binary_serde_round_trip(field)
}
}
4 changes: 0 additions & 4 deletions arrow-schema/src/schema.rs
Expand Up @@ -34,10 +34,6 @@ pub type SchemaRef = std::sync::Arc<Schema>;
pub struct Schema {
pub fields: Vec<Field>,
/// A map of key-value pairs containing additional meta data.
#[cfg_attr(
feature = "serde",
serde(skip_serializing_if = "HashMap::is_empty", default)
)]
pub metadata: HashMap<String, String>,
}

Expand Down

0 comments on commit 528a072

Please sign in to comment.