pub mod column_store;
pub mod mmap_vec;
use crate::graph::schema::{EdgeData, InternedKey, NodeData};
use crate::graph::storage::column_store::ColumnStore;
use crate::graph::storage::slot_mirror::SlotMirror;
use crate::graph::storage::undo::UndoJournal;
use petgraph::graph::{EdgeIndex, NodeIndex};
use petgraph::stable_graph::StableDiGraph;
use rustc_hash::FxHashMap;
use std::collections::HashMap;
use std::ops::Deref;
use std::sync::{Arc, RwLock};
#[derive(Debug, Default)]
pub struct MappedGraph {
pub(crate) inner: StableDiGraph<NodeData, EdgeData>,
pub(crate) column_stores: FxHashMap<InternedKey, Arc<ColumnStore>>,
pub(crate) type_index: RwLock<HashMap<u64, Arc<MappedTypeIndex>>>,
pub(crate) property_index: RwLock<HashMap<(String, String), Arc<MappedPropertyIndex>>>,
pub(crate) global_property_index: RwLock<HashMap<String, Arc<MappedPropertyIndex>>>,
pub(crate) undo: Option<Box<UndoJournal>>,
pub(crate) slot_mirror: SlotMirror,
}
#[derive(Debug, Default)]
pub struct MappedTypeIndex {
pub out_sources: Vec<NodeIndex>,
pub out_offsets: Vec<u32>,
pub out_edges: Vec<EdgeIndex>,
pub in_sources: Vec<NodeIndex>,
pub in_offsets: Vec<u32>,
pub in_edges: Vec<EdgeIndex>,
pub out_peer_counts: HashMap<NodeIndex, i64>,
pub in_peer_counts: HashMap<NodeIndex, i64>,
}
#[derive(Debug, Default)]
pub struct MappedPropertyIndex {
pub keys: Vec<String>,
pub nodes: Vec<NodeIndex>,
}
impl MappedPropertyIndex {
fn lower_bound(&self, target: &str) -> usize {
let mut lo = 0usize;
let mut hi = self.keys.len();
while lo < hi {
let mid = lo + (hi - lo) / 2;
if self.keys[mid].as_str() < target {
lo = mid + 1;
} else {
hi = mid;
}
}
lo
}
pub fn lookup_eq(&self, value: &str) -> Vec<NodeIndex> {
let start = self.lower_bound(value);
let mut out = Vec::new();
let mut i = start;
while i < self.keys.len() && self.keys[i] == value {
out.push(self.nodes[i]);
i += 1;
}
out
}
pub fn lookup_prefix(&self, prefix: &str, limit: usize) -> Vec<NodeIndex> {
if limit == 0 {
return Vec::new();
}
let start = self.lower_bound(prefix);
let mut out = Vec::with_capacity(limit.min(16));
let mut i = start;
while i < self.keys.len() && out.len() < limit {
if !self.keys[i].starts_with(prefix) {
break;
}
out.push(self.nodes[i]);
i += 1;
}
out
}
}
impl Deref for MappedGraph {
type Target = StableDiGraph<NodeData, EdgeData>;
#[inline]
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl serde::Serialize for MappedGraph {
fn serialize<S: serde::Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
self.inner.serialize(ser)
}
}
impl<'de> serde::Deserialize<'de> for MappedGraph {
fn deserialize<D: serde::Deserializer<'de>>(de: D) -> Result<Self, D::Error> {
StableDiGraph::deserialize(de).map(MappedGraph::from_graph)
}
}