74 lines
1.9 KiB
JavaScript
74 lines
1.9 KiB
JavaScript
import { union } from "lodash";
|
|
|
|
export function assignDependencyGroups(graph) {
|
|
console.log('assigning dep group ids');
|
|
graph.forEachLink(function (link) {
|
|
console.dir(link);
|
|
});
|
|
// Iterate through all the nodes
|
|
graph.forEachNode(node => {
|
|
if (node._depGroupVisited) {
|
|
return;
|
|
}
|
|
|
|
// DFS all the connected nodes to this node, mark visited, put in a group,
|
|
// store the lowest ordered id
|
|
const group = [];
|
|
const stack = [node];
|
|
let top, lowestOrderId, lowestOrder;
|
|
while (stack.length) {
|
|
top = stack.pop();
|
|
if (top._depGroupVisited) continue;
|
|
if (top.data?._id && (
|
|
lowestOrderId === undefined ||
|
|
top.data?.order < lowestOrder
|
|
)) {
|
|
lowestOrderId = top.data._id;
|
|
lowestOrder = top.data.order;
|
|
}
|
|
group.push(top)
|
|
top._depGroupVisited = true;
|
|
graph.forEachLinkedNode(top.id, linkedNode => stack.push(linkedNode));
|
|
}
|
|
// Assign group id
|
|
group.forEach(node => {
|
|
if (!node.data?._id) return;
|
|
if (group.length > 1) {
|
|
node.data.depGroupId = lowestOrderId;
|
|
} else {
|
|
delete node.data.depGroupId;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
export default function assignDependencyGroups2(graph) {
|
|
const groups = new Set();
|
|
graph.forEachLink(function (link) {
|
|
const from = graph.getNode(link.fromId);
|
|
const to = graph.getNode(link.toId);
|
|
let depGroup;
|
|
if (from._depGroup) {
|
|
depGroup = from._depGroup;
|
|
groups.delete(to._depGroup);
|
|
} else if (to._depGroup) {
|
|
depGroup = to._depGroup;
|
|
} else {
|
|
depGroup = {};
|
|
groups.add(depGroup);
|
|
}
|
|
depGroup.nodes = union(from._depGroup?.nodes, to._depGroup?.nodes, [from, to])
|
|
from._depGroup = depGroup;
|
|
to._depGroup = depGroup;
|
|
});
|
|
groups.forEach(g => {
|
|
if (!g.nodes.length) return;
|
|
const rootId = g.nodes[0].id;
|
|
g.nodes.forEach(n => {
|
|
if (!n.data?._id) return;
|
|
n.data.depGroupId = rootId;
|
|
});
|
|
});
|
|
}
|