@@ -115,16 +115,18 @@ def _snapshot_id(self, target):
115115 return snap .id if snap is not None else None
116116
117117 def _compact_all_data_files (self , table ):
118- """Replace all current data files with one COMPACT output file."""
118+ """Replace current data files with one COMPACT file per file group ."""
119119 from pypaimon .table .special_fields import SpecialFields
120120
121121 read_builder = table .new_read_builder ().with_projection (
122122 list (table .field_names ) + [SpecialFields .ROW_ID .name ]
123123 )
124124 plan = read_builder .new_scan ().plan_for_write ()
125- old_files = [
126- file for split in plan .splits () for file in split .files
127- ]
125+ old_files_by_group = {}
126+ for split in plan .splits ():
127+ old_files_by_group .setdefault (
128+ (tuple (split .partition .values ), split .bucket ), [],
129+ ).extend (split .files )
128130 current = read_builder .new_read ().to_arrow (plan .splits ()).sort_by (
129131 [(SpecialFields .ROW_ID .name , 'ascending' )]
130132 ).select (list (table .field_names ))
@@ -133,12 +135,20 @@ def _compact_all_data_files(self, table):
133135 writer = write_builder .new_write ()
134136 writer .write_arrow (current )
135137 messages = writer .prepare_commit ()
136- self .assertEqual (len (messages ), 1 )
137- self .assertEqual (len (messages [0 ].new_files ), 1 )
138- messages [0 ].new_files = [
139- messages [0 ].new_files [0 ].assign_first_row_id (0 )
140- ]
141- messages [0 ].deleted_files .extend (old_files )
138+ self .assertEqual (
139+ {(message .partition , message .bucket ) for message in messages },
140+ set (old_files_by_group ),
141+ )
142+ for message in messages :
143+ old_files = old_files_by_group [
144+ (message .partition , message .bucket )
145+ ]
146+ self .assertEqual (len (message .new_files ), 1 )
147+ first_row_id = min (file .first_row_id for file in old_files )
148+ message .new_files = [
149+ message .new_files [0 ].assign_first_row_id (first_row_id )
150+ ]
151+ message .deleted_files .extend (old_files )
142152
143153 commit = write_builder .new_commit ()
144154 file_store_commit = commit .file_store_commit
@@ -2376,7 +2386,11 @@ def test_self_merge_rebases_staged_updates_after_compaction(self):
23762386 target = 'default.tbl_{}' .format (uuid .uuid4 ().hex [:8 ])
23772387 self .catalog .create_table (
23782388 target ,
2379- Schema .from_pyarrow_schema (schema , options = options ),
2389+ Schema .from_pyarrow_schema (
2390+ schema ,
2391+ partition_keys = ['content_key' ],
2392+ options = options ,
2393+ ),
23802394 False ,
23812395 )
23822396
0 commit comments