1use crate::cast::*;
19
20pub(crate) fn cast_map_values(
22 from: &MapArray,
23 to_data_type: &DataType,
24 cast_options: &CastOptions,
25 to_ordered: bool,
26) -> Result<ArrayRef, ArrowError> {
27 let DataType::Map(entries_field, _) = to_data_type else {
28 return Err(ArrowError::CastError(
29 "Internal Error: to_data_type is not a map type.".to_string(),
30 ));
31 };
32
33 let key_field = key_field(entries_field).ok_or(ArrowError::CastError(
34 "map is missing key field".to_string(),
35 ))?;
36 let value_field = value_field(entries_field).ok_or(ArrowError::CastError(
37 "map is missing value field".to_string(),
38 ))?;
39
40 let key_array = cast_with_options(from.keys(), key_field.data_type(), cast_options)?;
41 let value_array = cast_with_options(from.values(), value_field.data_type(), cast_options)?;
42
43 Ok(Arc::new(MapArray::try_new(
44 entries_field.clone(),
45 from.offsets().clone(),
46 StructArray::try_new(
47 Fields::from(vec![key_field, value_field]),
48 vec![key_array, value_array],
49 from.entries().nulls().cloned(),
50 )?,
51 from.nulls().cloned(),
52 to_ordered,
53 )?))
54}
55
56pub(crate) fn key_field(entries_field: &FieldRef) -> Option<FieldRef> {
58 if let DataType::Struct(fields) = entries_field.data_type() {
59 fields.first().cloned()
60 } else {
61 None
62 }
63}
64
65pub(crate) fn value_field(entries_field: &FieldRef) -> Option<FieldRef> {
67 if let DataType::Struct(fields) = entries_field.data_type() {
68 fields.get(1).cloned()
69 } else {
70 None
71 }
72}