@@ -304,26 +304,26 @@ impl ManifestWriter {
304304 Ok ( field_stats. into_iter ( ) . map ( |stat| stat. finish ( ) ) . collect ( ) )
305305 }
306306
307- fn check_entry ( & self , entry : & ManifestEntry ) -> Result < ( ) > {
307+ fn check_data_file ( & self , data_file : & DataFile ) -> Result < ( ) > {
308308 match self . metadata . content {
309309 ManifestContentType :: Data => {
310- if entry . data_file . content != DataContentType :: Data {
310+ if data_file. content != DataContentType :: Data {
311311 return Err ( Error :: new (
312312 ErrorKind :: DataInvalid ,
313313 format ! (
314314 "Content type of entry {:?} should have DataContentType::Data" ,
315- entry . data_file. content
315+ data_file. content
316316 ) ,
317317 ) ) ;
318318 }
319319 }
320320 ManifestContentType :: Deletes => {
321- if entry . data_file . content != DataContentType :: EqualityDeletes
322- && entry . data_file . content != DataContentType :: PositionDeletes
321+ if data_file. content != DataContentType :: EqualityDeletes
322+ && data_file. content != DataContentType :: PositionDeletes
323323 {
324324 return Err ( Error :: new (
325325 ErrorKind :: DataInvalid ,
326- format ! ( "Content type of entry {:?} should have DataContentType::EqualityDeletes or DataContentType::PositionDeletes" , entry . data_file. content) ,
326+ format ! ( "Content type of entry {:?} should have DataContentType::EqualityDeletes or DataContentType::PositionDeletes" , data_file. content) ,
327327 ) ) ;
328328 }
329329 }
@@ -336,8 +336,8 @@ impl ManifestWriter {
336336 /// - Set the snapshot id to the current snapshot id
337337 /// - Set the sequence number to `None` if it is invalid(smaller than 0)
338338 /// - Set the file sequence number to `None`
339- pub fn add ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
340- self . check_entry ( & entry) ?;
339+ pub ( crate ) fn add ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
340+ self . check_data_file ( & entry. data_file ) ?;
341341 if entry. sequence_number ( ) . is_some_and ( |n| n >= 0 ) {
342342 entry. status = ManifestStatus :: Added ;
343343 entry. snapshot_id = Some ( self . snapshot_id ) ;
@@ -352,26 +352,92 @@ impl ManifestWriter {
352352 Ok ( ( ) )
353353 }
354354
355+ /// Add an added entry for a file with a specific sequence number. The entry's snapshot ID will be this manifest's snapshot ID. The entry's data sequence
356+ /// number will be the provided data sequence number. The entry's file sequence number will be
357+ /// assigned at commit.
358+ pub fn add_file ( & mut self , data_file : DataFile , sequence_number : i64 ) -> Result < ( ) > {
359+ self . check_data_file ( & data_file) ?;
360+ let entry = ManifestEntry {
361+ status : ManifestStatus :: Added ,
362+ snapshot_id : Some ( self . snapshot_id ) ,
363+ sequence_number : ( sequence_number >= 0 ) . then_some ( sequence_number) ,
364+ file_sequence_number : None ,
365+ data_file,
366+ } ;
367+ self . add_entry ( entry) ?;
368+ Ok ( ( ) )
369+ }
370+
355371 /// Add a delete manifest entry. This method will update following status of the entry:
356372 /// - Update the entry status to `Deleted`
357373 /// - Set the snapshot id to the current snapshot id
358- pub fn delete ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
359- self . check_entry ( & entry) ?;
374+ ///
375+ /// # TODO
376+ /// Remove this allow later
377+ #[ allow( dead_code) ]
378+ pub ( crate ) fn delete ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
379+ self . check_data_file ( & entry. data_file ) ?;
360380 entry. status = ManifestStatus :: Deleted ;
361381 entry. snapshot_id = Some ( self . snapshot_id ) ;
362382 self . add_entry ( entry) ?;
363383 Ok ( ( ) )
364384 }
365385
386+ /// Add a delete manifest entry. The entry's snapshot ID will be this manifest's snapshot ID.
387+ /// However, the original data and file sequence numbers of the file must be preserved when
388+ /// the file is marked as deleted.
389+ pub fn delete_file (
390+ & mut self ,
391+ data_file : DataFile ,
392+ sequence_number : i64 ,
393+ file_sequence_number : i64 ,
394+ ) -> Result < ( ) > {
395+ self . check_data_file ( & data_file) ?;
396+ let entry = ManifestEntry {
397+ status : ManifestStatus :: Deleted ,
398+ snapshot_id : Some ( self . snapshot_id ) ,
399+ sequence_number : Some ( sequence_number) ,
400+ file_sequence_number : Some ( file_sequence_number) ,
401+ data_file,
402+ } ;
403+ self . add_entry ( entry) ?;
404+ Ok ( ( ) )
405+ }
406+
366407 /// Add an existing manifest entry. This method will update following status of the entry:
367408 /// - Update the entry status to `Existing`
368- pub fn existing ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
369- self . check_entry ( & entry) ?;
409+ ///
410+ /// # TODO
411+ /// Remove this allow later
412+ #[ allow( dead_code) ]
413+ pub ( crate ) fn existing ( & mut self , mut entry : ManifestEntry ) -> Result < ( ) > {
414+ self . check_data_file ( & entry. data_file ) ?;
370415 entry. status = ManifestStatus :: Existing ;
371416 self . add_entry ( entry) ?;
372417 Ok ( ( ) )
373418 }
374419
420+ /// Add an existing manifest entry. The original data and file sequence numbers, snapshot ID,
421+ /// which were assigned at commit, must be preserved when adding an existing entry.
422+ pub fn existing_file (
423+ & mut self ,
424+ data_file : DataFile ,
425+ snapshot_id : i64 ,
426+ sequence_number : i64 ,
427+ file_sequence_number : i64 ,
428+ ) -> Result < ( ) > {
429+ self . check_data_file ( & data_file) ?;
430+ let entry = ManifestEntry {
431+ status : ManifestStatus :: Existing ,
432+ snapshot_id : Some ( snapshot_id) ,
433+ sequence_number : Some ( sequence_number) ,
434+ file_sequence_number : Some ( file_sequence_number) ,
435+ data_file,
436+ } ;
437+ self . add_entry ( entry) ?;
438+ Ok ( ( ) )
439+ }
440+
375441 fn add_entry ( & mut self , entry : ManifestEntry ) -> Result < ( ) > {
376442 // Check if the entry has sequence number
377443 if ( entry. status == ManifestStatus :: Deleted || entry. status == ManifestStatus :: Existing )
0 commit comments