Skip to main content

reifydb_sub_column/
factory.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_column::{
5	compress::{CompressConfig, Compressor},
6	registry::SnapshotRegistry,
7};
8use reifydb_core::util::ioc::IocContainer;
9use reifydb_engine::engine::StandardEngine;
10use reifydb_runtime::SharedRuntime;
11use reifydb_sub_api::subsystem::{Subsystem, SubsystemFactory};
12use reifydb_type::Result;
13
14use crate::{
15	actor::{series::SeriesMaterializationActor, table::TableMaterializationActor},
16	subsystem::{StorageConfig, StorageSubsystem},
17};
18
19pub struct StorageSubsystemFactory {
20	config: StorageConfig,
21}
22
23impl StorageSubsystemFactory {
24	pub fn new(config: StorageConfig) -> Self {
25		Self {
26			config,
27		}
28	}
29}
30
31impl Default for StorageSubsystemFactory {
32	fn default() -> Self {
33		Self::new(StorageConfig::default())
34	}
35}
36
37impl SubsystemFactory for StorageSubsystemFactory {
38	fn create(self: Box<Self>, ioc: &IocContainer) -> Result<Box<dyn Subsystem>> {
39		let runtime = ioc.resolve::<SharedRuntime>()?;
40		let engine = ioc.resolve::<StandardEngine>()?;
41		let actor_system = runtime.actor_system();
42		let registry = SnapshotRegistry::new();
43
44		let table_actor = TableMaterializationActor::new(
45			engine.clone(),
46			registry.clone(),
47			Compressor::new(CompressConfig::default()),
48			self.config.table_tick_interval,
49		);
50		let table_handle = actor_system.spawn_system("storage-materialize-table", table_actor);
51		let table_ref = table_handle.actor_ref().clone();
52
53		let series_actor = SeriesMaterializationActor::new(
54			engine,
55			registry.clone(),
56			Compressor::new(CompressConfig::default()),
57			self.config.series_tick_interval,
58			self.config.series_bucket_width,
59			self.config.series_grace,
60		);
61		let series_handle = actor_system.spawn_system("storage-materialize-series", series_actor);
62		let series_ref = series_handle.actor_ref().clone();
63
64		Ok(Box::new(StorageSubsystem::new(registry, table_ref, series_ref)))
65	}
66}