Skip to main content

raphtory_core/entities/properties/
props.rs

1use crate::storage::{lazy_vec::IllegalSet, TPropColumnError};
2use raphtory_api::core::entities::properties::prop::Prop;
3use std::fmt::Debug;
4use thiserror::Error;
5
6#[derive(Error, Debug)]
7pub enum TPropError {
8    #[error(transparent)]
9    ColumnError(#[from] TPropColumnError),
10}
11
12#[derive(Error, Debug)]
13pub enum MetadataError {
14    #[error("Attempted to change value of metadata, old: {old}, new: {new}")]
15    IllegalUpdate { old: Prop, new: Prop },
16
17    #[error(transparent)]
18    ColumnError(#[from] TPropColumnError),
19}
20
21impl From<IllegalSet<Option<Prop>>> for MetadataError {
22    fn from(value: IllegalSet<Option<Prop>>) -> Self {
23        let old = value.previous_value.unwrap_or(Prop::str("NONE"));
24        let new = value.new_value.unwrap_or(Prop::str("NONE"));
25        MetadataError::IllegalUpdate { old, new }
26    }
27}
28
29#[cfg(test)]
30mod test {
31    use super::*;
32    use raphtory_api::core::entities::properties::meta::PropMapper;
33    use std::{sync::Arc, thread};
34
35    #[test]
36    fn test_prop_mapper_concurrent() {
37        let values = [Prop::I64(1), Prop::U16(0), Prop::Bool(true), Prop::F64(0.0)];
38        let input_len = values.len();
39
40        let mapper = Arc::new(PropMapper::default());
41        let threads: Vec<_> = values
42            .into_iter()
43            .map(move |v| {
44                let mapper = mapper.clone();
45                thread::spawn(move || mapper.get_or_create_and_validate("test", v.dtype()))
46            })
47            .flat_map(|t| t.join())
48            .collect();
49
50        assert_eq!(threads.len(), input_len); // no errors
51        assert_eq!(threads.into_iter().flatten().count(), 1); // only one result (which ever was first)
52    }
53}