raphtory-storage 0.17.0

Raphtory storage interface
Documentation
use raphtory_api::core::{
    entities::{GidRef, VID},
    storage::dict_mapper::MaybeNew,
};
use raphtory_core::{
    entities::graph::{logical_to_physical::InvalidNodeId, tgraph::TemporalGraph},
    storage::{
        raw_edges::{LockedEdges, WriteLockedEdges},
        ReadLockedStorage, WriteLockedNodes,
    },
};
use std::sync::Arc;

#[derive(Debug)]
pub struct LockedGraph {
    pub(crate) nodes: Arc<ReadLockedStorage>,
    pub(crate) edges: Arc<LockedEdges>,
    pub graph: Arc<TemporalGraph>,
}

impl<'de> serde::Deserialize<'de> for LockedGraph {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        TemporalGraph::deserialize(deserializer).map(|graph| LockedGraph::new(Arc::new(graph)))
    }
}

impl serde::Serialize for LockedGraph {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        self.graph.serialize(serializer)
    }
}

impl LockedGraph {
    pub fn new(graph: Arc<TemporalGraph>) -> Self {
        let nodes = Arc::new(graph.storage.nodes_read_lock());
        let edges = Arc::new(graph.storage.edges_read_lock());
        Self {
            nodes,
            edges,
            graph,
        }
    }
}

impl Clone for LockedGraph {
    fn clone(&self) -> Self {
        LockedGraph {
            nodes: self.nodes.clone(),
            edges: self.edges.clone(),
            graph: self.graph.clone(),
        }
    }
}

pub struct WriteLockedGraph<'a> {
    pub nodes: WriteLockedNodes<'a>,
    pub edges: WriteLockedEdges<'a>,
    pub graph: &'a TemporalGraph,
}

impl<'a> WriteLockedGraph<'a> {
    pub(crate) fn new(graph: &'a TemporalGraph) -> Self {
        let nodes = graph.storage.nodes.write_lock();
        let edges = graph.storage.edges.write_lock();
        Self {
            nodes,
            edges,
            graph,
        }
    }

    pub fn num_nodes(&self) -> usize {
        self.graph.storage.nodes.len()
    }
    pub fn resolve_node(&self, gid: GidRef) -> Result<MaybeNew<VID>, InvalidNodeId> {
        self.graph
            .logical_to_physical
            .get_or_init(gid, || self.graph.storage.nodes.next_id())
    }

    pub fn resolve_node_type(&self, node_type: Option<&str>) -> MaybeNew<usize> {
        node_type
            .map(|node_type| self.graph.node_meta.get_or_create_node_type_id(node_type))
            .unwrap_or_else(|| MaybeNew::Existing(0))
    }

    pub fn num_shards(&self) -> usize {
        self.nodes.num_shards().max(self.edges.num_shards())
    }

    pub fn edges_mut(&mut self) -> &mut WriteLockedEdges<'a> {
        &mut self.edges
    }

    pub fn graph(&self) -> &TemporalGraph {
        self.graph
    }
}