use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum Distance {
Cosine,
Euclid,
Dot,
Manhattan,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Datatype {
Float32,
Uint8,
Float16,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VectorSpec {
pub size: u64,
pub distance: Distance,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_disk: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hnsw_config: Option<HnswConfigSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quantization_config: Option<QuantizationSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub datatype: Option<Datatype>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SparseVectorSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_disk: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub full_scan_threshold: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HnswConfigSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub m: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ef_construct: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub full_scan_threshold: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_indexing_threads: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_disk: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payload_m: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum QuantizationSpec {
Scalar(ScalarQuantizationSpec),
Product(ProductQuantizationSpec),
Binary(BinaryQuantizationSpec),
Turboquant(TurboquantQuantizationSpec),
Disabled,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScalarQuantizationSpec {
#[serde(default = "default_int8")]
pub r#type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quantile: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always_ram: Option<bool>,
}
fn default_int8() -> String {
"int8".to_string()
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProductQuantizationSpec {
pub compression: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always_ram: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BinaryQuantizationSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always_ram: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TurboquantQuantizationSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bits: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub always_ram: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OptimizersConfigSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deleted_threshold: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vacuum_min_vector_number: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_segment_number: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_segment_size: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub memmap_threshold: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub indexing_threshold: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub flush_interval_sec: Option<u64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PayloadSchemaType {
Keyword,
Integer,
Float,
Geo,
Text,
Bool,
Datetime,
Uuid,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CollectionSpec {
#[serde(default)]
pub vectors: IndexMap<String, VectorSpec>,
#[serde(default, skip_serializing_if = "IndexMap::is_empty")]
pub sparse_vectors: IndexMap<String, SparseVectorSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hnsw_config: Option<HnswConfigSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quantization_config: Option<QuantizationSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub optimizers_config: Option<OptimizersConfigSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub shard_number: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replication_factor: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub write_consistency_factor: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_disk_payload: Option<bool>,
}