Skip to content

Commit b701bd9

Browse files
committed
1. add method for data file
2. mark add entry method as crate private
1 parent b39d7db commit b701bd9

File tree

1 file changed

+78
-12
lines changed

1 file changed

+78
-12
lines changed

crates/iceberg/src/spec/manifest.rs

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)