From a2f223c7d9ca525192550ff8e044a3e1b5dabeb0 Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Tue, 12 Jul 2022 10:36:11 -0700 Subject: [PATCH] Set DICTIONARY_ORDERED flag for FFI_ArrowSchema (#2050) * Set DICTIONARY_ORDERED flag for FFI_ArrowSchema * Fix clippy --- arrow/src/datatypes/ffi.rs | 22 +++++++++++++++++++++- arrow/src/ffi.rs | 4 ++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/arrow/src/datatypes/ffi.rs b/arrow/src/datatypes/ffi.rs index 0857da61263..7ad468b5ed9 100644 --- a/arrow/src/datatypes/ffi.rs +++ b/arrow/src/datatypes/ffi.rs @@ -288,12 +288,16 @@ impl TryFrom<&Field> for FFI_ArrowSchema { type Error = ArrowError; fn try_from(field: &Field) -> Result { - let flags = if field.is_nullable() { + let mut flags = if field.is_nullable() { Flags::NULLABLE } else { Flags::empty() }; + if let Some(true) = field.dict_is_ordered() { + flags |= Flags::DICTIONARY_ORDERED; + } + FFI_ArrowSchema::try_from(field.data_type())? .with_name(field.name())? .with_flags(flags) @@ -435,4 +439,20 @@ mod tests { Ok(()) } + + #[test] + fn test_dictionary_ordered() -> Result<()> { + let schema = Schema::new(vec![Field::new_dict( + "dict", + DataType::Dictionary(Box::new(DataType::Int32), Box::new(DataType::Utf8)), + false, + 0, + true, + )]); + + let arrow_schema = FFI_ArrowSchema::try_from(schema)?; + assert!(arrow_schema.child(0).dictionary_ordered()); + + Ok(()) + } } diff --git a/arrow/src/ffi.rs b/arrow/src/ffi.rs index 1287f3b0a4d..97cbe76c84c 100644 --- a/arrow/src/ffi.rs +++ b/arrow/src/ffi.rs @@ -288,6 +288,10 @@ impl FFI_ArrowSchema { pub fn map_keys_sorted(&self) -> bool { self.flags & 0b00000100 != 0 } + + pub fn dictionary_ordered(&self) -> bool { + self.flags & 0b00000001 != 0 + } } impl Drop for FFI_ArrowSchema {