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 #[default]
14 Idx,
15 Uniq,
17 Search(SearchParams),
19 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}