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
265trait 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 {}