liurenjie1024 commented on code in PR #1451:
URL: https://github.com/apache/iceberg-rust/pull/1451#discussion_r2158782394


##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -45,60 +45,55 @@ use crate::{Catalog, TableCommit, TableRequirement, 
TableUpdate};
 
 /// Table transaction.
 pub struct Transaction {
-    base_table: Table,
-    current_table: Table,
+    table: Table,
     actions: Vec<BoxedTransactionAction>,
-    updates: Vec<TableUpdate>,
-    requirements: Vec<TableRequirement>,
 }
 
 impl Transaction {
     /// Creates a new transaction.
     pub fn new(table: &Table) -> Self {
         Self {
-            base_table: table.clone(),
-            current_table: table.clone(),
+            table: table.clone(),
             actions: vec![],
-            updates: vec![],
-            requirements: vec![],
         }
     }
 
-    fn update_table_metadata(&mut self, updates: &[TableUpdate]) -> Result<()> 
{
-        let mut metadata_builder = 
self.current_table.metadata().clone().into_builder(None);
+    fn update_table_metadata(&self, table: &mut Table, updates: 
&[TableUpdate]) -> Result<()> {
+        let mut metadata_builder = table.metadata().clone().into_builder(None);
         for update in updates {
             metadata_builder = update.clone().apply(metadata_builder)?;
         }
 
-        self.current_table
-            .with_metadata(Arc::new(metadata_builder.build()?.metadata));
+        table.with_metadata(Arc::new(metadata_builder.build()?.metadata));
 
         Ok(())
     }
 
     fn apply(
-        &mut self,
+        &self,
+        table: &mut Table,
         updates: Vec<TableUpdate>,
         requirements: Vec<TableRequirement>,
+        existing_updates: &mut Vec<TableUpdate>,
+        existing_requirements: &mut Vec<TableRequirement>,
     ) -> Result<()> {
         for requirement in &requirements {
-            requirement.check(Some(self.current_table.metadata()))?;
+            requirement.check(Some(table.metadata()))?;
         }
 
-        self.update_table_metadata(&updates)?;
+        self.update_table_metadata(table, &updates)?;
 
-        self.updates.extend(updates);
+        existing_updates.extend(updates);
 
         // For the requirements, it does not make sense to add a requirement 
more than once
         // For example, you cannot assert that the current schema has two 
different IDs
         for new_requirement in requirements {
-            if self
-                .requirements
+            if existing_requirements
                 .iter()
                 .map(discriminant)
                 .all(|d| d != discriminant(&new_requirement))
             {
-                self.requirements.push(new_requirement);
+                existing_requirements.push(new_requirement);

Review Comment:
   We should move this check to start of this method. Also I don't think we 
should filter here, we should return error.



##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -129,8 +124,10 @@ impl Transaction {
             }
         };
         let mut snapshot_id = generate_random_id();
+
+        // todo revisit this, this check won't be 100% valid because it's not 
checking the staging table
         while self
-            .current_table
+            .table
             .metadata()
             .snapshots()
             .any(|s| s.snapshot_id() == snapshot_id)

Review Comment:
   +1, I also think we should move this to `SnapshotProducer.`



##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -45,60 +45,55 @@ use crate::{Catalog, TableCommit, TableRequirement, 
TableUpdate};
 
 /// Table transaction.
 pub struct Transaction {
-    base_table: Table,
-    current_table: Table,
+    table: Table,
     actions: Vec<BoxedTransactionAction>,
-    updates: Vec<TableUpdate>,
-    requirements: Vec<TableRequirement>,
 }
 
 impl Transaction {
     /// Creates a new transaction.
     pub fn new(table: &Table) -> Self {
         Self {
-            base_table: table.clone(),
-            current_table: table.clone(),
+            table: table.clone(),
             actions: vec![],
-            updates: vec![],
-            requirements: vec![],
         }
     }
 
-    fn update_table_metadata(&mut self, updates: &[TableUpdate]) -> Result<()> 
{
-        let mut metadata_builder = 
self.current_table.metadata().clone().into_builder(None);
+    fn update_table_metadata(&self, table: &mut Table, updates: 
&[TableUpdate]) -> Result<()> {
+        let mut metadata_builder = table.metadata().clone().into_builder(None);
         for update in updates {
             metadata_builder = update.clone().apply(metadata_builder)?;
         }
 
-        self.current_table
-            .with_metadata(Arc::new(metadata_builder.build()?.metadata));
+        table.with_metadata(Arc::new(metadata_builder.build()?.metadata));
 
         Ok(())
     }
 
     fn apply(
-        &mut self,
+        &self,
+        table: &mut Table,
         updates: Vec<TableUpdate>,
         requirements: Vec<TableRequirement>,
+        existing_updates: &mut Vec<TableUpdate>,
+        existing_requirements: &mut Vec<TableRequirement>,
     ) -> Result<()> {
         for requirement in &requirements {
-            requirement.check(Some(self.current_table.metadata()))?;
+            requirement.check(Some(table.metadata()))?;
         }
 
-        self.update_table_metadata(&updates)?;
+        self.update_table_metadata(table, &updates)?;
 
-        self.updates.extend(updates);
+        existing_updates.extend(updates);
 
         // For the requirements, it does not make sense to add a requirement 
more than once
         // For example, you cannot assert that the current schema has two 
different IDs
         for new_requirement in requirements {
-            if self
-                .requirements
+            if existing_requirements
                 .iter()
                 .map(discriminant)
                 .all(|d| d != discriminant(&new_requirement))
             {
-                self.requirements.push(new_requirement);
+                existing_requirements.push(new_requirement);

Review Comment:
   In fact, I'm not sure if we actually need this check, maybe we could remove 
this for now?



##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -45,60 +45,55 @@ use crate::{Catalog, TableCommit, TableRequirement, 
TableUpdate};
 
 /// Table transaction.
 pub struct Transaction {
-    base_table: Table,
-    current_table: Table,
+    table: Table,
     actions: Vec<BoxedTransactionAction>,
-    updates: Vec<TableUpdate>,
-    requirements: Vec<TableRequirement>,
 }
 
 impl Transaction {
     /// Creates a new transaction.
     pub fn new(table: &Table) -> Self {
         Self {
-            base_table: table.clone(),
-            current_table: table.clone(),
+            table: table.clone(),
             actions: vec![],
-            updates: vec![],
-            requirements: vec![],
         }
     }
 
-    fn update_table_metadata(&mut self, updates: &[TableUpdate]) -> Result<()> 
{
-        let mut metadata_builder = 
self.current_table.metadata().clone().into_builder(None);
+    fn update_table_metadata(&self, table: &mut Table, updates: 
&[TableUpdate]) -> Result<()> {
+        let mut metadata_builder = table.metadata().clone().into_builder(None);
         for update in updates {
             metadata_builder = update.clone().apply(metadata_builder)?;
         }
 
-        self.current_table
-            .with_metadata(Arc::new(metadata_builder.build()?.metadata));
+        table.with_metadata(Arc::new(metadata_builder.build()?.metadata));
 
         Ok(())
     }
 
     fn apply(
-        &mut self,
+        &self,

Review Comment:
   Ditto.



##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -45,60 +45,55 @@ use crate::{Catalog, TableCommit, TableRequirement, 
TableUpdate};
 
 /// Table transaction.
 pub struct Transaction {
-    base_table: Table,
-    current_table: Table,
+    table: Table,
     actions: Vec<BoxedTransactionAction>,
-    updates: Vec<TableUpdate>,
-    requirements: Vec<TableRequirement>,
 }
 
 impl Transaction {
     /// Creates a new transaction.
     pub fn new(table: &Table) -> Self {
         Self {
-            base_table: table.clone(),
-            current_table: table.clone(),
+            table: table.clone(),
             actions: vec![],
-            updates: vec![],
-            requirements: vec![],
         }
     }
 
-    fn update_table_metadata(&mut self, updates: &[TableUpdate]) -> Result<()> 
{
-        let mut metadata_builder = 
self.current_table.metadata().clone().into_builder(None);
+    fn update_table_metadata(&self, table: &mut Table, updates: 
&[TableUpdate]) -> Result<()> {

Review Comment:
   We don't need `self` here?



##########
crates/iceberg/src/transaction/mod.rs:
##########
@@ -45,60 +45,55 @@ use crate::{Catalog, TableCommit, TableRequirement, 
TableUpdate};
 
 /// Table transaction.
 pub struct Transaction {
-    base_table: Table,
-    current_table: Table,
+    table: Table,
     actions: Vec<BoxedTransactionAction>,
-    updates: Vec<TableUpdate>,
-    requirements: Vec<TableRequirement>,
 }
 
 impl Transaction {
     /// Creates a new transaction.
     pub fn new(table: &Table) -> Self {
         Self {
-            base_table: table.clone(),
-            current_table: table.clone(),
+            table: table.clone(),
             actions: vec![],
-            updates: vec![],
-            requirements: vec![],
         }
     }
 
-    fn update_table_metadata(&mut self, updates: &[TableUpdate]) -> Result<()> 
{
-        let mut metadata_builder = 
self.current_table.metadata().clone().into_builder(None);
+    fn update_table_metadata(&self, table: &mut Table, updates: 
&[TableUpdate]) -> Result<()> {
+        let mut metadata_builder = table.metadata().clone().into_builder(None);
         for update in updates {
             metadata_builder = update.clone().apply(metadata_builder)?;
         }
 
-        self.current_table
-            .with_metadata(Arc::new(metadata_builder.build()?.metadata));
+        table.with_metadata(Arc::new(metadata_builder.build()?.metadata));

Review Comment:
   Not related to this pr, and it's not mandatory. But I think it's better to 
change the `with_metadata(mut self)` to consume table rather than modify it.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to