You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
5.5 KiB
168 lines
5.5 KiB
// =================================================== |
|
// =============== PARSING =========================== |
|
// =================================================== |
|
// Input |
|
// { links : [ {source: sourceName, dest : destName} * ] } |
|
// Output: |
|
let objcdv = { |
|
version: "0.0.1", |
|
_createGraph: function () { |
|
return { |
|
nodes: [], |
|
links: [], |
|
nodesSet: {}, |
|
node_index: 0, |
|
|
|
addLink: function (link) { |
|
|
|
var source_node = this.getNode(link.source); |
|
source_node.source++; |
|
|
|
var dest_node = this.getNode(link.dest); |
|
dest_node.dest++; |
|
|
|
this.links.push({ |
|
// d3 js properties |
|
source: source_node.idx, |
|
target: dest_node.idx, |
|
|
|
// Additional link information |
|
sourceNode: source_node, |
|
targetNode: dest_node |
|
}) |
|
}, |
|
|
|
getNode: function (nodeName) { |
|
var node = this.nodesSet[nodeName]; |
|
if (node == null) { |
|
var idx = this.node_index; |
|
this.nodesSet[nodeName] = node = {idx: idx, name: nodeName, source: 1, dest: 0}; |
|
this.node_index++; |
|
} |
|
return node |
|
}, |
|
|
|
updateNodes: function (f) { |
|
_.values(this.nodesSet).forEach(f) |
|
}, |
|
|
|
d3jsGraph: function () { |
|
// Sorting up nodes, since, in some cases they aren't returned in correct number |
|
var nodes = _.values(this.nodesSet).slice(0).sort((a, b) => a.idx - b.idx); |
|
return {nodes: nodes, links: this.links}; |
|
}, |
|
|
|
nodesStartingFromNode: function (node, {max_level = 100, use_backward_search = false, use_forward_search = true } = {} ) { |
|
// Figure out the neighboring node id's with brute strength because the graph is small |
|
var neighbours = {}; |
|
neighbours[node.index] = node; |
|
|
|
var nodesToCheck = [node.index]; |
|
let current_level = 0; |
|
while (Object.keys(nodesToCheck).length != 0) { |
|
var forwardNeighbours = []; |
|
var backwardNeighbours = []; |
|
|
|
let tmpNeighbours = {}; |
|
if (use_forward_search) { |
|
forwardNeighbours = this.links |
|
.filter((link) => link.source.index in neighbours) |
|
.filter((link) => !(link.target.index in neighbours)) |
|
.map((link) => { |
|
tmpNeighbours[link.target.index] = link.target; |
|
return link.target.index; |
|
}); |
|
} |
|
if (use_backward_search) { |
|
backwardNeighbours = this.links |
|
.filter((link) => link.target.index in neighbours) |
|
.filter((link) => !(link.source.index in neighbours)) |
|
.map((link) => { |
|
tmpNeighbours[link.source.index] = link.source; |
|
return link.source.index; |
|
}); |
|
} |
|
|
|
_.extend(neighbours, tmpNeighbours); |
|
|
|
|
|
nodesToCheck = forwardNeighbours.concat(backwardNeighbours); |
|
console.log("Nodes to check" + nodesToCheck); |
|
|
|
// Skip if we reached max level |
|
current_level++; |
|
if (current_level == max_level) { |
|
console.log("Reached max at level" + current_level); |
|
break; |
|
} |
|
} |
|
return _.values(neighbours); |
|
|
|
} |
|
|
|
}; |
|
|
|
}, |
|
_createPrefixes: function () { |
|
return { |
|
_prefixesDistr: {}, |
|
|
|
_sortedPrefixes: null, |
|
|
|
addName: function (name) { |
|
this._sortedPrefixes = null; |
|
|
|
var prefix = name.substring(0, 2); |
|
if (!(prefix in this._prefixesDistr)) { |
|
this._prefixesDistr[prefix] = 1; |
|
} else { |
|
this._prefixesDistr[prefix]++; |
|
} |
|
}, |
|
|
|
prefixIndexForName: function (name) { |
|
var sortedPrefixes = this._getSortedPrefixes(); |
|
var prefix = name.substring(0, 2); |
|
return _.indexOf(sortedPrefixes, prefix) |
|
}, |
|
|
|
_getSortedPrefixes: function () { |
|
if (this._sortedPrefixes == null) { |
|
this._sortedPrefixes = _.map(this._prefixesDistr, (v, k) => ({"key": k, "value": v})) |
|
.sort((a, b) => b.value - a.value) |
|
.map(o => o.key) |
|
} |
|
return this._sortedPrefixes |
|
} |
|
}; |
|
}, |
|
|
|
|
|
parse_dependencies_graph: function (dependencies) { |
|
|
|
var graph = this._createGraph(); |
|
var prefixes = this._createPrefixes(); |
|
|
|
dependencies.links.forEach((link) => { |
|
graph.addLink(link); |
|
|
|
prefixes.addName(link.source); |
|
prefixes.addName(link.dest); |
|
|
|
}); |
|
|
|
graph.updateNodes((node) => { |
|
node.weight = node.source; |
|
node.group = prefixes.prefixIndexForName(node.name) + 1 |
|
}); |
|
|
|
return graph |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|