Skip to main content

qdrant_client/builders/
binary_quantization_builder.rs

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