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,12 +49,12 @@ 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- fields = {"fields " : self .fields } if len ( self . fields ) > 0 else { }
53- return {
54- "field-id" : self .field_id ,
55- "names" : self . names ,
56- ** fields ,
57- }
52+ serialized : Dict [ str , Any ] = {"names " : self .names }
53+ if self . field_id is not None :
54+ serialized [ "field-id" ] = self .field_id
55+ if len ( self . fields ) > 0 :
56+ serialized [ " fields" ] = self . fields
57+ return serialized
5858
5959 def __len__ (self ) -> int :
6060 """Return the number of fields."""
@@ -65,7 +65,8 @@ def __str__(self) -> str:
6565 # Otherwise the UTs fail because the order of the set can change
6666 fields_str = ", " .join ([str (e ) for e in self .fields ]) or ""
6767 fields_str = " " + fields_str if fields_str else ""
68- return "([" + ", " .join (self .names ) + "] -> " + (str (self .field_id ) or "?" ) + fields_str + ")"
68+ field_id = "?" if self .field_id is None else (str (self .field_id ) or "?" )
69+ return "([" + ", " .join (self .names ) + "] -> " + field_id + fields_str + ")"
6970
7071
7172class NameMapping (IcebergRootModel [List [MappedField ]]):
@@ -232,7 +233,9 @@ def mapping(self, nm: NameMapping, field_results: List[MappedField]) -> List[Map
232233
233234 def fields (self , struct : List [MappedField ], field_results : List [MappedField ]) -> List [MappedField ]:
234235 reassignments : Dict [str , int ] = {
235- update .name : update .field_id for f in field_results if (update := self ._updates .get (f .field_id ))
236+ update .name : update .field_id
237+ for f in field_results
238+ if f .field_id is not None and (update := self ._updates .get (f .field_id ))
236239 }
237240 return [
238241 updated_field
@@ -241,6 +244,8 @@ def fields(self, struct: List[MappedField], field_results: List[MappedField]) ->
241244 ]
242245
243246 def field (self , field : MappedField , field_result : List [MappedField ]) -> MappedField :
247+ if field .field_id is None :
248+ return field
244249 field_names = field .names
245250 if (update := self ._updates .get (field .field_id )) is not None and update .name not in field_names :
246251 field_names .append (update .name )
@@ -333,8 +338,8 @@ def struct(self, struct: StructType, struct_partner: Optional[MappedField], fiel
333338 return StructType (* field_results )
334339
335340 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 )} " )
341+ if field_partner is None or field_partner . field_id is None :
342+ raise ValueError (f"Field or field ID missing from NameMapping: { '.' .join (self .current_path )} " )
338343
339344 return NestedField (
340345 field_id = field_partner .field_id ,
0 commit comments