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.graph_colls
82 .write()
83 .insert(name.to_string(), coll.clone());
84
85 if let Some(ref obs) = self.observer {
86 let kind = CollectionType::Graph {
87 dimension,
88 metric,
89 schema: schema.clone(),
90 };
91 obs.on_collection_created(name, &kind);
92 }
93
94 self.schema_version
95 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
96 }
97
98 #[must_use]
107 pub fn get_graph_collection(&self, name: &str) -> Option<GraphCollection> {
108 if let Some(c) = self.graph_colls.read().get(name).cloned() {
109 return Some(c);
110 }
111 self.open_graph_collection_from_disk(name)
112 }
113
114 fn open_graph_collection_from_disk(&self, name: &str) -> Option<GraphCollection> {
116 let cfg = self.read_collection_config(name)?;
117 cfg.graph_schema.as_ref()?;
118 let coll = GraphCollection::open(self.data_dir.join(name)).ok()?;
119 self.graph_colls
120 .write()
121 .insert(name.to_string(), coll.clone());
122 Some(coll)
123 }
124}