Skip to main content

gen_models/
metadata.rs

1use gen_core::traits::Capnp;
2use rusqlite::Row;
3
4use crate::{db::GraphConnection, gen_models_capnp::metadata, traits::*};
5
6#[derive(Clone, Debug, PartialEq)]
7pub struct Metadata {
8    pub db_uuid: String,
9}
10
11impl<'a> Capnp<'a> for Metadata {
12    type Builder = metadata::Builder<'a>;
13    type Reader = metadata::Reader<'a>;
14
15    fn write_capnp(&self, builder: &mut Self::Builder) {
16        builder.set_db_uuid(&self.db_uuid);
17    }
18
19    fn read_capnp(reader: Self::Reader) -> Self {
20        let db_uuid = reader.get_db_uuid().unwrap().to_string().unwrap();
21        Metadata { db_uuid }
22    }
23}
24
25impl Query for Metadata {
26    type Model = Metadata;
27
28    const TABLE_NAME: &'static str = "gen_metadata";
29
30    fn process_row(row: &Row) -> Self::Model {
31        Metadata {
32            db_uuid: row.get(0).unwrap(),
33        }
34    }
35}
36
37impl Metadata {
38    pub fn get_db_uuid(conn: &GraphConnection) -> String {
39        let metadata = Metadata::get(conn, "SELECT db_uuid FROM gen_metadata LIMIT 1", [])
40            .expect("Failed to get database UUID from metadata");
41        metadata.db_uuid
42    }
43
44    pub fn get_all(conn: &GraphConnection) -> Vec<Metadata> {
45        Metadata::query(conn, "SELECT db_uuid FROM gen_metadata", [])
46    }
47}
48
49// Keep the old function for backwards compatibility
50pub fn get_db_uuid(conn: &GraphConnection) -> String {
51    Metadata::get_db_uuid(conn)
52}
53
54#[cfg(test)]
55mod tests {
56    // Note this useful idiom: importing names from outer (for mod tests) scope.
57    use capnp::message::TypedBuilder;
58
59    use super::*;
60    use crate::test_helpers::get_connection;
61
62    #[test]
63    fn test_metadata_capnp_serialization() {
64        let metadata = Metadata {
65            db_uuid: "test-uuid-12345".to_string(),
66        };
67
68        let mut message = TypedBuilder::<metadata::Owned>::new_default();
69        let mut root = message.init_root();
70        metadata.write_capnp(&mut root);
71
72        let deserialized = Metadata::read_capnp(root.into_reader());
73        assert_eq!(metadata, deserialized);
74    }
75
76    #[test]
77    fn test_sets_uuid() {
78        let conn = get_connection(None).unwrap();
79        assert!(!get_db_uuid(&conn).is_empty());
80    }
81
82    #[test]
83    fn test_table_name_constants() {
84        use crate::{
85            accession::{Accession, AccessionEdge, AccessionPath},
86            annotations::Annotation,
87            block_group::BlockGroup,
88            block_group_edge::BlockGroupEdge,
89            collection::Collection,
90            edge::Edge,
91            files::GenDatabase,
92            metadata::Metadata,
93            node::Node,
94            operations::{Branch, FileAddition, Operation, OperationSummary},
95            path::Path,
96            path_edge::PathEdge,
97            sample::Sample,
98        };
99
100        // Test core models
101        assert_eq!(Node::table_name(), "nodes");
102        assert_eq!(Collection::table_name(), "collections");
103        assert_eq!(Sample::table_name(), "samples");
104
105        // Test graph models
106        assert_eq!(Edge::table_name(), "edges");
107        assert_eq!(Path::table_name(), "paths");
108        assert_eq!(PathEdge::table_name(), "path_edges");
109        assert_eq!(BlockGroup::table_name(), "block_groups");
110        assert_eq!(BlockGroupEdge::table_name(), "block_group_edges");
111
112        // Test accession models
113        assert_eq!(Accession::table_name(), "accessions");
114        assert_eq!(AccessionEdge::table_name(), "accession_edges");
115        assert_eq!(AccessionPath::table_name(), "accession_paths");
116        assert_eq!(Annotation::table_name(), "annotations");
117
118        // Test operation models
119        assert_eq!(Operation::table_name(), "operations");
120        assert_eq!(FileAddition::table_name(), "file_additions");
121        assert_eq!(OperationSummary::table_name(), "operation_summaries");
122        assert_eq!(Branch::table_name(), "branches");
123
124        // Test remaining models
125        assert_eq!(GenDatabase::table_name(), "gen_databases");
126        assert_eq!(Metadata::table_name(), "gen_metadata");
127    }
128}