@@ -164,32 +164,7 @@ ManifestEntryAdapter::~ManifestEntryAdapter() {
164164 }
165165}
166166
167- Status ManifestEntryAdapter::AddEntry (ManifestEntry& entry) {
168- ICEBERG_RETURN_UNEXPECTED (CheckDataFile (*entry.data_file ));
169- entry.status = ManifestStatus::kAdded ;
170- entry.snapshot_id = snapshot_id_;
171- if (entry.sequence_number .has_value () &&
172- entry.sequence_number .value () < TableMetadata::kInitialSequenceNumber ) {
173- entry.sequence_number = std::nullopt ;
174- }
175- entry.file_sequence_number = std::nullopt ;
176- return AddEntryInternal (entry);
177- }
178-
179- Status ManifestEntryAdapter::AddDeleteEntry (ManifestEntry& entry) {
180- ICEBERG_RETURN_UNEXPECTED (CheckDataFile (*entry.data_file ));
181- entry.status = ManifestStatus::kDeleted ;
182- entry.snapshot_id = snapshot_id_;
183- return AddEntryInternal (entry);
184- }
185-
186- Status ManifestEntryAdapter::AddExistingEntry (ManifestEntry& entry) {
187- ICEBERG_RETURN_UNEXPECTED (CheckDataFile (*entry.data_file ));
188- entry.status = ManifestStatus::kExisting ;
189- return AddEntryInternal (entry);
190- }
191-
192- ManifestFile ManifestEntryAdapter::ToManifestFile () const {
167+ Result<ManifestFile> ManifestEntryAdapter::ToManifestFile () const {
193168 ManifestFile manifest_file;
194169 manifest_file.partition_spec_id = partition_spec_->spec_id ();
195170 manifest_file.content = content_;
@@ -199,75 +174,17 @@ ManifestFile ManifestEntryAdapter::ToManifestFile() const {
199174 manifest_file.min_sequence_number =
200175 min_sequence_number_.value_or (TableMetadata::kInvalidSequenceNumber );
201176 manifest_file.existing_files_count = existing_files_count_;
202- manifest_file.added_snapshot_id = snapshot_id_.value_or (Snapshot::kInvalidSnapshotId );
203177 manifest_file.added_files_count = add_files_count_;
204178 manifest_file.existing_files_count = existing_files_count_;
205179 manifest_file.deleted_files_count = delete_files_count_;
206180 manifest_file.added_rows_count = add_rows_count_;
207181 manifest_file.existing_rows_count = existing_rows_count_;
208182 manifest_file.deleted_rows_count = delete_rows_count_;
209- manifest_file.partitions = std::move (partition_summary_->Summaries ());
183+ ICEBERG_ASSIGN_OR_RAISE (auto partition_summary, partition_summary_->Summaries ());
184+ manifest_file.partitions = std::move (partition_summary);
210185 return manifest_file;
211186}
212187
213- Status ManifestEntryAdapter::CheckDataFile (const DataFile& file) const {
214- switch (content_) {
215- case ManifestContent::kData :
216- if (file.content != DataFile::Content::kData ) {
217- return InvalidArgument (
218- " Manifest content type: data, data file content should be: data, but got: {}" ,
219- ToString (file.content ));
220- }
221- break ;
222- case ManifestContent::kDeletes :
223- if (file.content != DataFile::Content::kPositionDeletes &&
224- file.content != DataFile::Content::kEqualityDeletes ) {
225- return InvalidArgument (
226- " Manifest content type: deletes, data file content should be: "
227- " position_deletes or equality_deletes, but got: {}" ,
228- ToString (file.content ));
229- }
230- break ;
231- default :
232- std::unreachable ();
233- }
234- return {};
235- }
236-
237- Status ManifestEntryAdapter::AddEntryInternal (const ManifestEntry& entry) {
238- if (entry.data_file == nullptr ) [[unlikely]] {
239- return InvalidManifest (" Missing required data_file field from manifest entry." );
240- }
241-
242- switch (entry.status ) {
243- case ManifestStatus::kAdded :
244- add_files_count_++;
245- add_rows_count_ += entry.data_file ->record_count ;
246- break ;
247- case ManifestStatus::kExisting :
248- existing_files_count_++;
249- existing_rows_count_ += entry.data_file ->record_count ;
250- break ;
251- case ManifestStatus::kDeleted :
252- delete_files_count_++;
253- delete_rows_count_ += entry.data_file ->record_count ;
254- break ;
255- default :
256- std::unreachable ();
257- }
258-
259- ICEBERG_RETURN_UNEXPECTED (partition_summary_->Update (entry.data_file ->partition ));
260-
261- if (entry.IsAlive () && entry.sequence_number .has_value ()) {
262- if (!min_sequence_number_.has_value () ||
263- entry.sequence_number .value () < min_sequence_number_.value ()) {
264- min_sequence_number_ = entry.sequence_number .value ();
265- }
266- }
267-
268- return AppendInternal (entry);
269- }
270-
271188Status ManifestEntryAdapter::AppendPartitionValues (
272189 ArrowArray* array, const std::shared_ptr<StructType>& partition_type,
273190 const std::vector<Literal>& partition_values) {
@@ -425,13 +342,16 @@ Status ManifestEntryAdapter::AppendDataFile(
425342 ICEBERG_NANOARROW_RETURN_UNEXPECTED (ArrowArrayAppendNull (child_array, 1 ));
426343 }
427344 break ;
428- case 142 : // first_row_id (optional int64)
429- if (file.first_row_id .has_value ()) {
430- ICEBERG_RETURN_UNEXPECTED (AppendField (child_array, file.first_row_id .value ()));
345+ case 142 : {
346+ // first_row_id (optional int64)
347+ ICEBERG_ASSIGN_OR_RAISE (auto first_row_id, GetFirstRowId (file));
348+ if (first_row_id.has_value ()) {
349+ ICEBERG_RETURN_UNEXPECTED (AppendField (child_array, first_row_id.value ()));
431350 } else {
432351 ICEBERG_NANOARROW_RETURN_UNEXPECTED (ArrowArrayAppendNull (child_array, 1 ));
433352 }
434353 break ;
354+ }
435355 case 143 : {
436356 // referenced_data_file (optional string)
437357 ICEBERG_ASSIGN_OR_RAISE (auto referenced_data_file, GetReferenceDataFile (file));
@@ -493,6 +413,29 @@ Result<std::optional<int64_t>> ManifestEntryAdapter::GetContentSizeInBytes(
493413}
494414
495415Status ManifestEntryAdapter::AppendInternal (const ManifestEntry& entry) {
416+ if (entry.data_file == nullptr ) [[unlikely]] {
417+ return InvalidManifest (" Missing required data_file field from manifest entry." );
418+ }
419+
420+ switch (entry.status ) {
421+ case ManifestStatus::kAdded :
422+ add_files_count_++;
423+ add_rows_count_ += entry.data_file ->record_count ;
424+ break ;
425+ case ManifestStatus::kExisting :
426+ existing_files_count_++;
427+ existing_rows_count_ += entry.data_file ->record_count ;
428+ break ;
429+ case ManifestStatus::kDeleted :
430+ delete_files_count_++;
431+ delete_rows_count_ += entry.data_file ->record_count ;
432+ break ;
433+ default :
434+ std::unreachable ();
435+ }
436+
437+ ICEBERG_RETURN_UNEXPECTED (partition_summary_->Update (entry.data_file ->partition ));
438+
496439 const auto & fields = manifest_schema_->fields ();
497440 for (size_t i = 0 ; i < fields.size (); i++) {
498441 const auto & field = fields[i];
0 commit comments