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}