cairn_knowledge_graph/operations/
read_edge.rs1use 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 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), }
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), }
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}