surrealdb_core/idx/
mod.rs

1pub mod docids;
2pub(crate) mod ft;
3pub(crate) mod index;
4pub mod planner;
5pub mod trees;
6
7use crate::err::Error;
8use crate::idx::docids::DocId;
9use crate::idx::ft::terms::TermId;
10use crate::idx::trees::hnsw::ElementId;
11use crate::idx::trees::store::NodeId;
12use crate::idx::trees::vector::SerializedVector;
13use crate::key::index::bc::Bc;
14use crate::key::index::bd::Bd;
15use crate::key::index::bf::Bf;
16use crate::key::index::bi::Bi;
17use crate::key::index::bk::Bk;
18use crate::key::index::bl::Bl;
19use crate::key::index::bo::Bo;
20use crate::key::index::bp::Bp;
21use crate::key::index::bs::Bs;
22use crate::key::index::bt::Bt;
23use crate::key::index::bu::Bu;
24use crate::key::index::hd::Hd;
25use crate::key::index::he::He;
26use crate::key::index::hi::Hi;
27use crate::key::index::hl::Hl;
28use crate::key::index::hs::Hs;
29use crate::key::index::hv::Hv;
30use crate::key::index::vm::Vm;
31use crate::kvs::{Key, KeyEncode as _, Val};
32use crate::sql::statements::DefineIndexStatement;
33use crate::sql::{Id, Thing};
34use revision::Revisioned;
35use serde::de::DeserializeOwned;
36use serde::Serialize;
37use std::sync::Arc;
38
39#[derive(Debug, Clone, Default)]
40#[non_exhaustive]
41pub struct IndexKeyBase {
42	inner: Arc<Inner>,
43}
44
45#[derive(Debug, Default)]
46struct Inner {
47	ns: String,
48	db: String,
49	tb: String,
50	ix: String,
51}
52
53impl IndexKeyBase {
54	pub(crate) fn new(ns: &str, db: &str, ix: &DefineIndexStatement) -> Result<Self, Error> {
55		Ok(Self {
56			inner: Arc::new(Inner {
57				ns: ns.to_string(),
58				db: db.to_string(),
59				tb: ix.what.to_string(),
60				ix: ix.name.to_string(),
61			}),
62		})
63	}
64
65	fn new_bc_key(&self, term_id: TermId) -> Result<Key, Error> {
66		Bc::new(
67			self.inner.ns.as_str(),
68			self.inner.db.as_str(),
69			self.inner.tb.as_str(),
70			self.inner.ix.as_str(),
71			term_id,
72		)
73		.encode()
74	}
75
76	fn new_bd_key(&self, node_id: Option<NodeId>) -> Result<Key, Error> {
77		Bd::new(
78			self.inner.ns.as_str(),
79			self.inner.db.as_str(),
80			self.inner.tb.as_str(),
81			self.inner.ix.as_str(),
82			node_id,
83		)
84		.encode()
85	}
86
87	fn new_bi_key(&self, doc_id: DocId) -> Result<Key, Error> {
88		Bi::new(
89			self.inner.ns.as_str(),
90			self.inner.db.as_str(),
91			self.inner.tb.as_str(),
92			self.inner.ix.as_str(),
93			doc_id,
94		)
95		.encode()
96	}
97
98	fn new_bk_key(&self, doc_id: DocId) -> Result<Key, Error> {
99		Bk::new(
100			self.inner.ns.as_str(),
101			self.inner.db.as_str(),
102			self.inner.tb.as_str(),
103			self.inner.ix.as_str(),
104			doc_id,
105		)
106		.encode()
107	}
108
109	fn new_bl_key(&self, node_id: Option<NodeId>) -> Result<Key, Error> {
110		Bl::new(
111			self.inner.ns.as_str(),
112			self.inner.db.as_str(),
113			self.inner.tb.as_str(),
114			self.inner.ix.as_str(),
115			node_id,
116		)
117		.encode()
118	}
119
120	fn new_bo_key(&self, doc_id: DocId, term_id: TermId) -> Result<Key, Error> {
121		Bo::new(
122			self.inner.ns.as_str(),
123			self.inner.db.as_str(),
124			self.inner.tb.as_str(),
125			self.inner.ix.as_str(),
126			doc_id,
127			term_id,
128		)
129		.encode()
130	}
131
132	fn new_bp_key(&self, node_id: Option<NodeId>) -> Result<Key, Error> {
133		Bp::new(
134			self.inner.ns.as_str(),
135			self.inner.db.as_str(),
136			self.inner.tb.as_str(),
137			self.inner.ix.as_str(),
138			node_id,
139		)
140		.encode()
141	}
142
143	fn new_bf_key(&self, term_id: TermId, doc_id: DocId) -> Result<Key, Error> {
144		Bf::new(
145			self.inner.ns.as_str(),
146			self.inner.db.as_str(),
147			self.inner.tb.as_str(),
148			self.inner.ix.as_str(),
149			term_id,
150			doc_id,
151		)
152		.encode()
153	}
154
155	fn new_bt_key(&self, node_id: Option<NodeId>) -> Result<Key, Error> {
156		Bt::new(
157			self.inner.ns.as_str(),
158			self.inner.db.as_str(),
159			self.inner.tb.as_str(),
160			self.inner.ix.as_str(),
161			node_id,
162		)
163		.encode()
164	}
165
166	fn new_bs_key(&self) -> Result<Key, Error> {
167		Bs::new(
168			self.inner.ns.as_str(),
169			self.inner.db.as_str(),
170			self.inner.tb.as_str(),
171			self.inner.ix.as_str(),
172		)
173		.encode()
174	}
175
176	fn new_bu_key(&self, term_id: TermId) -> Result<Key, Error> {
177		Bu::new(
178			self.inner.ns.as_str(),
179			self.inner.db.as_str(),
180			self.inner.tb.as_str(),
181			self.inner.ix.as_str(),
182			term_id,
183		)
184		.encode()
185	}
186
187	fn new_hd_key(&self, doc_id: Option<DocId>) -> Result<Key, Error> {
188		Hd::new(
189			self.inner.ns.as_str(),
190			self.inner.db.as_str(),
191			self.inner.tb.as_str(),
192			self.inner.ix.as_str(),
193			doc_id,
194		)
195		.encode()
196	}
197
198	fn new_he_key(&self, element_id: ElementId) -> Result<Key, Error> {
199		He::new(
200			self.inner.ns.as_str(),
201			self.inner.db.as_str(),
202			self.inner.tb.as_str(),
203			self.inner.ix.as_str(),
204			element_id,
205		)
206		.encode()
207	}
208
209	fn new_hi_key(&self, id: Id) -> Result<Key, Error> {
210		Hi::new(
211			self.inner.ns.as_str(),
212			self.inner.db.as_str(),
213			self.inner.tb.as_str(),
214			self.inner.ix.as_str(),
215			id,
216		)
217		.encode()
218	}
219
220	fn new_hl_key(&self, layer: u16, chunk: u32) -> Result<Key, Error> {
221		Hl::new(
222			self.inner.ns.as_str(),
223			self.inner.db.as_str(),
224			self.inner.tb.as_str(),
225			self.inner.ix.as_str(),
226			layer,
227			chunk,
228		)
229		.encode()
230	}
231
232	fn new_hv_key(&self, vec: Arc<SerializedVector>) -> Result<Key, Error> {
233		Hv::new(
234			self.inner.ns.as_str(),
235			self.inner.db.as_str(),
236			self.inner.tb.as_str(),
237			self.inner.ix.as_str(),
238			vec,
239		)
240		.encode()
241	}
242
243	fn new_hs_key(&self) -> Result<Key, Error> {
244		Hs::new(
245			self.inner.ns.as_str(),
246			self.inner.db.as_str(),
247			self.inner.tb.as_str(),
248			self.inner.ix.as_str(),
249		)
250		.encode()
251	}
252
253	fn new_vm_key(&self, node_id: Option<NodeId>) -> Result<Key, Error> {
254		Vm::new(
255			self.inner.ns.as_str(),
256			self.inner.db.as_str(),
257			self.inner.tb.as_str(),
258			self.inner.ix.as_str(),
259			node_id,
260		)
261		.encode()
262	}
263}
264
265/// This trait provides `Revision` based default implementations for serialization/deserialization
266trait VersionedStore
267where
268	Self: Sized + Serialize + DeserializeOwned + Revisioned,
269{
270	fn try_into(&self) -> Result<Val, Error> {
271		let mut val = Vec::new();
272		self.serialize_revisioned(&mut val)?;
273		Ok(val)
274	}
275
276	fn try_from(val: Val) -> Result<Self, Error> {
277		Ok(Self::deserialize_revisioned(&mut val.as_slice())?)
278	}
279}
280
281impl VersionedStore for Thing {}