iceberg-cpp
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Protected Member Functions | List of all members
iceberg::OverwriteFiles Class Reference

API for overwriting files in a table. More...

#include <overwrite_files.h>

Inheritance diagram for iceberg::OverwriteFiles:
iceberg::MergingSnapshotUpdate iceberg::SnapshotUpdate iceberg::PendingUpdate iceberg::ErrorCollector

Public Member Functions

OverwriteFilesAddFile (const std::shared_ptr< DataFile > &file)
 Add a DataFile to the table.
 
OverwriteFilesDeleteFile (const std::shared_ptr< DataFile > &file)
 Delete a DataFile from the table.
 
OverwriteFilesDeleteFiles (const DataFileSet &data_files_to_delete, const DeleteFileSet &delete_files_to_delete)
 Delete a set of data files from the table with their respective delete files.
 
OverwriteFilesOverwriteByRowFilter (std::shared_ptr< Expression > expr)
 Delete files that match an expression on data rows from the table.
 
OverwriteFilesValidateFromSnapshot (int64_t snapshot_id)
 Set the snapshot ID used in any reads for this operation.
 
OverwriteFilesConflictDetectionFilter (std::shared_ptr< Expression > expr)
 Set a conflict detection filter used to validate concurrently added data and delete files.
 
OverwriteFilesValidateNoConflictingData ()
 Enable validation that data added concurrently does not conflict with this commit's operation.
 
OverwriteFilesValidateNoConflictingDeletes ()
 Enable validation that deletes that happened concurrently do not conflict with this commit's operation.
 
OverwriteFilesValidateAddedFilesMatchOverwriteFilter ()
 Signal that each file added to the table must match the overwrite expression.
 
OverwriteFilesCaseSensitive (bool case_sensitive)
 Enable or disable case-sensitive expression binding for validations that accept expressions.
 
std::string operation () override
 A string that describes the action that produced the new snapshot.
 
- Public Member Functions inherited from iceberg::MergingSnapshotUpdate
Result< std::vector< ManifestFile > > Apply (const TableMetadata &metadata_to_update, const std::shared_ptr< Snapshot > &snapshot) override
 Apply the update's changes to the given metadata and snapshot.
 
Status CleanUncommitted (const std::unordered_set< std::string > &committed) override
 Clean up any uncommitted manifests that were created.
 
std::unordered_map< std::string, std::string > Summary () override
 Get the summary map for this operation.
 
- Public Member Functions inherited from iceberg::SnapshotUpdate
Kind kind () const override
 Return the kind of this pending update.
 
bool IsRetryable () const override
 Whether this update can be retried after a commit conflict.
 
auto & DeleteWith (this auto &self, std::function< Status(const std::string &)> delete_func)
 Set a callback to delete files instead of the table's default.
 
auto & StageOnly (this auto &self)
 Stage a snapshot in table metadata, but do not make it current.
 
auto & ScanManifestsWith (this auto &self, Executor &executor)
 Configure an executor for manifest planning work.
 
auto & ToBranch (this auto &self, const std::string &branch)
 Perform operations on a particular branch.
 
auto & Set (this auto &self, const std::string &property, const std::string &value)
 Set a summary property in the snapshot produced by this update.
 
auto & WriteManifestsWith (this auto &self, Executor &executor, int32_t parallelism)
 Configure an executor and max writer count for writing new manifests.
 
Result< ApplyResultApply ()
 Apply the update's changes to create a new snapshot.
 
Status Finalize (Result< const TableMetadata * > commit_result) override
 Finalize the snapshot update, cleaning up any uncommitted files.
 
- Public Member Functions inherited from iceberg::PendingUpdate
virtual Status Commit ()
 Apply the pending changes and commit.
 
 PendingUpdate (const PendingUpdate &)=delete
 
PendingUpdateoperator= (const PendingUpdate &)=delete
 
 PendingUpdate (PendingUpdate &&) noexcept=default
 
PendingUpdateoperator= (PendingUpdate &&) noexcept=default
 
- Public Member Functions inherited from iceberg::ErrorCollector
 ErrorCollector (ErrorCollector &&)=default
 
ErrorCollectoroperator= (ErrorCollector &&)=default
 
 ErrorCollector (const ErrorCollector &)=default
 
ErrorCollectoroperator= (const ErrorCollector &)=default
 
template<typename... Args>
auto & AddError (this auto &self, ErrorKind kind, const std::format_string< Args... > fmt, Args &&... args)
 Add a specific error and return reference to derived class.
 
auto & AddError (this auto &self, Error err)
 Add an existing error object and return reference to derived class.
 
auto & AddError (this auto &self, std::unexpected< Error > err)
 Add an unexpected result's error and return reference to derived class.
 
bool has_errors () const
 Check if any errors have been collected.
 
size_t error_count () const
 Get the number of errors collected.
 
Status CheckErrors () const
 Check for accumulated errors and return them if any exist.
 
void ClearErrors ()
 Clear all accumulated errors.
 
const std::vector< Error > & errors () const
 Get read-only access to all collected errors.
 

Static Public Member Functions

static Result< std::shared_ptr< OverwriteFiles > > Make (std::string table_name, std::shared_ptr< TransactionContext > ctx)
 Create a new OverwriteFiles instance.
 

Protected Member Functions

Status Validate (const TableMetadata &current_metadata, const std::shared_ptr< Snapshot > &snapshot) override
 Validate the current metadata.
 
- Protected Member Functions inherited from iceberg::MergingSnapshotUpdate
 MergingSnapshotUpdate (std::string table_name, std::shared_ptr< TransactionContext > ctx)
 Constructor; reads merge configuration from table properties.
 
Status AddDataFile (std::shared_ptr< DataFile > file)
 Stage a data file to be added to the table.
 
Status AddDeleteFile (std::shared_ptr< DataFile > file)
 Stage a delete file to be added to the table.
 
Status ValidateNewDeleteFile (const TableMetadata &metadata, const DataFile &file)
 Validate a delete file against the table format version rules.
 
Status AddDeleteFile (std::shared_ptr< DataFile > file, int64_t data_sequence_number)
 Stage a delete file with an explicit data sequence number.
 
Status AddManifest (ManifestFile manifest)
 Add all files in a pre-existing data manifest to the new snapshot.
 
Status DeleteDataFile (std::shared_ptr< DataFile > file)
 Register a data file (by object) to be deleted from the table.
 
Status DeleteDeleteFile (std::shared_ptr< DataFile > file)
 Register a delete file (by object) to be removed from the table.
 
Status DeleteByPath (std::string_view path)
 Register a data file path to be deleted from the table.
 
Status DeleteByRowFilter (std::shared_ptr< Expression > expr)
 Register an expression to delete matching rows.
 
Status DropPartition (int32_t spec_id, PartitionValues partition)
 Register a partition to be dropped.
 
void FailMissingDeletePaths ()
 Fail if any registered delete path is not found in any manifest.
 
void FailAnyDelete ()
 Fail if any manifest entry matches a delete condition.
 
void SetNewDataFilesDataSequenceNumber (int64_t sequence_number)
 Override the data sequence number assigned to all newly-added data files.
 
bool HasDataSequenceNumber () const
 Returns true if SetNewDataFilesDataSequenceNumber was called.
 
void CaseSensitive (bool case_sensitive)
 Set case sensitivity for row filter and expression evaluation.
 
bool IsCaseSensitive () const
 Returns true if case-sensitive matching is enabled (default: true).
 
bool AddsDataFiles () const
 Returns true if any data files have been staged for addition.
 
bool AddsDeleteFiles () const
 Returns true if any delete files have been staged for addition.
 
bool DeletesDataFiles () const
 Returns true if any data files have been registered for deletion.
 
bool DeletesDeleteFiles () const
 Returns true if any delete files have been registered for removal.
 
const std::shared_ptr< Expression > & RowFilter () const
 Returns the row-filter expression set via DeleteByRowFilter, or nullptr.
 
Result< std::shared_ptr< PartitionSpec > > DataSpec () const
 Returns the single partition spec for all staged data files.
 
std::vector< std::shared_ptr< DataFile > > AddedDataFiles () const
 Returns all data files staged for addition.
 
Status ValidateNoNewDeletesForDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const DataFileSet &replaced_files, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io) const
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a delete file that covers a file in replaced_files.
 
Status ValidateAddedDVs (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > conflict_filter, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io) const
 Return an error if a staged deletion vector conflicts with a deletion vector added since starting_snapshot_id.
 
- Protected Member Functions inherited from iceberg::SnapshotUpdate
 SnapshotUpdate (std::shared_ptr< TransactionContext > ctx)
 
Result< std::vector< ManifestFile > > WriteDataManifests (std::span< const std::shared_ptr< DataFile > > files, const std::shared_ptr< PartitionSpec > &spec, std::optional< int64_t > data_sequence_number=std::nullopt)
 Write data manifests for the given data files.
 
Result< std::vector< ManifestFile > > WriteDeleteManifests (std::span< const ContentFileWithSequenceNumber > files, const std::shared_ptr< PartitionSpec > &spec)
 
const std::string & target_branch () const
 
bool can_inherit_snapshot_id () const
 
const std::string & commit_uuid () const
 
int32_t manifest_count () const
 
int32_t attempt () const
 
int64_t target_manifest_size_bytes () const
 
virtual bool CleanupAfterCommit () const
 Check if cleanup should happen after commit.
 
int64_t SnapshotId ()
 Get or generate the snapshot ID for the new snapshot.
 
Status DeleteFile (const std::string &path)
 Delete a file at the given path.
 
std::string ManifestPath ()
 
std::string ManifestListPath ()
 
SnapshotSummaryBuildersummary_builder ()
 
SnapshotSummaryBuilder BuildManifestCountSummary (std::span< const ManifestFile > manifests, int32_t replaced_manifests_count)
 
- Protected Member Functions inherited from iceberg::PendingUpdate
 PendingUpdate (std::shared_ptr< TransactionContext > ctx)
 
const TableMetadatabase () const
 

Additional Inherited Members

- Public Types inherited from iceberg::PendingUpdate
enum class  Kind : uint8_t {
  kExpireSnapshots , kSetSnapshot , kUpdateLocation , kUpdatePartitionSpec ,
  kUpdatePartitionStatistics , kUpdateProperties , kUpdateSchema , kUpdateSnapshot ,
  kUpdateSnapshotReference , kUpdateSortOrder , kUpdateStatistics
}
 
- Static Protected Member Functions inherited from iceberg::MergingSnapshotUpdate
static Status ValidateAddedDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > filter, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a data file matching the given filter expression.
 
static Status ValidateAddedDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const PartitionSet &partition_set, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a data file in any partition of the given partition set.
 
static Status ValidateDataFilesExist (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const std::unordered_set< std::string > &file_paths, bool skip_deletes, std::shared_ptr< Expression > filter, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, removed a file whose path is in file_paths (and skip_deletes is false).
 
static Status ValidateNoNewDeletesForDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const DataFileSet &replaced_files, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool ignore_equality_deletes=false)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a delete file that covers a file in replaced_files.
 
static Status ValidateNoNewDeletesForDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > data_filter, const DataFileSet &replaced_files, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a delete file matching the data filter that covers a file in replaced_files.
 
static Status ValidateNoNewDeleteFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > data_filter, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a delete file matching the given row filter.
 
static Status ValidateNoNewDeleteFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const PartitionSet &partition_set, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a delete file matching any partition in the given partition set.
 
static Status ValidateDeletedDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > data_filter, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, deleted a data file matching the given row filter.
 
static Status ValidateDeletedDataFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, const PartitionSet &partition_set, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, deleted a data file in any partition of the given partition set.
 
static Result< std::unique_ptr< DeleteFileIndex > > AddedDeleteFiles (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > data_filter, std::shared_ptr< PartitionSet > partition_set, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Build a DeleteFileIndex of delete files added since starting_snapshot_id.
 
static Status ValidateAddedDVs (const TableMetadata &metadata, std::optional< int64_t > starting_snapshot_id, std::shared_ptr< Expression > conflict_filter, const std::unordered_set< std::string > &referenced_data_files, const std::shared_ptr< Snapshot > &parent, std::shared_ptr< FileIO > io, bool case_sensitive=true)
 Return an error if any snapshot after starting_snapshot_id, or from the beginning if unset, added a deletion vector that conflicts with DVs being written.
 
- Protected Attributes inherited from iceberg::SnapshotUpdate
SnapshotSummaryBuilder summary_
 
- Protected Attributes inherited from iceberg::PendingUpdate
std::shared_ptr< TransactionContextctx_
 
- Protected Attributes inherited from iceberg::ErrorCollector
std::vector< Errorerrors_
 

Detailed Description

API for overwriting files in a table.

This API accumulates file additions and produces a new Snapshot of the table by replacing all deleted files with the set of additions. This operation is used to implement idempotent writes that always replace a section of a table with new data or update/delete operations that eagerly overwrite files.

Overwrites can be validated. The default validation mode is idempotent, meaning the overwrite is correct and should be committed regardless of other concurrent changes to the table. For example, this can be used for replacing all data for day D with query results. Alternatively, this API can be configured for overwriting certain files with their filtered versions while ensuring no new data that would need to be filtered has been added.

When committing, these changes are applied to the latest table snapshot. Commit conflicts are resolved by applying the changes to the new latest snapshot and reattempting the commit.

Member Function Documentation

◆ AddFile()

OverwriteFiles & iceberg::OverwriteFiles::AddFile ( const std::shared_ptr< DataFile > &  file)

Add a DataFile to the table.

Parameters
fileA data file.
Returns
This OverwriteFiles for method chaining.

◆ CaseSensitive()

OverwriteFiles & iceberg::OverwriteFiles::CaseSensitive ( bool  case_sensitive)

Enable or disable case-sensitive expression binding for validations that accept expressions.

Parameters
case_sensitiveWhether expression binding should be case sensitive.
Returns
This OverwriteFiles for method chaining.

◆ ConflictDetectionFilter()

OverwriteFiles & iceberg::OverwriteFiles::ConflictDetectionFilter ( std::shared_ptr< Expression expr)

Set a conflict detection filter used to validate concurrently added data and delete files.

Parameters
exprAn expression on rows in the table.
Returns
This OverwriteFiles for method chaining.

◆ DeleteFile()

OverwriteFiles & iceberg::OverwriteFiles::DeleteFile ( const std::shared_ptr< DataFile > &  file)

Delete a DataFile from the table.

Parameters
fileA data file.
Returns
This OverwriteFiles for method chaining.

◆ DeleteFiles()

OverwriteFiles & iceberg::OverwriteFiles::DeleteFiles ( const DataFileSet data_files_to_delete,
const DeleteFileSet delete_files_to_delete 
)

Delete a set of data files from the table with their respective delete files.

Parameters
data_files_to_deleteThe data files to be deleted from the table.
delete_files_to_deleteThe delete files corresponding to the data files to be deleted from the table.
Returns
This OverwriteFiles for method chaining.

◆ Make()

Result< std::shared_ptr< OverwriteFiles > > iceberg::OverwriteFiles::Make ( std::string  table_name,
std::shared_ptr< TransactionContext ctx 
)
static

Create a new OverwriteFiles instance.

Parameters
table_nameThe name of the table
ctxThe transaction context to use for this update
Returns
A Result containing the OverwriteFiles instance or an error

◆ operation()

std::string iceberg::OverwriteFiles::operation ( )
overridevirtual

A string that describes the action that produced the new snapshot.

Returns
A string operation name

Implements iceberg::SnapshotUpdate.

◆ OverwriteByRowFilter()

OverwriteFiles & iceberg::OverwriteFiles::OverwriteByRowFilter ( std::shared_ptr< Expression expr)

Delete files that match an expression on data rows from the table.

A file is selected to be deleted by the expression if it could contain any rows that match the expression. Candidate files are selected using an inclusive partition projection. These candidate files are deleted if all of the rows in the file must match the expression, determined by the expression's strict partition projection. This guarantees that files are deleted if and only if all rows in the file must match the expression.

Files that may contain some rows that match the expression and some rows that do not will result in a validation error.

Parameters
exprAn expression on rows in the table.
Returns
This OverwriteFiles for method chaining.

◆ Validate()

Status iceberg::OverwriteFiles::Validate ( const TableMetadata current_metadata,
const std::shared_ptr< Snapshot > &  snapshot 
)
overrideprotectedvirtual

Validate the current metadata.

Child operations can override this to add custom validation.

Parameters
current_metadataCurrent table metadata to validate
snapshotEnding snapshot on the lineage which is being validated

Reimplemented from iceberg::SnapshotUpdate.

◆ ValidateAddedFilesMatchOverwriteFilter()

OverwriteFiles & iceberg::OverwriteFiles::ValidateAddedFilesMatchOverwriteFilter ( )

Signal that each file added to the table must match the overwrite expression.

If this method is called, each added file is validated on commit to ensure that it matches the overwrite row filter. This is used to ensure that writes are idempotent: files cannot be added during a commit that would not be removed if the operation were run a second time.

Returns
This OverwriteFiles for method chaining.

◆ ValidateFromSnapshot()

OverwriteFiles & iceberg::OverwriteFiles::ValidateFromSnapshot ( int64_t  snapshot_id)

Set the snapshot ID used in any reads for this operation.

Validations check changes after this snapshot ID. If the from snapshot is not set, all ancestor snapshots through the table's initial snapshot are validated.

Parameters
snapshot_idA snapshot ID.
Returns
This OverwriteFiles for method chaining.

◆ ValidateNoConflictingData()

OverwriteFiles & iceberg::OverwriteFiles::ValidateNoConflictingData ( )

Enable validation that data added concurrently does not conflict with this commit's operation.

This method should be called while committing non-idempotent overwrite operations. If a concurrent operation commits a new file after the data was read and that file might contain rows matching the specified conflict detection filter, the overwrite operation detects this and fails.

Calling this method with a correct conflict detection filter is required to maintain isolation for non-idempotent overwrite operations.

Validation uses the conflict detection filter passed to ConflictDetectionFilter() and applies to operations that happened after the snapshot passed to ValidateFromSnapshot(). If the conflict detection filter is not set, any new data added concurrently will fail this overwrite operation.

Returns
This OverwriteFiles for method chaining.

◆ ValidateNoConflictingDeletes()

OverwriteFiles & iceberg::OverwriteFiles::ValidateNoConflictingDeletes ( )

Enable validation that deletes that happened concurrently do not conflict with this commit's operation.

Validating concurrent deletes is required during non-idempotent overwrite operations. If a concurrent operation deletes data in one of the files being overwritten, the overwrite operation must be aborted as it may undelete rows that were removed concurrently.

Calling this method with a correct conflict detection filter is required to maintain isolation for non-idempotent overwrite operations.

Validation uses the conflict detection filter passed to ConflictDetectionFilter() and applies to operations that happened after the snapshot passed to ValidateFromSnapshot(). If the conflict detection filter is not set, this operation will use the row filter provided in OverwriteByRowFilter() to check for new delete files and will ensure there are no conflicting deletes for data files removed via DeleteFile().

Returns
This OverwriteFiles for method chaining.

The documentation for this class was generated from the following files: