dc.graph
Version:
Graph visualizations integrated with crossfilter and dc.js
84 lines (79 loc) • 3.25 kB
JavaScript
dc_graph.path_reader = function(pathsgroup) {
var highlight_paths_group = dc_graph.register_highlight_paths_group(pathsgroup || 'highlight-paths-group');
var _intervals, _intervalTree, _time;
function register_path_objs(path, nop, eop) {
reader.elementList.eval(path).forEach(function(element) {
var key, paths;
switch(reader.elementType.eval(element)) {
case 'node':
key = reader.nodeKey.eval(element);
paths = nop[key] = nop[key] || [];
break;
case 'edge':
key = reader.edgeSource.eval(element) + '-' + reader.edgeTarget.eval(element);
paths = eop[key] = eop[key] || [];
break;
}
paths.push(path);
});
}
var reader = {
pathList: property(identity, false),
timeRange: property(null, false),
pathStrength: property(null, false),
elementList: property(identity, false),
elementType: property(null, false),
nodeKey: property(null, false),
edgeSource: property(null, false),
edgeTarget: property(null, false),
clear: function() {
highlight_paths_group.paths_changed({}, {}, []);
},
data: function(data) {
var nop = {}, eop = {}, allpaths = [], has_ranges;
reader.pathList.eval(data).forEach(function(path) {
if((path._range = reader.timeRange.eval(path))) { // ugh modifying user data
if(has_ranges===false)
throw new Error("can't have a mix of ranged and non-ranged paths");
has_ranges = true;
} else {
if(has_ranges===true)
throw new Error("can't have a mix of ranged and non-ranged paths");
has_ranges = false;
register_path_objs(path, nop, eop);
}
allpaths.push(path);
});
if(has_ranges) {
_intervals = allpaths.map(function(path) {
var interval = [path._range[0].getTime(), path._range[1].getTime()];
interval.path = path;
return interval;
});
// currently must include lysenko-interval-tree separately
_intervalTree = lysenkoIntervalTree(_intervals);
if(_time)
this.setTime(_time);
} else {
_intervals = null;
_intervalTree = null;
highlight_paths_group.paths_changed(nop, eop, allpaths);
}
},
getIntervals: function() {
return _intervals;
},
setTime: function(t) {
if(t && _intervalTree) {
var paths = [], nop = {}, eop = {};
_intervalTree.queryPoint(t.getTime(), function(interval) {
paths.push(interval.path);
register_path_objs(interval.path, nop, eop);
});
highlight_paths_group.paths_changed(nop, eop, paths);
}
_time = t;
}
};
return reader;
};