@@ -9,7 +9,9 @@ use arrow_schema::{
9
9
use itertools:: Itertools ;
10
10
11
11
use crate :: error:: Error ;
12
- use crate :: schema:: { ArrayType , DataType , MapType , PrimitiveType , StructField , StructType } ;
12
+ use crate :: schema:: {
13
+ ArrayType , DataType , MapType , MetadataValue , PrimitiveType , StructField , StructType ,
14
+ } ;
13
15
14
16
pub ( crate ) const LIST_ARRAY_ROOT : & str = "element" ;
15
17
pub ( crate ) const MAP_ROOT_DEFAULT : & str = "key_value" ;
@@ -32,7 +34,10 @@ impl TryFrom<&StructField> for ArrowField {
32
34
let metadata = f
33
35
. metadata ( )
34
36
. iter ( )
35
- . map ( |( key, val) | Ok ( ( key. clone ( ) , serde_json:: to_string ( val) ?) ) )
37
+ . map ( |( key, val) | match & val {
38
+ & MetadataValue :: String ( val) => Ok ( ( key. clone ( ) , val. clone ( ) ) ) ,
39
+ _ => Ok ( ( key. clone ( ) , serde_json:: to_string ( val) ?) ) ,
40
+ } )
36
41
. collect :: < Result < _ , serde_json:: Error > > ( )
37
42
. map_err ( |err| ArrowError :: JsonError ( err. to_string ( ) ) ) ?;
38
43
@@ -250,3 +255,30 @@ impl TryFrom<&ArrowDataType> for DataType {
250
255
}
251
256
}
252
257
}
258
+
259
+ #[ cfg( test) ]
260
+ mod tests {
261
+ use crate :: engine:: arrow_conversion:: ArrowField ;
262
+ use crate :: {
263
+ schema:: { DataType , StructField } ,
264
+ DeltaResult ,
265
+ } ;
266
+ use std:: collections:: HashMap ;
267
+
268
+ #[ test]
269
+ fn test_metadata_string_conversion ( ) -> DeltaResult < ( ) > {
270
+ let mut metadata = HashMap :: new ( ) ;
271
+ metadata. insert ( "description" , "hello world" . to_owned ( ) ) ;
272
+ let struct_field =
273
+ StructField :: new ( "name" , DataType :: STRING , false ) . with_metadata ( metadata) ;
274
+
275
+ let arrow_field = ArrowField :: try_from ( & struct_field) ?;
276
+ let new_metadata = arrow_field. metadata ( ) ;
277
+
278
+ assert_eq ! (
279
+ new_metadata. get( "description" ) . unwrap( ) ,
280
+ & "hello world" . to_owned( )
281
+ ) ;
282
+ Ok ( ( ) )
283
+ }
284
+ }
0 commit comments