Skip to main content

heliosdb_nano/
embedded_db_dump.rs

1//! Implementation of dump/restore traits for EmbeddedDatabase
2
3use 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        // Get vector indexes from the vector index manager
23        let vector_indexes = self.storage.vector_indexes();
24        let all_metadata = vector_indexes.list_all_metadata();
25
26        // Filter indexes for this specific table and convert to IndexMetadata
27        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, // Vector indexes are not unique constraint indexes
40                }
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        // Build and execute CREATE INDEX SQL statement
57        // Handle different index types (hnsw, btree, etc.)
58        let using_clause = match index.index_type.as_str() {
59            "hnsw" | "hnsw_pq" => "USING hnsw",
60            "btree" => "",  // Default type
61            "hash" => "USING hash",
62            "gin" => "USING gin",
63            _ => "", // Default to btree
64        };
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        // Execute the CREATE INDEX statement
79        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}