graph_api_simplegraph/
id.rs

1use crate::SimpleGraph;
2use graph_api_lib::{Element, ElementId};
3
4/// Simple vertex identifier using direct numeric values
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Hash)]
6pub struct VertexId {
7    label: u16,
8    vertex_id: u32,
9}
10
11impl VertexId {
12    /// Creates a new VertexId
13    ///
14    /// # Arguments
15    /// * `label_id` - The label identifier
16    /// * `vertex_id` - The unique vertex identifier
17    pub fn new(label: u16, vertex_id: u32) -> Self {
18        Self { label, vertex_id }
19    }
20
21    pub fn label(&self) -> u16 {
22        self.label
23    }
24
25    pub fn vertex(&self) -> u32 {
26        self.vertex_id
27    }
28}
29
30/// Simple edge identifier using direct numeric values
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Hash)]
32pub struct EdgeId {
33    label: u16,
34    edge_id: u32,
35    head: VertexId,
36    tail: VertexId,
37}
38
39impl EdgeId {
40    pub fn new(label: u16, edge_id: u32, tail: VertexId, head: VertexId) -> Self {
41        Self {
42            label,
43            edge_id,
44            head,
45            tail,
46        }
47    }
48
49    pub fn label(&self) -> u16 {
50        self.label
51    }
52
53    pub fn edge(&self) -> u32 {
54        self.edge_id
55    }
56
57    pub(crate) fn head(&self) -> VertexId {
58        self.head
59    }
60
61    pub(crate) fn tail(&self) -> VertexId {
62        self.tail
63    }
64}
65
66impl<Vertex, Edge> From<VertexId> for ElementId<SimpleGraph<Vertex, Edge>>
67where
68    Vertex: Element,
69    Edge: Element,
70{
71    fn from(val: VertexId) -> Self {
72        ElementId::Vertex(val)
73    }
74}
75
76impl<Vertex, Edge> From<EdgeId> for ElementId<SimpleGraph<Vertex, Edge>>
77where
78    Vertex: Element,
79    Edge: Element,
80{
81    fn from(val: EdgeId) -> Self {
82        ElementId::Edge(val)
83    }
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn test_vertex_id() {
92        let label_id = 42u16;
93        let vertex_id = 12345u32;
94        let vid = VertexId::new(label_id, vertex_id);
95
96        assert_eq!(vid.label(), label_id);
97        assert_eq!(vid.vertex(), { vertex_id });
98    }
99
100    #[test]
101    fn test_edge_id() {
102        let label_id = 24u16;
103        let edge_id = 67890u32;
104        let head = VertexId::new(1, 100);
105        let tail = VertexId::new(2, 200);
106
107        let eid = EdgeId::new(label_id, edge_id, tail, head);
108
109        assert_eq!(eid.label(), label_id);
110        assert_eq!(eid.edge(), edge_id);
111        assert_eq!(eid.head().vertex(), head.vertex());
112        assert_eq!(eid.tail().vertex(), tail.vertex());
113    }
114
115    #[test]
116    fn test_id_conversion() {
117        let vid = VertexId::new(1, 100);
118        let eid = EdgeId::new(2, 200, vid, VertexId::new(3, 300));
119
120        // Using SimpleGraph type for ElementId parameter
121        type TestGraph = SimpleGraph<(), ()>;
122
123        let id1: ElementId<TestGraph> = vid.into();
124        let id2: ElementId<TestGraph> = eid.into();
125
126        match id1 {
127            ElementId::Vertex(v) => assert_eq!(v, vid),
128            _ => panic!("Expected Vertex ID"),
129        }
130
131        match id2 {
132            ElementId::Edge(e) => assert_eq!(e, eid),
133            _ => panic!("Expected Edge ID"),
134        }
135    }
136}