use std::collections::HashMap;
use xlog_core::RelId;
pub(crate) struct DeltaRelationTracker {
entries: HashMap<String, (RelId, String)>,
any_changed: bool,
}
impl DeltaRelationTracker {
pub(crate) fn new() -> Self {
Self {
entries: HashMap::new(),
any_changed: false,
}
}
pub(crate) fn insert(&mut self, pred: String, rel_id: RelId, store_name: String) {
self.entries.insert(pred, (rel_id, store_name));
}
pub(crate) fn get(&self, pred: &str) -> Option<&(RelId, String)> {
self.entries.get(pred)
}
pub(crate) fn delta_name(&self, pred: &str) -> xlog_core::Result<&str> {
self.entries
.get(pred)
.map(|(_rel_id, name)| name.as_str())
.ok_or_else(|| {
xlog_core::XlogError::execution_ctx("delta_name", "missing delta relation", &pred)
})
}
pub(crate) fn delta_rel_id(&self, pred: &str) -> xlog_core::Result<RelId> {
self.entries
.get(pred)
.map(|(rel_id, _name)| *rel_id)
.ok_or_else(|| {
xlog_core::XlogError::execution_ctx("delta_rel_id", "missing delta relation", &pred)
})
}
pub(crate) fn begin_iteration(&mut self) {
self.any_changed = false;
}
pub(crate) fn mark_changed(&mut self) {
self.any_changed = true;
}
pub(crate) fn is_converged(&self) -> bool {
!self.any_changed
}
pub(crate) fn into_inner(self) -> HashMap<String, (RelId, String)> {
self.entries
}
}