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 pub auth_registry: Arc<AuthenticationRegistry>,
38 #[cfg(not(reifydb_single_threaded))]
39 pub remote_registry: Option<RemoteRegistry>,
40}
41
42pub struct Services {
43 pub catalog: Catalog,
44 pub runtime_context: RuntimeContext,
45 pub compiler: Compiler,
46 pub routines: Routines,
47 pub transforms: Transforms,
48 pub operators: OperatorLibrary,
49 pub virtual_table_registry: UserVTableRegistry,
50 pub metrics_reader: MetricsReader<SingleStore>,
51 pub ioc: IocContainer,
52 pub auth_registry: Arc<AuthenticationRegistry>,
53 pub view_lineage: ViewLineage,
54 #[cfg(not(reifydb_single_threaded))]
55 pub remote_registry: Option<RemoteRegistry>,
56}
57
58impl Services {
59 pub fn new(
60 catalog: Catalog,
61 config: EngineConfig,
62 operator_store: OperatorLibrary,
63 metrics_reader: MetricsReader<SingleStore>,
64 ) -> Self {
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: config.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 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 auth_registry: Arc::new(AuthenticationRegistry::default()),
108 #[cfg(not(reifydb_single_threaded))]
109 remote_registry: None,
110 },
111 OperatorLibrary::new(),
112 MetricsReader::new(store),
113 );
114 Arc::new(services)
115 }
116}