surrealdb_core/key/database/
ml.rs1use std::borrow::Cow;
3
4use anyhow::Result;
5use storekey::{BorrowDecode, Encode};
6
7use crate::catalog::{DatabaseId, MlModelDefinition, NamespaceId};
8use crate::key::category::{Categorise, Category};
9use crate::kvs::{KVKey, impl_kv_key_storekey};
10
11#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Encode, BorrowDecode)]
12pub(crate) struct Ml<'a> {
13 __: u8,
14 _a: u8,
15 pub ns: NamespaceId,
16 _b: u8,
17 pub db: DatabaseId,
18 _c: u8,
19 _d: u8,
20 _e: u8,
21 pub ml: Cow<'a, str>,
22 pub vn: Cow<'a, str>,
23}
24
25impl_kv_key_storekey!(Ml<'_> => MlModelDefinition);
26
27pub fn new<'a>(ns: NamespaceId, db: DatabaseId, ml: &'a str, vn: &'a str) -> Ml<'a> {
28 Ml::new(ns, db, ml, vn)
29}
30
31pub fn prefix(ns: NamespaceId, db: DatabaseId) -> Result<Vec<u8>> {
32 let mut k = super::all::new(ns, db).encode_key()?;
33 k.extend_from_slice(b"!ml\x00");
34 Ok(k)
35}
36
37pub fn suffix(ns: NamespaceId, db: DatabaseId) -> Result<Vec<u8>> {
38 let mut k = super::all::new(ns, db).encode_key()?;
39 k.extend_from_slice(b"!ml\xff");
40 Ok(k)
41}
42
43impl Categorise for Ml<'_> {
44 fn categorise(&self) -> Category {
45 Category::DatabaseModel
46 }
47}
48
49impl<'a> Ml<'a> {
50 pub fn new(ns: NamespaceId, db: DatabaseId, ml: &'a str, vn: &'a str) -> Self {
51 Self {
52 __: b'/',
53 _a: b'*',
54 ns,
55 _b: b'*',
56 db,
57 _c: b'!',
58 _d: b'm',
59 _e: b'l',
60 ml: Cow::Borrowed(ml),
61 vn: Cow::Borrowed(vn),
62 }
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn key() {
72 let val = Ml::new(NamespaceId(1), DatabaseId(2), "testml", "1.0.0");
73 let enc = Ml::encode_key(&val).unwrap();
74 assert_eq!(enc, b"/*\x00\x00\x00\x01*\x00\x00\x00\x02!mltestml\x001.0.0\0");
75 }
76
77 #[test]
78 fn test_prefix() {
79 let val = super::prefix(NamespaceId(1), DatabaseId(2)).unwrap();
80 assert_eq!(val, b"/*\x00\x00\x00\x01*\x00\x00\x00\x02!ml\0");
81 }
82
83 #[test]
84 fn test_suffix() {
85 let val = super::suffix(NamespaceId(1), DatabaseId(2)).unwrap();
86 assert_eq!(val, b"/*\x00\x00\x00\x01*\x00\x00\x00\x02!ml\xff");
87 }
88}