4
4
TopologyNodeDataStats ,
5
5
TopologyNodeDataStatsSection ,
6
6
ExplainPlanNodeData ,
7
+ TopologyNodeDataStatsItem ,
7
8
} from '@yandex-cloud/paranoid' ;
8
9
9
10
interface PlanOperator {
@@ -25,6 +26,8 @@ export interface RootPlan {
25
26
Plan : Plan ;
26
27
}
27
28
29
+ const CONNECTION_NODE_META_FIELDS = new Set ( [ 'PlanNodeId' , 'PlanNodeType' , 'Node Type' , 'Plans' ] ) ;
30
+
28
31
function prepareStats ( plan : Plan ) {
29
32
const stats : TopologyNodeDataStats [ ] = [ ] ;
30
33
@@ -52,21 +55,52 @@ function prepareStats(plan: Plan) {
52
55
} ) ;
53
56
}
54
57
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
+
55
77
return stats ;
56
78
}
57
79
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
+
58
93
export function preparePlan ( plan : Plan ) {
59
94
const nodes : GraphNode [ ] = [ ] ;
60
95
const links : Link [ ] = [ ] ;
61
96
62
- function parsePlans ( plans : Plan [ ] = [ ] , from : string , curDepth : number ) {
63
- const depth = curDepth + 1 ;
97
+ function parsePlans ( plans : Plan [ ] = [ ] , from : string ) {
64
98
plans . forEach ( ( p ) => {
65
99
const node : GraphNode < ExplainPlanNodeData > = {
66
100
name : String ( p . PlanNodeId ) ,
67
101
data : {
68
102
id : p . PlanNodeId ,
69
- type : p . PlanNodeType === 'Connection' ? 'connection' : 'stage' ,
103
+ type : getNodeType ( p ) ,
70
104
name : p [ 'Node Type' ] ,
71
105
operators : p . Operators ?. map ( ( o ) => o . Name ) ,
72
106
stats : prepareStats ( p ) ,
@@ -75,7 +109,7 @@ export function preparePlan(plan: Plan) {
75
109
} ;
76
110
nodes . push ( node ) ;
77
111
links . push ( { from, to : node . name } ) ;
78
- parsePlans ( p . Plans , node . name , depth ) ;
112
+ parsePlans ( p . Plans , node . name ) ;
79
113
} ) ;
80
114
}
81
115
@@ -84,12 +118,13 @@ export function preparePlan(plan: Plan) {
84
118
name : String ( rootPlan . PlanNodeId ) ,
85
119
data : {
86
120
id : rootPlan . PlanNodeId ,
87
- type : 'stage' ,
121
+ type : getNodeType ( rootPlan ) ,
88
122
name : rootPlan [ 'Node Type' ] ,
89
123
} ,
90
124
} ;
91
125
nodes . push ( rootNode ) ;
92
- parsePlans ( rootPlan . Plans , rootNode . name , 0 ) ;
126
+ parsePlans ( rootPlan . Plans , rootNode . name ) ;
127
+
93
128
return {
94
129
nodes,
95
130
links,
0 commit comments