o
    i<                     @  s  d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZ dd	lmZmZmZmZ dd
lmZmZmZmZmZmZmZ ddlm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( G dd de Z)G dd de!e*e)  Z+edZ,edZ-G dd dee,e-f eZ.G dd de.e/e0e)f e/e0e)f f Z1ed=ddZ2e23e+d>ddZ4e23e*d?d"dZ4d@d%d&Z5G d'd( d(ee*e)  Z6G d)d* d*e.e*e) e)f Z7dAd-d.Z8dBd3d4Z9G d5d6 d6ee) Z:G d7d8 d8ee)e#f Z;dCd;d<Z<dS )Dz
Contains everything around the name mapping.

More information can be found on here:
https://iceberg.apache.org/spec/#name-mapping-serialization
    )annotationsN)ABCabstractmethod)ChainMap)Iterator)cached_propertysingledispatch)AnyGenericTypeVar)Fieldconlistfield_validatormodel_serializer)PPartnerAccessorSchemaSchemaVisitorSchemaWithPartnerVisitorvisitvisit_with_partner)IcebergBaseModelIcebergRootModel)IcebergTypeListTypeMapTypeNestedFieldPrimitiveType
StructTypec                   @  s   e Zd ZU edddZded< eeZded< ee	dZ
d	ed
< ed
ddedddZedddZdddZdddZdS )MappedFieldfield-idN)aliasdefaultz
int | Nonefield_idz	list[str]names)default_factorylist[MappedField]fieldsbefore)modevr	   returnc                 C  s   |pg S N )clsr*   r-   r-   Z/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/pyiceberg/table/name_mapping.pyconvert_null_to_empty_List-      z&MappedField.convert_null_to_empty_Listdict[str, Any]c                 C  s:   d| j i}| jdur| j|d< t| jdkr| j|d< |S )z>Set custom serializer to leave out the field when it is empty.r$   Nr    r   r'   )r$   r#   lenr'   )self
serializedr-   r-   r/   	ser_model2   s   



zMappedField.ser_modelintc                 C  
   t | jS )zReturn the number of fields.)r3   r'   r4   r-   r-   r/   __len__<      
zMappedField.__len__strc                 C  sf   d dd | jD pd}|rd| nd}| jdu rdnt| jp"d}dd | j d	 | | d
 S )z8Convert the mapped-field into a nicely formatted string.z, c                 S     g | ]}t |qS r-   r<   .0er-   r-   r/   
<listcomp>C       z'MappedField.__str__.<locals>.<listcomp>  N?z([z] -> ))joinr'   r#   r<   r$   )r4   
fields_strr#   r-   r-   r/   __str__@   s    zMappedField.__str__)r*   r	   r+   r	   )r+   r2   r+   r7   r+   r<   )__name__
__module____qualname__r   r#   __annotations__r   r<   r$   listr'   r   classmethodr0   r   r6   r:   rJ   r-   r-   r-   r/   r   (   s   
 

	r   c                   @  sB   e Zd ZU ded< edddZddd	ZdddZdddZdS )NameMappingr&   rootr+   dict[str, MappedField]c                 C  s   t | t S r,   )visit_name_mapping_IndexByNamer9   r-   r-   r/   _field_by_nameL   s   zNameMapping._field_by_namer7   c                 C  r8   )zReturn the number of mappings.)r3   rT   r9   r-   r-   r/   r:   P   r;   zNameMapping.__len__Iterator[MappedField]c                 C  r8   )zIterate over the mapped fields.)iterrT   r9   r-   r-   r/   __iter__T   r;   zNameMapping.__iter__r<   c                 C  s0   t | jdkr	dS dddd | jD  d S )z8Convert the name-mapping into a nicely formatted string.r   z[]z[
  z
  c                 S  r=   r-   r>   r?   r-   r-   r/   rB   ]   rC   z'NameMapping.__str__.<locals>.<listcomp>z
])r3   rT   rH   r9   r-   r-   r/   rJ   X   s   zNameMapping.__str__N)r+   rU   rK   )r+   rY   rL   )	rM   rN   rO   rP   r   rX   r:   r[   rJ   r-   r-   r-   r/   rS   I   s   
 

rS   STc                   @  s6   e Zd ZedddZedddZedddZdS )NameMappingVisitornmrS   field_resultsr\   r+   c                 C     dS )zVisit a NameMapping.Nr-   r4   r_   r`   r-   r-   r/   mappinge       zNameMappingVisitor.mappingstructr&   list[T]c                 C  ra   )zVisit a List[MappedField].Nr-   r4   re   r`   r-   r-   r/   r'   i   rd   zNameMappingVisitor.fieldsfieldr   field_resultr]   c                 C  ra   )zVisit a MappedField.Nr-   r4   rh   ri   r-   r-   r/   rh   m   rd   zNameMappingVisitor.fieldN)r_   rS   r`   r\   r+   r\   )re   r&   r`   rf   r+   r\   )rh   r   ri   r\   r+   r]   )rM   rN   rO   r   rc   r'   rh   r-   r-   r-   r/   r^   d   s    r^   c                   @  s*   e Zd ZdddZdddZdddZdS )rW   r_   rS   r`   rU   r+   c                 C     |S r,   r-   rb   r-   r-   r/   rc   s      z_IndexByName.mappingre   r&   list[dict[str, MappedField]]c                 C  s   t t| S r,   )dictr   rg   r-   r-   r/   r'   v      z_IndexByName.fieldsrh   r   ri   c                   s.    fdd|  D } jD ]} ||< q|S )Nc                   s,   i | ]\}} j D ]
}| d | |q	qS ).r$   )r@   keyresult_field
field_namerh   r-   r/   
<dictcomp>z   s
    
z&_IndexByName.field.<locals>.<dictcomp>)itemsr$   )r4   rh   ri   resultnamer-   ru   r/   rh   y   s   


z_IndexByName.fieldN)r_   rS   r`   rU   r+   rU   )re   r&   r`   rm   r+   rU   )rh   r   ri   rU   r+   rU   )rM   rN   rO   rc   r'   rh   r-   r-   r-   r/   rW   r   s    

rW   obj-NameMapping | list[MappedField] | MappedFieldvisitorNameMappingVisitor[S, T]r+   c                 C  s   t d|  )z2Traverse the name mapping in post-order traversal.zCannot visit non-type: )NotImplementedErrorrz   r|   r-   r-   r/   rV      s   rV   c                 C  s   | | t| j|S r,   )rc   rV   rT   r   r-   r-   r/   _   s   r   r'   r&   c                   s    fdd| D }  | |S )Nc                   s    g | ]}  |t|j qS r-   )rh   rV   r'   r@   rh   r|   r-   r/   rB      s     z_.<locals>.<listcomp>)r'   )r'   r|   resultsr-   r   r/   r      s   rc   r<   c                 C  s
   t | S r,   )rS   model_validate_json)rc   r-   r-   r/   parse_mapping_from_json   s   
r   c                   @  sH   e Zd Zd#ddZd$ddZd%ddZd&ddZd'ddZd(d d!Zd"S ))_CreateMappingschemar   struct_resultbuiltins.list[MappedField]r+   c                 C  rk   r,   r-   )r4   r   r   r-   r-   r/   r      rl   z_CreateMapping.schemare   r   r`   )builtins.list[builtins.list[MappedField]]c                 C  s   dd t |j|ddD S )Nc                 S  s$   g | ]\}}t |j|jg|d qS )r#   r$   r'   )r   r#   ry   )r@   rh   rx   r-   r-   r/   rB      s    z)_CreateMapping.struct.<locals>.<listcomp>T)strict)zipr'   rg   r-   r-   r/   re      s   z_CreateMapping.structrh   r   ri   c                 C  rk   r,   r-   rj   r-   r-   r/   rh      rl   z_CreateMapping.field	list_typer   element_resultc                 C  s   t |jdg|dgS )Nelementr   )r   
element_id)r4   r   r   r-   r-   r/   rQ         z_CreateMapping.listmap_typer   
key_resultvalue_resultc                 C  s$   t |jdg|dt |jdg|dgS )Nrr   r   value)r   key_idvalue_id)r4   r   r   r   r-   r-   r/   map   s   z_CreateMapping.map	primitiver   c                 C  s   g S r,   r-   )r4   r   r-   r-   r/   r      rl   z_CreateMapping.primitiveN)r   r   r   r   r+   r   )re   r   r`   r   r+   r   )rh   r   ri   r   r+   r   )r   r   r   r   r+   r   )r   r   r   r   r   r   r+   r   )r   r   r+   r   )	rM   rN   rO   r   re   rh   rQ   r   r   r-   r-   r-   r/   r      s    




r   c                   @  s^   e Zd ZU ded< ded< d#ddZed$ddZd%ddZd&ddZd'ddZ	d(d d!Z
d"S ))_UpdateMappingdict[int, NestedField]_updatesdict[int, list[NestedField]]_addsupdatesaddsc                 C  s   || _ || _d S r,   )r   r   )r4   r   r   r-   r-   r/   __init__   s   
z_UpdateMapping.__init__rh   r   assignmentsdict[str, int]r+   MappedField | Nonec                   sb   t   | jD ]}|| }r|| jkr | q fdd| jD }|r/t| j|| jdS d S )Nc                   s   g | ]}| vr|qS r-   r-   r@   fremoved_namesr-   r/   rB      s    z;_UpdateMapping._remove_reassigned_names.<locals>.<listcomp>r   )setr$   getr#   addr   r'   )rh   r   ry   assigned_idremaining_namesr-   r   r/   _remove_reassigned_names   s   

z'_UpdateMapping._remove_reassigned_namesmapped_fieldsr&   	parent_idr7   c              	     sv   j | }r9g }g }|D ]}|t|j|jgt|jt d qdd |D   fdd|D | }|S |S )Nr   c                 S  s   i | ]}|j |jqS r-   )ry   r#   r   r-   r-   r/   rv      s    z2_UpdateMapping._add_new_fields.<locals>.<dictcomp>c                   $   g | ]} |  d urqS r,   r   r   reassignmentsr4   updated_fieldr-   r/   rB      
    z2_UpdateMapping._add_new_fields.<locals>.<listcomp>)	r   r   appendr   r#   ry   r   
field_typer   )r4   r   r   fields_to_addr'   
new_fieldsr   r-   r   r/   _add_new_fields   s   z_UpdateMapping._add_new_fieldsr_   rS   r`   c                 C  s   |  |dS )N)r   rb   r-   r-   r/   rc      ro   z_UpdateMapping.mappingre   c                   s*   fdd|D   fdd|D S )Nc                   s2   i | ]}|j d ur j|j  rjj qS r,   )r#   r   r   ry   r   )r4   updater-   r/   rv      s
    z)_UpdateMapping.fields.<locals>.<dictcomp>c                   r   r,   r   r   r   r-   r/   rB      r   z)_UpdateMapping.fields.<locals>.<listcomp>r-   rg   r-   )r   r4   r   r   r/   r'      s   z_UpdateMapping.fieldsri   c                 C  sZ   |j d u r|S |j}| j|j  }d ur |j|vr ||j t|j || ||j dS )Nr   )r#   r$   r   r   ry   r   r   r   )r4   rh   ri   field_namesr   r-   r-   r/   rh      s   
 z_UpdateMapping.fieldN)r   r   r   r   )rh   r   r   r   r+   r   )r   r&   r   r7   r+   r&   )r_   rS   r`   r&   r+   r&   )re   r&   r`   r&   r+   r&   )rh   r   ri   r&   r+   r   )rM   rN   rO   rP   r   staticmethodr   r   rc   r'   rh   r-   r-   r-   r/   r      s   
 



r   r   r   c                 C  s   t t| t S r,   )rS   r   r   )r   r-   r-   r/   create_mapping_from_schema      r   r   r   r   r   c                 C  s   t t| t||S r,   )rS   rV   r   )rc   r   r   r-   r-   r/   update_mapping   r   r   c                   @  s>   e Zd ZdddZdddZdddZdddZdddZdS )NameMappingAccessorpartnerr   r+   c                 C  s   |S r,   r-   )r4   r   r-   r-   r/   schema_partner   rl   z"NameMappingAccessor.schema_partnerpartner_struct&list[MappedField] | MappedField | Noner   r7   rt   r<   c                 C  s8   |d urt |tr|j}|D ]}||jv r|  S qd S r,   )
isinstancer   r'   r$   )r4   r   r   rt   rh   r-   r-   r/   field_partner  s   

z!NameMappingAccessor.field_partnerpartner_listc                 C  *   |d ur|j D ]}d|jv r|  S qd S Nr   r'   r$   )r4   r   rh   r-   r-   r/   list_element_partner     

z(NameMappingAccessor.list_element_partnerpartner_mapc                 C  r   Nrr   r   r4   r   rh   r-   r-   r/   map_key_partner  r   z#NameMappingAccessor.map_key_partnerc                 C  r   Nr   r   r   r-   r-   r/   map_value_partner  r   z%NameMappingAccessor.map_value_partnerN)r   r   r+   r   )r   r   r   r7   rt   r<   r+   r   )r   r   r+   r   )r   r   r+   r   )rM   rN   rO   r   r   r   r   r   r-   r-   r-   r/   r      s    



r   c                   @  s   e Zd ZU ded< dFddZdGddZdGddZdHddZdHddZdIddZ	dIddZ
dJddZdJdd ZdKd(d)ZdLd.d/ZdMd1d2ZdNd7d8ZdOd>d?ZdPdCdDZdES )QNameMappingProjectionVisitorzbuiltins.list[str]current_pathr+   Nonec                 C  s
   g | _ d S r,   )r   r9   r-   r-   r/   r   )  r;   z%NameMappingProjectionVisitor.__init__rh   r   r   P | Nonec                 C  s   | j |j d S r,   )r   r   ry   r4   rh   r   r-   r-   r/   before_field-     z)NameMappingProjectionVisitor.before_fieldc                 C     | j   d S r,   r   popr   r-   r-   r/   after_field0     z(NameMappingProjectionVisitor.after_fieldr   element_partnerc                 C     | j d d S r   r   r   r4   r   r   r-   r-   r/   before_list_element3  r   z0NameMappingProjectionVisitor.before_list_elementc                 C  r   r,   r   r   r-   r-   r/   after_list_element6  r   z/NameMappingProjectionVisitor.after_list_elementrr   key_partnerc                 C  r   r   r   r4   rr   r   r-   r-   r/   before_map_key9  r   z+NameMappingProjectionVisitor.before_map_keyc                 C  r   r,   r   r   r-   r-   r/   after_map_key<  r   z*NameMappingProjectionVisitor.after_map_keyr   value_partnerc                 C  r   r   r   r4   r   r   r-   r-   r/   before_map_value?  r   z-NameMappingProjectionVisitor.before_map_valuec                 C  r   r,   r   r   r-   r-   r/   after_map_valueB  r   z,NameMappingProjectionVisitor.after_map_valuer   r   r   r   r   r   r   c                 C  s   t |jd|jiS )N	schema_id)r   r'   r   )r4   r   r   r   r-   r-   r/   r   E  r   z#NameMappingProjectionVisitor.schemare   struct_partnerr`   builtins.list[NestedField]c                 C  s   t | S r,   )r   )r4   re   r   r`   r-   r-   r/   re   H  r1   z#NameMappingProjectionVisitor.structri   c              	   C  sJ   |d u s	|j d u rtdd| j t|j |j||j|j|j|j	dS )Nz,Field or field ID missing from NameMapping: rp   )r#   ry   r   requireddocinitial_defaultinitial_write)
r#   
ValueErrorrH   r   r   ry   r   r   r   write_default)r4   rh   r   ri   r-   r-   r/   rh   M  s   z"NameMappingProjectionVisitor.fieldr   r   list_partnerr   c                 C  sD   |d u rt dd| j tdd |jD j}t|||jdS )N Could not find field with name: rp   c                 s      | ]
}d |j v r|V  qdS )r   Nrq   r   r-   r-   r/   	<genexpr>_      z4NameMappingProjectionVisitor.list.<locals>.<genexpr>)r   r   element_required)r   rH   r   nextr'   r#   r   r   )r4   r   r   r   r   r-   r-   r/   rQ   [  s   z!NameMappingProjectionVisitor.listr   r   map_partnerr   r   c                 C  s^   |d u rt dd| j tdd |jD j}tdd |jD j}t|||||jdS )Nr   rp   c                 s  r   )rr   Nrq   r   r-   r-   r/   r   h  r   z3NameMappingProjectionVisitor.map.<locals>.<genexpr>c                 s  r   )r   Nrq   r   r-   r-   r/   r   i  r   )r   key_typer   
value_typevalue_required)r   rH   r   r   r'   r#   r   r  )r4   r   r  r   r   r   r   r-   r-   r/   r   b  s   z NameMappingProjectionVisitor.mapr   r   primitive_partnerc                 C  s"   |d u rt dd| j |S )Nr   rp   )r   rH   r   )r4   r   r  r-   r-   r/   r   r  s   z&NameMappingProjectionVisitor.primitiveN)r+   r   )rh   r   r   r   r+   r   )r   r   r   r   r+   r   )rr   r   r   r   r+   r   )r   r   r   r   r+   r   )r   r   r   r   r   r   r+   r   )re   r   r   r   r`   r   r+   r   )rh   r   r   r   ri   r   r+   r   )r   r   r   r   r   r   r+   r   )
r   r   r  r   r   r   r   r   r+   r   )r   r   r  r   r+   r   )rM   rN   rO   rP   r   r   r   r   r   r   r   r   r   r   re   rh   rQ   r   r   r-   r-   r-   r/   r   &  s"   
 













r   schema_without_idsname_mappingc                 C  s   t | |t t S r,   )r   r   r   )r  r  r-   r-   r/   apply_name_mappingy  r   r  )rz   r{   r|   r}   r+   r\   )rz   rS   r|   r}   r+   r\   )r'   r&   r|   r}   r+   r\   )rc   r<   r+   rS   )r   r   r+   rS   )rc   rS   r   r   r   r   r+   rS   )r  r   r  rS   r+   r   )=__doc__
__future__r   builtinsabcr   r   collectionsr   collections.abcr   	functoolsr   r   typingr	   r
   r   pydanticr   r   r   r   pyiceberg.schemar   r   r   r   r   r   r   pyiceberg.typedefr   r   pyiceberg.typesr   r   r   r   r   r   r   rQ   rS   r\   r]   r^   rn   r<   rW   rV   registerr   r   r   r   r   r   r   r   r  r-   r-   r-   r/   <module>   s@   $ !(

B
'S