@@ -304,7 +304,7 @@ nlohmann::json SchemaToJson(const Schema& schema) {
304304 return json;
305305}
306306
307- nlohmann::json SnapshotRefToJson (const SnapshotRef& ref) {
307+ nlohmann::json ToJson (const SnapshotRef& ref) {
308308 nlohmann::json json;
309309 json[kSnapshotId ] = ref.snapshot_id ;
310310 json[kType ] = SnapshotRefTypeToString (ref.type ());
@@ -320,14 +320,17 @@ nlohmann::json SnapshotRefToJson(const SnapshotRef& ref) {
320320 return json;
321321}
322322
323- nlohmann::json SnapshotToJson (const Snapshot& snapshot) {
323+ nlohmann::json ToJson (const Snapshot& snapshot) {
324324 nlohmann::json json;
325325 json[kSnapshotId ] = snapshot.snapshot_id ;
326326 SetOptionalField (json, kParentSnapshotId , snapshot.parent_snapshot_id );
327327 json[kSequenceNumber ] = snapshot.sequence_number ;
328328 json[kTimestampMs ] = snapshot.timestamp_ms ;
329329 json[kManifestList ] = snapshot.manifest_list ;
330- json[kSummary ] = snapshot.summary ;
330+ // If there is an operation, write the summary map
331+ if (snapshot.operation ().has_value ()) {
332+ json[kSummary ] = snapshot.summary ;
333+ }
331334 SetOptionalField (json, kSchemaId , snapshot.schema_id );
332335 return json;
333336}
@@ -558,30 +561,32 @@ Result<std::unique_ptr<Snapshot>> SnapshotFromJson(const nlohmann::json& json) {
558561 GetJsonValueOptional<int64_t >(json, kParentSnapshotId ));
559562
560563 ICEBERG_ASSIGN_OR_RAISE (auto summary_json,
561- GetJsonValue <nlohmann::json>(json, kSummary ));
564+ GetJsonValueOptional <nlohmann::json>(json, kSummary ));
562565 std::unordered_map<std::string, std::string> summary;
563- for (const auto & [key, value] : summary_json.items ()) {
564- if (!kValidSnapshotSummaryFields .contains (key)) {
565- return unexpected<Error>({
566- .kind = ErrorKind::kJsonParseError ,
567- .message = std::format (" Invalid snapshot summary field: {}" , key),
568- });
569- }
570- if (!value.is_string ()) {
571- return unexpected<Error>({
572- .kind = ErrorKind::kJsonParseError ,
573- .message =
574- std::format (" Invalid snapshot summary field value: {}" , value.dump ()),
575- });
576- }
577- if (key == SnapshotSummaryFields::kOperation &&
578- !kValidDataOperation .contains (value.get <std::string>())) {
579- return unexpected<Error>({
580- .kind = ErrorKind::kJsonParseError ,
581- .message = std::format (" Invalid snapshot operation: {}" , value.dump ()),
582- });
566+ if (summary_json.has_value ()) {
567+ for (const auto & [key, value] : summary_json->items ()) {
568+ if (!kValidSnapshotSummaryFields .contains (key)) {
569+ return unexpected<Error>({
570+ .kind = ErrorKind::kJsonParseError ,
571+ .message = std::format (" Invalid snapshot summary field: {}" , key),
572+ });
573+ }
574+ if (!value.is_string ()) {
575+ return unexpected<Error>({
576+ .kind = ErrorKind::kJsonParseError ,
577+ .message =
578+ std::format (" Invalid snapshot summary field value: {}" , value.dump ()),
579+ });
580+ }
581+ if (key == SnapshotSummaryFields::kOperation &&
582+ !kValidDataOperation .contains (value.get <std::string>())) {
583+ return unexpected<Error>({
584+ .kind = ErrorKind::kJsonParseError ,
585+ .message = std::format (" Invalid snapshot operation: {}" , value.dump ()),
586+ });
587+ }
588+ summary[key] = value.get <std::string>();
583589 }
584- summary[key] = value.get <std::string>();
585590 }
586591
587592 ICEBERG_ASSIGN_OR_RAISE (auto schema_id, GetJsonValueOptional<int32_t >(json, kSchemaId ));
0 commit comments