rbbt-rest 1.7.19 → 1.7.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rbbt/rest/common/cache.rb +13 -1
- data/lib/rbbt/rest/common/misc.rb +4 -2
- data/lib/rbbt/rest/common/users.rb +5 -0
- data/lib/rbbt/rest/entity.rb +2 -1
- data/lib/rbbt/rest/knowledge_base.rb +5 -2
- data/lib/rbbt/rest/knowledge_base/helpers.rb +9 -0
- data/lib/rbbt/rest/main.rb +2 -0
- data/share/views/compass/app.sass +6 -0
- data/share/views/layout/header.haml +8 -4
- data/share/views/public/js/helpers/defer.js +11 -9
- data/share/views/public/js/helpers/helpers.js +23 -5
- data/share/views/public/js/rbbt.basic.js +32 -1
- data/share/views/public/js/rbbt.entity.basic.js +41 -17
- data/share/views/public/js/rbbt.knowledge_base.js +60 -9
- data/share/views/public/js/rbbt.page.js +0 -1
- data/share/views/public/js/rbbt.plots/rbbt.plots.aes.js +195 -0
- data/share/views/public/js/{rbbt.aesthetics.js → rbbt.plots/rbbt.plots.aesthetics.js} +0 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.basic.js +2 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.adapters.js +216 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.js +138 -0
- data/share/views/public/js/rbbt.plots/rbbt.plots.graph.kb.js +72 -0
- data/share/views/public/js/{rbbt.plots.js → rbbt.plots/rbbt.plots.list.js} +1 -4
- data/share/views/public/js/rbbt/actions.js +0 -1
- data/share/views/public/plugins/js-cookie/js/js.cookie.js +145 -0
- data/share/views/public/plugins/mithril/js/mithril.js +1819 -833
- metadata +10 -5
- data/share/views/public/js/rbbt.aes_plots.js +0 -381
@@ -0,0 +1,195 @@
|
|
1
|
+
rbbt.plots.aes = {}
|
2
|
+
|
3
|
+
rbbt.plots.aes.map_aesthetic = function(aes, mapper, map_obj){
|
4
|
+
switch(mapper){
|
5
|
+
case false:
|
6
|
+
case undefined:
|
7
|
+
case null:
|
8
|
+
case 'direct':
|
9
|
+
return aes;
|
10
|
+
case 'gradient':
|
11
|
+
if (map_obj){
|
12
|
+
if (typeof aes == 'object')
|
13
|
+
aes = aes.map(function(value){ return map_obj[value] })
|
14
|
+
else
|
15
|
+
aes = map_obj[aes]
|
16
|
+
}
|
17
|
+
return get_gradient(aes, 'red', 'green')
|
18
|
+
case 'sign-gradient':
|
19
|
+
if (map_obj){
|
20
|
+
if (typeof aes == 'object')
|
21
|
+
aes = aes.map(function(value){ return map_obj[value] })
|
22
|
+
else
|
23
|
+
aes = map_obj[aes]
|
24
|
+
}
|
25
|
+
return get_sign_gradient(aes, 'red', 'grey', 'green')
|
26
|
+
case 'map':
|
27
|
+
if (typeof aes == 'object')
|
28
|
+
return aes.map(function(value){ return map_obj[value.toString()] })
|
29
|
+
else
|
30
|
+
return map_obj[aes]
|
31
|
+
case 'function':
|
32
|
+
var res = []
|
33
|
+
if (typeof aes == 'object')
|
34
|
+
for (i in aes) res.push(map_obj(aes[i]))
|
35
|
+
else
|
36
|
+
res = map_obj(aes)
|
37
|
+
return res
|
38
|
+
case 'list_function':
|
39
|
+
return map_obj(aes)
|
40
|
+
}
|
41
|
+
}
|
42
|
+
rbbt.plots.aes.get_properties = function(list, rules){
|
43
|
+
if (undefined === rules) rules == []
|
44
|
+
if (undefined === list.properties) list.properties = {}
|
45
|
+
var promises = []
|
46
|
+
forArray(rules, function(rule){
|
47
|
+
var name = rule.name
|
48
|
+
var extract = rule.extract
|
49
|
+
if (typeof extract == 'string'){
|
50
|
+
eval('extract='+extract)
|
51
|
+
}
|
52
|
+
|
53
|
+
if (rule.entity_type && rule.entity_type != list.type) return
|
54
|
+
|
55
|
+
if (rule.info){
|
56
|
+
var property = rule.property
|
57
|
+
var deferred = m.deferred()
|
58
|
+
var entry = rule.info
|
59
|
+
if (undefined === name) name = entry
|
60
|
+
|
61
|
+
var value = list.info[entry]
|
62
|
+
if (undefined === value && entry == 'type') value = list.type
|
63
|
+
if (undefined === value && entry == 'code') value = list.codes
|
64
|
+
|
65
|
+
deferred.resolve(value)
|
66
|
+
promise = deferred.promise
|
67
|
+
}
|
68
|
+
|
69
|
+
if (rule.value){
|
70
|
+
var property = rule.property
|
71
|
+
var deferred = m.deferred()
|
72
|
+
deferred.resolve(rule.value)
|
73
|
+
promise = deferred.promise
|
74
|
+
}
|
75
|
+
|
76
|
+
if (rule.property){
|
77
|
+
var property = rule.property
|
78
|
+
var args = rule.args
|
79
|
+
if (undefined === name) name = property
|
80
|
+
promise = rbbt.entity_array.property(list.codes, list.type, list.info, property, args)
|
81
|
+
if (extract){ promise = promise.then(function(res){ return res.map(extract)}) }
|
82
|
+
}
|
83
|
+
|
84
|
+
if (rule.workflow){
|
85
|
+
var workflow = rule.workflow
|
86
|
+
var task = rule.task
|
87
|
+
var args = rule.args
|
88
|
+
if (undefined === name) name = task
|
89
|
+
promise = rbbt.job(workflow, task, args, true)
|
90
|
+
if (extract){ promise = promise.then(function(res){ return list.codes.map(function(code){return extract.call(null, res, code)}) } )}
|
91
|
+
}
|
92
|
+
|
93
|
+
if (rule.parents || rule.children){
|
94
|
+
var kb_type
|
95
|
+
var database
|
96
|
+
if (rule.parents){
|
97
|
+
kb_type = 'parent'
|
98
|
+
var database = rule.parents
|
99
|
+
if (undefined === name) name = database
|
100
|
+
|
101
|
+
promise = rbbt.entity_array.parents(list.codes, list.type, database)
|
102
|
+
}else{
|
103
|
+
kb_type = 'children'
|
104
|
+
var database = rule.children
|
105
|
+
if (undefined === name) name = database
|
106
|
+
|
107
|
+
promise = rbbt.entity_array.children(list.codes, list.type, database)
|
108
|
+
}
|
109
|
+
|
110
|
+
if (rule.field){
|
111
|
+
promise = m.sync([promise,rbbt.knowledge_base.database_info(database)]).then(function(res){
|
112
|
+
var data = res[0]
|
113
|
+
var db_info = res[1]
|
114
|
+
var fields = db_info.fields
|
115
|
+
var field_pos = fields.indexOf(rule.field)
|
116
|
+
|
117
|
+
if (field_pos < 0){
|
118
|
+
var msg = "Field not found: " + rule.field + ". Options: " + fields.join(", ")
|
119
|
+
throw new Error(msg)
|
120
|
+
}
|
121
|
+
|
122
|
+
var matches = {}
|
123
|
+
forHash(data, function(key, values){
|
124
|
+
var source = values[0]
|
125
|
+
var target = values[1]
|
126
|
+
if (matches[source] === undefined) matches[source] = {}
|
127
|
+
matches[source][target] = values[field_pos+2]
|
128
|
+
})
|
129
|
+
return matches
|
130
|
+
})
|
131
|
+
}else{
|
132
|
+
promise = promise.then(function(data){
|
133
|
+
var matches = {}
|
134
|
+
forHash(data, function(key, values){
|
135
|
+
var source,target
|
136
|
+
if (rule.parents){
|
137
|
+
source = values[1]
|
138
|
+
target = values[0]
|
139
|
+
}else{
|
140
|
+
source = values[0]
|
141
|
+
target = values[1]
|
142
|
+
}
|
143
|
+
if (matches[source] === undefined) matches[source] = {}
|
144
|
+
matches[source][target] = values.slice(2)
|
145
|
+
})
|
146
|
+
return matches
|
147
|
+
})
|
148
|
+
}
|
149
|
+
|
150
|
+
if (extract){
|
151
|
+
promise = promise.then(function(matches){
|
152
|
+
return list.codes.map(function(e){
|
153
|
+
return extract.call(null, matches, e)
|
154
|
+
})
|
155
|
+
})
|
156
|
+
}
|
157
|
+
else{
|
158
|
+
promise = promise.then(function(matches){
|
159
|
+
return list.codes.map(function(e){ return matches[e] })
|
160
|
+
})
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
promises.push(promise.then(function(res){list.properties[name] = res}))
|
165
|
+
})
|
166
|
+
|
167
|
+
return m.sync(promises)
|
168
|
+
}
|
169
|
+
|
170
|
+
rbbt.plots.aes.set_aes = function(list, aes_rules){
|
171
|
+
if (undefined === list.aes) list.aes = {}
|
172
|
+
forArray(aes_rules, function(rule){
|
173
|
+
|
174
|
+
if (rule.entity_type && rule.entity_type != list.type) return
|
175
|
+
|
176
|
+
|
177
|
+
var name = rule.name
|
178
|
+
var aes = rule.aes
|
179
|
+
var mapper = rule.mapper
|
180
|
+
var mapper_obj = rule.mapper_obj
|
181
|
+
var property = list.properties[name]
|
182
|
+
|
183
|
+
if (rule.value){
|
184
|
+
list.aes[aes] = rule.value
|
185
|
+
return
|
186
|
+
}
|
187
|
+
|
188
|
+
if (undefined === property && list.info[name]) property = list.info[name]
|
189
|
+
if (undefined === property && name == 'type') property = list.type
|
190
|
+
if (undefined === property && name == 'code') property = list.codes
|
191
|
+
if (undefined === property) return
|
192
|
+
|
193
|
+
list.aes[aes] = rbbt.plots.aes.map_aesthetic(property, mapper, mapper_obj)
|
194
|
+
})
|
195
|
+
}
|
File without changes
|
@@ -0,0 +1,216 @@
|
|
1
|
+
rbbt.plots.graph.build_d3 = function(graph_model){
|
2
|
+
|
3
|
+
var model = rbbt.plots.graph.consolidate(graph_model)
|
4
|
+
|
5
|
+
var node_index = {}
|
6
|
+
for (i=0; i< model.nodes.length; i++) node_index[model.nodes[i].code] = i
|
7
|
+
|
8
|
+
for (i=0; i< model.edges.length; i++){
|
9
|
+
var edge = model.edges[i]
|
10
|
+
edge.source = node_index[edge.source]
|
11
|
+
edge.target = node_index[edge.target]
|
12
|
+
}
|
13
|
+
|
14
|
+
model.links = model.edges
|
15
|
+
model.edges = undefined
|
16
|
+
model.node_index = node_index
|
17
|
+
|
18
|
+
return model
|
19
|
+
}
|
20
|
+
|
21
|
+
rbbt.plots.graph.build_cytoscape = function(graph_model){
|
22
|
+
var model = rbbt.plots.graph.consolidate(graph_model)
|
23
|
+
|
24
|
+
var dataSchema = {nodes: [], edges:[]}
|
25
|
+
|
26
|
+
var node_vars = {}
|
27
|
+
for (i in model.nodes){
|
28
|
+
for (p in model.nodes[i]){
|
29
|
+
if (undefined !== model.nodes[i][p])
|
30
|
+
node_vars[p] = typeof model.nodes[i][p]
|
31
|
+
}
|
32
|
+
}
|
33
|
+
for (p in node_vars){
|
34
|
+
dataSchema.nodes.push({name: p, type: node_vars[p]})
|
35
|
+
}
|
36
|
+
|
37
|
+
node_vars = {}
|
38
|
+
for (i in model.edges){
|
39
|
+
for (p in model.edges[i]){
|
40
|
+
if (undefined !== model.edges[i][p])
|
41
|
+
node_vars[p] = typeof model.edges[i][p]
|
42
|
+
}
|
43
|
+
}
|
44
|
+
for (p in node_vars){
|
45
|
+
dataSchema.edges.push({name: p, type: node_vars[p]})
|
46
|
+
}
|
47
|
+
|
48
|
+
var cy_model = {}
|
49
|
+
cy_model.dataSchema = dataSchema
|
50
|
+
cy_model.data = model
|
51
|
+
|
52
|
+
return cy_model
|
53
|
+
}
|
54
|
+
|
55
|
+
rbbt.plots.graph.build_cytoscapejs = function(graph_model){
|
56
|
+
var model = rbbt.plots.graph.consolidate(graph_model)
|
57
|
+
|
58
|
+
var nodes = []
|
59
|
+
forArray(model.nodes, function(node){
|
60
|
+
var clean = clean_hash(node)
|
61
|
+
if (undefined === clean.id) clean.id = clean.code
|
62
|
+
nodes.push({data: clean})
|
63
|
+
})
|
64
|
+
|
65
|
+
var edges = []
|
66
|
+
forArray(model.edges, function(edge){
|
67
|
+
var clean = clean_hash(edge)
|
68
|
+
if (undefined === clean.id) clean.id = clean.code
|
69
|
+
edges.push({data: clean})
|
70
|
+
})
|
71
|
+
|
72
|
+
var cy_model = {}
|
73
|
+
cy_model.elements = {nodes: nodes, edges: edges}
|
74
|
+
|
75
|
+
return cy_model
|
76
|
+
}
|
77
|
+
|
78
|
+
rbbt.plots.graph.view_cytoscapejs = function(graph_model, elem, style, layout, extra){
|
79
|
+
|
80
|
+
var default_style = [ // the stylesheet for the graph
|
81
|
+
{
|
82
|
+
selector: 'node',
|
83
|
+
style: { 'background-color': 'blue', 'label': 'data(id)' }
|
84
|
+
},
|
85
|
+
|
86
|
+
{
|
87
|
+
selector: 'node[label]',
|
88
|
+
style: {'label': 'data(label)' }
|
89
|
+
},
|
90
|
+
|
91
|
+
{
|
92
|
+
selector: 'node[color]',
|
93
|
+
style: { 'background-color': 'data(color)' }
|
94
|
+
},
|
95
|
+
|
96
|
+
{
|
97
|
+
selector: 'edge',
|
98
|
+
style: { 'width': 1, 'line-color': 'grey', 'target-arrow-color': '#ccc', 'target-arrow-shape': 'triangle' }
|
99
|
+
},
|
100
|
+
{
|
101
|
+
selector: 'edge[color]',
|
102
|
+
style: { 'line-color': 'data(color)'}
|
103
|
+
}
|
104
|
+
]
|
105
|
+
|
106
|
+
var default_layout = { name: 'cose' }
|
107
|
+
|
108
|
+
if (undefined === style) style = default_style
|
109
|
+
if (undefined === layout) layout = default_layout
|
110
|
+
|
111
|
+
var deferred = m.deferred()
|
112
|
+
|
113
|
+
console.log(graph_model)
|
114
|
+
rbbt.plots.graph.update(graph_model).then(function(updated_model){
|
115
|
+
var cy_model = rbbt.plots.graph.build_cytoscapejs(updated_model)
|
116
|
+
|
117
|
+
require_js(['/plugins/cytoscapejs/cytoscape.js'], function(){
|
118
|
+
var cy_params = {
|
119
|
+
container: elem,
|
120
|
+
elements: cy_model.elements,
|
121
|
+
style: style,
|
122
|
+
layout: layout,
|
123
|
+
}
|
124
|
+
|
125
|
+
if (undefined !== extra) forHash(extra,function(k,v){ cy_params[k,v] })
|
126
|
+
|
127
|
+
var cy = cytoscape(cy_params)
|
128
|
+
|
129
|
+
deferred.resolve(cy)
|
130
|
+
})
|
131
|
+
},rbbt.exception.report)
|
132
|
+
|
133
|
+
return deferred.promise
|
134
|
+
}
|
135
|
+
|
136
|
+
rbbt.plots.graph.view_cytoscape = function(graph_model, elem, style, layout, extra){
|
137
|
+
rbbt.plots.graph.update(graph_model).then(function(updated_model){
|
138
|
+
var dataset = rbbt.plots.graph.build_cytoscape(updated_model)
|
139
|
+
|
140
|
+
require_js(['/js/cytoscape/js/src/AC_OETags.js', '/js/cytoscape/js/src/cytoscapeweb.js', '/js/cytoscape'], function(){
|
141
|
+
var tool = $('#plot').cytoscape_tool({
|
142
|
+
knowledge_base: 'user',
|
143
|
+
namespace: 'Hsa/feb2014',
|
144
|
+
entities: dataset.nodes,
|
145
|
+
network: dataset,
|
146
|
+
aesthetics: {},
|
147
|
+
|
148
|
+
node_click: function(event){
|
149
|
+
var target = event.target;
|
150
|
+
|
151
|
+
for (var i in target.data){
|
152
|
+
var variable_name = i;
|
153
|
+
var variable_value = target.data[i];
|
154
|
+
}
|
155
|
+
|
156
|
+
for (var i in target.data) {
|
157
|
+
var variable_name = i;
|
158
|
+
var variable_value = target.data[i];
|
159
|
+
}
|
160
|
+
|
161
|
+
var url = target.data.url;
|
162
|
+
|
163
|
+
rbbt.modal.controller.show_url(url)
|
164
|
+
return(false)
|
165
|
+
},
|
166
|
+
|
167
|
+
edge_click: function(event){
|
168
|
+
var target = event.target;
|
169
|
+
for (var i in target.data){
|
170
|
+
var variable_name = i;
|
171
|
+
var variable_value = target.data[i];
|
172
|
+
}
|
173
|
+
|
174
|
+
var pair = [target.data.source, target.data.target].join("~")
|
175
|
+
tool.cytoscape_tool('show_info', "user", target.data.database, pair);
|
176
|
+
|
177
|
+
return(false)
|
178
|
+
}
|
179
|
+
|
180
|
+
});
|
181
|
+
|
182
|
+
require_js('/js/controls/context_menu', function(){
|
183
|
+
cytoscape_context_menu(tool)
|
184
|
+
})
|
185
|
+
|
186
|
+
require_js('/js/controls/placement', function(){
|
187
|
+
cytoscape_placement(tool)
|
188
|
+
})
|
189
|
+
|
190
|
+
require_js('/js/controls/save', function(){
|
191
|
+
cytoscape_save(tool)
|
192
|
+
})
|
193
|
+
tool.cytoscape_tool('draw');
|
194
|
+
})
|
195
|
+
})
|
196
|
+
}
|
197
|
+
|
198
|
+
rbbt.plots.graph.view_d3js_graph = function(graph_model, elem, node_obj){
|
199
|
+
rbbt.plots.graph.update(graph_model).then(function(updated_model){
|
200
|
+
console.log(updated_model)
|
201
|
+
var dataset = rbbt.plots.graph.build_d3(updated_model)
|
202
|
+
|
203
|
+
if (undefined === node_obj){
|
204
|
+
node_obj = function(node){
|
205
|
+
var g = node.append('g').attr('class', function(d){ if(undefined === d.shape) d.shape = 'circle'; return "node " + d.shape})
|
206
|
+
d3.selectAll('.node.circle').append('circle').attr('fill',function(d){return d.color}).attr('r', 20)
|
207
|
+
d3.selectAll('.node.rect').append('rect').attr('fill',function(d){return d.color}).attr('width', 40).attr('height', 40).attr('x', -20).attr('y', -20)
|
208
|
+
g.append('text').attr('x',-20).attr('y',-20).text(function(d){if(undefined === d.label) d.label = d.code; return d.label}).fill('black')
|
209
|
+
return g
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
rbbt.plots.d3js_graph(dataset, elem, node_obj)
|
214
|
+
|
215
|
+
})
|
216
|
+
}
|
@@ -0,0 +1,138 @@
|
|
1
|
+
rbbt.plots.graph = {}
|
2
|
+
|
3
|
+
rbbt.plots.graph.get_entities = function(graph_model){
|
4
|
+
|
5
|
+
if (undefined !== graph_model.entities) return graph_model
|
6
|
+
|
7
|
+
var entities = {}
|
8
|
+
forHash(graph_model.associations, function(database, list){
|
9
|
+
var source_type = list.source_type
|
10
|
+
var source_entities = {}
|
11
|
+
source_entities.codes = unique(list.info.source)
|
12
|
+
source_entities.info = list.source_info
|
13
|
+
source_entities.type = list.source_type
|
14
|
+
|
15
|
+
var target_type = list.target_type
|
16
|
+
var target_entities = {}
|
17
|
+
target_entities.codes = unique(list.info.target)
|
18
|
+
target_entities.info = list.target_info
|
19
|
+
target_entities.type = list.target_type
|
20
|
+
|
21
|
+
if (entities[source_entities.type])
|
22
|
+
entities[source_entities.type].codes = unique(entities[source_entities.type].codes.concat(source_entities.codes))
|
23
|
+
else
|
24
|
+
entities[source_entities.type] = source_entities
|
25
|
+
|
26
|
+
if (entities[target_entities.type])
|
27
|
+
entities[target_entities.type].codes = unique(entities[target_entities.type].codes.concat(target_entities.codes))
|
28
|
+
else
|
29
|
+
entities[target_entities.type] = target_entities
|
30
|
+
})
|
31
|
+
|
32
|
+
graph_model.entities = entities
|
33
|
+
|
34
|
+
return graph_model
|
35
|
+
}
|
36
|
+
|
37
|
+
rbbt.plots.graph.update_aes = function(graph_model){
|
38
|
+
var data_promises = []
|
39
|
+
forHash(graph_model.entities, function(type, list){
|
40
|
+
data_promises.push(
|
41
|
+
|
42
|
+
rbbt.plots.aes.get_properties(list, graph_model.rules).
|
43
|
+
then(function(){
|
44
|
+
rbbt.plots.aes.set_aes(list, graph_model.aes_rules)
|
45
|
+
})
|
46
|
+
|
47
|
+
)
|
48
|
+
})
|
49
|
+
|
50
|
+
forHash(graph_model.associations, function(db, list){
|
51
|
+
data_promises.push(
|
52
|
+
|
53
|
+
rbbt.plots.aes.get_properties(list, graph_model.edge_rules).
|
54
|
+
then(function(){
|
55
|
+
rbbt.plots.aes.set_aes(list, graph_model.edge_aes_rules)
|
56
|
+
})
|
57
|
+
|
58
|
+
)
|
59
|
+
})
|
60
|
+
return m.sync(data_promises).then(function(){return graph_model})
|
61
|
+
}
|
62
|
+
|
63
|
+
//{{{ CONSOLIDATION
|
64
|
+
|
65
|
+
rbbt.plots.graph.consolidate_list = function(list){
|
66
|
+
var nodes = []
|
67
|
+
|
68
|
+
var codes = list.codes
|
69
|
+
var info = list.info
|
70
|
+
var aes = list.aes
|
71
|
+
var properties = list.properties
|
72
|
+
|
73
|
+
for (i in codes){
|
74
|
+
var node = {}
|
75
|
+
node.code = codes[i]
|
76
|
+
node.id = codes[i]
|
77
|
+
forHash(aes, function(name, values){
|
78
|
+
var value
|
79
|
+
if (typeof values == 'object') value = values[i]
|
80
|
+
else value = values
|
81
|
+
node[name] = value
|
82
|
+
})
|
83
|
+
nodes.push(node)
|
84
|
+
}
|
85
|
+
|
86
|
+
return nodes
|
87
|
+
}
|
88
|
+
|
89
|
+
rbbt.plots.graph.consolidate_associations = function(list){
|
90
|
+
var nodes = []
|
91
|
+
|
92
|
+
var codes = list.codes
|
93
|
+
var info = list.info
|
94
|
+
var aes = list.aes
|
95
|
+
var properties = list.properties
|
96
|
+
var values = list.properties
|
97
|
+
|
98
|
+
for (i in codes){
|
99
|
+
var node = {}
|
100
|
+
node.code = codes[i]
|
101
|
+
forHash(aes, function(name, values){
|
102
|
+
var value
|
103
|
+
if (typeof values == 'object') value = values[i]
|
104
|
+
else value = values
|
105
|
+
node[name] = value
|
106
|
+
})
|
107
|
+
nodes.push(node)
|
108
|
+
}
|
109
|
+
|
110
|
+
return nodes
|
111
|
+
}
|
112
|
+
|
113
|
+
rbbt.plots.graph.consolidate = function(graph_model){
|
114
|
+
var model = {}
|
115
|
+
|
116
|
+
var nodes = []
|
117
|
+
|
118
|
+
forHash(graph_model.entities, function(type, list){
|
119
|
+
var list_nodes = rbbt.plots.graph.consolidate_list(list)
|
120
|
+
for (i in list_nodes) nodes.push(list_nodes[i])
|
121
|
+
})
|
122
|
+
|
123
|
+
var edges = []
|
124
|
+
forHash(graph_model.associations, function(database, list){
|
125
|
+
var list_edges = rbbt.plots.graph.consolidate_associations(list,database)
|
126
|
+
for (i in list_edges) edges.push(list_edges[i])
|
127
|
+
})
|
128
|
+
|
129
|
+
model.nodes = nodes
|
130
|
+
model.edges = edges
|
131
|
+
|
132
|
+
return model
|
133
|
+
}
|
134
|
+
|
135
|
+
rbbt.plots.graph.update = function(graph_model){
|
136
|
+
graph_model = rbbt.plots.graph.get_entities(graph_model)
|
137
|
+
return rbbt.plots.graph.update_aes(graph_model)
|
138
|
+
}
|