iceberg/transaction/
upgrade_format_version.rs1use std::sync::Arc;
19
20use async_trait::async_trait;
21
22use crate::TableUpdate::UpgradeFormatVersion;
23use crate::spec::FormatVersion;
24use crate::table::Table;
25use crate::transaction::action::{ActionCommit, TransactionAction};
26use crate::{Error, ErrorKind, Result};
27
28pub struct UpgradeFormatVersionAction {
34 format_version: Option<FormatVersion>,
35}
36
37impl UpgradeFormatVersionAction {
38 pub(crate) fn new() -> Self {
40 UpgradeFormatVersionAction {
41 format_version: None,
42 }
43 }
44
45 pub fn set_format_version(mut self, format_version: FormatVersion) -> Self {
55 self.format_version = Some(format_version);
56 self
57 }
58}
59
60#[async_trait]
61impl TransactionAction for UpgradeFormatVersionAction {
62 async fn commit(self: Arc<Self>, _table: &Table) -> Result<ActionCommit> {
63 let format_version = self.format_version.ok_or_else(|| {
64 Error::new(
65 ErrorKind::DataInvalid,
66 "FormatVersion is not set for UpgradeFormatVersionAction!",
67 )
68 })?;
69
70 Ok(ActionCommit::new(
71 vec![UpgradeFormatVersion { format_version }],
72 vec![],
73 ))
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use as_any::Downcast;
80
81 use crate::spec::FormatVersion;
82 use crate::transaction::Transaction;
83 use crate::transaction::action::ApplyTransactionAction;
84 use crate::transaction::upgrade_format_version::UpgradeFormatVersionAction;
85
86 #[test]
87 fn test_upgrade_format_version() {
88 let table = crate::transaction::tests::make_v1_table();
89 let tx = Transaction::new(&table);
90 let tx = tx
91 .upgrade_table_version()
92 .set_format_version(FormatVersion::V2)
93 .apply(tx)
94 .unwrap();
95
96 assert_eq!(tx.actions.len(), 1);
97
98 let action = (*tx.actions[0])
99 .downcast_ref::<UpgradeFormatVersionAction>()
100 .unwrap();
101
102 assert_eq!(action.format_version, Some(FormatVersion::V2));
103 }
104}