in src/dachshund/typed_graph_builder.rs [72:120]
fn populate_edges(rows: &[EdgeRow], node_map: &mut FxHashMap<NodeId, Node>) -> CLQResult<()> {
for r in rows.iter() {
assert!(node_map.contains_key(&r.source_id));
assert!(node_map.contains_key(&r.target_id));
let source_node = node_map
.get_mut(&r.source_id)
.ok_or_else(CLQError::err_none)?;
source_node
.neighbors
.entry(r.target_id)
.or_insert_with(Vec::new);
source_node
.neighbors
.get_mut(&r.target_id)
.unwrap()
.push(NodeEdge::new(r.edge_type_id, r.target_id));
// probably unnecessary.
node_map
.get_mut(&r.source_id)
.ok_or_else(CLQError::err_none)?
.edges
.push(NodeEdge::new(r.edge_type_id, r.target_id));
// edges with the same source and target type should not be repeated
if r.source_type_id != r.target_type_id {
let target_node = node_map
.get_mut(&r.target_id)
.ok_or_else(CLQError::err_none)?;
target_node
.neighbors
.entry(r.source_id)
.or_insert_with(Vec::new);
target_node
.neighbors
.get_mut(&r.source_id)
.unwrap()
.push(NodeEdge::new(r.edge_type_id, r.source_id));
target_node
.edges
.push(NodeEdge::new(r.edge_type_id, r.source_id));
}
}
Ok(())
}