Skip to main content

reifydb_engine/vm/
services.rs

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