qdrant_client/builders/
binary_quantization_builder.rs

1use crate::qdrant::*;
2
3#[derive(Clone)]
4pub struct BinaryQuantizationBuilder {
5    /// If true - quantized vectors always will be stored in RAM, ignoring the config of main storage
6    pub(crate) always_ram: Option<Option<bool>>,
7    pub(crate) encoding: Option<Option<i32>>,
8    pub(crate) query_encoding: Option<Option<BinaryQuantizationQueryEncoding>>,
9}
10
11impl BinaryQuantizationBuilder {
12    /// If true - quantized vectors always will be stored in RAM, ignoring the config of main storage
13    pub fn always_ram(self, value: bool) -> Self {
14        let mut new = self;
15        new.always_ram = Some(Some(value));
16        new
17    }
18
19    /// Binary quantization encoding method
20    pub fn encoding(self, value: impl Into<BinaryQuantizationEncoding>) -> Self {
21        let mut new = self;
22        let encoding: BinaryQuantizationEncoding = value.into();
23        new.encoding = Some(Some(encoding.into()));
24        new
25    }
26
27    /// Asymmetric quantization configuration allows a query to have different quantization than stored vectors.
28    /// It can increase the accuracy of search at the cost of performance.
29    pub fn query_encoding(self, value: impl Into<BinaryQuantizationQueryEncoding>) -> Self {
30        let mut new = self;
31        new.query_encoding = Some(Some(value.into()));
32        new
33    }
34
35    fn build_inner(self) -> Result<BinaryQuantization, BinaryQuantizationBuilderError> {
36        Ok(BinaryQuantization {
37            always_ram: self.always_ram.unwrap_or_default(),
38            encoding: self.encoding.unwrap_or_default(),
39            query_encoding: self.query_encoding.unwrap_or_default(),
40        })
41    }
42    /// Create an empty builder, with all fields set to `None` or `PhantomData`.
43    fn create_empty() -> Self {
44        Self {
45            always_ram: Default::default(),
46            encoding: Default::default(),
47            query_encoding: Default::default(),
48        }
49    }
50}
51
52impl From<BinaryQuantizationBuilder> for BinaryQuantization {
53    fn from(value: BinaryQuantizationBuilder) -> Self {
54        value.build_inner().unwrap_or_else(|_| {
55            panic!(
56                "Failed to convert {0} to {1}",
57                "BinaryQuantizationBuilder", "BinaryQuantization"
58            )
59        })
60    }
61}
62
63impl BinaryQuantizationBuilder {
64    /// Builds the desired type. Can often be omitted.
65    pub fn build(self) -> BinaryQuantization {
66        self.build_inner().unwrap_or_else(|_| {
67            panic!(
68                "Failed to build {0} into {1}",
69                "BinaryQuantizationBuilder", "BinaryQuantization"
70            )
71        })
72    }
73}
74
75impl BinaryQuantizationBuilder {
76    pub(crate) fn empty() -> Self {
77        Self::create_empty()
78    }
79}
80
81#[non_exhaustive]
82#[derive(Debug)]
83pub enum BinaryQuantizationBuilderError {
84    /// Uninitialized field
85    UninitializedField(&'static str),
86    /// Custom validation error
87    ValidationError(String),
88}
89
90// Implementing the Display trait for better error messages
91impl std::fmt::Display for BinaryQuantizationBuilderError {
92    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
93        match self {
94            Self::UninitializedField(field) => {
95                write!(f, "`{field}` must be initialized")
96            }
97            Self::ValidationError(error) => write!(f, "{error}"),
98        }
99    }
100}
101
102// Implementing the Error trait
103impl std::error::Error for BinaryQuantizationBuilderError {}
104
105// Implementing From trait for conversion from UninitializedFieldError
106impl From<derive_builder::UninitializedFieldError> for BinaryQuantizationBuilderError {
107    fn from(error: derive_builder::UninitializedFieldError) -> Self {
108        Self::UninitializedField(error.field_name())
109    }
110}
111
112// Implementing From trait for conversion from String
113impl From<String> for BinaryQuantizationBuilderError {
114    fn from(error: String) -> Self {
115        Self::ValidationError(error)
116    }
117}
118
119impl BinaryQuantizationQueryEncoding {
120    pub fn scalar8bits() -> Self {
121        Self {
122            variant: Some(binary_quantization_query_encoding::Variant::Setting(
123                binary_quantization_query_encoding::Setting::Scalar8Bits.into(),
124            )),
125        }
126    }
127
128    pub fn scalar4bits() -> Self {
129        Self {
130            variant: Some(binary_quantization_query_encoding::Variant::Setting(
131                binary_quantization_query_encoding::Setting::Scalar4Bits.into(),
132            )),
133        }
134    }
135
136    pub fn binary() -> Self {
137        Self {
138            variant: Some(binary_quantization_query_encoding::Variant::Setting(
139                binary_quantization_query_encoding::Setting::Binary.into(),
140            )),
141        }
142    }
143
144    pub fn default_encoding() -> Self {
145        Self {
146            variant: Some(binary_quantization_query_encoding::Variant::Setting(
147                binary_quantization_query_encoding::Setting::Default.into(),
148            )),
149        }
150    }
151}