velesdb_core/database/
vector_ops.rs1use crate::collection::VectorCollection;
4use crate::{CollectionType, DistanceMetric, Result, StorageMode};
5
6use super::Database;
7
8#[allow(deprecated)]
9impl Database {
10 pub fn create_vector_collection(
16 &self,
17 name: &str,
18 dimension: usize,
19 metric: DistanceMetric,
20 ) -> Result<()> {
21 self.create_vector_collection_with_options(name, dimension, metric, StorageMode::default())
22 }
23
24 pub fn create_vector_collection_with_options(
30 &self,
31 name: &str,
32 dimension: usize,
33 metric: DistanceMetric,
34 storage_mode: StorageMode,
35 ) -> Result<()> {
36 self.ensure_collection_name_available(name)?;
37 let path = self.data_dir.join(name);
38 let coll = VectorCollection::create(path, name, dimension, metric, storage_mode)?;
39 self.register_vector_collection(name, &coll, dimension, metric, storage_mode);
40 Ok(())
41 }
42
43 pub fn create_vector_collection_with_hnsw(
52 &self,
53 name: &str,
54 dimension: usize,
55 metric: DistanceMetric,
56 storage_mode: StorageMode,
57 m: Option<usize>,
58 ef_construction: Option<usize>,
59 ) -> Result<()> {
60 self.ensure_collection_name_available(name)?;
61 let path = self.data_dir.join(name);
62 let coll = VectorCollection::create_with_hnsw(
63 path,
64 name,
65 dimension,
66 metric,
67 storage_mode,
68 m,
69 ef_construction,
70 )?;
71 self.register_vector_collection(name, &coll, dimension, metric, storage_mode);
72 Ok(())
73 }
74
75 fn register_vector_collection(
78 &self,
79 name: &str,
80 coll: &VectorCollection,
81 dimension: usize,
82 metric: DistanceMetric,
83 storage_mode: StorageMode,
84 ) {
85 self.collections
86 .write()
87 .insert(name.to_string(), coll.inner.clone());
88 self.vector_colls
89 .write()
90 .insert(name.to_string(), coll.clone());
91
92 if let Some(ref obs) = self.observer {
93 let kind = CollectionType::Vector {
94 dimension,
95 metric,
96 storage_mode,
97 };
98 obs.on_collection_created(name, &kind);
99 }
100
101 self.schema_version
102 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
103 }
104
105 #[must_use]
115 pub fn get_vector_collection(&self, name: &str) -> Option<VectorCollection> {
116 if let Some(c) = self.vector_colls.read().get(name).cloned() {
117 return Some(c);
118 }
119 self.open_vector_collection_from_disk(name)
120 }
121
122 fn open_vector_collection_from_disk(&self, name: &str) -> Option<VectorCollection> {
124 let cfg = self.read_collection_config(name)?;
125 if cfg.graph_schema.is_some() || cfg.metadata_only {
126 return None;
127 }
128 let coll = VectorCollection::open(self.data_dir.join(name)).ok()?;
129 self.vector_colls
130 .write()
131 .insert(name.to_string(), coll.clone());
132 Some(coll)
133 }
134}