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