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.
190 lines
6.8 KiB
190 lines
6.8 KiB
// =================================================== |
|
// =============== PARSING =========================== |
|
// =================================================== |
|
// Input |
|
// { links : [ {source: sourceName, dest : destName} * ] } |
|
// Output: |
|
"use strict"; |
|
|
|
var objcdv = { |
|
version: "0.0.1", |
|
_createGraph: function _createGraph() { |
|
return { |
|
nodes: [], |
|
links: [], |
|
nodesSet: {}, |
|
node_index: 0, |
|
|
|
addLink: function addLink(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 getNode(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 updateNodes(f) { |
|
_.values(this.nodesSet).forEach(f); |
|
}, |
|
|
|
d3jsGraph: function d3jsGraph() { |
|
// Sorting up nodes, since, in some cases they aren't returned in correct number |
|
var nodes = _.values(this.nodesSet).slice(0).sort(function (a, b) { |
|
return a.idx - b.idx; |
|
}); |
|
return { nodes: nodes, links: this.links }; |
|
}, |
|
|
|
nodesStartingFromNode: function nodesStartingFromNode(node) { |
|
var _this = this; |
|
|
|
var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; |
|
|
|
var _ref$max_level = _ref.max_level; |
|
var max_level = _ref$max_level === undefined ? 100 : _ref$max_level; |
|
var _ref$use_backward_search = _ref.use_backward_search; |
|
var use_backward_search = _ref$use_backward_search === undefined ? false : _ref$use_backward_search; |
|
var _ref$use_forward_search = _ref.use_forward_search; |
|
var use_forward_search = _ref$use_forward_search === undefined ? true : _ref$use_forward_search; |
|
|
|
// 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]; |
|
var current_level = 0; |
|
|
|
var _loop = function () { |
|
forwardNeighbours = []; |
|
backwardNeighbours = []; |
|
|
|
var tmpNeighbours = {}; |
|
if (use_forward_search) { |
|
forwardNeighbours = _this.links.filter(function (link) { |
|
return link.source.index in neighbours; |
|
}).filter(function (link) { |
|
return !(link.target.index in neighbours); |
|
}).map(function (link) { |
|
tmpNeighbours[link.target.index] = link.target; |
|
return link.target.index; |
|
}); |
|
} |
|
if (use_backward_search) { |
|
backwardNeighbours = _this.links.filter(function (link) { |
|
return link.target.index in neighbours; |
|
}).filter(function (link) { |
|
return !(link.source.index in neighbours); |
|
}).map(function (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); |
|
return "break"; |
|
} |
|
}; |
|
|
|
while (Object.keys(nodesToCheck).length != 0) { |
|
var forwardNeighbours; |
|
var backwardNeighbours; |
|
|
|
var _ret = _loop(); |
|
|
|
if (_ret === "break") break; |
|
} |
|
return _.values(neighbours); |
|
} |
|
|
|
}; |
|
}, |
|
_createPrefixes: function _createPrefixes() { |
|
return { |
|
_prefixesDistr: {}, |
|
|
|
_sortedPrefixes: null, |
|
|
|
addName: function addName(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 prefixIndexForName(name) { |
|
var sortedPrefixes = this._getSortedPrefixes(); |
|
var prefix = name.substring(0, 2); |
|
return _.indexOf(sortedPrefixes, prefix); |
|
}, |
|
|
|
_getSortedPrefixes: function _getSortedPrefixes() { |
|
if (this._sortedPrefixes == null) { |
|
this._sortedPrefixes = _.map(this._prefixesDistr, function (v, k) { |
|
return { "key": k, "value": v }; |
|
}).sort(function (a, b) { |
|
return b.value - a.value; |
|
}).map(function (o) { |
|
return o.key; |
|
}); |
|
} |
|
return this._sortedPrefixes; |
|
} |
|
}; |
|
}, |
|
|
|
parse_dependencies_graph: function parse_dependencies_graph(dependencies) { |
|
|
|
var graph = this._createGraph(); |
|
var prefixes = this._createPrefixes(); |
|
|
|
dependencies.links.forEach(function (link) { |
|
graph.addLink(link); |
|
|
|
prefixes.addName(link.source); |
|
prefixes.addName(link.dest); |
|
}); |
|
|
|
graph.updateNodes(function (node) { |
|
node.weight = node.source; |
|
node.group = prefixes.prefixIndexForName(node.name) + 1; |
|
}); |
|
|
|
return graph; |
|
} |
|
|
|
}; |
|
|
|
//# sourceMappingURL=parse-compiled.js.map
|