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_value::value::sumtype::VariantRef;
24
25#[cfg(not(reifydb_single_threaded))]
26use crate::remote::RemoteRegistry;
27use crate::vm::flow_lineage::ViewLineage;
28
29pub struct EngineConfig {
30 pub runtime_context: RuntimeContext,
31 pub routines: Routines,
32 pub transforms: Transforms,
33 pub ioc: IocContainer,
34 #[cfg(not(reifydb_single_threaded))]
35 pub remote_registry: Option<RemoteRegistry>,
36}
37
38pub struct Services {
39 pub catalog: Catalog,
40 pub runtime_context: RuntimeContext,
41 pub compiler: Compiler,
42 pub routines: Routines,
43 pub transforms: Transforms,
44 pub flow_operator_store: SystemFlowOperatorStore,
45 pub virtual_table_registry: UserVTableRegistry,
46 pub stats_reader: MetricReader<SingleStore>,
47 pub ioc: IocContainer,
48 pub auth_registry: AuthenticationRegistry,
49 pub view_lineage: ViewLineage,
50 #[cfg(not(reifydb_single_threaded))]
51 pub remote_registry: Option<RemoteRegistry>,
52}
53
54impl Services {
55 pub fn new(
56 catalog: Catalog,
57 config: EngineConfig,
58 flow_operator_store: SystemFlowOperatorStore,
59 stats_reader: MetricReader<SingleStore>,
60 ) -> Self {
61 let auth_registry = AuthenticationRegistry::new(config.runtime_context.clock.clone());
62 Self {
63 compiler: Compiler::new(catalog.clone()),
64 catalog,
65 runtime_context: config.runtime_context,
66 routines: config.routines,
67 transforms: config.transforms,
68 flow_operator_store,
69 virtual_table_registry: UserVTableRegistry::new(),
70 stats_reader,
71 ioc: config.ioc,
72 auth_registry,
73 view_lineage: ViewLineage::default(),
74 #[cfg(not(reifydb_single_threaded))]
75 remote_registry: config.remote_registry,
76 }
77 }
78
79 pub fn get_handlers(&self, txn: &mut Transaction<'_>, variant: VariantRef) -> Vec<Arc<dyn Procedure>> {
80 self.routines.get_handlers(&self.catalog, txn, variant)
81 }
82
83 pub fn get_procedure(&self, name: &str) -> Option<Arc<dyn Procedure>> {
84 self.routines.get_procedure(name)
85 }
86
87 #[allow(dead_code)]
88 pub fn testing() -> Arc<Self> {
89 let store = SingleStore::testing_memory();
90
91 let routines_builder = Routines::builder();
92 let routines_builder = default_native_functions(routines_builder);
93 let routines_builder = default_native_procedures(routines_builder);
94 let routines = routines_builder.configure();
95
96 let mut services = Self::new(
97 Catalog::testing(),
98 EngineConfig {
99 runtime_context: RuntimeContext::with_clock(Clock::Real),
100 routines,
101 transforms: Transforms::empty(),
102 ioc: IocContainer::new(),
103 #[cfg(not(reifydb_single_threaded))]
104 remote_registry: None,
105 },
106 SystemFlowOperatorStore::new(),
107 MetricReader::new(store),
108 );
109 services.auth_registry = AuthenticationRegistry::default();
110 Arc::new(services)
111 }
112}