1#![cfg_attr(
9 test,
10 allow(clippy::unwrap_used, clippy::expect_used, clippy::unwrap_in_result)
11)]
12
13use std::sync::Arc;
14
15use vortex_array::arrays::scalar_fn::plugin::ScalarFnArrayPlugin;
16use vortex_array::arrow::ArrowSessionExt;
17use vortex_array::dtype::session::DTypeSessionExt;
18use vortex_array::scalar_fn::session::ScalarFnSessionExt;
19use vortex_array::session::ArraySessionExt;
20use vortex_session::VortexSession;
21
22use crate::scalar_fns::cosine_similarity::CosineSimilarity;
23use crate::scalar_fns::inner_product::InnerProduct;
24use crate::scalar_fns::l2_denorm::L2Denorm;
25use crate::scalar_fns::l2_norm::L2Norm;
26use crate::types::fixed_shape_tensor::FixedShapeTensor;
27use crate::types::vector::Vector;
28
29pub mod matcher;
30pub mod scalar_fns;
31
32mod types;
33
34pub use types::fixed_shape_tensor;
35pub use types::vector;
36
37pub mod encodings;
38
39pub mod vector_search;
40
41mod utils;
42
43pub const SCALAR_FN_ARRAY_TENSOR_PLUGIN_ENV: &str = "VX_SCALAR_FN_ARRAY_TENSOR_PLUGIN";
49
50pub fn initialize(session: &VortexSession) {
52 session.dtypes().register(Vector);
53 session.dtypes().register(FixedShapeTensor);
54
55 let arrow_session = session.arrow();
56 arrow_session.register_exporter(Arc::new(Vector));
57 arrow_session.register_importer(Arc::new(Vector));
58
59 let session_fns = session.scalar_fns();
60
61 session_fns.register(CosineSimilarity);
62 session_fns.register(InnerProduct);
63 session_fns.register(L2Denorm);
64 session_fns.register(L2Norm);
65
66 if std::env::var_os(SCALAR_FN_ARRAY_TENSOR_PLUGIN_ENV).is_some_and(|v| !v.is_empty()) {
71 let session_arrays = session.arrays();
72
73 session_arrays.register(ScalarFnArrayPlugin::new(CosineSimilarity));
74 session_arrays.register(ScalarFnArrayPlugin::new(InnerProduct));
75 session_arrays.register(ScalarFnArrayPlugin::new(L2Denorm));
76 session_arrays.register(ScalarFnArrayPlugin::new(L2Norm));
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use std::sync::LazyLock;
83
84 use vortex_array::session::ArraySession;
85 use vortex_session::VortexSession;
86
87 pub static SESSION: LazyLock<VortexSession> = LazyLock::new(|| {
88 let session = VortexSession::empty().with::<ArraySession>();
89 crate::initialize(&session);
90 session
91 });
92}