Skip to main content

fraiseql_core/federation/
direct_db_resolver.rs

1//! Direct database entity resolution for federation.
2//!
3//! Resolves entities from remote FraiseQL database instances via direct database connections,
4//! achieving <20ms latency by eliminating HTTP overhead.
5
6use crate::{error::Result, federation::connection_manager::ConnectionManager};
7
8/// Resolves entities from remote databases via direct connections
9pub struct DirectDatabaseResolver {
10    /// Manages connections to remote databases
11    connection_manager: ConnectionManager,
12}
13
14impl Default for DirectDatabaseResolver {
15    fn default() -> Self {
16        Self::new()
17    }
18}
19
20impl DirectDatabaseResolver {
21    /// Create a new direct database resolver
22    pub fn new() -> Self {
23        Self {
24            connection_manager: ConnectionManager::new(),
25        }
26    }
27
28    /// Get the number of cached remote connections
29    pub fn connection_count(&self) -> Result<usize> {
30        self.connection_manager.connection_count()
31    }
32
33    /// Close a specific remote connection
34    pub fn close_connection(&self, connection_string: &str) -> Result<()> {
35        self.connection_manager.close_connection(connection_string)
36    }
37
38    /// Close all remote connections
39    pub fn close_all(&self) -> Result<()> {
40        self.connection_manager.close_all()
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn test_direct_database_resolver_creation() {
50        let _resolver = DirectDatabaseResolver::new();
51    }
52
53    #[test]
54    fn test_connection_count_empty() {
55        let resolver = DirectDatabaseResolver::new();
56        assert_eq!(resolver.connection_count().unwrap(), 0);
57    }
58
59    #[test]
60    fn test_close_all() {
61        let resolver = DirectDatabaseResolver::new();
62        assert!(resolver.close_all().is_ok());
63    }
64
65    #[test]
66    fn test_close_connection() {
67        let resolver = DirectDatabaseResolver::new();
68        assert!(resolver.close_connection("postgresql://localhost/db").is_ok());
69    }
70}