use reifydb_core::{
common::CommitVersion,
interface::{
catalog::flow::FlowNodeId,
change::{Change, Diff},
},
row::Row,
value::column::columns::Columns,
};
pub struct ChangeBuilder {
operator_id: FlowNodeId,
version: CommitVersion,
diffs: Vec<Diff>,
}
impl ChangeBuilder {
pub fn new(operator_id: FlowNodeId, version: CommitVersion) -> Self {
Self {
operator_id,
version,
diffs: Vec::new(),
}
}
pub fn insert(mut self, post: Columns) -> Self {
self.diffs.push(Diff::Insert {
post,
});
self
}
pub fn insert_row(mut self, row: Row) -> Self {
self.diffs.push(Diff::Insert {
post: Columns::from_row(&row),
});
self
}
pub fn update(mut self, pre: Columns, post: Columns) -> Self {
self.diffs.push(Diff::Update {
pre,
post,
});
self
}
pub fn update_rows(mut self, pre: Row, post: Row) -> Self {
self.diffs.push(Diff::Update {
pre: Columns::from_row(&pre),
post: Columns::from_row(&post),
});
self
}
pub fn remove(mut self, pre: Columns) -> Self {
self.diffs.push(Diff::Remove {
pre,
});
self
}
pub fn remove_row(mut self, row: Row) -> Self {
self.diffs.push(Diff::Remove {
pre: Columns::from_row(&row),
});
self
}
pub fn diff(mut self, diff: Diff) -> Self {
self.diffs.push(diff);
self
}
pub fn diffs(mut self, iter: impl IntoIterator<Item = Diff>) -> Self {
self.diffs.extend(iter);
self
}
pub fn build(self) -> Change {
Change::from_flow(self.operator_id, self.version, self.diffs)
}
}