o
    iG                     @   s2  d dl Z d dlZd dlZd dl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 d dlmZmZmZmZmZ d dlmZ d dlmZ d dlZd d	lmZmZ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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<mZm=Z=m>Z>m?Z? d dl@mAZAmBZB d dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ d dlRmZ d dlSmTZTmUZU d dlVmWZW d dlXmYZY erd dlZZ[ede[j\e[j]Z^edZ_edZ`dZadZbdZcdZddZedZfdZgdZheWecZieWedZjdndekdekdB d ejlfd!d"Zmd#e
egef d$eeB d eeB fd%d&Zndd'd(e
degdf d)ed*ed+ d e
dgdf fd,d-ZoG d.d/ d/eAek eee_e`f Zpd0ed epeef fd1d2ZqG d3d4 d4epe_erf ZsG d5d6 d6eZtG d7d8 d8epe_erf ee_ eYZuG d9d: d:eue_ ZvG d;d< d<eue_ ZwG d=d> d>eue_ ZxG d?d@ d@eue_ ZydAezd ekfdBdCZ{G dDdE dEepe_e_f Z|G dFdG dGepe_e_f Z}edHedIeHd ekfdJdKZ~e~ezdHezdIeHd ekfdLdMZe~erdHerdIeHd ekfdNdMZe~edHedIeHd ekfdOdMZedIeHdHerd ekfdPdQZeeEdIeHdHerd ekfdRdMZeePdIeHdHerd ekfdSdMZeeMdIeHdHerd ekfdTdMZeeOdIeHdHerd ekfdUdMZG dVdW dWepe_e`f ZG dXdY dYepe_df eYZdZekd[e'd\e
edB gedB f d e9dB fd]d^ZdZekd[e'd\e
edB gedB f d e9dB fd_d`ZdZekd[e'd\e
edB gedB f d e9dB fdadbZdZekd[e'd\e
edB gedB f d e9dB fdcddZd\epeef deekd[e+d e9dB fdfdgZdeekd[e+d e9fdhdiZdZekd[e,d\e
egef d e9fdjdkZG dldm dme.ZdS )o    N)ABCabstractmethod)Callable)IntEnum)singledispatch)TYPE_CHECKINGAnyGenericOptionalTypeVar)Literal)UUID)FieldPositiveIntPrivateAttr)NotInstalledError)BoundEqualToBoundGreaterThanBoundGreaterThanOrEqualBoundInBoundLessThanBoundLessThanOrEqualBoundLiteralPredicateBoundNotEqualTo
BoundNotInBoundNotStartsWithBoundPredicateBoundSetPredicateBoundStartsWith	BoundTermBoundUnaryPredicateEqualToGreaterThanGreaterThanOrEqualLessThanLessThanOrEqual
NotEqualToNotStartsWith	Reference
StartsWithUnboundPredicate)DateLiteralDecimalLiteralr   LongLiteralTimestampLiteralliteral)IcebergRootModelL)
BinaryTypeDateTypeDecimalType	FixedTypeIcebergTypeIntegerTypeLongType
StringTypeTimestampNanoTypeTimestampTypeTimestamptzNanoTypeTimestamptzTypeTimeTypeUUIDType)datetime)decimal_to_bytestruncate_decimal)ParseNumberFromBrackets)	Singleton	ArrayLikeSTidentityvoidbuckettruncateyearmonthdayhourmodule_nameextras_namereturnc                 C   sF   zt | W S  ty"   |r|  d| d}n|  d}t|d w )Nz/ needs to be installed. pip install "pyiceberg[z]"z needs to be installed.)	importlibimport_moduleImportErrorr   )rP   rQ   msg rW   R/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/pyiceberg/transforms.py_try_importq   s   

rY   funclitc                 C   s   t | |jS )zESmall helper to upwrap the value from the literal, and wrap it again.)r/   value)rZ   r[   rW   rW   rX   _transform_literal|      r]   expected_typetransform_funcargsr`   zpa.DataTypec             
      sH   zdd l W n ty } ztd|d }~ww d fdd}|S )	Nr   7For partition transforms, PyArrow needs to be installedarrayrE   rR   c                    s   dfdd}t | jr|| g R  S t | jr8g }|  D ]}|||g R   q#|S tdt|  )NarrrE   rR   c                    s    d ur	|   S | S N)castre   r_   rW   rX   _cast_if_needed   s   
zI_pyiceberg_transform_wrapper.<locals>._transform.<locals>._cast_if_neededzIPyArrow array can only be of type pa.Array or pa.ChunkedArray, but found )re   rE   rR   rE   )
isinstanceArrayChunkedArray
iterchunksappendchunked_array
ValueErrortype)rd   ri   result_chunksre   rb   r`   para   rW   rX   
_transform   s   
z0_pyiceberg_transform_wrapper.<locals>._transform)rd   rE   rR   rE   pyarrowModuleNotFoundError)ra   r`   rb   eru   rW   rs   rX   _pyiceberg_transform_wrapper   s   
rz   c                   @   s6  e Zd ZU dZe Zeed< ede	de
edB gedB f fddZede	defdd	Zede	de	fd
dZededededB fddZededededB fddZedefddZdedefddZde	dedB defddZedefddZdefddZdedefdd Zede	dd!fd"d#ZdS )$	TransformzTransform base class for concrete transforms.

    A base class to transform values and project predicates on partition values.
    This class is not used directly. Instead, use one of module method to create the child classes.
    rootsourcerR   Nc                 C      d S rf   rW   selfr}   rW   rW   rX   	transform      zTransform.transformc                 C      dS NFrW   r   rW   rW   rX   can_transform      zTransform.can_transformc                 C   r   )a}  Return the `IcebergType` produced by this transform given a source type.

        This method defines both the physical and display representation of the partition field.

        The physical representation must conform to the Iceberg spec. The display representation
        can deviate from the spec, such as by transforming the value into a more human-readable format.
        NrW   r   rW   rW   rX   result_type   s   	zTransform.result_typenamepredc                 C   r~   rf   rW   r   r   r   rW   rW   rX   project   r   zTransform.projectc                 C   r~   rf   rW   r   rW   rW   rX   strict_project   r   zTransform.strict_projectc                 C   r   r   rW   r   rW   rW   rX   preserves_order   r   zTransform.preserves_orderotherc                 C   s   | |kS rf   rW   r   r   rW   rW   rX   satisfies_order_of      zTransform.satisfies_order_of_r\   c                 C   s   |d urt |S dS Nnullstrr   r   r\   rW   rW   rX   to_human_string      zTransform.to_human_stringc                 C   s   |   S rf   )__str__r   rW   rW   rX   
dedup_name      zTransform.dedup_namec                 C      | j S )z8Return the string representation of the Transform class.)r|   r   rW   rW   rX   r         zTransform.__str__c                 C   s   t |tr| j|jkS dS )z<Return the equality of two instances of the Transform class.F)rj   r{   r|   r   rW   rW   rX   __eq__   s   
zTransform.__eq__Callable[[pa.Array], pa.Array]c                 C   r~   rf   rW   r   rW   rW   rX   pyarrow_transform   r   zTransform.pyarrow_transform)__name__
__module____qualname____doc__r   r|   r   __annotations__r   r6   r   rF   rG   r   boolr   r   r   r*   r   r   propertyr   r   r   r   r   r   r   r   rW   rW   rW   rX   r{      s.   
 &
r{   vc                 C   s   t | trN| tkrt S | tkrt S | tr tt	
| dS | tr-tt
| dS | tkr4t S | tkr;t S | tkrBt S | tkrIt S t| dS | S )N)num_buckets)widthr   )rj   r   IDENTITYIdentityTransformVOIDVoidTransform
startswithBUCKETBucketTransformBUCKET_PARSERmatchTRUNCATETruncateTransformTRUNCATE_PARSERYEARYearTransformMONTHMonthTransformDAYDayTransformHOURHourTransformUnknownTransformr   rW   rW   rX   parse_transform   s&   



r   c                
       s,  e Zd ZU dZe Zeed< e Z	e
ed< dededdf fdd	Zedefd
dZdedefddZdedB dedB fddZdedefddZdedededB fddZdedededB fddZdedefddZd%dededeedB gedB f fddZdefd d!Zdedd"fd#d$Z  ZS )&r   a>  Base Transform class to transform a value into a bucket partition value.

    Transforms are parameterized by a number of buckets. Bucket partition transforms use a 32-bit
    hash of the source value to produce a positive value by mod the bucket number.

    Args:
      num_buckets (int): The number of buckets.
    r|   _num_bucketsr   datarR   Nc                    s&   t  jd| dfi | || _d S )Nzbucket[])super__init__r   )r   r   r   	__class__rW   rX   r      s   
zBucketTransform.__init__c                 C   r   rf   r   r   rW   rW   rX   r     r   zBucketTransform.num_bucketsr\   c                 C      t  rf   NotImplementedErrorr   r\   rW   rW   rX   hash     zBucketTransform.hashc                 C   s   |r|  |tj@ | j S d S rf   )r   r7   maxr   r   rW   rW   rX   apply  s   zBucketTransform.applyr}   c                 C      t  S rf   r7   r   rW   rW   rX   r     r   zBucketTransform.result_typer   r   c                       |  |j jj t|jtrt| ||S t|tr"|	t
|S t|tr3|	t
|t |jS t|trH|	t
| fdd|jD S d S )Nc                       h | ]}t  |qS rW   r]   .0r/   transformerrW   rX   	<setcomp>      z*BucketTransform.project.<locals>.<setcomp>)r   termreffield
field_typerj   BoundTransform_project_transform_predicater    
as_unboundr(   r   r]   r/   r   literalsr   rW   r   rX   r     s   


 zBucketTransform.projectc                    r   )Nc                    r   rW   r   r   r   rW   rX   r   ,  r   z1BucketTransform.strict_project.<locals>.<setcomp>)r   r   r   r   r   rj   r   r   r    r   r(   r   r]   r/   r   r   r   rW   r   rX   r   "  s   


 zBucketTransform.strict_projectc                 C   s$   t |ttttttttt	t
tttfS rf   )rj   r7   r3   r8   r>   r;   r=   r:   r<   r4   r9   r5   r2   r?   r   rW   rW   rX   r   1  s"   zBucketTransform.can_transformTrJ   c                    s&  t |trdtdtfdd nyt |trdtdtfdd njt |ttfr/dtdtfdd nYt |ttfr@dtdtfdd nHt |t	t
frQdtdtfdd n7t |tr`dtdtfd	d n(t |tttfrrdtdtfd
d nt |trdtdtfdd ntd| |r fddS  S )Nr   rR   c                 S   (   t | tjrt| } ttd| S Nz<q)	rj   py_datetimetimer@   time_to_microsmmh3r   structpackr   rW   rW   rX   	hash_funcH     
z,BucketTransform.transform.<locals>.hash_funcc                 S   r   r   )	rj   r   dater@   date_to_daysr   r   r   r   r   rW   rW   rX   r   P  r   c                 S   s(   t | tjrt| } ttd| S r   )rj   r   r@   datetime_to_microsr   r   r   r   r   rW   rW   rX   r   X  r   c                 S   s4   t | tjrt| } nt| } ttd| S r   )	rj   r   r@   r   nanos_to_microsr   r   r   r   r   rW   rW   rX   r   `  s   
c                 S   s   t td| S r   )r   r   r   r   r   rW   rW   rX   r   l     c                 S   s   t t| S rf   )r   r   rA   r   rW   rW   rX   r   q     c                 S   
   t | S rf   )r   r   r   rW   rW   rX   r   v  s   
c                 S   s    t | trt| jS t| S rf   )rj   r   r   r   bytesr   rW   rW   rX   r   {  s   

zUnknown type c                    s    | d ur | t j@ j S d S rf   )r7   r   r   r   r   r   rW   rX   <lambda>  s     z+BucketTransform.transform.<locals>.<lambda>)rj   r>   r   intr3   r;   r=   r:   r<   r7   r8   r4   r9   r5   r2   r?   rp   )r   r}   rJ   rW   r   rX   r   E  s(   




zBucketTransform.transformc                 C      d| j  dS )z>Return the string representation of the BucketTransform class.zBucketTransform(num_buckets=)r   r   rW   rW   rX   __repr__  r^   zBucketTransform.__repr__r   c                 C      t dddj}t|j| jS Npyiceberg_corepyiceberg-corerQ   )rY   r   rz   rJ   r   r   r}   pyiceberg_core_transformrW   rW   rX   r     s   z!BucketTransform.pyarrow_transform)T) r   r   r   r   r   r|   r   r   r   r   r   r   r   r   r   r   rF   r   r   r6   r   r   r*   r   r   r   r   r   r   r   r   __classcell__rW   rW   r   rX   r      s    
 	*Br   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	TimeResolution                  r   N)
r   r   r   r   r   WEEKr   r   MINUTESECONDrW   rW   rW   rX   r    s    r  c                   @   s   e Zd ZeedefddZdeee	f de
fddZdedefdd	Zededeed
B ged
B f fddZdededed
B fddZdededed
B fddZedefddZede
fddZd
S )TimeTransformrR   c                 C   r~   rf   rW   r   rW   rW   rX   granularity  r   zTimeTransform.granularityr   c                 C   s   t |dr| j|jkS dS )Nr  F)hasattrr  r   rW   rW   rX   r     s   z TimeTransform.satisfies_order_ofr}   c                 C   r   rf   r   r   rW   rW   rX   r     r   zTimeTransform.result_typeNc                 C   r~   rf   rW   r   rW   rW   rX   r     r   zTimeTransform.transformr   r   c                 C   t   |  |j jj}t|jtrt| ||S t|tr"|	t
|S t|tr-t|||S t|tr8t|||S d S rf   )r   r   r   r   r   rj   r   r   r    r   r(   r   _truncate_numberr   _set_apply_transformr   r   r   r   rW   rW   rX   r        


zTimeTransform.projectc                 C   r  rf   )r   r   r   r   r   rj   r   r   r    r   r(   r   _truncate_number_strictr   r  r  rW   rW   rX   r     r  zTimeTransform.strict_projectc                 C   r   )Nr   rW   r   rW   rW   rX   r     r   zTimeTransform.dedup_namec                 C   r   NTrW   r   rW   rW   rX   r     r   zTimeTransform.preserves_order)r   r   r   r   r   r  r  r{   rF   rG   r   r   r6   r7   r   r   r   r   r   r   r   r*   r   r   r   r   rW   rW   rW   rX   r    s    &r  c                   @      e Zd ZU dZeddZed ed< dede	e
dB gedB f fdd	Zdedefd
dZedefddZdede
dB defddZdefddZdeddfddZdS )r   zTransforms a datetime value into a year value.

    Example:
        >>> transform = YearTransform()
        >>> transform.transform(TimestampType())(1512151975038194)
        47
    rL   defaultr|   r}   rR   Nc                    |   t |trdtdtfdd n)t |ttfr dtdtfdd nt |ttfr1dtdtfdd ntd|  fdd	S )
Nr   rR   c                 S       t | tjrt| } t| S rf   )rj   r   r   r@   r   days_to_yearsr   rW   rW   rX   	year_func     

z*YearTransform.transform.<locals>.year_funcc                 S       t | tjrt| } t| S rf   )rj   r   r@   r   micros_to_yearsr   rW   rW   rX   r"    r#  c                 S   r   rf   )r@   nanos_to_yearsr   rW   rW   rX   r"       
z&Cannot apply year transform for type: c                       | d ur | S d S rf   rW   r   r"  rW   rX   r         z)YearTransform.transform.<locals>.<lambda>	rj   r3   r   r   r;   r=   r:   r<   rp   r   rW   r)  rX   r        
zYearTransform.transformc                 C      t |tttttfS rf   rj   r3   r;   r=   r:   r<   r   rW   rW   rX   r     r   zYearTransform.can_transformc                 C      t jS rf   )r  r   r   rW   rW   rX   r    r   zYearTransform.granularityr   r\   c                 C      t |tr
t|S dS r   )rj   r   r@   to_human_yearr   rW   rW   rX   r        zYearTransform.to_human_stringc                 C   r   )z<Return the string representation of the YearTransform class.zYearTransform()rW   r   rW   rW   rX   r     r   zYearTransform.__repr__r   c                 C   (   t d}t dddj}t|j| dS Nrw   r  r  r  r_   )rY   r   rz   rL   int32r   r}   rt   r  rW   rW   rX   r     s   zYearTransform.pyarrow_transformr   r   r   r   r   r|   LiteralTyper   r6   r   rF   r   r   r   r   r   r  r  r   r   r   r   rW   rW   rW   rX   r        
 $r   c                   @   r  )r   zTransforms a datetime value into a month value.

    Example:
        >>> transform = MonthTransform()
        >>> transform.transform(DateType())(17501)
        575
    rM   r  r|   r}   rR   Nc                    r  )
Nr   rR   c                 S   r   rf   )rj   r   r   r@   r   days_to_monthsr   rW   rW   rX   
month_func  r#  z,MonthTransform.transform.<locals>.month_funcc                 S   r$  rf   )rj   r   r@   r   micros_to_monthsr   rW   rW   rX   r;    r#  c                 S   r   rf   )r@   nanos_to_monthsr   rW   rW   rX   r;  !  r'  z'Cannot apply month transform for type: c                    r(  rf   rW   r   r;  rW   rX   r   )  r*  z*MonthTransform.transform.<locals>.<lambda>r+  r   rW   r>  rX   r     r,  zMonthTransform.transformc                 C   r-  rf   r.  r   rW   rW   rX   r   +  r   zMonthTransform.can_transformc                 C   r/  rf   )r  r   r   rW   rW   rX   r  .  r   zMonthTransform.granularityr   r\   c                 C   r0  r   )rj   r   r@   to_human_monthr   rW   rW   rX   r   2  r2  zMonthTransform.to_human_stringc                 C   r   )z=Return the string representation of the MonthTransform class.zMonthTransform()rW   r   rW   rW   rX   r   5  r   zMonthTransform.__repr__r   c                 C   r3  r4  )rY   r   rz   rM   r5  r6  rW   rW   rX   r   9  s   z MonthTransform.pyarrow_transformr7  rW   rW   rW   rX   r     r9  r   c                   @   s   e Zd ZU dZeddZed ed< dede	e
dB gedB f fdd	Zdedefd
dZdedefddZedefddZdede
dB defddZdefddZdeddfddZdS )r   zTransforms a datetime value into a day value.

    Example:
        >>> transform = DayTransform()
        >>> transform.transform(DateType())(17501)
        17501
    rN   r  r|   r}   rR   Nc                    r  )
Nr   rR   c                 S   s   t | tjrt| } | S rf   )rj   r   r   r@   r   r   rW   rW   rX   day_funcN  s   
z(DayTransform.transform.<locals>.day_funcc                 S   r$  rf   )rj   r   r@   r   micros_to_daysr   rW   rW   rX   r@  V  r#  c                 S   r   rf   )r@   nanos_to_daysr   rW   rW   rX   r@  ^  r'  z%Cannot apply day transform for type: c                    r(  rf   rW   r   r@  rW   rX   r   f  r*  z(DayTransform.transform.<locals>.<lambda>r+  r   rW   rC  rX   r   K  r,  zDayTransform.transformc                 C   r-  rf   r.  r   rW   rW   rX   r   h  r   zDayTransform.can_transformc                 C   r   )a  Return the result type of a day transform.

        The physical representation conforms to the Iceberg spec as DateType is internally converted to int.
        The DateType returned here provides a more human-readable way to display the partition field.
        )r3   r   rW   rW   rX   r   k  s   zDayTransform.result_typec                 C   r/  rf   )r  r   r   rW   rW   rX   r  s  r   zDayTransform.granularityr   r\   c                 C   r0  r   )rj   r   r@   to_human_dayr   rW   rW   rX   r   w  r2  zDayTransform.to_human_stringc                 C   r   )z;Return the string representation of the DayTransform class.zDayTransform()rW   r   rW   rW   rX   r   z  r   zDayTransform.__repr__r   c                 C   s,   t ddd}t dddj}t|j| dS )Nrw   r  r  r  r_   )rY   r   rz   rN   r5  r6  rW   rW   rX   r   ~  s   zDayTransform.pyarrow_transform)r   r   r   r   r   r|   r8  r   r6   r   rF   r   r   r   r   r   r   r  r  r   r   r   r   rW   rW   rW   rX   r   @  s   
 $r   c                   @   r  )r   zTransforms a datetime value into a hour value.

    Example:
        >>> transform = HourTransform()
        >>> transform.transform(TimestampType())(1512151975038194)
        420042
    rO   r  r|   r}   rR   Nc                    s^   t |ttfrdtdtfdd nt |ttfr"dtdtfdd ntd|  fddS )	Nr   rR   c                 S   r$  rf   )rj   r   r@   r   micros_to_hoursr   rW   rW   rX   	hour_func  r#  z*HourTransform.transform.<locals>.hour_funcc                 S   r   rf   )r@   nanos_to_hoursr   rW   rW   rX   rF    r'  z&Cannot apply hour transform for type: c                    r(  rf   rW   r   rF  rW   rX   r     r*  z)HourTransform.transform.<locals>.<lambda>)rj   r;   r=   r   r   r:   r<   rp   r   rW   rH  rX   r     s   zHourTransform.transformc                 C   s   t |ttttfS rf   )rj   r;   r=   r:   r<   r   rW   rW   rX   r     r   zHourTransform.can_transformc                 C   r/  rf   )r  r   r   rW   rW   rX   r    r   zHourTransform.granularityr   r\   c                 C   r0  r   )rj   r   r@   to_human_hourr   rW   rW   rX   r     r2  zHourTransform.to_human_stringc                 C   r   )z<Return the string representation of the HourTransform class.zHourTransform()rW   r   rW   rW   rX   r     r   zHourTransform.__repr__r   c                 C   s   t dddj}t|jS r  )rY   r   rz   rO   r  rW   rW   rX   r     s   
zHourTransform.pyarrow_transformr7  rW   rW   rW   rX   r     s   
 $r   bufferc                 C   s   t | dS )zConvert bytes to base64 string.z
ISO-8859-1)base64	b64encodedecode)rJ  rW   rW   rX   _base64encode  s   rN  c                       s*  e Zd ZU dZeddZed ed< d& fddZd	e	de
edB gedB f fd
dZd	e	defddZd	e	de	fddZdedededB fddZdedededB fddZedefddZdeeef defddZde	dedB defddZdefdd Zdefd!d"Zd	e	dd#fd$d%Z  ZS )'r   zTransforms a value into itself.

    Example:
        >>> transform = IdentityTransform()
        >>> transform.transform(StringType())('hello-world')
        'hello-world'
    rH   r  r|   rR   Nc                    s   t  d d S )NrH   )r   r   r   r   rW   rX   r     s   zIdentityTransform.__init__r}   c                 C      dd S )Nc                 S      | S rf   rW   r   rW   rW   rX   r         z-IdentityTransform.transform.<locals>.<lambda>rW   r   rW   rW   rX   r     r   zIdentityTransform.transformc                 C      |j S rf   )is_primitiver   rW   rW   rX   r     r   zIdentityTransform.can_transformc                 C      |S rf   rW   r   rW   rW   rX   r     r   zIdentityTransform.result_typer   r   c                 C   sl   t |jtrt| ||S t |tr|t|S t |tr&|t||jS t |t	r4|t||j
S d S rf   )rj   r   r   r   r    r   r(   r   r/   r   r   r   rW   rW   rX   r     s   


zIdentityTransform.projectc                 C   sT   t |tr|t|S t |tr|t||jS t |tr(|t||jS d S rf   )rj   r    r   r(   r   r/   r   r   r   rW   rW   rX   r     s   


z IdentityTransform.strict_projectc                 C   r   r  rW   r   rW   rW   rX   r     r   z!IdentityTransform.preserves_orderr   c                 C   rR  )zCOrdering by value is the same as long as the other preserves order.)r   r   rW   rW   rX   r     r   z$IdentityTransform.satisfies_order_ofsource_typer\   c                 C   s   |d ur	t ||S dS r   )_human_string)r   rU  r\   rW   rW   rX   r     s   z!IdentityTransform.to_human_stringc                 C   r   )@Return the string representation of the IdentityTransform class.rH   rW   r   rW   rW   rX   r     r   zIdentityTransform.__str__c                 C   r   )rW  zIdentityTransform()rW   r   rW   rW   rX   r     r   zIdentityTransform.__repr__r   c                 C   rO  )Nc                 S   rP  rf   rW   r   rW   rW   rX   r     rQ  z5IdentityTransform.pyarrow_transform.<locals>.<lambda>rW   r   rW   rW   rX   r     r   z#IdentityTransform.pyarrow_transform)rR   N)r   r   r   r   r   r|   r8  r   r   r6   r   rF   r   r   r   r   r   r   r*   r   r   r   r   r{   rG   r   r   r   r   r   r  rW   rW   r   rX   r     s    
 $
r   c                       s\  e Zd ZU dZe Zeed< e Z	e
ed< e Zeed< dedef fddZd	e
d
efddZd	e
d
e
fddZed
efddZed
e
fddZdeded
edB fddZdeded
edB fddZed
efddZd	e
d
eedB gedB f fddZdeeef d
efdd Z d!e
d"edB d
efd#d$Z!d
efd%d&Z"d	e
d
d'fd(d)Z#  Z$S )*r   zA transform for truncating a value to a specified width.

    Args:
      width (int): The truncate width, should be positive.
    Raises:
      ValueError: If a type is provided that is incompatible with a Truncate transform.
    r|   _source_type_widthr   r   c                    s(   t  jddd| di| || _d S )Nr|   z	truncate[r   rW   )r   r   rY  )r   r   r   r   rW   rX   r     s   
zTruncateTransform.__init__r}   rR   c                 C   r-  rf   )rj   r7   r8   r9   r2   r4   r   rW   rW   rX   r     r   zTruncateTransform.can_transformc                 C   rT  rf   rW   r   rW   rW   rX   r     r   zTruncateTransform.result_typec                 C   r   r  rW   r   rW   rW   rX   r     r   z!TruncateTransform.preserves_orderc                 C   r   rf   )rX  r   rW   rW   rX   rU    r   zTruncateTransform.source_typer   r   Nc                 C   s   |j  jj}t|j trt| ||S t|tr|t	|S t|t
r-t||| |S t|tttfrEt|trCt||| |S d S t|ttfrZt|tr\t||| |S d S d S rf   )r   r   r   r   rj   r   r   r    r   r(   r   r  r   r7   r8   r4   r   r  r2   r9   _truncate_array)r   r   r   r   rW   rW   rX   r   !  s    



zTruncateTransform.projectc                 C   st  |j  jj}t|j trt| ||S t|tr|t	|S t|t
ttfrEt|tr5t||| |S t|trCt||| |S d S t|trt|trpt|jj}|| jk rb|||jjS || jkrnt||jjS d S t|trt|jj}|| jk r|||jjS || jkrt||jjS ||| ||jjS t||| |S t|trt||| |S d S rf   )r   r   r   r   rj   r   r   r    r   r(   r7   r8   r4   r   r  r   r   r  r   lenr/   r\   r   r!   r   r&   _truncate_array_strict)r   r   r   r   literal_widthrW   rW   rX   r   2  s<   










z TruncateTransform.strict_projectc                 C   r   rf   rY  r   rW   rW   rX   r   \  r   zTruncateTransform.widthc                    s   t |ttfrdtdtf fddn+t |ttfr&dtdtf fddnt |tr7dtdtf fddntd| fdd	S )
Nr   rR   c                    s   | |  j   S rf   r^  r   r   rW   rX   truncate_funcc  r   z2TruncateTransform.transform.<locals>.truncate_funcc                    s   | dt  jt|  S )Nr   )minrY  r[  r   r   rW   rX   r_  h  r2  c                    s   t |  jS rf   )rB   rY  r   r   rW   rX   r_  m  s   zCannot truncate for type: c                    r(  rf   rW   r   )r_  rW   rX   r   s  r*  z-TruncateTransform.transform.<locals>.<lambda>)rj   r7   r8   r   r9   r2   r4   rp   r   rW   )r   r_  rX   r   `  s   
zTruncateTransform.transformr   c                 C   s>   | |krdS t | jtrt |trt |jtr| j|jkS dS )NTF)rj   rU  r9   r   r   r   rW   rW   rX   r   u  s   

z$TruncateTransform.satisfies_order_ofr   r\   c                 C   s&   |d u rdS t |trt|S t|S r   )rj   r   rN  r   r   rW   rW   rX   r     s
   
z!TruncateTransform.to_human_stringc                 C   r   )z@Return the string representation of the TruncateTransform class.zTruncateTransform(width=r   r^  r   rW   rW   rX   r     r^   zTruncateTransform.__repr__r   c                 C   r   r  )rY   r   rz   rK   rY  r  rW   rW   rX   r     s   z#TruncateTransform.pyarrow_transform)%r   r   r   r   r   r|   r   r   r   rX  r6   rY  r   r   r   r   r   r   r   r   r   rU  r   r*   r   r   r   r   rF   r   r{   rG   r   r   r   r   r  rW   rW   r   rX   r     s*   
 *$r   r\   _typec                 C      t | S rf   r   r\   ra  rW   rW   rX   rV    r   rV  c                 C   rb  rf   )rN  rc  rW   rW   rX   r     r   r   c                 C   s
   t || S rf   )_int_to_human_stringrc  rW   rW   rX   r        
c                 C   s   t |  S rf   )r   lowerrc  rW   rW   rX   r     s   c                 C   s   t |S rf   r   ra  r\   rW   rW   rX   rd    r   rd  c                 C   
   t |S rf   )r@   rD  rg  rW   rW   rX   r     re  c                 C   rh  rf   )r@   to_human_timerg  rW   rW   rX   r     re  c                 C   rh  rf   )r@   to_human_timestamprg  rW   rW   rX   r     re  c                 C   rh  rf   )r@   to_human_timestamptzrg  rW   rW   rX   r     re  c                       s   e Zd ZU dZeddZed ed< e Z	e
ed< de
def fdd	Zd
edeedB gedB f fddZd
edefddZd
edefddZde
dededB fddZde
dededB fddZde
fddZd
eddfddZ  ZS )r   zA transform that represents when an unknown transform is provided.

    Args:
      transform (str): A string name of a transform.

    Keyword Args:
      source_type (IcebergType): An Iceberg `Type`.
    unknownr  r|   ru   r   r   c                    s   t  jdi | || _d S )NrW   )r   r   ru   )r   r   r   r   rW   rX   r     s   
zUnknownTransform.__init__r}   rR   Nc                 C   s   t d|  )Nz$Cannot apply unsupported transform: )AttributeErrorr   rW   rW   rX   r     r   zUnknownTransform.transformc                 C   r   r   rW   r   rW   rW   rX   r     r   zUnknownTransform.can_transformc                 C   r   rf   )r9   r   rW   rW   rX   r     r   zUnknownTransform.result_typer   r   c                 C   r~   rf   rW   r   rW   rW   rX   r     r   zUnknownTransform.projectc                 C   r~   rf   rW   r   rW   rW   rX   r     r   zUnknownTransform.strict_projectc                 C   s   dt | j dS )z?Return the string representation of the UnknownTransform class.zUnknownTransform(transform=r   )reprru   r   rW   rW   rX   r     s   zUnknownTransform.__repr__r   c                 C   r   rf   r   r   rW   rW   rX   r     r   z"UnknownTransform.pyarrow_transform)r   r   r   r   r   r|   r8  r   r   ru   r   r   r   r6   r   rF   rG   r   r   r   r9   r   r   r*   r   r   r   r   r  rW   rW   r   rX   r     s   
 	$r   c                   @   s   e Zd ZU dZdZeed< dedee	dB ge
dB f fddZd	edefd
dZdedefddZdedededB fddZdedededB fddZd	ede	dB defddZdefddZdeddfddZdS )r   z%A transform that always returns None.rI   r|   r}   rR   Nc                 C   rO  )Nc                 S   r~   rf   rW   r   rW   rW   rX   r     rQ  z)VoidTransform.transform.<locals>.<lambda>rW   r   rW   rW   rX   r     r   zVoidTransform.transformr   c                 C   r   r  rW   )r   r   rW   rW   rX   r     r   zVoidTransform.can_transformc                 C   rT  rf   rW   r   rW   rW   rX   r     r   zVoidTransform.result_typer   r   c                 C   r~   rf   rW   r   rW   rW   rX   r     r   zVoidTransform.projectc                 C   r~   rf   rW   r   rW   rW   rX   r     r   zVoidTransform.strict_projectr\   c                 C   r   r   rW   r   rW   rW   rX   r     r   zVoidTransform.to_human_stringc                 C   r   )z<Return the string representation of the VoidTransform class.zVoidTransform()rW   r   rW   rW   rX   r     r   zVoidTransform.__repr__r   c              
      s<   zdd l  W n ty } ztd|d }~ww  fddS )Nr   rc   c                    s    j t| | jdS )N)rq   )nullsr[  rq   rh   rt   rW   rX   r   	  r*  z1VoidTransform.pyarrow_transform.<locals>.<lambda>rv   )r   r}   ry   rW   rp  rX   r     s   
zVoidTransform.pyarrow_transform)r   r   r   r   r|   r   r   r6   r   rF   rG   r   r   r   r   r   r*   r   r   r   r   r   rW   rW   rW   rX   r     s   
 $r   r   r   r   c                 C   s   |j }t|ttttfstdt| t|tr&t	t
| t|| S t|tr5t	t
| t||S t|trFtt
| t|| S t|trUtt
| t||S t|trdtt
| t||S d S Nz!Expected a numeric literal, got: )r/   rj   r-   r,   r+   r.   rp   rq   r   r%   r(   r]   	decrementr   r   r#   	incrementr   r   r!   r   r   r   boundaryrW   rW   rX   r    s   




r  c                 C   s   |j }t|ttttfstdt| t|tr$t	t
| t||S t|tr5t	t
| t|| S t|trDtt
| t||S t|trUtt
| t|| S t|trdtt
| t||S t|trkd S d S rq  )r/   rj   r-   r,   r+   r.   rp   rq   r   r$   r(   r]   r   rs  r   r"   r   rr  r   r&   r   rt  rW   rW   rX   r  "  s    





r  c                 C   sl   |j }t|ttfrtt| t||S t|ttfr%t	t| t||S t|t
r4tt| t||S d S rf   )r/   rj   r   r   r$   r(   r]   r   r   r"   r   r&   rt  rW   rW   rX   r\  <  s   
r\  c                 C   s   |j }t|ttfrtt| t||S t|ttfr%t	t| t||S t|t
r4tt| t||S t|trCtt| t||S t|trRtt| t||S d S rf   )r/   rj   r   r   r%   r(   r]   r   r   r#   r   r!   r   r)   r   r'   rt  rW   rW   rX   rZ  K  s   


rZ  partition_namec                 C   s(   |j }t|tr| |jkrt||S d S rf   )r   rj   r   r   _remove_transform)r   rv  r   r   rW   rW   rX   r   ^  s   
r   c                 C   sb   t |tr|t| S t |tr|t| |jS t |ttfr*|t| |jS t	d| )Nz/Cannot replace transform in unknown predicate: )
rj   r    r   r(   r   r/   r   r   r   rp   )rv  r   rW   rW   rX   rw  g  s   

rw  c                    sD   |j }t|tr fdd|D }|jt| d|dS td| )Nc                    r   rW   r   r   r   rW   rX   r   u  r   z'_set_apply_transform.<locals>.<setcomp>)r   )r   zUnknown BoundSetPredicate: )r   rj   r   r   r(   rp   )r   r   r   r   transformed_literalsrW   r   rX   r  r  s
   
r  c                   @   s<   e Zd ZU dZeeef ed< dedeeef fddZdS )r   zA transform expression.r   r   c                 C   s   || _ || _d S rf   )r   r   )r   r   r   rW   rW   rX   r     s   
zBoundTransform.__init__N)	r   r   r   r   r{   r   r   r   r   rW   rW   rW   rX   r   {  s   
 r   rf   )rK  r@   r   rS   r   typesabcr   r   collections.abcr   enumr   	functoolsr   typingr   r   r	   r
   r   r   r8  uuidr   r   pydanticr   r   r   pyiceberg.exceptionsr   pyiceberg.expressionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   pyiceberg.expressions.literalsr+   r,   r-   r.   r/   pyiceberg.typedefr0   r1   pyiceberg.typesr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   pyiceberg.utilspyiceberg.utils.decimalrA   rB   pyiceberg.utils.parsingrC   pyiceberg.utils.singletonrD   rw   rt   rk   rl   rE   rF   rG   r   r   r   r   r   r   r   r   r   r   r   
ModuleTyperY   r]   rz   r{   r   r   r   r  r  r   r   r   r   r   rN  r   r   rV  registerr   r   rd  r   r   r  r  r\  rZ  r   rw  r  r   rW   rW   rW   rX   <module>   s  l @(
 =  
-<=E4D ($





	$	