reifydb_sub_column/
factory.rs1use 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}