reifydb_engine/vm/
services.rs1use std::sync::Arc;
5
6use reifydb_auth::registry::AuthenticationRegistry;
7use reifydb_catalog::{
8 catalog::Catalog,
9 metrics::storage::metrics::MetricsReader,
10 vtable::{system::operator_libary::OperatorLibrary, user::registry::UserVTableRegistry},
11};
12use reifydb_core::util::ioc::IocContainer;
13use reifydb_extension::transform::registry::Transforms;
14#[cfg(test)]
15use reifydb_routine::{
16 function::default_in_process_functions, monoid::default_in_process_monoids,
17 procedure::default_in_process_procedures,
18};
19use reifydb_routine_abi::{Procedure, registry::Routines};
20use reifydb_rql::compiler::Compiler;
21use reifydb_runtime::context::RuntimeContext;
22#[cfg(test)]
23use reifydb_runtime::context::clock::Clock;
24use reifydb_store_single::SingleStore;
25use reifydb_transaction::transaction::Transaction;
26use reifydb_value::value::sumtype::VariantRef;
27
28#[cfg(not(reifydb_single_threaded))]
29use crate::remote::RemoteRegistry;
30use crate::vm::flow_lineage::ViewLineage;
31
32pub struct EngineConfig {
33 pub runtime_context: RuntimeContext,
34 pub routines: Routines,
35 pub transforms: Transforms,
36 pub ioc: IocContainer,
37 #[cfg(not(reifydb_single_threaded))]
38 pub remote_registry: Option<RemoteRegistry>,
39}
40
41pub struct Services {
42 pub catalog: Catalog,
43 pub runtime_context: RuntimeContext,
44 pub compiler: Compiler,
45 pub routines: Routines,
46 pub transforms: Transforms,
47 pub operators: OperatorLibrary,
48 pub virtual_table_registry: UserVTableRegistry,
49 pub metrics_reader: MetricsReader<SingleStore>,
50 pub ioc: IocContainer,
51 pub auth_registry: AuthenticationRegistry,
52 pub view_lineage: ViewLineage,
53 #[cfg(not(reifydb_single_threaded))]
54 pub remote_registry: Option<RemoteRegistry>,
55}
56
57impl Services {
58 pub fn new(
59 catalog: Catalog,
60 config: EngineConfig,
61 operator_store: OperatorLibrary,
62 metrics_reader: MetricsReader<SingleStore>,
63 ) -> Self {
64 let auth_registry = AuthenticationRegistry::new(config.runtime_context.clock.clone());
65 Self {
66 compiler: Compiler::new(catalog.clone()),
67 catalog,
68 runtime_context: config.runtime_context,
69 routines: config.routines,
70 transforms: config.transforms,
71 operators: operator_store,
72 virtual_table_registry: UserVTableRegistry::new(),
73 metrics_reader,
74 ioc: config.ioc,
75 auth_registry,
76 view_lineage: ViewLineage::default(),
77 #[cfg(not(reifydb_single_threaded))]
78 remote_registry: config.remote_registry,
79 }
80 }
81
82 pub fn get_handlers(&self, txn: &mut Transaction<'_>, variant: VariantRef) -> Vec<Arc<dyn Procedure>> {
83 self.routines.get_handlers(&self.catalog, txn, variant)
84 }
85
86 pub fn get_procedure(&self, name: &str) -> Option<Arc<dyn Procedure>> {
87 self.routines.get_procedure(name)
88 }
89
90 #[cfg(test)]
91 pub fn testing() -> Arc<Self> {
92 let store = SingleStore::testing_memory();
93
94 let routines_builder = Routines::builder();
95 let routines_builder = default_in_process_functions(routines_builder);
96 let routines_builder = default_in_process_procedures(routines_builder);
97 let routines_builder = default_in_process_monoids(routines_builder);
98 let routines = routines_builder.configure();
99
100 let mut services = Self::new(
101 Catalog::testing(),
102 EngineConfig {
103 runtime_context: RuntimeContext::with_clock(Clock::Real),
104 routines,
105 transforms: Transforms::empty(),
106 ioc: IocContainer::new(),
107 #[cfg(not(reifydb_single_threaded))]
108 remote_registry: None,
109 },
110 OperatorLibrary::new(),
111 MetricsReader::new(store),
112 );
113 services.auth_registry = AuthenticationRegistry::default();
114 Arc::new(services)
115 }
116}