raphtory-storage 0.17.0

Raphtory storage interface
Documentation
use crate::graph::edges::edge_storage_ops::{EdgeStorageOps, TimeIndexRef};
use raphtory_api::core::entities::{
    properties::{prop::Prop, tprop::TPropOps},
    LayerIds, EID, VID,
};
use raphtory_core::entities::edges::edge_store::MemEdge;
use rayon::prelude::*;
use std::ops::Range;

#[cfg(feature = "storage")]
use crate::{disk::graph_impl::DiskEdge, graph::variants::storage_variants2::StorageVariants2};

macro_rules! for_all {
    ($value:expr, $pattern:pat => $result:expr) => {
        match $value {
            EdgeStorageRef::Mem($pattern) => $result,
            #[cfg(feature = "storage")]
            EdgeStorageRef::Disk($pattern) => $result,
        }
    };
}

#[cfg(feature = "storage")]
macro_rules! for_all_iter {
    ($value:expr, $pattern:pat => $result:expr) => {
        match $value {
            EdgeStorageRef::Mem($pattern) => StorageVariants2::Mem($result),
            EdgeStorageRef::Disk($pattern) => StorageVariants2::Disk($result),
        }
    };
}

#[cfg(not(feature = "storage"))]
macro_rules! for_all_iter {
    ($value:expr, $pattern:pat => $result:expr) => {
        match $value {
            EdgeStorageRef::Mem($pattern) => $result,
        }
    };
}

#[derive(Copy, Clone, Debug)]
pub enum EdgeStorageRef<'a> {
    Mem(MemEdge<'a>),
    #[cfg(feature = "storage")]
    Disk(DiskEdge<'a>),
}

impl<'a> EdgeStorageOps<'a> for EdgeStorageRef<'a> {
    fn added(self, layer_ids: &LayerIds, w: Range<i64>) -> bool {
        for_all!(self, edge => EdgeStorageOps::added(edge, layer_ids, w))
    }

    fn has_layer(self, layer_ids: &LayerIds) -> bool {
        for_all!(self, edge => EdgeStorageOps::has_layer(edge, layer_ids))
    }

    fn src(self) -> VID {
        for_all!(self, edge => edge.src())
    }

    fn dst(self) -> VID {
        for_all!(self, edge => edge.dst())
    }

    fn eid(self) -> EID {
        for_all!(self, edge => edge.eid())
    }

    fn layer_ids_iter(self, layer_ids: &'a LayerIds) -> impl Iterator<Item = usize> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::layer_ids_iter(edge, layer_ids))
    }

    fn layer_ids_par_iter(self, layer_ids: &LayerIds) -> impl ParallelIterator<Item = usize> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::layer_ids_par_iter(edge, layer_ids))
    }

    fn additions_iter(
        self,
        layer_ids: &'a LayerIds,
    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::additions_iter(edge, layer_ids))
    }

    fn additions_par_iter(
        self,
        layer_ids: &LayerIds,
    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::additions_par_iter(edge, layer_ids))
    }

    fn deletions_iter(
        self,
        layer_ids: &'a LayerIds,
    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::deletions_iter(edge, layer_ids))
    }

    fn deletions_par_iter(
        self,
        layer_ids: &LayerIds,
    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::deletions_par_iter(edge, layer_ids))
    }

    fn updates_iter(
        self,
        layer_ids: &'a LayerIds,
    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::updates_iter(edge, layer_ids))
    }

    fn updates_par_iter(
        self,
        layer_ids: &LayerIds,
    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>, TimeIndexRef<'a>)> + 'a {
        for_all_iter!(self, edge => EdgeStorageOps::updates_par_iter(edge, layer_ids))
    }

    fn additions(self, layer_id: usize) -> TimeIndexRef<'a> {
        for_all!(self, edge => EdgeStorageOps::additions(edge, layer_id))
    }

    fn deletions(self, layer_id: usize) -> TimeIndexRef<'a> {
        for_all!(self, edge => EdgeStorageOps::deletions(edge, layer_id))
    }

    fn temporal_prop_layer(self, layer_id: usize, prop_id: usize) -> impl TPropOps<'a> + 'a {
        for_all_iter!(self, edge => edge.temporal_prop_layer(layer_id, prop_id))
    }

    fn metadata_layer(self, layer_id: usize, prop_id: usize) -> Option<Prop> {
        for_all!(self, edge => edge.metadata_layer(layer_id, prop_id))
    }
}