Skip to main content

cairn_knowledge_graph/operations/
read_edge.rs

1use crate::error::GraphComputingError;
2
3use crate::graph::edge::{
4    DirectedEdgeDefinedByIndices, DirectedEdgeDefinedByKeys, EdgeToEdgeCoordinate, EdgeTypeIndex,
5    EdgeTypeRef,
6};
7use crate::graph::graph::Graph;
8use crate::operations::read_vertex_value::ReadVertexValue;
9
10pub trait ReadEdge {
11    fn is_key_defined_edge_in_graph(
12        &self,
13        edge: &DirectedEdgeDefinedByKeys,
14    ) -> Result<bool, GraphComputingError>;
15    fn is_index_defined_edge_in_graph(
16        &self,
17        edge: &DirectedEdgeDefinedByIndices,
18    ) -> Result<bool, GraphComputingError>;
19
20    // TODO: review placement of this function
21    fn is_edge_type_in_graph(&self, edge_type: &EdgeTypeRef) -> Result<bool, GraphComputingError>;
22    fn is_index_defined_edge_type_in_graph(
23        &self,
24        edge_type: &EdgeTypeIndex,
25    ) -> Result<bool, GraphComputingError>;
26}
27
28impl ReadEdge for Graph {
29    fn is_key_defined_edge_in_graph(
30        &self,
31        edge: &DirectedEdgeDefinedByKeys,
32    ) -> Result<bool, GraphComputingError> {
33        if self.is_valid_vertex_key(edge.originates_from_vertex())
34            && self.is_valid_vertex_key(edge.points_to_vertex())
35        {
36            let edge_coordinate = self.key_defined_edge_to_edge_coordinate(edge)?;
37            match self.get_edge_adjacency_matrix_ref(edge.edge_type_ref()) {
38                Ok(edge_adjacency_matrix) => edge_adjacency_matrix.is_edge(&edge_coordinate),
39                Err(_) => Ok(false), // TODO: match error type to decide if an error should be passed on instead
40            }
41        } else {
42            return Ok(false);
43        }
44    }
45
46    fn is_index_defined_edge_in_graph(
47        &self,
48        edge: &DirectedEdgeDefinedByIndices,
49    ) -> Result<bool, GraphComputingError> {
50        let edge_coordinate = self.index_defined_edge_to_edge_coordinate(edge)?;
51        match self
52            .adjacency_matrices_ref()
53            .get_ref(edge.edge_type().clone())
54        {
55            Ok(edge_adjacency_matrix) => edge_adjacency_matrix.is_edge(&edge_coordinate),
56            Err(_) => Ok(false), // TODO: match error type to decide if an error should be passed on instead
57        }
58    }
59
60    fn is_edge_type_in_graph(&self, edge_type: &EdgeTypeRef) -> Result<bool, GraphComputingError> {
61        Ok(self
62            .edge_type_to_edge_type_index_map_ref()
63            .contains_key(edge_type))
64    }
65
66    fn is_index_defined_edge_type_in_graph(
67        &self,
68        edge_type: &EdgeTypeIndex,
69    ) -> Result<bool, GraphComputingError> {
70        Ok(self.adjacency_matrices_ref().is_valid_index(edge_type)?)
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    use crate::tests::standard_graph_for_testing::standard_graph_for_testing;
79
80    #[test]
81    fn test_is_edge_type() {
82        let graph = standard_graph_for_testing();
83
84        assert!(!graph
85            .is_edge_type_in_graph(String::from("this_edge_type_does_not_exist").as_str())
86            .unwrap());
87        assert!(graph
88            .is_edge_type_in_graph(String::from("is_a").as_str())
89            .unwrap());
90    }
91}