o
    <iR                     @   s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ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"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZB d d	lCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ d
Z[e@fde:eKB de\e]edeBf f defddZ^de:eKB de4fddZ_G dd de;e4 Z`e` Zade:eKB de:eKB de4fddZbe@e@fde:eKB de:eKB de\e]edeBf f de\e]edef f def
ddZcG dd deZdG dd de9eKe4f ZeG d d! d!e9eKef ZfG d"d# d#e8eK Zgd$S )%    )Callable)Enum)BinaryDecoder)BinaryReaderBooleanReader
DateReaderDecimalReaderDefaultReaderDoubleReaderFixedReaderFloatReaderIntegerReader
ListReader	MapReader
NoneReaderOptionReaderReaderStringReaderStructReader
TimeReaderTimestampNanoReaderTimestampReaderTimestamptzNanoReaderTimestamptzReaderUnknownReader
UUIDReader)BinaryWriterBooleanWriter
DateWriterDecimalWriterDefaultWriterDoubleWriterFixedWriterFloatWriterIntegerWriter
ListWriter	MapWriterOptionWriterStringWriterStructWriterTimestampNanoWriterTimestamptzNanoWriterTimestamptzWriterTimestampWriter
TimeWriterUnknownWriter
UUIDWriterWriter)ResolveError)PartnerAccessorPrimitiveWithPartnerVisitorSchemaSchemaVisitorPerPrimitiveTypepromotevisitvisit_with_partner)
EMPTY_DICTRecordStructProtocol)
BinaryTypeBooleanTypeDateTypeDecimalType
DoubleType	FixedType	FloatTypeIcebergTypeIntegerTypeListTypeLongTypeMapTypeNestedFieldPrimitiveType
StringType
StructTypeTimestampNanoTypeTimestampTypeTimestamptzNanoTypeTimestamptzTypeTimeTypeUnknownTypeUUIDTypefile_schema
read_types.returnc                 C   s   t | | |S )aM  Construct a reader from a file schema.

    Args:
        file_schema (Schema | IcebergType): The schema of the Avro file.
        read_types (Dict[int, Callable[..., StructProtocol]]): Constructors for structs for certain field-ids

    Raises:
        NotImplementedError: If attempting to resolve an unrecognized object type.
    )resolve_reader)rU   rV    rY   T/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/pyiceberg/avro/resolver.pyconstruct_readero   s   r[   c                 C   s
   t | tS )zConstruct a writer from a file schema.

    Args:
        file_schema (Schema | IcebergType): The schema of the Avro file.

    Raises:
        NotImplementedError: If attempting to resolve an unrecognized object type.
    )r8   CONSTRUCT_WRITER_VISITOR)rU   rY   rY   rZ   construct_writer~   s   
	r]   c                   @   s  e Zd ZdZdededefddZdedee defd	d
Z	de
dedefddZdededefddZdedededefddZdedefddZdedefddZdedefdd Zd!edefd"d#Zd$edefd%d&Zd'edefd(d)Zd*edefd+d,Zd-edefd.d/Zd0edefd1d2Z d3e!defd4d5Z"d6e#defd7d8Z$d9e%defd:d;Z&d<e'defd=d>Z(d?e)defd@dAZ*dBe+defdCdDZ,dEe-defdFdGZ.dHe/defdIdJZ0dKS )LConstructWriterz/Construct a writer tree from an Iceberg schema.schemastruct_resultrW   c                 C   s   |S NrY   )selfr_   r`   rY   rY   rZ   r_         zConstructWriter.schemastructfield_resultsc                 C   s   t tdd t|D S )Nc                 s   s    | ]	\}}||fV  qd S ra   rY   ).0posresultrY   rY   rZ   	<genexpr>   s    z)ConstructWriter.struct.<locals>.<genexpr>)r)   tuple	enumerate)rb   rd   re   rY   rY   rZ   rd         zConstructWriter.structfieldfield_resultc                 C   s   |j r|S t|S ra   requiredr'   )rb   rm   rn   rY   rY   rZ   rm         zConstructWriter.field	list_typeelement_resultc                 C   s   t |S ra   )r%   )rb   rr   rs   rY   rY   rZ   list   s   zConstructWriter.listmap_type
key_resultvalue_resultc                 C   s
   t ||S ra   )r&   )rb   ru   rv   rw   rY   rY   rZ   map   s   
zConstructWriter.map
fixed_typec                 C      t t|S ra   r"   len)rb   ry   rY   rY   rZ   visit_fixed      zConstructWriter.visit_fixeddecimal_typec                 C      t |j|jS ra   r   	precisionscale)rb   r   rY   rY   rZ   visit_decimal      zConstructWriter.visit_decimalboolean_typec                 C      t  S ra   r   )rb   r   rY   rY   rZ   visit_boolean      zConstructWriter.visit_booleaninteger_typec                 C   r   ra   r$   )rb   r   rY   rY   rZ   visit_integer   r   zConstructWriter.visit_integer	long_typec                 C   r   ra   r   )rb   r   rY   rY   rZ   
visit_long   r   zConstructWriter.visit_long
float_typec                 C   r   ra   r#   )rb   r   rY   rY   rZ   visit_float   r   zConstructWriter.visit_floatdouble_typec                 C   r   ra   r!   )rb   r   rY   rY   rZ   visit_double   r   zConstructWriter.visit_double	date_typec                 C   r   ra   r   )rb   r   rY   rY   rZ   
visit_date   r   zConstructWriter.visit_date	time_typec                 C   r   ra   r.   )rb   r   rY   rY   rZ   
visit_time   r   zConstructWriter.visit_timetimestamp_typec                 C   r   ra   r-   )rb   r   rY   rY   rZ   visit_timestamp   r   zConstructWriter.visit_timestamptimestamp_ns_typec                 C   r   ra   r*   )rb   r   rY   rY   rZ   visit_timestamp_ns   r   z"ConstructWriter.visit_timestamp_nstimestamptz_typec                 C   r   ra   r,   )rb   r   rY   rY   rZ   visit_timestamptz   r   z!ConstructWriter.visit_timestamptztimestamptz_ns_typec                 C   r   ra   r+   )rb   r   rY   rY   rZ   visit_timestamptz_ns   r   z$ConstructWriter.visit_timestamptz_nsstring_typec                 C   r   ra   r(   )rb   r   rY   rY   rZ   visit_string   r   zConstructWriter.visit_string	uuid_typec                 C   r   ra   r0   )rb   r   rY   rY   rZ   
visit_uuid   r   zConstructWriter.visit_uuidbinary_typec                 C   r   ra   r   )rb   r   rY   rY   rZ   visit_binary   r   zConstructWriter.visit_binaryunknown_typec                 C   r   ra   r/   )rb   r   rY   rY   rZ   visit_unknown   r   zConstructWriter.visit_unknownN)1__name__
__module____qualname____doc__r5   r1   r_   rL   rt   rd   rI   rm   rF   rH   rx   rB   r}   r@   r   r>   r   rE   r   rG   r   rC   r   rA   r   r?   r   rQ   r   rN   r   rM   r   rP   r   rO   r   rK   r   rS   r   r=   r   rR   r   rY   rY   rY   rZ   r^      s0    r^   record_schemac                 C   s"   | |krt |S t|| t t S )aO  Resolve the file and read schema to produce a reader.

    Args:
        record_schema (Schema | IcebergType): The schema of the record in memory.
        file_schema (Schema | IcebergType): The schema of the file that will be written

    Raises:
        NotImplementedError: If attempting to resolve an unrecognized object type.
    )r]   r9   WriteSchemaResolverSchemaPartnerAccessor)r   rU   rY   rY   rZ   resolve_writer   s   r   read_schema
read_enumsc                 C   s   t | |t||t S )a>  Resolve the file and read schema to produce a reader.

    Args:
        file_schema (Schema | IcebergType): The schema of the Avro file.
        read_schema (Schema | IcebergType): The requested read schema which is equal, subset or superset of the file schema.
        read_types (Dict[int, Callable[..., StructProtocol]]): A dict of types to use for struct data.
        read_enums (Dict[int, Callable[..., Enum]]): A dict of fields that have to be converted to an enum.

    Raises:
        NotImplementedError: If attempting to resolve an unrecognized object type.
    )r9   ReadSchemaResolverr   )rU   r   rV   r   rY   rY   rZ   rX      s   rX   c                   @   sp   e Zd ZU dZdZedef ed< eed< dedef deddfdd	Z	d
e
defddZd
e
ddfddZdS )
EnumReaderz5An Enum reader to wrap primitive values into an Enum.enumreader.r   r   rW   Nc                 C   s   || _ || _d S ra   r   )rb   r   r   rY   rY   rZ   __init__  s   
zEnumReader.__init__decoderc                 C   s   |  | j|S ra   )r   r   readrb   r   rY   rY   rZ   r     rq   zEnumReader.readc                 C   s   d S ra   rY   r   rY   rY   rZ   skip  rc   zEnumReader.skip)r   r   r   r   	__slots__r   r   __annotations__r   r   r   r   r   rY   rY   rY   rZ   r      s   
 r   c                
       s  e Zd ZdededB dedefddZdededB d	ee defd
dZ	de
dedB dedefddZdededB dedefddZdededB dededef
ddZdededB def fddZded edB defd!d"Zd#ed edB defd$d%Zd&ed edB defd'd(Zd)ed edB defd*d+Zd,ed edB defd-d.Zd/ed edB defd0d1Zd2ed edB defd3d4Zd5ed edB defd6d7Z d8e!d edB defd9d:Z"d;e#d edB defd<d=Z$d>e%d edB defd?d@Z&dAe'd edB defdBdCZ(dDe)d edB defdEdFZ*dGe+d edB defdHdIZ,dJe-d edB defdKdLZ.dMe/d edB defdNdOZ0dPe1d edB defdQdRZ2  Z3S )Sr   rU   r   Nrh   rW   c                 C      |S ra   rY   )rb   rU   r   rh   rY   rY   rZ   r_     rc   zWriteSchemaResolver.schemarecord_structfile_writersc                 C   s   t |tstd| dd t|jD }g }t||jddD ];\}}|j|v r4|||j |f q |jrT|j	d urI|d t
||j	df q |jrStd| q |d |f q tt|dS )	Nz2File/write schema are not aligned for struct, got c                 S      i | ]\}}|j |qS rY   field_idrf   rg   rm   rY   rY   rZ   
<dictcomp>      z.WriteSchemaResolver.struct.<locals>.<dictcomp>Tstrict)writervaluez2Field is required, and there is no write default: )field_writers)
isinstancerL   r2   rk   fieldszipr   appendrp   write_defaultr    
ValueErrorr)   rj   )rb   rU   r   r   record_struct_positionsresultsr   
file_fieldrY   rY   rZ   rd     s   


zWriteSchemaResolver.structr   record_typefield_writerc                 C      |j r|S t|S ra   ro   )rb   r   r   r   rY   rY   rZ   rm   &  rq   zWriteSchemaResolver.fieldfile_list_type	file_listelement_writerc                 C   s   t |jr|S t|S ra   )r%   element_requiredr'   )rb   r   r   r   rY   rY   rZ   rt   )  s   zWriteSchemaResolver.listfile_map_typefile_primitive
key_writervalue_writerc                 C   s   t ||jr|S t|S ra   )r&   value_requiredr'   )rb   r   r   r   r   rY   rY   rZ   rx   ,  rl   zWriteSchemaResolver.maprecord_primitivec                    s(   |d ur||krt || t ||S ra   )r7   super	primitive)rb   r   r   	__class__rY   rZ   r   /  s   
zWriteSchemaResolver.primitiver   partnerc                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   7  r   z!WriteSchemaResolver.visit_booleanr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   :  r   z!WriteSchemaResolver.visit_integerr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   =  r   zWriteSchemaResolver.visit_longr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   @  r   zWriteSchemaResolver.visit_floatr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   C  r   z WriteSchemaResolver.visit_doubler   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   F  r   z!WriteSchemaResolver.visit_decimalr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   I  r   zWriteSchemaResolver.visit_dater   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   L  r   zWriteSchemaResolver.visit_timer   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   O  r   z#WriteSchemaResolver.visit_timestampr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   R  r   z&WriteSchemaResolver.visit_timestamp_nsr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   U  r   z%WriteSchemaResolver.visit_timestamptzr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   X  r   z(WriteSchemaResolver.visit_timestamptz_nsr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   [  r   z WriteSchemaResolver.visit_stringr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   ^  r   zWriteSchemaResolver.visit_uuidry   c                 C   rz   ra   r{   rb   ry   r   rY   rY   rZ   r}   a  r~   zWriteSchemaResolver.visit_fixedr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   d  r   z WriteSchemaResolver.visit_binaryr   c                 C   r   ra   r   rb   r   r   rY   rY   rZ   r   g  r   z!WriteSchemaResolver.visit_unknown)4r   r   r   r5   rD   r1   r_   rL   rt   rd   rI   rm   rF   rH   rx   rJ   r   r>   r   rE   r   rG   r   rC   r   rA   r   r@   r   r?   r   rQ   r   rN   r   rM   r   rP   r   rO   r   rK   r   rS   r   rB   r}   r=   r   rR   r   __classcell__rY   rY   r   rZ   r     s0    """r   c                
       s8  e Zd ZU dZeeedef f ed< eeede	f f ed< e
e ed< eefdeeedef f deeede	f f ddfdd	Zd
ededB dedefddZdededB ddfddZdededB ddfddZdededB de
e defddZdededB dedefddZdededB d edefd!d"Z
d#ed$edB d%ed&edef
d'd(Zd)ed*edB def fd+d,Zd-ed.edB defd/d0Zd1ed.edB defd2d3Zd4e d.edB defd5d6Z!d7e"d.edB defd8d9Z#d:e$d.edB defd;d<Z%d=e&d.edB defd>d?Z'd@e(d.edB defdAdBZ)dCe*d.edB defdDdEZ+dFe,d.edB defdGdHZ-dIe.d.edB defdJdKZ/dLe0d.edB defdMdNZ1dOe2d.edB defdPdQZ3dRe4d.edB defdSdTZ5dUe6d.edB defdVdWZ7dXe8d.edB defdYdZZ9d[e:d.edB defd\d]Z;d^e<d.edB defd_d`Z=  Z>S )ar   rV   r   context.rV   r   r  rW   Nc                 C   s   || _ || _g | _d S ra   r  )rb   rV   r   rY   rY   rZ   r   q  s   
zReadSchemaResolver.__init__r_   expected_schemarh   c                 C   r   ra   rY   )rb   r_   r  rh   rY   rY   rZ   r_   z  rc   zReadSchemaResolver.schemarm   field_partnerc                 C   s   | j |j d S ra   )r  r   r   rb   rm   r  rY   rY   rZ   before_field}  rq   zReadSchemaResolver.before_fieldc                 C   s   | j   d S ra   )r  popr	  rY   rY   rZ   after_field  r   zReadSchemaResolver.after_fieldrd   expected_structfield_readersc           
         s  t jdkrjt nt}j|t}|s!ttt|||S t	|t
s-td| dd t|jD  fddt|j|ddD }d	d
 |jD }t|jD ]0\}}	|	j|vrt	|	trs|	jd urs||t|	jf qU|	jr}t|	 d||t f qUtt|||S )Nr   1File/read schema are not aligned for struct, got c                 S   r   rY   r   r   rY   rY   rZ   r     r   z-ReadSchemaResolver.struct.<locals>.<dictcomp>c                    s<   g | ]\}} |jj |j  s|nt |fqS rY   )getr   r   r   )rf   rm   result_reader	enum_typeexpected_positionsrb   rY   rZ   
<listcomp>  s    
z-ReadSchemaResolver.struct.<locals>.<listcomp>Tr   c                 S   s   h | ]}|j qS rY   r   )rf   rm   rY   rY   rZ   	<setcomp>  s    z,ReadSchemaResolver.struct.<locals>.<setcomp>z1 is non-optional, and not part of the file schema)r|   r  STRUCT_ROOTrV   r  r;   r   rj   rk   r   rL   r2   r   r   r   rI   initial_defaultr   r	   rp   r   )
rb   rd   r  r  read_struct_idstruct_callabler   file_fieldsrg   
read_fieldrY   r  rZ   rd     s(   
	
zReadSchemaResolver.structexpected_fieldfield_readerc                 C   r   ra   )rp   r   )rb   rm   r  r  rY   rY   rZ   rm     rq   zReadSchemaResolver.fieldrr   expected_listelement_readerc                 C   s4   |rt |tstd| t|jr|S t|S Nz/File/read schema are not aligned for list, got )r   rF   r2   r   r   r   )rb   rr   r  r   rY   rY   rZ   rt     s   zReadSchemaResolver.listru   expected_map
key_readervalue_readerc                 C   s6   |rt |tstd| t||jr|S t|S Nz.File/read schema are not aligned for map, got )r   rH   r2   r   r   r   )rb   ru   r"  r#  r$  rY   rY   rZ   rx     s   zReadSchemaResolver.mapr   expected_primitivec                    sF   |d urt |tstd| d| ||krt|| t ||S )Nz%File/read schema are not aligned for z, got )r   rJ   r2   r7   r   r   )rb   r   r&  r   rY   rZ   r     s   

zReadSchemaResolver.primitiver   r   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   z ReadSchemaResolver.visit_booleanr   c                 C   r   ra   r   r   rY   rY   rZ   r     r   z ReadSchemaResolver.visit_integerr   c                 C   r   ra   r'  r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_longr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_floatr   c                 C   r   ra   )r
   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_doubler   c                 C   r   ra   )r   r   r   r   rY   rY   rZ   r     r   z ReadSchemaResolver.visit_decimalr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_dater   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_timer   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   z"ReadSchemaResolver.visit_timestampr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   z%ReadSchemaResolver.visit_timestamp_nsr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   z$ReadSchemaResolver.visit_timestamptzr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   z'ReadSchemaResolver.visit_timestamptz_nsr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_stringr   c                 C   r   ra   )r   r   rY   rY   rZ   r     r   zReadSchemaResolver.visit_uuidry   c                 C   rz   ra   )r   r|   r  rY   rY   rZ   r}     r~   zReadSchemaResolver.visit_fixedr   c                 C   r   ra   )r   r  rY   rY   rZ   r     r   zReadSchemaResolver.visit_binaryr   c                 C   r   ra   )r   r  rY   rY   rZ   r     r   z ReadSchemaResolver.visit_unknown)?r   r   r   r   dictintr   r<   r   r   rt   r:   r   r5   rD   r   r_   rI   r
  r  rL   rd   rm   rF   rH   rx   rJ   r   r>   r   rE   r   rG   r   rC   r   rA   r   r@   r   r?   r   rQ   r   rN   r   rM   r   rP   r   rO   r   rK   r   rS   r   rB   r}   r=   r   rR   r   r  rY   rY   r   rZ   r   k  sN   
 
	"%""r   c                	   @   s   e Zd ZdedB dedB fddZdedB dedededB fdd	Zd
edB dedB fddZdedB dedB fddZ	dedB dedB fddZ
dS )r   r   NrW   c                 C   s    t |tr	| S td| )Nz1File/read schema are not aligned for schema, got )r   r5   	as_structr2   )rb   r   rY   rY   rZ   schema_partner  s   
z$SchemaPartnerAccessor.schema_partnerr   
field_namec                 C   s2   t |tr||}ntd| |r|jS d S )Nr  )r   rL   rm   r2   
field_type)rb   r   r   r,  rm   rY   rY   rZ   r    s   
z#SchemaPartnerAccessor.field_partnerpartner_listc                 C      t |tr|jS td| r!  )r   rF   element_typer2   )rb   r.  rY   rY   rZ   list_element_partner     
z*SchemaPartnerAccessor.list_element_partnerpartner_mapc                 C   r/  r%  )r   rH   key_typer2   rb   r3  rY   rY   rZ   map_key_partner  r2  z%SchemaPartnerAccessor.map_key_partnerc                 C   r/  r%  )r   rH   
value_typer2   r5  rY   rY   rZ   map_value_partner  r2  z'SchemaPartnerAccessor.map_value_partner)r   r   r   rD   r+  r)  strr  r1  r6  r8  rY   rY   rY   rZ   r     s    "r   N)hcollections.abcr   r   r   pyiceberg.avro.decoderr   pyiceberg.avro.readerr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   pyiceberg.avro.writerr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   pyiceberg.exceptionsr2   pyiceberg.schemar3   r4   r5   r6   r7   r8   r9   pyiceberg.typedefr:   r;   r<   pyiceberg.typesr=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r  r(  r)  r[   r]   r^   r\   r   rX   r   r   r   r   rY   rY   rY   rZ   <module>   s\   d`$	d
F

_ 