raphtory_storage/graph/edges/
edge_ref.rs1use 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}