3737
3838
3939class MappedField (IcebergBaseModel ):
40- field_id : int = Field (alias = "field-id" )
40+ field_id : Optional [ int ] = Field (alias = "field-id" , default = None )
4141 names : List [str ] = conlist (str )
4242 fields : List [MappedField ] = Field (default_factory = list )
4343
@@ -49,9 +49,10 @@ def convert_null_to_empty_List(cls, v: Any) -> Any:
4949 @model_serializer
5050 def ser_model (self ) -> Dict [str , Any ]:
5151 """Set custom serializer to leave out the field when it is empty."""
52+ field_id = {"field-id" : self .field_id } if self .field_id is not None else {}
5253 fields = {"fields" : self .fields } if len (self .fields ) > 0 else {}
5354 return {
54- "field-id" : self . field_id ,
55+ ** field_id ,
5556 "names" : self .names ,
5657 ** fields ,
5758 }
@@ -65,7 +66,8 @@ def __str__(self) -> str:
6566 # Otherwise the UTs fail because the order of the set can change
6667 fields_str = ", " .join ([str (e ) for e in self .fields ]) or ""
6768 fields_str = " " + fields_str if fields_str else ""
68- return "([" + ", " .join (self .names ) + "] -> " + (str (self .field_id ) or "?" ) + fields_str + ")"
69+ field_id = "?" if self .field_id is None else (str (self .field_id ) or "?" )
70+ return "([" + ", " .join (self .names ) + "] -> " + field_id + fields_str + ")"
6971
7072
7173class NameMapping (IcebergRootModel [List [MappedField ]]):
@@ -232,7 +234,9 @@ def mapping(self, nm: NameMapping, field_results: List[MappedField]) -> List[Map
232234
233235 def fields (self , struct : List [MappedField ], field_results : List [MappedField ]) -> List [MappedField ]:
234236 reassignments : Dict [str , int ] = {
235- update .name : update .field_id for f in field_results if (update := self ._updates .get (f .field_id ))
237+ update .name : update .field_id
238+ for f in field_results
239+ if f .field_id is not None and (update := self ._updates .get (f .field_id ))
236240 }
237241 return [
238242 updated_field
@@ -241,6 +245,8 @@ def fields(self, struct: List[MappedField], field_results: List[MappedField]) ->
241245 ]
242246
243247 def field (self , field : MappedField , field_result : List [MappedField ]) -> MappedField :
248+ if field .field_id is None :
249+ return field
244250 field_names = field .names
245251 if (update := self ._updates .get (field .field_id )) is not None and update .name not in field_names :
246252 field_names .append (update .name )
@@ -333,8 +339,8 @@ def struct(self, struct: StructType, struct_partner: Optional[MappedField], fiel
333339 return StructType (* field_results )
334340
335341 def field (self , field : NestedField , field_partner : Optional [MappedField ], field_result : IcebergType ) -> IcebergType :
336- if field_partner is None :
337- raise ValueError (f"Field missing from NameMapping: { '.' .join (self .current_path )} " )
342+ if field_partner is None or field_partner . field_id is None :
343+ raise ValueError (f"Field or field ID missing from NameMapping: { '.' .join (self .current_path )} " )
338344
339345 return NestedField (
340346 field_id = field_partner .field_id ,
0 commit comments