qdrant_datafusion/arrow/
schema.rs1use std::sync::Arc;
3
4use datafusion::arrow::datatypes::*;
5use qdrant_client::qdrant::{CollectionConfig, Datatype, VectorParams, vectors_config};
6
7use crate::error::{Error, Result};
8
9pub fn is_multi_vector_field(field: &Field) -> bool {
11 matches!(
12 field.data_type(),
13 DataType::List(inner) if matches!(inner.data_type(), DataType::List(_))
14 )
15}
16
17pub fn datatype_to_arrow(_dt: Datatype) -> DataType {
19 DataType::Float32
22 }
28
29pub fn create_vector_field(name: &str, dt: Datatype, nullable: bool) -> FieldRef {
31 Field::new(name, datatype_to_arrow(dt), nullable).into()
32}
33
34pub fn create_vector_param_field(name: &str, vector_params: &VectorParams) -> Field {
36 if vector_params.multivector_config.is_some() {
37 Field::new(
38 name,
39 DataType::List(Arc::new(Field::new(
40 "item",
41 DataType::List(create_vector_field("item", vector_params.datatype(), true)),
42 true,
43 ))),
44 true, )
46 } else {
47 Field::new(
48 name,
49 DataType::List(create_vector_field("item", vector_params.datatype(), true)),
50 true, )
52 }
53}
54
55pub fn collection_to_arrow_schema(collection: &str, config: &CollectionConfig) -> Result<Schema> {
60 let mut fields = vec![
61 Field::new("id", DataType::Utf8, false),
63 Field::new("payload", DataType::Utf8, true),
65 ];
66
67 let params =
69 config.params.as_ref().ok_or(Error::MissingCollectionInfoParams(collection.into()))?;
70
71 if let Some(config) = params.vectors_config.as_ref().and_then(|c| c.config.as_ref()) {
73 match config {
74 vectors_config::Config::Params(vector_params) => {
75 fields.push(create_vector_param_field("vector", vector_params));
77 }
78 vectors_config::Config::ParamsMap(params_map) => {
79 fields.extend(
81 params_map
82 .map
83 .iter()
84 .map(|(name, params)| create_vector_param_field(name, params)),
85 );
86 }
87 }
88 }
89
90 if let Some(sparse_config) = ¶ms.sparse_vectors_config {
92 for name in sparse_config.map.keys() {
94 fields.push(Field::new(
96 format!("{name}_indices"),
97 DataType::List(Field::new("item", DataType::UInt32, true).into()),
98 true, ));
100 fields.push(Field::new(
102 format!("{name}_values"),
103 DataType::List(create_vector_field("item", Datatype::Float32, true)),
104 true, ));
106 }
107 }
108
109 Ok(Schema::new(fields))
110}