44 TopologyNodeDataStats ,
55 TopologyNodeDataStatsSection ,
66 ExplainPlanNodeData ,
7+ TopologyNodeDataStatsItem ,
78} from '@yandex-cloud/paranoid' ;
89
910interface PlanOperator {
@@ -25,6 +26,8 @@ export interface RootPlan {
2526 Plan : Plan ;
2627}
2728
29+ const CONNECTION_NODE_META_FIELDS = new Set ( [ 'PlanNodeId' , 'PlanNodeType' , 'Node Type' , 'Plans' ] ) ;
30+
2831function prepareStats ( plan : Plan ) {
2932 const stats : TopologyNodeDataStats [ ] = [ ] ;
3033
@@ -52,21 +55,52 @@ function prepareStats(plan: Plan) {
5255 } ) ;
5356 }
5457
58+ if ( plan . PlanNodeType === 'Connection' ) {
59+ const attrStats : TopologyNodeDataStatsItem [ ] = [ ] ;
60+
61+ for ( const [ key , value ] of Object . entries ( plan ) ) {
62+ if ( CONNECTION_NODE_META_FIELDS . has ( key ) ) {
63+ continue ;
64+ }
65+
66+ attrStats . push ( { name : key , value : String ( value ) } ) ;
67+ }
68+
69+ if ( attrStats . length > 0 ) {
70+ stats . push ( {
71+ group : 'Attributes' ,
72+ stats : attrStats ,
73+ } ) ;
74+ }
75+ }
76+
5577 return stats ;
5678}
5779
80+ function getNodeType ( plan : Plan ) {
81+ switch ( plan . PlanNodeType ) {
82+ case 'Connection' :
83+ return 'connection' ;
84+ case 'ResultSet' :
85+ return 'result' ;
86+ case 'Query' :
87+ return 'query' ;
88+ default :
89+ return 'stage' ;
90+ }
91+ }
92+
5893export function preparePlan ( plan : Plan ) {
5994 const nodes : GraphNode [ ] = [ ] ;
6095 const links : Link [ ] = [ ] ;
6196
62- function parsePlans ( plans : Plan [ ] = [ ] , from : string , curDepth : number ) {
63- const depth = curDepth + 1 ;
97+ function parsePlans ( plans : Plan [ ] = [ ] , from : string ) {
6498 plans . forEach ( ( p ) => {
6599 const node : GraphNode < ExplainPlanNodeData > = {
66100 name : String ( p . PlanNodeId ) ,
67101 data : {
68102 id : p . PlanNodeId ,
69- type : p . PlanNodeType === 'Connection' ? 'connection' : 'stage' ,
103+ type : getNodeType ( p ) ,
70104 name : p [ 'Node Type' ] ,
71105 operators : p . Operators ?. map ( ( o ) => o . Name ) ,
72106 stats : prepareStats ( p ) ,
@@ -75,7 +109,7 @@ export function preparePlan(plan: Plan) {
75109 } ;
76110 nodes . push ( node ) ;
77111 links . push ( { from, to : node . name } ) ;
78- parsePlans ( p . Plans , node . name , depth ) ;
112+ parsePlans ( p . Plans , node . name ) ;
79113 } ) ;
80114 }
81115
@@ -84,12 +118,13 @@ export function preparePlan(plan: Plan) {
84118 name : String ( rootPlan . PlanNodeId ) ,
85119 data : {
86120 id : rootPlan . PlanNodeId ,
87- type : 'stage' ,
121+ type : getNodeType ( rootPlan ) ,
88122 name : rootPlan [ 'Node Type' ] ,
89123 } ,
90124 } ;
91125 nodes . push ( rootNode ) ;
92- parsePlans ( rootPlan . Plans , rootNode . name , 0 ) ;
126+ parsePlans ( rootPlan . Plans , rootNode . name ) ;
127+
93128 return {
94129 nodes,
95130 links,
0 commit comments