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::{block_encoding::registry::BlockEncodings, transform::registry::Transforms};
14#[cfg(test)]
15use reifydb_routine::{function::default_in_process_functions, procedure::default_in_process_procedures};
16use reifydb_routine_abi::{Procedure, registry::Routines};
17use reifydb_rql::compiler::Compiler;
18use reifydb_runtime::context::RuntimeContext;
19#[cfg(test)]
20use reifydb_runtime::context::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 block_encodings: BlockEncodings,
34 pub ioc: IocContainer,
35 pub auth_registry: Arc<AuthenticationRegistry>,
36 #[cfg(not(reifydb_single_threaded))]
37 pub remote_registry: Option<RemoteRegistry>,
38}
39
40pub struct Services {
41 pub catalog: Catalog,
42 pub runtime_context: RuntimeContext,
43 pub compiler: Compiler,
44 pub routines: Routines,
45 pub transforms: Transforms,
46 pub block_encodings: BlockEncodings,
47 pub operators: OperatorLibrary,
48 pub virtual_table_registry: UserVTableRegistry,
49 pub metrics_reader: MetricsReader<SingleStore>,
50 pub ioc: IocContainer,
51 pub auth_registry: Arc<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 Self {
65 compiler: Compiler::new(catalog.clone(), config.routines.clone()),
66 catalog,
67 runtime_context: config.runtime_context,
68 routines: config.routines,
69 transforms: config.transforms,
70 block_encodings: config.block_encodings,
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 = routines_builder.configure();
98
99 let services = Self::new(
100 Catalog::testing(),
101 EngineConfig {
102 runtime_context: RuntimeContext::with_clock(Clock::Real),
103 routines,
104 transforms: Transforms::empty(),
105 block_encodings: BlockEncodings::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}