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