Skip to content

Commit 06d26de

Browse files
committed
fix(QueryExplain): apply all node types
1 parent de7adeb commit 06d26de

File tree

1 file changed

+41
-6
lines changed

1 file changed

+41
-6
lines changed

src/utils/prepareQueryExplain.ts

+41-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
TopologyNodeDataStats,
55
TopologyNodeDataStatsSection,
66
ExplainPlanNodeData,
7+
TopologyNodeDataStatsItem,
78
} from '@yandex-cloud/paranoid';
89

910
interface 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+
2831
function 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+
5893
export 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

Comments
 (0)