raphtory_storage/graph/nodes/
row.rs1use raphtory_api::core::entities::properties::prop::Prop;
2use raphtory_core::storage::node_entry::MemRow;
3
4#[cfg(feature = "storage")]
5use {
6 pometry_storage::{
7 graph::TemporalGraph, properties::TemporalProps, timestamps::TimeStamps, tprops::DiskTProp,
8 tprops::PropCol,
9 },
10 raphtory_api::core::{entities::VID, storage::timeindex::TimeIndexEntry},
11};
12
13#[derive(Debug, Copy, Clone)]
14pub enum Row<'a> {
15 Mem(MemRow<'a>),
16 #[cfg(feature = "storage")]
17 Disk(DiskRow<'a>),
18}
19
20impl<'a> IntoIterator for Row<'a> {
21 type Item = (usize, Option<Prop>);
22
23 type IntoIter = Box<dyn Iterator<Item = Self::Item> + 'a>;
24
25 fn into_iter(self) -> Self::IntoIter {
26 match self {
27 Row::Mem(mem_row) => mem_row.into_iter(),
28 #[cfg(feature = "storage")]
29 Row::Disk(disk_row) => disk_row.into_iter(),
30 }
31 }
32}
33
34#[cfg(feature = "storage")]
35#[derive(Debug, Copy, Clone)]
36pub struct DiskRow<'a> {
37 graph: &'a TemporalGraph,
38 ts: TimeStamps<'a, TimeIndexEntry>,
39 layer: usize,
40 row: usize,
41}
42
43#[cfg(feature = "storage")]
44impl<'a> DiskRow<'a> {
45 pub fn new(
46 graph: &'a TemporalGraph,
47 ts: TimeStamps<'a, TimeIndexEntry>,
48 row: usize,
49 layer: usize,
50 ) -> Self {
51 Self {
52 graph,
53 ts,
54 row,
55 layer,
56 }
57 }
58
59 pub fn temporal_props(&'a self) -> &'a TemporalProps<VID> {
60 &self.graph.node_properties().temporal_props()[self.layer]
61 }
62}
63
64#[cfg(feature = "storage")]
65impl<'a> IntoIterator for DiskRow<'a> {
66 type Item = (usize, Option<Prop>);
67
68 type IntoIter = Box<dyn Iterator<Item = Self::Item> + 'a>;
69
70 fn into_iter(self) -> Self::IntoIter {
71 let props = self.temporal_props();
72 let iter = (0..props.prop_dtypes().len()).filter_map(move |prop_id| {
73 let global_prop = self
74 .graph
75 .prop_mapping()
76 .globalise_node_prop_id(self.layer, prop_id)?;
77 let props = self.temporal_props();
78 Some((
79 global_prop,
80 get(
81 &props.prop_for_ts::<TimeIndexEntry>(self.ts, prop_id),
82 self.row,
83 ),
84 ))
85 });
86 Box::new(iter)
87 }
88}
89
90#[cfg(feature = "storage")]
91fn get<'a>(disk_col: &DiskTProp<'a, TimeIndexEntry>, row: usize) -> Option<Prop> {
92 disk_col.get_prop_row(row)
93}