velesdb_core/database/
graph_ops.rs1use crate::collection::GraphCollection;
4use crate::{CollectionType, DistanceMetric, Result};
5
6use super::Database;
7
8impl Database {
9 #[allow(clippy::needless_pass_by_value)] pub fn create_graph_collection(
16 &self,
17 name: &str,
18 schema: crate::collection::GraphSchema,
19 ) -> Result<()> {
20 self.ensure_collection_name_available(name)?;
21 let path = self.data_dir.join(name);
22 let coll =
23 GraphCollection::create(path, name, None, DistanceMetric::Cosine, schema.clone())?;
24 self.register_graph_collection(name, &coll, None, DistanceMetric::Cosine, &schema);
25 Ok(())
26 }
27
28 #[allow(clippy::needless_pass_by_value)] pub fn create_graph_collection_with_embeddings(
39 &self,
40 name: &str,
41 schema: crate::collection::GraphSchema,
42 dimension: usize,
43 metric: DistanceMetric,
44 ) -> Result<()> {
45 self.ensure_collection_name_available(name)?;
46 self.enforce_vector_dimension_limit(dimension)?;
47 let path = self.data_dir.join(name);
48 let coll = GraphCollection::create(path, name, Some(dimension), metric, schema.clone())?;
49 self.register_graph_collection(name, &coll, Some(dimension), metric, &schema);
50 Ok(())
51 }
52
53 pub(super) fn create_graph_collection_from_type(
55 &self,
56 name: &str,
57 dimension: Option<usize>,
58 metric: DistanceMetric,
59 schema: &crate::collection::GraphSchema,
60 ) -> Result<()> {
61 self.ensure_collection_name_available(name)?;
62 if let Some(d) = dimension {
63 self.enforce_vector_dimension_limit(d)?;
64 }
65 let path = self.data_dir.join(name);
66 let coll = GraphCollection::create(path, name, dimension, metric, schema.clone())?;
67 self.register_graph_collection(name, &coll, dimension, metric, schema);
68 Ok(())
69 }
70
71 fn register_graph_collection(
74 &self,
75 name: &str,
76 coll: &GraphCollection,
77 dimension: Option<usize>,
78 metric: DistanceMetric,
79 schema: &crate::collection::GraphSchema,
80 ) {
81 self.push_runtime_limits(&coll.inner);
83
84 self.graph_colls
85 .write()
86 .insert(name.to_string(), coll.clone());
87
88 if let Some(ref obs) = self.observer {
89 let kind = CollectionType::Graph {
90 dimension,
91 metric,
92 schema: schema.clone(),
93 };
94 obs.on_collection_created(name, &kind);
95 }
96
97 self.schema_version
98 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
99 }
100
101 #[must_use]
110 pub fn get_graph_collection(&self, name: &str) -> Option<GraphCollection> {
111 if let Some(c) = self.graph_colls.read().get(name).cloned() {
112 return Some(c);
113 }
114 self.open_graph_collection_from_disk(name)
115 }
116
117 fn open_graph_collection_from_disk(&self, name: &str) -> Option<GraphCollection> {
119 let cfg = self.read_collection_config(name)?;
120 cfg.graph_schema.as_ref()?;
121 let coll = GraphCollection::open(self.data_dir.join(name)).ok()?;
122 self.push_runtime_limits(&coll.inner);
124 self.graph_colls
125 .write()
126 .insert(name.to_string(), coll.clone());
127 Some(coll)
128 }
129}