surrealdb_sql/
index.rs

1use crate::ident::Ident;
2use crate::scoring::Scoring;
3use crate::Number;
4use revision::revisioned;
5use serde::{Deserialize, Serialize};
6use std::fmt;
7use std::fmt::{Display, Formatter};
8
9#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
10#[revisioned(revision = 1)]
11pub enum Index {
12	/// (Basic) non unique
13	#[default]
14	Idx,
15	/// Unique index
16	Uniq,
17	/// Index with Full-Text search capabilities
18	Search(SearchParams),
19	/// M-Tree index for distance based metrics
20	MTree(MTreeParams),
21}
22
23#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
24#[revisioned(revision = 1)]
25pub struct SearchParams {
26	pub az: Ident,
27	pub hl: bool,
28	pub sc: Scoring,
29	pub doc_ids_order: u32,
30	pub doc_lengths_order: u32,
31	pub postings_order: u32,
32	pub terms_order: u32,
33}
34
35#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
36#[revisioned(revision = 1)]
37pub struct MTreeParams {
38	pub dimension: u16,
39	pub distance: Distance,
40	pub vector_type: VectorType,
41	pub capacity: u16,
42	pub doc_ids_order: u32,
43}
44
45#[derive(Clone, Default, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
46#[revisioned(revision = 1)]
47pub enum Distance {
48	#[default]
49	Euclidean,
50	Manhattan,
51	Hamming,
52	Minkowski(Number),
53}
54
55impl Display for Distance {
56	fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
57		match self {
58			Self::Euclidean => f.write_str("EUCLIDEAN"),
59			Self::Manhattan => f.write_str("MANHATTAN"),
60			Self::Hamming => f.write_str("HAMMING"),
61			Self::Minkowski(order) => write!(f, "MINKOWSKI {}", order),
62		}
63	}
64}
65
66#[derive(Clone, Copy, Default, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
67#[revisioned(revision = 1)]
68pub enum VectorType {
69	#[default]
70	F64,
71	F32,
72	I64,
73	I32,
74	I16,
75}
76
77impl Display for VectorType {
78	fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
79		match self {
80			Self::F64 => f.write_str("F64"),
81			Self::F32 => f.write_str("F32"),
82			Self::I64 => f.write_str("I64"),
83			Self::I32 => f.write_str("I32"),
84			Self::I16 => f.write_str("I16"),
85		}
86	}
87}
88
89impl Display for Index {
90	fn fmt(&self, f: &mut Formatter) -> fmt::Result {
91		match self {
92			Self::Idx => Ok(()),
93			Self::Uniq => f.write_str("UNIQUE"),
94			Self::Search(p) => {
95				write!(
96					f,
97					"SEARCH ANALYZER {} {} DOC_IDS_ORDER {} DOC_LENGTHS_ORDER {} POSTINGS_ORDER {} TERMS_ORDER {}",
98					p.az,
99					p.sc,
100					p.doc_ids_order,
101					p.doc_lengths_order,
102					p.postings_order,
103					p.terms_order
104				)?;
105				if p.hl {
106					f.write_str(" HIGHLIGHTS")?
107				}
108				Ok(())
109			}
110			Self::MTree(p) => {
111				write!(
112					f,
113					"MTREE DIMENSION {} DIST {} TYPE {} CAPACITY {} DOC_IDS_ORDER {}",
114					p.dimension, p.distance, p.vector_type, p.capacity, p.doc_ids_order
115				)
116			}
117		}
118	}
119}