use crate::transaction::Operation;
use lance_core::deepsize::DeepSizeOf;
use std::collections::HashMap;
use std::sync::Arc;
use uuid::Uuid;
#[derive(Debug, Clone, DeepSizeOf, PartialEq)]
pub struct Transaction {
pub read_version: u64,
pub uuid: String,
pub operation: Operation,
pub tag: Option<String>,
pub transaction_properties: Option<Arc<HashMap<String, String>>>,
}
pub struct TransactionBuilder {
read_version: u64,
uuid: Option<String>,
operation: Operation,
tag: Option<String>,
transaction_properties: Option<Arc<HashMap<String, String>>>,
}
impl TransactionBuilder {
pub fn new(read_version: u64, operation: Operation) -> Self {
Self {
read_version,
uuid: None,
operation,
tag: None,
transaction_properties: None,
}
}
pub fn uuid(mut self, uuid: String) -> Self {
self.uuid = Some(uuid);
self
}
pub fn tag(mut self, tag: Option<String>) -> Self {
self.tag = tag;
self
}
pub fn transaction_properties(
mut self,
transaction_properties: Option<Arc<HashMap<String, String>>>,
) -> Self {
self.transaction_properties = transaction_properties;
self
}
pub fn build(self) -> Transaction {
let uuid = self
.uuid
.unwrap_or_else(|| Uuid::new_v4().hyphenated().to_string());
Transaction {
read_version: self.read_version,
uuid,
operation: self.operation,
tag: self.tag,
transaction_properties: self.transaction_properties,
}
}
}
impl Transaction {
pub fn new_from_version(read_version: u64, operation: Operation) -> Self {
TransactionBuilder::new(read_version, operation).build()
}
pub fn new(read_version: u64, operation: Operation, tag: Option<String>) -> Self {
TransactionBuilder::new(read_version, operation)
.tag(tag)
.build()
}
}