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::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}