From 106929416bb5139dadcb7e8158ae771bb572e214 Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Tue, 12 Jul 2022 01:06:46 -0700 Subject: [PATCH] Set DICTIONARY_ORDERED flag for FFI_ArrowSchema --- 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 0857da612633..080ae2099bc8 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 | 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 1287f3b0a4dd..97cbe76c84c0 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 {