use reifydb_core::{
common::CommitVersion,
interface::catalog::{
id::{MigrationEventId, MigrationId},
migration::{Migration, MigrationEvent},
},
};
use crate::materialized::{MaterializedCatalog, MultiVersionMigration, MultiVersionMigrationEvent};
impl MaterializedCatalog {
pub fn find_migration_at(&self, id: MigrationId, version: CommitVersion) -> Option<Migration> {
self.migrations.get(&id).and_then(|entry| entry.value().get(version))
}
pub fn find_migration_by_name_at(&self, name: &str, version: CommitVersion) -> Option<Migration> {
self.migrations_by_name.get(&name.to_string()).and_then(|entry| {
let migration_id = *entry.value();
self.find_migration_at(migration_id, version)
})
}
pub fn find_migration_by_name(&self, name: &str) -> Option<Migration> {
self.migrations_by_name.get(&name.to_string()).and_then(|entry| {
let migration_id = *entry.value();
self.migrations.get(&migration_id).and_then(|m| m.value().get_latest())
})
}
pub fn list_migrations(&self) -> Vec<Migration> {
self.migrations.iter().filter_map(|entry| entry.value().get_latest()).collect()
}
pub fn set_migration(&self, id: MigrationId, version: CommitVersion, migration: Option<Migration>) {
if let Some(entry) = self.migrations.get(&id)
&& let Some(pre) = entry.value().get_latest()
{
self.migrations_by_name.remove(&pre.name);
}
let multi = self.migrations.get_or_insert_with(id, MultiVersionMigration::new);
if let Some(new) = migration {
self.migrations_by_name.insert(new.name.clone(), id);
multi.value().insert(version, new);
} else {
multi.value().remove(version);
}
}
pub fn find_migration_event_at(&self, id: MigrationEventId, version: CommitVersion) -> Option<MigrationEvent> {
self.migration_events.get(&id).and_then(|entry| entry.value().get(version))
}
pub fn list_migration_events(&self) -> Vec<MigrationEvent> {
self.migration_events.iter().filter_map(|entry| entry.value().get_latest()).collect()
}
pub fn set_migration_event(&self, id: MigrationEventId, version: CommitVersion, event: Option<MigrationEvent>) {
let multi = self.migration_events.get_or_insert_with(id, MultiVersionMigrationEvent::new);
if let Some(new) = event {
multi.value().insert(version, new);
} else {
multi.value().remove(version);
}
}
}