Skip to content

Commit 7a22db7

Browse files
authored
Merge pull request #20959 from apache/fix/sankey-focus-trajectory-performance
fix(sankey): fix browser crash when `emphasis.focus` is `'trajectory'` with large data
2 parents fc6656f + 76b1071 commit 7a22db7

File tree

2 files changed

+6363
-24
lines changed

2 files changed

+6363
-24
lines changed

src/data/Graph.ts

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ class GraphNode {
392392
const connectedEdgesMap = zrUtil.createHashMap<boolean, number>();
393393
const connectedNodesMap = zrUtil.createHashMap<boolean, number>();
394394

395-
for (let i = 0; i < this.edges.length; i++) {
395+
for (let i = 0, len = this.edges.length; i < len; i++) {
396396
const adjacentEdge = this.edges[i];
397397
if (adjacentEdge.dataIndex < 0) {
398398
continue;
@@ -409,9 +409,14 @@ class GraphNode {
409409
nodeIteratorIndex++;
410410
connectedNodesMap.set(sourceNode.dataIndex, true);
411411

412-
for (let j = 0; j < sourceNode.inEdges.length; j++) {
413-
connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true);
414-
sourceNodesQueue.push(sourceNode.inEdges[j].node1);
412+
const sourceNodeInEdges = sourceNode.inEdges;
413+
for (let j = 0, len = sourceNodeInEdges.length, inEdge, inEdgeDataIndex; j < len; j++) {
414+
inEdge = sourceNodeInEdges[j];
415+
inEdgeDataIndex = inEdge.dataIndex;
416+
if (inEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(inEdgeDataIndex)) {
417+
connectedEdgesMap.set(inEdgeDataIndex, true);
418+
sourceNodesQueue.push(inEdge.node1);
419+
}
415420
}
416421
}
417422

@@ -420,9 +425,15 @@ class GraphNode {
420425
const targetNode = targetNodesQueue[nodeIteratorIndex];
421426
nodeIteratorIndex++;
422427
connectedNodesMap.set(targetNode.dataIndex, true);
423-
for (let j = 0; j < targetNode.outEdges.length; j++) {
424-
connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true);
425-
targetNodesQueue.push(targetNode.outEdges[j].node2);
428+
429+
const targetNodeOutEdges = targetNode.outEdges;
430+
for (let j = 0, len = targetNodeOutEdges.length, outEdge, outEdgeDataIndex; j < len; j++) {
431+
outEdge = targetNodeOutEdges[j];
432+
outEdgeDataIndex = outEdge.dataIndex;
433+
if (outEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(outEdgeDataIndex)) {
434+
connectedEdgesMap.set(outEdgeDataIndex, true);
435+
targetNodesQueue.push(outEdge.node2);
436+
}
426437
}
427438
}
428439
}
@@ -491,9 +502,14 @@ class GraphEdge {
491502

492503
connectedNodesMap.set(sourceNode.dataIndex, true);
493504

494-
for (let j = 0; j < sourceNode.inEdges.length; j++) {
495-
connectedEdgesMap.set(sourceNode.inEdges[j].dataIndex, true);
496-
sourceNodes.push(sourceNode.inEdges[j].node1);
505+
const sourceNodeInEdges = sourceNode.inEdges;
506+
for (let j = 0, len = sourceNodeInEdges.length, inEdge, inEdgeDataIndex; j < len; j++) {
507+
inEdge = sourceNode.inEdges[j];
508+
inEdgeDataIndex = inEdge.dataIndex;
509+
if (inEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(inEdgeDataIndex)) {
510+
connectedEdgesMap.set(inEdgeDataIndex, true);
511+
sourceNodes.push(inEdge.node1);
512+
}
497513
}
498514
}
499515

@@ -504,9 +520,14 @@ class GraphEdge {
504520

505521
connectedNodesMap.set(targetNode.dataIndex, true);
506522

507-
for (let j = 0; j < targetNode.outEdges.length; j++) {
508-
connectedEdgesMap.set(targetNode.outEdges[j].dataIndex, true);
509-
targetNodes.push(targetNode.outEdges[j].node2);
523+
const targetNodeOutEdges = targetNode.outEdges;
524+
for (let j = 0, len = targetNodeOutEdges.length, outEdge, outEdgeDataIndex; j < len; j++) {
525+
outEdge = targetNode.outEdges[j];
526+
outEdgeDataIndex = outEdge.dataIndex;
527+
if (outEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(outEdgeDataIndex)) {
528+
connectedEdgesMap.set(outEdgeDataIndex, true);
529+
targetNodes.push(outEdge.node2);
530+
}
510531
}
511532
}
512533

@@ -585,4 +606,4 @@ zrUtil.mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData'));
585606

586607
export default Graph;
587608

588-
export {GraphNode, GraphEdge};
609+
export {GraphNode, GraphEdge};

0 commit comments

Comments
 (0)