Skip to main content

reifydb_engine/vm/
services.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}