74 Result<std::vector<ManifestFile>> Apply(
76 const std::shared_ptr<Snapshot>& snapshot)
override;
78 Status CleanUncommitted(
const std::unordered_set<std::string>& committed)
override;
80 std::unordered_map<std::string, std::string> Summary()
override;
85 std::shared_ptr<TransactionContext> ctx);
88 Status AddDataFile(std::shared_ptr<DataFile> file);
91 Status AddDeleteFile(std::shared_ptr<DataFile> file);
102 Status AddDeleteFile(std::shared_ptr<DataFile> file, int64_t data_sequence_number);
112 Status DeleteDataFile(std::shared_ptr<DataFile> file);
115 Status DeleteDeleteFile(std::shared_ptr<DataFile> file);
120 Status DeleteByPath(std::string_view path);
127 Status DeleteByRowFilter(std::shared_ptr<Expression> expr);
136 void FailMissingDeletePaths();
139 void FailAnyDelete();
142 void SetNewDataFilesDataSequenceNumber(int64_t sequence_number);
146 return new_data_files_data_seq_number_.has_value();
150 void CaseSensitive(
bool case_sensitive);
156 bool AddsDataFiles()
const;
159 bool AddsDeleteFiles()
const;
162 bool DeletesDataFiles()
const;
165 bool DeletesDeleteFiles()
const;
168 const std::shared_ptr<Expression>&
RowFilter()
const {
return delete_expression_; }
174 Result<std::shared_ptr<PartitionSpec>> DataSpec()
const;
177 std::vector<std::shared_ptr<DataFile>> AddedDataFiles()
const;
181 static Status ValidateAddedDataFiles(
const TableMetadata& metadata,
182 std::optional<int64_t> starting_snapshot_id,
183 std::shared_ptr<Expression> filter,
184 const std::shared_ptr<Snapshot>& parent,
185 std::shared_ptr<FileIO> io,
186 bool case_sensitive =
true);
191 static Status ValidateAddedDataFiles(
const TableMetadata& metadata,
192 std::optional<int64_t> starting_snapshot_id,
194 const std::shared_ptr<Snapshot>& parent,
195 std::shared_ptr<FileIO> io);
200 static Status ValidateDataFilesExist(
201 const TableMetadata& metadata, std::optional<int64_t> starting_snapshot_id,
202 const std::unordered_set<std::string>& file_paths,
bool skip_deletes,
203 std::shared_ptr<Expression> filter,
const std::shared_ptr<Snapshot>& parent,
204 std::shared_ptr<FileIO> io,
bool case_sensitive =
true);
216 std::optional<int64_t> starting_snapshot_id,
218 const std::shared_ptr<Snapshot>& parent,
219 std::shared_ptr<FileIO> io)
const {
220 const bool ignore_equality_deletes = new_data_files_data_seq_number_.has_value();
221 return ValidateNoNewDeletesForDataFiles(metadata, starting_snapshot_id,
222 replaced_files, parent, io,
223 ignore_equality_deletes);
233 static Status ValidateNoNewDeletesForDataFiles(
234 const TableMetadata& metadata, std::optional<int64_t> starting_snapshot_id,
235 const DataFileSet& replaced_files,
const std::shared_ptr<Snapshot>& parent,
236 std::shared_ptr<FileIO> io,
bool ignore_equality_deletes =
false);
241 static Status ValidateNoNewDeletesForDataFiles(
242 const TableMetadata& metadata, std::optional<int64_t> starting_snapshot_id,
243 std::shared_ptr<Expression> data_filter,
const DataFileSet& replaced_files,
244 const std::shared_ptr<Snapshot>& parent, std::shared_ptr<FileIO> io,
245 bool case_sensitive =
true);
250 static Status ValidateNoNewDeleteFiles(
const TableMetadata& metadata,
251 std::optional<int64_t> starting_snapshot_id,
252 std::shared_ptr<Expression> data_filter,
253 const std::shared_ptr<Snapshot>& parent,
254 std::shared_ptr<FileIO> io,
255 bool case_sensitive =
true);
260 static Status ValidateNoNewDeleteFiles(
const TableMetadata& metadata,
261 std::optional<int64_t> starting_snapshot_id,
263 const std::shared_ptr<Snapshot>& parent,
264 std::shared_ptr<FileIO> io);
268 static Status ValidateDeletedDataFiles(
const TableMetadata& metadata,
269 std::optional<int64_t> starting_snapshot_id,
270 std::shared_ptr<Expression> data_filter,
271 const std::shared_ptr<Snapshot>& parent,
272 std::shared_ptr<FileIO> io,
273 bool case_sensitive =
true);
278 static Status ValidateDeletedDataFiles(
const TableMetadata& metadata,
279 std::optional<int64_t> starting_snapshot_id,
281 const std::shared_ptr<Snapshot>& parent,
282 std::shared_ptr<FileIO> io);
285 static Result<std::unique_ptr<DeleteFileIndex>> AddedDeleteFiles(
286 const TableMetadata& metadata, std::optional<int64_t> starting_snapshot_id,
287 std::shared_ptr<Expression> data_filter,
288 std::shared_ptr<PartitionSet> partition_set,
289 const std::shared_ptr<Snapshot>& parent, std::shared_ptr<FileIO> io,
290 bool case_sensitive =
true);
295 static Status ValidateAddedDVs(
296 const TableMetadata& metadata, std::optional<int64_t> starting_snapshot_id,
297 std::shared_ptr<Expression> conflict_filter,
298 const std::unordered_set<std::string>& referenced_data_files,
299 const std::shared_ptr<Snapshot>& parent, std::shared_ptr<FileIO> io,
300 bool case_sensitive =
true);
305 std::optional<int64_t> starting_snapshot_id,
306 std::shared_ptr<Expression> conflict_filter,
307 const std::shared_ptr<Snapshot>& parent,
308 std::shared_ptr<FileIO> io)
const;
311 struct PendingDeleteFile {
312 std::shared_ptr<DataFile> file;
313 std::optional<int64_t> data_sequence_number;
320 struct PendingDeleteFilesByReferencedFile {
322 std::string referenced_file;
323 std::vector<PendingDeleteFile> files;
326 void Add(std::string referenced_file, PendingDeleteFile file);
327 bool empty()
const {
return entries_.empty(); }
328 size_t size()
const {
return entries_.size(); }
329 const std::vector<Entry>& entries()
const {
return entries_; }
332 std::vector<Entry> entries_;
333 std::unordered_map<std::string, size_t> index_by_referenced_file_;
341 Result<ManifestFile> CopyManifest(
const ManifestFile& manifest,
bool update_summary);
343 Status AddDeleteFile(std::shared_ptr<DataFile> file,
344 std::optional<int64_t> data_sequence_number);
346 Status ManagersReady()
const;
348 void SetSummaryProperty(
const std::string& property,
const std::string& value)
override;
350 Result<std::vector<PendingDeleteFile>> MergeDVs()
const;
353 Result<std::vector<ManifestFile>> WriteNewDataManifests();
356 Result<std::vector<ManifestFile>> WriteNewDeleteManifests();
358 Status CleanUncommittedAppends(
const std::unordered_set<std::string>& committed);
360 Status DeleteUncommitted(std::vector<ManifestFile>& manifests,
361 const std::unordered_set<std::string>& committed,
bool clear);
364 std::string table_name_;
365 std::shared_ptr<Expression> delete_expression_;
366 bool case_sensitive_ =
true;
370 SnapshotSummaryBuilder added_data_files_summary_;
371 SnapshotSummaryBuilder added_delete_files_summary_;
372 SnapshotSummaryBuilder appended_manifests_summary_;
373 std::unordered_map<std::string, std::string> custom_summary_properties_;
375 std::unique_ptr<ManifestFilterManager> data_filter_manager_;
376 std::unique_ptr<ManifestFilterManager> delete_filter_manager_;
377 std::unique_ptr<ManifestMergeManager> data_merge_manager_;
378 std::unique_ptr<ManifestMergeManager> delete_merge_manager_;
380 std::unordered_map<int32_t, DataFileSet> new_data_files_by_spec_;
381 std::vector<PendingDeleteFile> v2_deletes_;
382 PendingDeleteFilesByReferencedFile dvs_by_referenced_file_;
383 std::optional<int64_t> new_data_files_data_seq_number_;
387 std::vector<ManifestFile> append_manifests_;
389 std::vector<ManifestFile> append_manifests_to_copy_;
390 std::vector<ManifestFile> rewritten_append_manifests_;
394 bool has_new_data_files_ =
false;
395 bool has_new_delete_files_ =
false;
397 std::vector<ManifestFile> cached_new_data_manifests_;
398 std::vector<ManifestFile> cached_new_delete_manifests_;