heliosdb_nano/
embedded_db_dump.rs1use crate::{EmbeddedDatabase, Result, Tuple, Schema};
4use crate::storage::dump::{DatabaseInterface, DatabaseRestoreInterface, IndexMetadata};
5
6impl DatabaseInterface for EmbeddedDatabase {
7 fn list_tables(&self) -> Result<Vec<String>> {
8 let catalog = self.storage.catalog();
9 catalog.list_tables()
10 }
11
12 fn get_table_schema(&self, table: &str) -> Result<Schema> {
13 let catalog = self.storage.catalog();
14 catalog.get_table_schema(table)
15 }
16
17 fn scan_table(&self, table: &str) -> Result<Vec<Tuple>> {
18 self.storage.scan_table(table)
19 }
20
21 fn get_table_indexes(&self, table: &str) -> Result<Vec<IndexMetadata>> {
22 let vector_indexes = self.storage.vector_indexes();
24 let all_metadata = vector_indexes.list_all_metadata();
25
26 let indexes: Vec<IndexMetadata> = all_metadata
28 .into_iter()
29 .filter(|meta| meta.table_name == table)
30 .map(|meta| {
31 let index_type = match &meta.index_type {
32 crate::storage::VectorIndexType::Standard(_) => "hnsw",
33 crate::storage::VectorIndexType::Quantized(_) => "hnsw_pq",
34 };
35 IndexMetadata {
36 name: meta.name,
37 index_type: index_type.to_string(),
38 columns: vec![meta.column_name],
39 is_unique: false, }
41 })
42 .collect();
43
44 Ok(indexes)
45 }
46}
47
48impl DatabaseRestoreInterface for EmbeddedDatabase {
49 fn create_table(&mut self, name: &str, schema: Schema) -> Result<()> {
50 let catalog = self.storage.catalog();
51 catalog.create_table(name, schema)?;
52 Ok(())
53 }
54
55 fn create_index(&mut self, table: &str, index: &IndexMetadata) -> Result<()> {
56 let using_clause = match index.index_type.as_str() {
59 "hnsw" | "hnsw_pq" => "USING hnsw",
60 "btree" => "", "hash" => "USING hash",
62 "gin" => "USING gin",
63 _ => "", };
65
66 let columns = index.columns.join(", ");
67 let unique_clause = if index.is_unique { "UNIQUE " } else { "" };
68
69 let sql = format!(
70 "CREATE {}INDEX {} ON {} {} ({})",
71 unique_clause,
72 index.name,
73 table,
74 using_clause,
75 columns
76 );
77
78 self.execute(&sql)?;
80 Ok(())
81 }
82
83 fn insert_row(&mut self, table: &str, row: Tuple) -> Result<()> {
84 self.storage.insert_tuple(table, row)?;
85 Ok(())
86 }
87}