meshdb_executor/
reader.rs1use crate::error::Result;
2use meshdb_core::{Edge, EdgeId, Node, NodeId, Property};
3use meshdb_storage::{PropertyConstraintSpec, StorageEngine};
4
5pub trait GraphReader: Send + Sync {
17 fn get_node(&self, id: NodeId) -> Result<Option<Node>>;
18 fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>>;
19 fn all_node_ids(&self) -> Result<Vec<NodeId>>;
20 fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>>;
21 fn nodes_by_property(
29 &self,
30 label: &str,
31 property: &str,
32 value: &Property,
33 ) -> Result<Vec<NodeId>>;
34 fn list_property_indexes(&self) -> Result<Vec<(String, String)>> {
40 Ok(Vec::new())
41 }
42 fn list_edge_property_indexes(&self) -> Result<Vec<(String, String)>> {
47 Ok(Vec::new())
48 }
49 fn list_property_constraints(&self) -> Result<Vec<PropertyConstraintSpec>> {
53 Ok(Vec::new())
54 }
55 fn outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
56 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
57}
58
59impl<T: StorageEngine> GraphReader for T {
71 fn get_node(&self, id: NodeId) -> Result<Option<Node>> {
72 Ok(StorageEngine::get_node(self, id)?)
73 }
74
75 fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>> {
76 Ok(StorageEngine::get_edge(self, id)?)
77 }
78
79 fn all_node_ids(&self) -> Result<Vec<NodeId>> {
80 Ok(StorageEngine::all_node_ids(self)?)
81 }
82
83 fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>> {
84 Ok(StorageEngine::nodes_by_label(self, label)?)
85 }
86
87 fn nodes_by_property(
88 &self,
89 label: &str,
90 property: &str,
91 value: &Property,
92 ) -> Result<Vec<NodeId>> {
93 Ok(StorageEngine::nodes_by_property(
94 self, label, property, value,
95 )?)
96 }
97
98 fn list_property_indexes(&self) -> Result<Vec<(String, String)>> {
99 Ok(StorageEngine::list_property_indexes(self)
100 .into_iter()
101 .map(|s| (s.label, s.property))
102 .collect())
103 }
104
105 fn list_edge_property_indexes(&self) -> Result<Vec<(String, String)>> {
106 Ok(StorageEngine::list_edge_property_indexes(self)
107 .into_iter()
108 .map(|s| (s.edge_type, s.property))
109 .collect())
110 }
111
112 fn list_property_constraints(&self) -> Result<Vec<PropertyConstraintSpec>> {
113 Ok(StorageEngine::list_property_constraints(self))
114 }
115
116 fn outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
117 Ok(StorageEngine::outgoing(self, id)?)
118 }
119
120 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
121 Ok(StorageEngine::incoming(self, id)?)
122 }
123}
124
125pub struct StorageReaderAdapter<'a>(pub &'a dyn StorageEngine);
131
132impl GraphReader for StorageReaderAdapter<'_> {
133 fn get_node(&self, id: NodeId) -> Result<Option<Node>> {
134 Ok(self.0.get_node(id)?)
135 }
136
137 fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>> {
138 Ok(self.0.get_edge(id)?)
139 }
140
141 fn all_node_ids(&self) -> Result<Vec<NodeId>> {
142 Ok(self.0.all_node_ids()?)
143 }
144
145 fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>> {
146 Ok(self.0.nodes_by_label(label)?)
147 }
148
149 fn nodes_by_property(
150 &self,
151 label: &str,
152 property: &str,
153 value: &Property,
154 ) -> Result<Vec<NodeId>> {
155 Ok(self.0.nodes_by_property(label, property, value)?)
156 }
157
158 fn list_property_indexes(&self) -> Result<Vec<(String, String)>> {
159 Ok(self
160 .0
161 .list_property_indexes()
162 .into_iter()
163 .map(|s| (s.label, s.property))
164 .collect())
165 }
166
167 fn list_edge_property_indexes(&self) -> Result<Vec<(String, String)>> {
168 Ok(self
169 .0
170 .list_edge_property_indexes()
171 .into_iter()
172 .map(|s| (s.edge_type, s.property))
173 .collect())
174 }
175
176 fn list_property_constraints(&self) -> Result<Vec<PropertyConstraintSpec>> {
177 Ok(self.0.list_property_constraints())
178 }
179
180 fn outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
181 Ok(self.0.outgoing(id)?)
182 }
183
184 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
185 Ok(self.0.incoming(id)?)
186 }
187}