use crate::mutation::candidate::PhysicalDocumentIdentity;
use crate::mutation::triggers::queue::AfterTriggerQueue;
use std::collections::BTreeSet;
use std::sync::atomic::{AtomicBool, Ordering};
use uqa_sql::plan::CtePlan;
#[derive(Default)]
pub struct StatementCommands {
modifies_with: AtomicBool,
postponed: parking_lot::Mutex<Vec<CtePlan>>,
written: parking_lot::Mutex<BTreeSet<PhysicalDocumentIdentity>>,
triggered: parking_lot::Mutex<BTreeSet<PhysicalDocumentIdentity>>,
after_triggers: AfterTriggerQueue,
}
impl StatementCommands {
pub(crate) fn begin_data_modifying_with(&self, postponed: Vec<CtePlan>) {
self.modifies_with.store(true, Ordering::Relaxed);
*self.postponed.lock() = postponed;
}
pub fn modifies_with(&self) -> bool {
self.modifies_with.load(Ordering::Relaxed)
}
pub fn after_triggers(&self) -> &AfterTriggerQueue {
&self.after_triggers
}
pub fn take_postponed(&self) -> Vec<CtePlan> {
std::mem::take(&mut *self.postponed.lock())
}
pub fn note_written(&self, rows: impl IntoIterator<Item = PhysicalDocumentIdentity>) {
self.written.lock().extend(rows);
}
pub fn wrote(&self, row: &PhysicalDocumentIdentity) -> bool {
self.written.lock().contains(row)
}
pub fn note_triggered(&self, rows: impl IntoIterator<Item = PhysicalDocumentIdentity>) {
self.triggered.lock().extend(rows);
}
pub fn triggered_write(&self, row: &PhysicalDocumentIdentity) -> bool {
self.triggered.lock().contains(row)
}
}