use std::collections::HashMap;
use std::sync::Arc;
use petgraph::graph::NodeIndex;
use super::DirGraph;
use crate::datatypes::values::Value;
use crate::graph::schema::{InternedKey, NodeData, PropertyStorage};
use crate::graph::storage::{GraphRead, GraphWrite};
impl DirGraph {
pub fn insert_node_routed(
&mut self,
id: Value,
title: Value,
node_type: &str,
mut properties: HashMap<String, Value>,
) -> NodeIndex {
self.inject_provenance(node_type, &mut properties);
if self.graph.is_disk() {
let prop_types: HashMap<String, String> = properties
.iter()
.map(|(k, v)| (k.clone(), v.type_name().to_string()))
.collect();
self.upsert_node_type_metadata(node_type, prop_types);
let interned_props: Vec<(InternedKey, Value)> = properties
.iter()
.map(|(k, v)| (self.interner.get_or_intern(k), v.clone()))
.collect();
let mut keys: Vec<InternedKey> = interned_props.iter().map(|(k, _)| *k).collect();
keys.sort_unstable_by_key(|k| k.as_u64());
self.ensure_type_schema_keys(node_type, &keys);
let row_id = {
let store = self.ensure_column_store_for_push(node_type);
store.push_id(&id);
store.push_title(&title);
store.push_row(&interned_props)
};
let store_arc = Arc::clone(
self.column_stores
.get(node_type)
.expect("ensure_column_store_for_push just inserted it"),
);
let node_type_key = self.interner.get_or_intern(node_type);
let node_data = NodeData {
id,
title,
node_type: node_type_key,
properties: PropertyStorage::Columnar {
store: store_arc,
row_id,
},
};
let idx = GraphWrite::add_node(&mut self.graph, node_data);
GraphWrite::update_row_id(&mut self.graph, idx, row_id);
idx
} else {
let mut interned_keys: Vec<InternedKey> = properties
.keys()
.map(|k| self.interner.get_or_intern(k))
.collect();
interned_keys.sort_unstable_by_key(|k| k.as_u64());
self.ensure_type_schema_keys(node_type, &interned_keys);
let schema = Arc::clone(
self.type_schemas
.get(node_type)
.expect("ensure_type_schema_keys just inserted it"),
);
let node_data = NodeData::new_compact(
id,
title,
node_type.to_string(),
properties,
&mut self.interner,
&schema,
);
GraphWrite::add_node(&mut self.graph, node_data)
}
}
}