meshdb_executor/
reader.rs1use crate::error::Result;
2use meshdb_core::{Edge, EdgeId, Node, NodeId, Property};
3use meshdb_storage::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 outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
43 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>>;
44}
45
46impl<T: StorageEngine> GraphReader for T {
58 fn get_node(&self, id: NodeId) -> Result<Option<Node>> {
59 Ok(StorageEngine::get_node(self, id)?)
60 }
61
62 fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>> {
63 Ok(StorageEngine::get_edge(self, id)?)
64 }
65
66 fn all_node_ids(&self) -> Result<Vec<NodeId>> {
67 Ok(StorageEngine::all_node_ids(self)?)
68 }
69
70 fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>> {
71 Ok(StorageEngine::nodes_by_label(self, label)?)
72 }
73
74 fn nodes_by_property(
75 &self,
76 label: &str,
77 property: &str,
78 value: &Property,
79 ) -> Result<Vec<NodeId>> {
80 Ok(StorageEngine::nodes_by_property(
81 self, label, property, value,
82 )?)
83 }
84
85 fn list_property_indexes(&self) -> Result<Vec<(String, String)>> {
86 Ok(StorageEngine::list_property_indexes(self)
87 .into_iter()
88 .map(|s| (s.label, s.property))
89 .collect())
90 }
91
92 fn outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
93 Ok(StorageEngine::outgoing(self, id)?)
94 }
95
96 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
97 Ok(StorageEngine::incoming(self, id)?)
98 }
99}
100
101pub struct StorageReaderAdapter<'a>(pub &'a dyn StorageEngine);
107
108impl GraphReader for StorageReaderAdapter<'_> {
109 fn get_node(&self, id: NodeId) -> Result<Option<Node>> {
110 Ok(self.0.get_node(id)?)
111 }
112
113 fn get_edge(&self, id: EdgeId) -> Result<Option<Edge>> {
114 Ok(self.0.get_edge(id)?)
115 }
116
117 fn all_node_ids(&self) -> Result<Vec<NodeId>> {
118 Ok(self.0.all_node_ids()?)
119 }
120
121 fn nodes_by_label(&self, label: &str) -> Result<Vec<NodeId>> {
122 Ok(self.0.nodes_by_label(label)?)
123 }
124
125 fn nodes_by_property(
126 &self,
127 label: &str,
128 property: &str,
129 value: &Property,
130 ) -> Result<Vec<NodeId>> {
131 Ok(self.0.nodes_by_property(label, property, value)?)
132 }
133
134 fn list_property_indexes(&self) -> Result<Vec<(String, String)>> {
135 Ok(self
136 .0
137 .list_property_indexes()
138 .into_iter()
139 .map(|s| (s.label, s.property))
140 .collect())
141 }
142
143 fn outgoing(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
144 Ok(self.0.outgoing(id)?)
145 }
146
147 fn incoming(&self, id: NodeId) -> Result<Vec<(EdgeId, NodeId)>> {
148 Ok(self.0.incoming(id)?)
149 }
150}