Skip to main content

storage_kit/core/
schema.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5/// Numeric element type used by vector schema fields.
6///
7/// # Examples
8///
9/// ```
10/// let element = storage_kit::database::catalog::VectorElementType::F32;
11/// assert!(matches!(element, storage_kit::database::catalog::VectorElementType::F32));
12/// ```
13#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
14pub enum VectorElementType {
15    /// Stores vector elements as half-precision floating point values.
16    F16,
17    /// Stores vector elements as single-precision floating point values.
18    F32,
19    /// Stores vector elements as double-precision floating point values.
20    F64,
21    /// Signed 16-bit integer.
22    I16,
23    /// Signed 32-bit integer.
24    I32,
25    /// Signed 64-bit integer.
26    I64,
27}
28
29/// Portable field type description used for collection schemas.
30///
31/// # Examples
32///
33/// ```
34/// let field_type = storage_kit::database::catalog::FieldType::DenseVector {
35///     dim: 3,
36///     element: storage_kit::database::catalog::VectorElementType::F32,
37/// };
38/// assert!(matches!(field_type, storage_kit::database::catalog::FieldType::DenseVector { .. }));
39/// ```
40#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
41pub enum FieldType {
42    /// Used for boolean fields.
43    Bool,
44    /// Signed 64-bit integer field.
45    I64,
46    /// Unsigned 64-bit integer field.
47    U64,
48    /// 64-bit floating point field.
49    F64,
50    /// Used for UTF-8 text fields.
51    String,
52    /// Used for fields that hold arbitrary JSON values.
53    ///
54    /// This does not promise native ordering or pattern matching. Supplied
55    /// LanceDB accepts scalar equality, non-equality, and membership on Json
56    /// fields and rejects range and pattern predicates on them.
57    Json,
58    /// Dense vector field with fixed dimension and element type.
59    DenseVector {
60        /// Vector dimensionality.
61        dim: usize,
62        /// Numeric element type.
63        element: VectorElementType,
64    },
65    /// Used for fields that hold opaque binary blobs.
66    Binary,
67}
68
69/// Declares a single collection field.
70///
71/// # Examples
72///
73/// ```
74/// let field = storage_kit::database::catalog::FieldSchema {
75///     name: "title".into(),
76///     field_type: storage_kit::database::catalog::FieldType::String,
77///     nullable: false,
78///     metadata: std::collections::BTreeMap::new(),
79/// };
80/// assert_eq!(field.name, "title");
81/// ```
82#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
83pub struct FieldSchema {
84    /// Field name as exposed by the backend.
85    pub name: String,
86    /// Portable field type assigned to the field.
87    pub field_type: FieldType,
88    /// Whether the field accepts null values.
89    pub nullable: bool,
90    /// Backend-specific metadata preserved with the field.
91    pub metadata: BTreeMap<String, String>,
92}
93
94/// Portable schema description for a collection.
95///
96/// # Examples
97///
98/// ```
99/// let schema = storage_kit::database::catalog::CollectionSchema {
100///     fields: vec![storage_kit::database::catalog::FieldSchema {
101///         name: "title".into(),
102///         field_type: storage_kit::database::catalog::FieldType::String,
103///         nullable: false,
104///         metadata: std::collections::BTreeMap::new(),
105///     }],
106///     metadata: std::collections::BTreeMap::new(),
107/// };
108/// assert_eq!(schema.fields.len(), 1);
109/// ```
110#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
111pub struct CollectionSchema {
112    /// Ordered field list for the collection.
113    pub fields: Vec<FieldSchema>,
114    /// Backend-specific schema metadata preserved with the normalized schema.
115    pub metadata: BTreeMap<String, String>,
116}