@@ -283,116 +283,6 @@ pub struct PgJsonVisitor<'a, 'b> {
283283 parent_ids : Vec < u32 > ,
284284}
285285
286- const NODE_TYPE_KEY : & str = "Node Type" ;
287- const PLANS_KEY : & str = "Plans" ;
288- const OUTPUT_KEY : & str = "Output" ;
289-
290- fn ordered_keys ( map : & serde_json:: Map < String , serde_json:: Value > ) -> Vec < & str > {
291- let mut keys = map. keys ( ) . map ( String :: as_str) . collect :: < Vec < _ > > ( ) ;
292- keys. sort_unstable ( ) ;
293-
294- if !map. contains_key ( NODE_TYPE_KEY ) {
295- return keys;
296- }
297-
298- let mut remaining_keys = Vec :: with_capacity ( keys. len ( ) . saturating_sub ( 1 ) ) ;
299- let mut has_plans_key = false ;
300- let mut has_output_key = false ;
301- for key in keys {
302- match key {
303- NODE_TYPE_KEY => { }
304- PLANS_KEY => has_plans_key = true ,
305- OUTPUT_KEY => has_output_key = true ,
306- _ => remaining_keys. push ( key) ,
307- }
308- }
309-
310- let mut ordered_keys = Vec :: with_capacity ( map. len ( ) ) ;
311- ordered_keys. push ( NODE_TYPE_KEY ) ;
312- ordered_keys. extend ( remaining_keys) ;
313- if has_plans_key {
314- ordered_keys. push ( PLANS_KEY ) ;
315- }
316- if has_output_key {
317- ordered_keys. push ( OUTPUT_KEY ) ;
318- }
319- ordered_keys
320- }
321-
322- macro_rules! to_json_string {
323- ( $value: expr) => {
324- serde_json:: to_string( $value) . map_err( |e| DataFusionError :: External ( Box :: new( e) ) )
325- } ;
326- }
327-
328- fn push_indent ( buf : & mut String , indent : usize ) {
329- buf. push_str ( & " " . repeat ( indent * 2 ) ) ;
330- }
331-
332- fn write_delimited_entries (
333- buf : & mut String ,
334- indent : usize ,
335- open : char ,
336- close : char ,
337- len : usize ,
338- mut write_entry : impl FnMut ( usize , & mut String ) -> datafusion_common:: Result < ( ) > ,
339- ) -> datafusion_common:: Result < ( ) > {
340- if len == 0 {
341- buf. push ( open) ;
342- buf. push ( close) ;
343- return Ok ( ( ) ) ;
344- }
345-
346- buf. push ( open) ;
347- buf. push ( '\n' ) ;
348- for idx in 0 ..len {
349- push_indent ( buf, indent + 1 ) ;
350- write_entry ( idx, buf) ?;
351- if idx + 1 != len {
352- buf. push ( ',' ) ;
353- }
354- buf. push ( '\n' ) ;
355- }
356- push_indent ( buf, indent) ;
357- buf. push ( close) ;
358- Ok ( ( ) )
359- }
360-
361- fn write_ordered_json (
362- value : & serde_json:: Value ,
363- buf : & mut String ,
364- indent : usize ,
365- ) -> datafusion_common:: Result < ( ) > {
366- match value {
367- serde_json:: Value :: Null
368- | serde_json:: Value :: Bool ( _)
369- | serde_json:: Value :: Number ( _)
370- | serde_json:: Value :: String ( _) => {
371- buf. push_str ( & to_json_string ! ( value) ?) ;
372- }
373- serde_json:: Value :: Array ( values) => {
374- write_delimited_entries ( buf, indent, '[' , ']' , values. len ( ) , |idx, buf| {
375- write_ordered_json ( & values[ idx] , buf, indent + 1 )
376- } ) ?;
377- }
378- serde_json:: Value :: Object ( map) => {
379- let keys = ordered_keys ( map) ;
380- write_delimited_entries ( buf, indent, '{' , '}' , keys. len ( ) , |idx, buf| {
381- let key = keys[ idx] ;
382- let value = map
383- . get ( key)
384- . ok_or_else ( || internal_datafusion_err ! ( "Missing key in object!" ) ) ?;
385-
386- buf. push_str ( & to_json_string ! ( key) ?) ;
387- buf. push_str ( ": " ) ;
388- write_ordered_json ( value, buf, indent + 1 )
389- } ) ?;
390- }
391- }
392-
393- Ok ( ( ) )
394- }
395-
396286impl < ' a , ' b > PgJsonVisitor < ' a , ' b > {
397287 pub fn new ( f : & ' a mut fmt:: Formatter < ' b > ) -> Self {
398288 Self {
@@ -802,9 +692,12 @@ impl<'n> TreeNodeVisitor<'n> for PgJsonVisitor<'_, '_> {
802692 } else {
803693 // This is the root node
804694 let plan = serde_json:: json!( [ { "Plan" : current_node} ] ) ;
805- let mut plan_str = String :: new ( ) ;
806- write_ordered_json ( & plan, & mut plan_str, 0 ) ?;
807- write ! ( self . f, "{plan_str}" ) ?;
695+ write ! (
696+ self . f,
697+ "{}" ,
698+ serde_json:: to_string_pretty( & plan)
699+ . map_err( |e| DataFusionError :: External ( Box :: new( e) ) ) ?
700+ ) ?;
808701 }
809702
810703 Ok ( TreeNodeRecursion :: Continue )
0 commit comments