o
    uyi;                     @  s  d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZ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Z4e23e5d>d dZ4d?d#d$Z6G d%d& d&eee+  Z7G d'd( d(e/ee+ e+f Z8d@d+d,Z9dAd1d2Z:G d3d4 d4ee+ Z;G d5d6 d6ee+e%f Z<dBd9d:Z=d;S )Cz
Contains everything around the name mapping.

More information can be found on here:
https://iceberg.apache.org/spec/#name-mapping-serialization
    )annotations)ABCabstractmethod)ChainMap)cached_propertysingledispatch)AnyDictGenericIteratorListOptionalTypeVarUnion)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Optional[int]field_id	List[str]names)default_factoryList[MappedField]fieldsbefore)modevr   returnc                 C  s   |pg S N )clsr/   r2   r2   _/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/pyiceberg/table/name_mapping.pyconvert_null_to_empty_List+   s   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
serializedr2   r2   r4   	ser_model0   s   



zMappedField.ser_modelintc                 C  
   t | jS )zReturn the number of fields.)r7   r,   r8   r2   r2   r4   __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 r2   r@   .0er2   r2   r4   
<listcomp>A       z'MappedField.__str__.<locals>.<listcomp>  N?z([z] -> ))joinr,   r'   r@   r)   )r8   
fields_strr'   r2   r2   r4   __str__>   s    zMappedField.__str__)r/   r   r0   r   )r0   r6   r0   r;   r0   r@   )__name__
__module____qualname__r   r'   __annotations__r   r@   r)   listr,   r   classmethodr5   r   r:   r>   rN   r2   r2   r2   r4   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+   rootr0   Dict[str, MappedField]c                 C  s   t | t S r1   )visit_name_mapping_IndexByNamer=   r2   r2   r4   _field_by_nameJ   s   zNameMapping._field_by_namer;   c                 C  r<   )zReturn the number of mappings.)r7   rX   r=   r2   r2   r4   r>   N   r?   zNameMapping.__len__Iterator[MappedField]c                 C  r<   )zIterate over the mapped fields.)iterrX   r=   r2   r2   r4   __iter__R   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  rA   r2   rB   rC   r2   r2   r4   rF   [   rG   z'NameMapping.__str__.<locals>.<listcomp>z
])r7   rX   rL   r=   r2   r2   r4   rN   V   s   zNameMapping.__str__N)r0   rY   rO   )r0   r]   rP   )	rQ   rR   rS   rT   r   r\   r>   r_   rN   r2   r2   r2   r4   rW   G   s   
 

rW   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nmrW   field_resultsr`   r0   c                 C     dS )zVisit a NameMapping.Nr2   r8   rc   rd   r2   r2   r4   mappingc       zNameMappingVisitor.mappingstructr+   List[T]c                 C  re   )zVisit a List[MappedField].Nr2   r8   ri   rd   r2   r2   r4   r,   g   rh   zNameMappingVisitor.fieldsfieldr#   field_resultra   c                 C  re   )zVisit a MappedField.Nr2   r8   rl   rm   r2   r2   r4   rl   k   rh   zNameMappingVisitor.fieldN)rc   rW   rd   r`   r0   r`   )ri   r+   rd   rj   r0   r`   )rl   r#   rm   r`   r0   ra   )rQ   rR   rS   r   rg   r,   rl   r2   r2   r2   r4   rb   b   s    rb   c                   @  s*   e Zd ZdddZdddZdddZdS )r[   rc   rW   rd   rY   r0   c                 C     |S r1   r2   rf   r2   r2   r4   rg   q      z_IndexByName.mappingri   r+   List[Dict[str, MappedField]]c                 C  s   t t| S r1   )dictr   rk   r2   r2   r4   r,   t      z_IndexByName.fieldsrl   r#   rm   c                   s.    fdd|  D } jD ]} ||< q|S )Nc                   s,   i | ]\}} j D ]
}| d | |q	qS ).r)   )rD   keyresult_field
field_namerl   r2   r4   
<dictcomp>x   s
    
z&_IndexByName.field.<locals>.<dictcomp>)itemsr)   )r8   rl   rm   resultnamer2   ry   r4   rl   w   s   


z_IndexByName.fieldN)rc   rW   rd   rY   r0   rY   )ri   r+   rd   rq   r0   rY   )rl   r#   rm   rY   r0   rY   )rQ   rR   rS   rg   r,   rl   r2   r2   r2   r4   r[   p   s    

r[   obj2Union[NameMapping, List[MappedField], MappedField]visitorNameMappingVisitor[S, T]r0   c                 C  s   t d|  )z2Traverse the name mapping in post-order traversal.zCannot visit non-type: )NotImplementedErrorr~   r   r2   r2   r4   rZ      s   rZ   c                 C  s   | | t| j|S r1   )rg   rZ   rX   r   r2   r2   r4   _   s   r   r,   r+   c                   s    fdd| D }  | |S )Nc                   s    g | ]}  |t|j qS r2   )rl   rZ   r,   rD   rl   r   r2   r4   rF      s     z_.<locals>.<listcomp>)r,   )r,   r   resultsr2   r   r4   r      s   rg   r@   c                 C  s
   t | S r1   )rW   model_validate_json)rg   r2   r2   r4   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_resultr+   r0   c                 C  ro   r1   r2   )r8   r   r   r2   r2   r4   r      rp   z_CreateMapping.schemari   r"   rd   List[List[MappedField]]c                 C  s   dd t |j|D S )Nc                 S  s$   g | ]\}}t |j|jg|d qS )r'   r)   r,   )r#   r'   r}   )rD   rl   r|   r2   r2   r4   rF      s    z)_CreateMapping.struct.<locals>.<listcomp>)zipr,   rk   r2   r2   r4   ri      s   
z_CreateMapping.structrl   r    rm   c                 C  ro   r1   r2   rn   r2   r2   r4   rl      rp   z_CreateMapping.field	list_typer   element_resultc                 C  s   t |jdg|dgS )Nelementr   )r#   
element_id)r8   r   r   r2   r2   r4   rU         z_CreateMapping.listmap_typer   
key_resultvalue_resultc                 C  s$   t |jdg|dt |jdg|dgS )Nrv   r   value)r#   key_idvalue_id)r8   r   r   r   r2   r2   r4   map   s   z_CreateMapping.map	primitiver!   c                 C  s   g S r1   r2   )r8   r   r2   r2   r4   r      rp   z_CreateMapping.primitiveN)r   r   r   r+   r0   r+   )ri   r"   rd   r   r0   r+   )rl   r    rm   r+   r0   r+   )r   r   r   r+   r0   r+   )r   r   r   r+   r   r+   r0   r+   )r   r!   r0   r+   )	rQ   rR   rS   r   ri   rl   rU   r   r   r2   r2   r2   r4   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 r1   )r   r   )r8   r   r   r2   r2   r4   __init__   s   
z_UpdateMapping.__init__rl   r#   assignmentsDict[str, int]r0   Optional[MappedField]c                   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 r2   r2   rD   fremoved_namesr2   r4   rF      s    z;_UpdateMapping._remove_reassigned_names.<locals>.<listcomp>r   )setr)   getr'   addr#   r,   )rl   r   r}   assigned_idremaining_namesr2   r   r4   _remove_reassigned_names   s   

z'_UpdateMapping._remove_reassigned_namesmapped_fieldsr+   	parent_idr;   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 r2   )r}   r'   r   r2   r2   r4   rz      s    z2_UpdateMapping._add_new_fields.<locals>.<dictcomp>c                   $   g | ]} |  d urqS r1   r   r   reassignmentsr8   updated_fieldr2   r4   rF      
    z2_UpdateMapping._add_new_fields.<locals>.<listcomp>)	r   r   appendr#   r'   r}   r   
field_typer   )r8   r   r   fields_to_addr,   
new_fieldsr   r2   r   r4   _add_new_fields   s   z_UpdateMapping._add_new_fieldsrc   rW   rd   c                 C  s   |  |dS )N)r   rf   r2   r2   r4   rg      rs   z_UpdateMapping.mappingri   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 r1   )r'   r   r   r}   r   )r8   updater2   r4   rz      s
    z)_UpdateMapping.fields.<locals>.<dictcomp>c                   r   r1   r   r   r   r2   r4   rF      r   z)_UpdateMapping.fields.<locals>.<listcomp>r2   rk   r2   )r   r8   r   r   r4   r,      s   z_UpdateMapping.fieldsrm   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   r}   r   r#   r   )r8   rl   rm   field_namesr   r2   r2   r4   rl      s   
 z_UpdateMapping.fieldN)r   r   r   r   )rl   r#   r   r   r0   r   )r   r+   r   r;   r0   r+   )rc   rW   rd   r+   r0   r+   )ri   r+   rd   r+   r0   r+   )rl   r#   rm   r+   r0   r#   )rQ   rR   rS   rT   r   staticmethodr   r   rg   r,   rl   r2   r2   r2   r4   r      s   
 



r   r   r   c                 C  s   t t| t S r1   )rW   r   r   )r   r2   r2   r4   create_mapping_from_schema      r   r   r   r   r   c                 C  s   t t| t||S r1   )rW   rZ   r   )rg   r   r   r2   r2   r4   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   r0   c                 C  s   |S r1   r2   )r8   r   r2   r2   r4   schema_partner   rp   z"NameMappingAccessor.schema_partnerpartner_struct/Optional[Union[List[MappedField], MappedField]]r   r;   rx   r@   c                 C  s8   |d urt |tr|j}|D ]}||jv r|  S qd S r1   )
isinstancer#   r,   r)   )r8   r   r   rx   rl   r2   r2   r4   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)   )r8   r   rl   r2   r2   r4   list_element_partner     

z(NameMappingAccessor.list_element_partnerpartner_mapc                 C  r   Nrv   r   r8   r   rl   r2   r2   r4   map_key_partner  r   z#NameMappingAccessor.map_key_partnerc                 C  r   Nr   r   r   r2   r2   r4   map_value_partner  r   z%NameMappingAccessor.map_value_partnerN)r   r   r0   r   )r   r   r   r;   rx   r@   r0   r   )r   r   r0   r   )r   r   r0   r   )rQ   rR   rS   r   r   r   r   r   r2   r2   r2   r4   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NameMappingProjectionVisitorr(   current_pathr0   Nonec                 C  s
   g | _ d S r1   )r   r=   r2   r2   r4   r   %  r?   z%NameMappingProjectionVisitor.__init__rl   r    r   Optional[P]c                 C  s   | j |j d S r1   )r   r   r}   r8   rl   r   r2   r2   r4   before_field)     z)NameMappingProjectionVisitor.before_fieldc                 C     | j   d S r1   r   popr   r2   r2   r4   after_field,     z(NameMappingProjectionVisitor.after_fieldr   element_partnerc                 C     | j d d S r   r   r   r8   r   r   r2   r2   r4   before_list_element/  r   z0NameMappingProjectionVisitor.before_list_elementc                 C  r   r1   r   r   r2   r2   r4   after_list_element2  r   z/NameMappingProjectionVisitor.after_list_elementrv   key_partnerc                 C  r   r   r   r8   rv   r   r2   r2   r4   before_map_key5  r   z+NameMappingProjectionVisitor.before_map_keyc                 C  r   r1   r   r   r2   r2   r4   after_map_key8  r   z*NameMappingProjectionVisitor.after_map_keyr   value_partnerc                 C  r   r   r   r8   r   r   r2   r2   r4   before_map_value;  r   z-NameMappingProjectionVisitor.before_map_valuec                 C  r   r1   r   r   r2   r2   r4   after_map_value>  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   )r8   r   r   r   r2   r2   r4   r   A  r   z#NameMappingProjectionVisitor.schemari   struct_partnerrd   List[NestedField]c                 C  s   t | S r1   )r"   )r8   ri   r   rd   r2   r2   r4   ri   D  s   z#NameMappingProjectionVisitor.structrm   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: rt   )r'   r}   r   requireddocinitial_defaultinitial_write)
r'   
ValueErrorrL   r   r    r}   r   r   r   write_default)r8   rl   r   rm   r2   r2   r4   rl   G  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: rt   c                 s      | ]
}d |j v r|V  qdS )r   Nru   r   r2   r2   r4   	<genexpr>Y      z4NameMappingProjectionVisitor.list.<locals>.<genexpr>)r   r   element_required)r   rL   r   nextr,   r'   r   r  )r8   r   r   r   r   r2   r2   r4   rU   U  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   rt   c                 s  r   )rv   Nru   r   r2   r2   r4   r   b  r   z3NameMappingProjectionVisitor.map.<locals>.<genexpr>c                 s  r   )r   Nru   r   r2   r2   r4   r   c  r   )r   key_typer   
value_typevalue_required)r   rL   r   r  r,   r'   r   r  )r8   r   r  r   r   r   r   r2   r2   r4   r   \  s   z NameMappingProjectionVisitor.mapr   r!   primitive_partnerc                 C  s"   |d u rt dd| j |S )Nr   rt   )r   rL   r   )r8   r   r  r2   r2   r4   r   l  s   z&NameMappingProjectionVisitor.primitiveN)r0   r   )rl   r    r   r   r0   r   )r   r    r   r   r0   r   )rv   r    r   r   r0   r   )r   r    r   r   r0   r   )r   r   r   r   r   r"   r0   r   )ri   r"   r   r   rd   r   r0   r   )rl   r    r   r   rm   r   r0   r   )r   r   r   r   r   r   r0   r   )
r   r   r  r   r   r   r   r   r0   r   )r   r!   r  r   r0   r!   )rQ   rR   rS   rT   r   r   r   r   r   r   r   r   r   r   ri   rl   rU   r   r   r2   r2   r2   r4   r   "  s"   
 













r   schema_without_idsname_mappingc                 C  s   t | |t t S r1   )r   r   r   )r  r	  r2   r2   r4   apply_name_mappings  r   r
  N)r~   r   r   r   r0   r`   )r~   rW   r   r   r0   r`   )r,   r+   r   r   r0   r`   )rg   r@   r0   rW   )r   r   r0   rW   )rg   rW   r   r   r   r   r0   rW   )r  r   r	  rW   r0   r   )>__doc__
__future__r   abcr   r   collectionsr   	functoolsr   r   typingr   r	   r
   r   r   r   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#   rW   r`   ra   rb   r@   r[   rZ   registerr   rU   r   r   r   r   r   r   r   r
  r2   r2   r2   r4   <module>   s<   ($ !(

B
'Q