Skip to main content

raphtory_storage/graph/edges/
edge_ref.rs

1use crate::graph::edges::edge_storage_ops::{EdgeStorageOps, TimeIndexRef};
2use raphtory_api::core::entities::{
3    properties::{prop::Prop, tprop::TPropOps},
4    LayerIds, EID, VID,
5};
6use raphtory_core::entities::edges::edge_store::MemEdge;
7use rayon::prelude::*;
8use std::ops::Range;
9
10#[cfg(feature = "storage")]
11use crate::{disk::graph_impl::DiskEdge, graph::variants::storage_variants2::StorageVariants2};
12
13macro_rules! for_all {
14    ($value:expr, $pattern:pat => $result:expr) => {
15        match $value {
16            EdgeStorageRef::Mem($pattern) => $result,
17            #[cfg(feature = "storage")]
18            EdgeStorageRef::Disk($pattern) => $result,
19        }
20    };
21}
22
23#[cfg(feature = "storage")]
24macro_rules! for_all_iter {
25    ($value:expr, $pattern:pat => $result:expr) => {
26        match $value {
27            EdgeStorageRef::Mem($pattern) => StorageVariants2::Mem($result),
28            EdgeStorageRef::Disk($pattern) => StorageVariants2::Disk($result),
29        }
30    };
31}
32
33#[cfg(not(feature = "storage"))]
34macro_rules! for_all_iter {
35    ($value:expr, $pattern:pat => $result:expr) => {
36        match $value {
37            EdgeStorageRef::Mem($pattern) => $result,
38        }
39    };
40}
41
42#[derive(Copy, Clone, Debug)]
43pub enum EdgeStorageRef<'a> {
44    Mem(MemEdge<'a>),
45    #[cfg(feature = "storage")]
46    Disk(DiskEdge<'a>),
47}
48
49impl<'a> EdgeStorageOps<'a> for EdgeStorageRef<'a> {
50    fn added(self, layer_ids: &LayerIds, w: Range<i64>) -> bool {
51        for_all!(self, edge => EdgeStorageOps::added(edge, layer_ids, w))
52    }
53
54    fn has_layer(self, layer_ids: &LayerIds) -> bool {
55        for_all!(self, edge => EdgeStorageOps::has_layer(edge, layer_ids))
56    }
57
58    fn src(self) -> VID {
59        for_all!(self, edge => edge.src())
60    }
61
62    fn dst(self) -> VID {
63        for_all!(self, edge => edge.dst())
64    }
65
66    fn eid(self) -> EID {
67        for_all!(self, edge => edge.eid())
68    }
69
70    fn layer_ids_iter(self, layer_ids: &'a LayerIds) -> impl Iterator<Item = usize> + 'a {
71        for_all_iter!(self, edge => EdgeStorageOps::layer_ids_iter(edge, layer_ids))
72    }
73
74    fn layer_ids_par_iter(self, layer_ids: &LayerIds) -> impl ParallelIterator<Item = usize> + 'a {
75        for_all_iter!(self, edge => EdgeStorageOps::layer_ids_par_iter(edge, layer_ids))
76    }
77
78    fn additions_iter(
79        self,
80        layer_ids: &'a LayerIds,
81    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
82        for_all_iter!(self, edge => EdgeStorageOps::additions_iter(edge, layer_ids))
83    }
84
85    fn additions_par_iter(
86        self,
87        layer_ids: &LayerIds,
88    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
89        for_all_iter!(self, edge => EdgeStorageOps::additions_par_iter(edge, layer_ids))
90    }
91
92    fn deletions_iter(
93        self,
94        layer_ids: &'a LayerIds,
95    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
96        for_all_iter!(self, edge => EdgeStorageOps::deletions_iter(edge, layer_ids))
97    }
98
99    fn deletions_par_iter(
100        self,
101        layer_ids: &LayerIds,
102    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>)> + 'a {
103        for_all_iter!(self, edge => EdgeStorageOps::deletions_par_iter(edge, layer_ids))
104    }
105
106    fn updates_iter(
107        self,
108        layer_ids: &'a LayerIds,
109    ) -> impl Iterator<Item = (usize, TimeIndexRef<'a>, TimeIndexRef<'a>)> + 'a {
110        for_all_iter!(self, edge => EdgeStorageOps::updates_iter(edge, layer_ids))
111    }
112
113    fn updates_par_iter(
114        self,
115        layer_ids: &LayerIds,
116    ) -> impl ParallelIterator<Item = (usize, TimeIndexRef<'a>, TimeIndexRef<'a>)> + 'a {
117        for_all_iter!(self, edge => EdgeStorageOps::updates_par_iter(edge, layer_ids))
118    }
119
120    fn additions(self, layer_id: usize) -> TimeIndexRef<'a> {
121        for_all!(self, edge => EdgeStorageOps::additions(edge, layer_id))
122    }
123
124    fn deletions(self, layer_id: usize) -> TimeIndexRef<'a> {
125        for_all!(self, edge => EdgeStorageOps::deletions(edge, layer_id))
126    }
127
128    fn temporal_prop_layer(self, layer_id: usize, prop_id: usize) -> impl TPropOps<'a> + 'a {
129        for_all_iter!(self, edge => edge.temporal_prop_layer(layer_id, prop_id))
130    }
131
132    fn metadata_layer(self, layer_id: usize, prop_id: usize) -> Option<Prop> {
133        for_all!(self, edge => edge.metadata_layer(layer_id, prop_id))
134    }
135}