@@ -359,6 +359,53 @@ TEST(JsonInternalTest, Snapshot) {
359359 TestJsonConversion (snapshot, expected_json);
360360}
361361
362+ TEST (JsonInternalTest, SnapshotRowLineageSerializesTopLevelFields) {
363+ ICEBERG_UNWRAP_OR_FAIL (
364+ auto snapshot,
365+ Snapshot::Make (/* sequence_number=*/ 99 , /* snapshot_id=*/ 1234567890 ,
366+ /* parent_snapshot_id=*/ 9876543210 ,
367+ TimePointMsFromUnixMs (1234567890123 ), DataOperation::kAppend ,
368+ {{SnapshotSummaryFields::kAddedDataFiles , " 50" }},
369+ /* schema_id=*/ 42 , " /path/to/manifest_list" ,
370+ /* first_row_id=*/ 100 , /* added_rows=*/ 25 ));
371+
372+ auto json = ToJson (*snapshot);
373+ EXPECT_EQ (json[" first-row-id" ], 100 );
374+ EXPECT_EQ (json[" added-rows" ], 25 );
375+ EXPECT_FALSE (json[" summary" ].contains (" first-row-id" ));
376+ EXPECT_FALSE (json[" summary" ].contains (" added-rows" ));
377+ }
378+
379+ TEST (JsonInternalTest, SnapshotFromJsonReadsTopLevelRowLineageFields) {
380+ nlohmann::json snapshot_json =
381+ R"( {"snapshot-id":1234567890,
382+ "parent-snapshot-id":9876543210,
383+ "sequence-number":99,
384+ "timestamp-ms":1234567890123,
385+ "manifest-list":"/path/to/manifest_list",
386+ "summary":{
387+ "operation":"append",
388+ "added-data-files":"50",
389+ "first-row-id":"101",
390+ "added-rows":"26"
391+ },
392+ "schema-id":42,
393+ "first-row-id":100,
394+ "added-rows":25})" _json;
395+
396+ ICEBERG_UNWRAP_OR_FAIL (auto snapshot, SnapshotFromJson (snapshot_json));
397+ ICEBERG_UNWRAP_OR_FAIL (auto first_row_id, snapshot->FirstRowId ());
398+ ICEBERG_UNWRAP_OR_FAIL (auto added_rows, snapshot->AddedRows ());
399+ EXPECT_EQ (first_row_id, 100 );
400+ EXPECT_EQ (added_rows, 25 );
401+
402+ auto json = ToJson (*snapshot);
403+ EXPECT_EQ (json[" first-row-id" ], 100 );
404+ EXPECT_EQ (json[" added-rows" ], 25 );
405+ EXPECT_EQ (json[" summary" ][" first-row-id" ], " 101" );
406+ EXPECT_EQ (json[" summary" ][" added-rows" ], " 26" );
407+ }
408+
362409// FIXME: disable it for now since Iceberg Spark plugin generates
363410// custom summary keys.
364411TEST (JsonInternalTest, DISABLED_SnapshotFromJsonWithInvalidSummary) {
@@ -583,19 +630,21 @@ TEST(JsonInternalTest, TableUpdateSetDefaultSortOrder) {
583630}
584631
585632TEST (JsonInternalTest, TableUpdateAddSnapshot) {
586- auto snapshot = std::make_shared<Snapshot> (
587- Snapshot{. snapshot_id = 123456789 ,
588- . parent_snapshot_id = 987654321 ,
589- . sequence_number = 5 ,
590- . timestamp_ms = TimePointMsFromUnixMs (1234567890000 ),
591- . manifest_list = " /path/to/manifest-list.avro" ,
592- . summary = {{SnapshotSummaryFields:: kOperation , DataOperation:: kAppend }},
593- . schema_id = 1 } );
633+ ICEBERG_UNWRAP_OR_FAIL (
634+ auto snapshot_unique ,
635+ Snapshot::Make ( /* sequence_number= */ 5 , /* snapshot_id= */ 123456789 ,
636+ /* parent_snapshot_id= */ 987654321 ,
637+ TimePointMsFromUnixMs (1234567890000 ), DataOperation:: kAppend ,
638+ /* summary= */ {}, /* schema_id= */ 1 , " /path/to/manifest-list.avro" ,
639+ /* first_row_id= */ 100 , /* added_rows= */ 25 ));
640+ std::shared_ptr<Snapshot> snapshot ( std::move (snapshot_unique) );
594641 table::AddSnapshot update (snapshot);
595642
596643 ICEBERG_UNWRAP_OR_FAIL (auto json, ToJson (update));
597644 EXPECT_EQ (json[" action" ], " add-snapshot" );
598645 EXPECT_TRUE (json.contains (" snapshot" ));
646+ EXPECT_EQ (json[" snapshot" ][" first-row-id" ], 100 );
647+ EXPECT_EQ (json[" snapshot" ][" added-rows" ], 25 );
599648
600649 auto parsed = TableUpdateFromJson (json);
601650 ASSERT_THAT (parsed, IsOk ());
0 commit comments