o
    uyi{                     @  s  d dl mZ d dl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 d dlmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZmZm Z  d d	l!m"Z" dddZ#dddZ$dddZ%G dd deZ&dd d!Z'G d"d# d#e
e eZ(G d$d% d%eZ)ed&Z*G d'd( d(e
e* eZ+G d)d* d*e(e e)eZ,G d+d, d,e,e Z-G d-d. d.e(e e+e,e  eZ.G d/d0 d0e.e Z/G d1d2 d2e&Z0G d3d4 d4e&Z1G d5d6 d6e&Z2G d7d8 d8e&e"Z3G d9d: d:e&e"Z4G d;d< d<e
e e)e&eZ5G d=d> d>e
e e+e& e&eZ6G d?d@ d@e6e eZ7G dAdB dBe5e eZ8G dCdD dDe8e Z9G dEdF dFe8e Z:G dGdH dHe7Z;G dIdJ dJe7Z<G dKdL dLe8e Z=G dMdN dNe8e Z>G dOdP dPe7Z?G dQdR dRe7Z@G dSdT dTe6e eZAG dUdV dVe5e eZBG dWdX dXeBe ZCG dYdZ dZeBe ZDG d[d\ d\eAe ZEG d]d^ d^eAe eZFG d_d` d`e6e eZGG dadb dbe5e eZHG dcdd ddeHe ZIG dedf dfeHe ZJG dgdh dheHe ZKG didj djeHe ZLG dkdl dleHe ZMG dmdn dneHe ZNG dodp dpeHe ZOG dqdr dreHe ZPG dsdt dteGe ZQG dudv dveGe ZRG dwdx dxeGe ZSG dydz dzeGe ZTG d{d| d|eGe ZUG d}d~ d~eGe ZVG dd deGe ZWG dd deGe ZXdS )    )annotations)ABCabstractmethod)cached_property)
AnyCallableGenericIterableSequenceSetTupleTypeTypeVarUnion)AboveMaxBelowMinLiteralliteral)AccessorSchema)LStructProtocol)
DoubleType	FloatTypeNestedField)	SingletontermUnion[str, UnboundTerm[Any]]returnUnboundTerm[Any]c                 C  s   t | tr	t| S | S N)
isinstancestr	Referencer    r%   a/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/pyiceberg/expressions/__init__.py_to_unbound_term/   s   r'   values(Union[Iterable[L], Iterable[Literal[L]]]Set[Literal[L]]c                 C  s   dd | D S )Nc                 S  s   h | ]}t |qS r%   )_to_literal).0vr%   r%   r&   	<setcomp>4       z"_to_literal_set.<locals>.<setcomp>r%   )r(   r%   r%   r&   _to_literal_set3      r0   valueUnion[L, Literal[L]]
Literal[L]c                 C  s   t | tr| S t| S r    )r!   r   r   r2   r%   r%   r&   r+   7   s   
r+   c                   @  s2   e Zd ZdZedddZdddZddd	Zd
S )BooleanExpressionz*An expression that evaluates to a boolean.r   c                 C     dS )2Transform the Expression into its negated version.Nr%   selfr%   r%   r&   
__invert__A       zBooleanExpression.__invert__otherc                 C  "   t |tstd| t| |S )z,Perform and operation on another expression.!Expected BooleanExpression, got: )r!   r6   
ValueErrorAndr:   r=   r%   r%   r&   __and__E      

zBooleanExpression.__and__c                 C  r>   )z+Perform or operation on another expression.r?   )r!   r6   r@   OrrB   r%   r%   r&   __or__L   rD   zBooleanExpression.__or__Nr   r6   )r=   r6   r   r6   )__name__
__module____qualname____doc__r   r;   rC   rF   r%   r%   r%   r&   r6   >   s    
r6   	operator_CCallable[[BooleanExpression, BooleanExpression], BooleanExpression]itemsSequence[BooleanExpression]c                 C  sZ   |st dt|dkr|d S t|d }t| |d| }t| ||d }| ||S )u  
    Recursively constructs a balanced binary tree of BooleanExpressions using the provided binary operator.

    This function is a safer and more scalable alternative to:
        reduce(operator_, items)

    Using `reduce` creates a deeply nested, unbalanced tree (e.g., operator_(a, operator_(b, operator_(c, ...)))),
    which grows linearly with the number of items. This can lead to RecursionError exceptions in Python
    when the number of expressions is large (e.g., >1000).

    In contrast, this function builds a balanced binary tree with logarithmic depth (O(log n)),
    helping avoid recursion issues and ensuring that expression trees remain stable, predictable,
    and safe to traverse — especially in tools like PyIceberg that operate on large logical trees.

    Parameters:
        operator_ (Callable): A binary operator function (e.g., pyiceberg.expressions.Or, And) that takes two
            BooleanExpressions and returns a combined BooleanExpression.
        items (Sequence[BooleanExpression]): A sequence of BooleanExpression objects to combine.

    Returns:
        BooleanExpression: The balanced combination of all input BooleanExpressions.

    Raises:
        ValueError: If the input sequence is empty.
    zNo expressions to combine   r      N)r@   len_build_balanced_tree)rL   rN   midleftrightr%   r%   r&   rS   T   s   
rS   c                   @     e Zd ZdZdS )Termz.A simple expression that evaluates to a value.NrH   rI   rJ   rK   r%   r%   r%   r&   rX   {       rX   c                   @  rW   )Boundz$Represents a bound value expression.NrY   r%   r%   r%   r&   r[      rZ   r[   Bc                   @  s2   e Zd ZdZeddd	d
ZeedddZdS )Unboundz'Represents an unbound value expression.Tschemar   case_sensitiveboolr   r\   c                 C     d S r    r%   r:   r^   r_   r%   r%   r&   bind      zUnbound.bindType[Bound]c                 C  ra   r    r%   r9   r%   r%   r&   as_bound      zUnbound.as_boundNT)r^   r   r_   r`   r   r\   )r   re   )rH   rI   rJ   rK   r   rc   propertyrf   r%   r%   r%   r&   r]      s    r]   c                   @  s,   e Zd ZdZedddZedd	d
ZdS )	BoundTermzRepresents a bound term.r   BoundReference[L]c                 C  r7   )zReturn the bound reference.Nr%   r9   r%   r%   r&   ref   r<   zBoundTerm.refstructr   r   c                 C  r7   )zcReturn the value at the referenced field's position in an object that abides by the StructProtocol.Nr%   r:   rm   r%   r%   r&   eval   r<   zBoundTerm.evalNr   rk   rm   r   r   r   )rH   rI   rJ   rK   r   rl   ro   r%   r%   r%   r&   rj      s    rj   c                   @  s^   e Zd ZU dZded< ded< 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 )#BoundReferencezA reference bound to a field in a schema.

    Args:
        field (NestedField): A referenced field in an Iceberg schema.
        accessor (Accessor): An Accessor object to access the value at the field's position.
    r   fieldr   accessorc                 C  s   || _ || _d S r    rs   rt   )r:   rs   rt   r%   r%   r&   __init__   s   
zBoundReference.__init__rm   r   r   r   c                 C  s   | j |S )aP  Return the value at the referenced field's position in an object that abides by the StructProtocol.

        Args:
            struct (StructProtocol): A row object that abides by the StructProtocol and returns values given a position.
        Returns:
            Any: The value at the referenced field's position in `struct`.
        )rt   getrn   r%   r%   r&   ro      s   zBoundReference.evalr=   r   r`   c                 C     t |tr| j|jkS dS )zAReturn the equality of two instances of the BoundReference class.F)r!   rr   rs   rB   r%   r%   r&   __eq__      zBoundReference.__eq__r"   c                 C     dt | j dt | j dS )z=Return the string representation of the BoundReference class.zBoundReference(field=z, accessor=))reprrs   rt   r9   r%   r%   r&   __repr__      zBoundReference.__repr__rk   c                 C  s   | S r    r%   r9   r%   r%   r&   rl      rd   zBoundReference.refintc                 C  s   t t| S )z.Return hash value of the BoundReference class.)hashr"   r9   r%   r%   r&   __hash__      zBoundReference.__hash__N)rs   r   rt   r   rq   r=   r   r   r`   r   r"   rp   )r   r   )rH   rI   rJ   rK   __annotations__rv   ro   ry   r~   rl   r   r%   r%   r%   r&   rr      s   
 





rr   c                   @  s    e Zd ZdZeddd	d
ZdS )UnboundTermzRepresents an unbound term.Tr^   r   r_   r`   r   BoundTerm[L]c                 C  ra   r    r%   rb   r%   r%   r&   rc      rd   zUnboundTerm.bindNrh   )r^   r   r_   r`   r   r   )rH   rI   rJ   rK   r   rc   r%   r%   r%   r&   r      s    r   c                   @  sR   e Zd ZU dZded< dddZddd	ZdddZddddZe	dddZ
dS ) r#   zA reference not yet bound to a field in a schema.

    Args:
        name (str): The name of the field.

    Note:
        An unbound reference is sometimes referred to as a "named" reference.
    r"   namer   Nonec                 C  
   || _ d S r    )r   )r:   r   r%   r%   r&   rv         
zReference.__init__c                 C     dt | j dS )z8Return the string representation of the Reference class.zReference(name=r|   )r}   r   r9   r%   r%   r&   r~         zReference.__repr__r=   r   r`   c                 C  rx   )z<Return the equality of two instances of the Reference class.F)r!   r#   r   rB   r%   r%   r&   ry      rz   zReference.__eq__Tr^   r   r_   rk   c                 C  s*   |j | j|d}||j}| j||dS )a  Bind the reference to an Iceberg schema.

        Args:
            schema (Schema): An Iceberg schema.
            case_sensitive (bool): Whether to consider case when binding the reference to the field.

        Raises:
            ValueError: If an empty name is provided.

        Returns:
            BoundReference: A reference bound to the specific field in the Iceberg schema.
        )
name_or_idr_   ru   )
find_fieldr   accessor_for_fieldfield_idrf   )r:   r^   r_   rs   rt   r%   r%   r&   rc      s   zReference.bindType[BoundReference[L]]c                 C     t t S r    )rr   r   r9   r%   r%   r&   rf         zReference.as_boundN)r   r"   r   r   r   r   rh   )r^   r   r_   r`   r   rk   )r   r   )rH   rI   rJ   rK   r   rv   r~   ry   rc   ri   rf   r%   r%   r%   r&   r#      s   
 	


r#   c                      sf   e Zd ZU dZded< ded< d fddZdddZdddZdddZdddZ	dddZ
  ZS )rA   z/AND operation expression - logical conjunction.r6   rU   rV   restr   c                   j   |rt t||g|R S |t u s|t u rt S |t u r |S |t u r'|S t | }||_||_|S r    )rS   rA   AlwaysFalse
AlwaysTruesuper__new__rU   rV   clsrU   rV   r   obj	__class__r%   r&   r         

zAnd.__new__r=   r   r`   c                 C  &   t |tr| j|jko| j|jkS dS )z6Return the equality of two instances of the And class.F)r!   rA   rU   rV   rB   r%   r%   r&   ry        &z
And.__eq__r"   c                 C  r{   z2Return the string representation of the And class.z	And(left=, right=r|   )r"   rU   rV   r9   r%   r%   r&   __str__  r   zAnd.__str__c                 C  r{   r   r}   rU   rV   r9   r%   r%   r&   r~     r   zAnd.__repr__c                 C     t | j | j S r8   )rE   rU   rV   r9   r%   r%   r&   r;        zAnd.__invert__+Tuple[BooleanExpression, BooleanExpression]c                 C     | j | jfS )zPickle the And class.rU   rV   r9   r%   r%   r&   __getnewargs__   r   zAnd.__getnewargs__rU   r6   rV   r6   r   r6   r   r6   r   r   rG   r   r   )rH   rI   rJ   rK   r   r   ry   r   r~   r;   r   __classcell__r%   r%   r   r&   rA      s   
 



rA   c                      s\   e Zd ZU dZded< ded< d fddZdddZdddZdddZdddZ	  Z
S )rE   z.OR operation expression - logical disjunction.r6   rU   rV   r   r   c                   r   r    )rS   rE   r   r   r   r   rU   rV   r   r   r%   r&   r   +  r   z
Or.__new__r=   r   r`   c                 C  r   )z5Return the equality of two instances of the Or class.F)r!   rE   rU   rV   rB   r%   r%   r&   ry   :  r   z	Or.__eq__r"   c                 C  r{   )z1Return the string representation of the Or class.zOr(left=r   r|   r   r9   r%   r%   r&   r~   >  r   zOr.__repr__c                 C  r   r   )rA   rU   rV   r9   r%   r%   r&   r;   B  r   zOr.__invert__r   c                 C  r   )zPickle the Or class.r   r9   r%   r%   r&   r   G  r   zOr.__getnewargs__r   r   r   rG   r   )rH   rI   rJ   rK   r   r   ry   r~   r;   r   r   r%   r%   r   r&   rE   %  s   
 


rE   c                      sT   e Zd ZU dZded< d fddZddd	ZdddZdddZdddZ	  Z
S )Notz,NOT operation expression - logical negation.r6   childr   c                   sF   |t  u rt S |t u rt  S t|tr|jS t | }||_|S r    )r   r   r!   r   r   r   r   )r   r   r   r   r%   r&   r   Q  s   


zNot.__new__r"   c                 C  r   )z2Return the string representation of the Not class.z
Not(child=r|   )r}   r   r9   r%   r%   r&   r~   \  r   zNot.__repr__r=   r   r`   c                 C  rx   )z6Return the equality of two instances of the Not class.F)r!   r   r   rB   r%   r%   r&   ry   `  rz   z
Not.__eq__c                 C  s   | j S r   r   r9   r%   r%   r&   r;   d     zNot.__invert__Tuple[BooleanExpression]c                 C     | j fS )zPickle the Not class.r   r9   r%   r%   r&   r   h  r   zNot.__getnewargs__)r   r6   r   r6   r   r   rG   )r   r   )rH   rI   rJ   rK   r   r   r~   ry   r;   r   r   r%   r%   r   r&   r   L  s   
 


r   c                   @  .   e Zd ZdZdddZdddZdd	d
ZdS )r   zTRUE expression.r   r   c                 C     t  S r   )r   r9   r%   r%   r&   r;   p  r   zAlwaysTrue.__invert__r"   c                 C  r7   z9Return the string representation of the AlwaysTrue class.zAlwaysTrue()r%   r9   r%   r%   r&   r   t  rg   zAlwaysTrue.__str__c                 C  r7   r   r%   r9   r%   r%   r&   r~   x  rg   zAlwaysTrue.__repr__N)r   r   r   rH   rI   rJ   rK   r;   r   r~   r%   r%   r%   r&   r   m  
    

r   c                   @  r   )r   zFALSE expression.r   r   c                 C  r   r   )r   r9   r%   r%   r&   r;     r   zAlwaysFalse.__invert__r"   c                 C  r7   z:Return the string representation of the AlwaysFalse class.zAlwaysFalse()r%   r9   r%   r%   r&   r     rg   zAlwaysFalse.__str__c                 C  r7   r   r%   r9   r%   r%   r&   r~     rg   zAlwaysFalse.__repr__N)r   r   r   r   r%   r%   r%   r&   r   }  r   r   c                   @  s<   e Zd ZU ded< dddZdd	d
ZeedddZdS )BoundPredicater   r   c                 C  r   r    r$   r:   r   r%   r%   r&   rv     r   zBoundPredicate.__init__r=   r   r   r`   c                 C     t || jr| j|jkS dS )zAReturn the equality of two instances of the BoundPredicate class.Fr!   r   r   rB   r%   r%   r&   ry     s   zBoundPredicate.__eq__Type[UnboundPredicate[Any]]c                 C  ra   r    r%   r9   r%   r%   r&   
as_unbound  rg   zBoundPredicate.as_unboundNr   r   r   )r   r   )	rH   rI   rJ   r   rv   ry   ri   r   r   r%   r%   r%   r&   r     s   
 

r   c                   @  sL   e Zd ZU ded< dddZdd
dZeddddZeedddZ	dS )UnboundPredicater   r   r   c                 C  s   t || _d S r    )r'   r   r   r%   r%   r&   rv     r1   zUnboundPredicate.__init__r=   r   r   r`   c                 C  r   )zCReturn the equality of two instances of the UnboundPredicate class.Fr   rB   r%   r%   r&   ry     s   zUnboundPredicate.__eq__Tr^   r   r_   r6   c                 C  ra   r    r%   rb   r%   r%   r&   rc     rd   zUnboundPredicate.bindType[BoundPredicate[L]]c                 C  ra   r    r%   r9   r%   r%   r&   rf     rg   zUnboundPredicate.as_boundN)r   r   r   rh   )r^   r   r_   r`   r   r6   )r   r   )
rH   rI   rJ   r   rv   ry   r   rc   ri   rf   r%   r%   r%   r&   r     s   
 

r   c                   @  s4   e Zd Zdddd	ZdddZeedddZdS )UnaryPredicateTr^   r   r_   r`   r   BoundUnaryPredicate[Any]c                 C  s   | j ||}| |S r    )r   rc   rf   )r:   r^   r_   
bound_termr%   r%   r&   rc     s   
zUnaryPredicate.bindr"   c                 C     t | jj dt| j dS )z=Return the string representation of the UnaryPredicate class.(term=r|   r"   r   rH   r}   r   r9   r%   r%   r&   r~     r   zUnaryPredicate.__repr__Type[BoundUnaryPredicate[Any]]c                 C  ra   r    r%   r9   r%   r%   r&   rf     rg   zUnaryPredicate.as_boundNrh   )r^   r   r_   r`   r   r   r   )r   r   )rH   rI   rJ   rc   r~   ri   r   rf   r%   r%   r%   r&   r     s    
r   c                   @  s2   e Zd ZdddZeedddZdd	d
ZdS )BoundUnaryPredicater   r"   c                 C  r   )zBReturn the string representation of the BoundUnaryPredicate class.r   r|   r   r9   r%   r%   r&   r~     r   zBoundUnaryPredicate.__repr__Type[UnaryPredicate]c                 C  ra   r    r%   r9   r%   r%   r&   r     rg   zBoundUnaryPredicate.as_unboundTuple[BoundTerm[L]]c                 C  r   )z%Pickle the BoundUnaryPredicate class.r$   r9   r%   r%   r&   r     r   z"BoundUnaryPredicate.__getnewargs__Nr   )r   r   )r   r   )rH   rI   rJ   r~   ri   r   r   r   r%   r%   r%   r&   r     s    
r   c                      6   e Zd Zd fddZddd	ZedddZ  ZS )BoundIsNullr   r   r   r6   c                      |  jjr	t S t | S r    )rl   rs   requiredr   r   r   r   r   r   r%   r&   r        zBoundIsNull.__new__BoundNotNull[L]c                 C  
   t | jS r   )BoundNotNullr   r9   r%   r%   r&   r;        
zBoundIsNull.__invert__Type[IsNull]c                 C     t S r    )IsNullr9   r%   r%   r&   r     rg   zBoundIsNull.as_unboundr   r   r   r6   )r   r   )r   r   rH   rI   rJ   r   r;   ri   r   r   r%   r%   r   r&   r     
    
r   c                      s6   e Zd Zd fddZdddZedd
dZ  ZS )r   r   r   c                   r   r    )rl   rs   r   r   r   r   r   r   r%   r&   r     r   zBoundNotNull.__new__r   BoundIsNull[L]c                 C  r   r   )r   r   r9   r%   r%   r&   r;     r   zBoundNotNull.__invert__Type[NotNull]c                 C  r   r    )NotNullr9   r%   r%   r&   r     rg   zBoundNotNull.as_unboundr   )r   r   )r   r   r   r%   r%   r   r&   r     r   r   c                   @  $   e Zd Zd	ddZed
ddZdS )r   r   r   c                 C  r   r   )r   r   r9   r%   r%   r&   r;     r   zIsNull.__invert__Type[BoundIsNull[L]]c                 C  r   r    )r   r   r9   r%   r%   r&   rf     r   zIsNull.as_boundN)r   r   )r   r   rH   rI   rJ   r;   ri   rf   r%   r%   r%   r&   r         
r   c                   @  r   )r   r   r   c                 C  r   r   )r   r   r9   r%   r%   r&   r;     r   zNotNull.__invert__Type[BoundNotNull[L]]c                 C  r   r    )r   r   r9   r%   r%   r&   rf     r   zNotNull.as_boundN)r   r   )r   r   r   r%   r%   r%   r&   r     r   r   c                      r   )
BoundIsNaNr   r   r   r6   c                   ,   |  jj}t|ttfrt | S t S r    )	rl   rs   
field_typer!   r   r   r   r   r   r   r   
bound_typer   r%   r&   r        zBoundIsNaN.__new__BoundNotNaN[L]c                 C  r   r   )BoundNotNaNr   r9   r%   r%   r&   r;     r   zBoundIsNaN.__invert__Type[IsNaN]c                 C  r   r    )IsNaNr9   r%   r%   r&   r   	  rg   zBoundIsNaN.as_unboundr   )r   r   )r   r   r   r%   r%   r   r&   r     
    
r   c                      r   )r   r   r   r   r6   c                   r   r    )	rl   rs   r   r!   r   r   r   r   r   r   r   r%   r&   r     r   zBoundNotNaN.__new__BoundIsNaN[L]c                 C  r   r   )r   r   r9   r%   r%   r&   r;     r   zBoundNotNaN.__invert__Type[NotNaN]c                 C  r   r    )NotNaNr9   r%   r%   r&   r     rg   zBoundNotNaN.as_unboundr   )r   r   )r   r   r   r%   r%   r   r&   r     r   r   c                   @  r   )r   r   r   c                 C  r   r   )r   r   r9   r%   r%   r&   r;     r   zIsNaN.__invert__Type[BoundIsNaN[L]]c                 C  r   r    )r   r   r9   r%   r%   r&   rf   #  r   zIsNaN.as_boundN)r   r   )r   r   r   r%   r%   r%   r&   r     r   r   c                   @  r   )r   r   r   c                 C  r   r   )r   r   r9   r%   r%   r&   r;   )  r   zNotNaN.__invert__Type[BoundNotNaN[L]]c                 C  r   r    )r   r   r9   r%   r%   r&   rf   -  r   zNotNaN.as_boundN)r   r   )r   r   r   r%   r%   r%   r&   r   (  r   r   c                      sn   e Zd ZU ded< d  fddZd!d"ddZd#ddZd#ddZd$ddZd%ddZ	e
ed&ddZ  ZS )'SetPredicater*   literalsr   r   r)   c                      t  | t|| _d S r    r   rv   r0   r   r:   r   r   r   r%   r&   rv   5     zSetPredicate.__init__Tr^   r   r_   r`   r   BoundSetPredicate[L]c                   s*   | j || |   fdd| jD S )Nc                   s   h | ]}|   jjqS r%   )torl   rs   r   r,   litr   r%   r&   r.   ;  s    z$SetPredicate.bind.<locals>.<setcomp>)r   rc   rf   r   rb   r%   r  r&   rc   9  s   zSetPredicate.bindr"   c              	   C  :   t | jj dt | j ddtdd | jD  dS );Return the string representation of the SetPredicate class.(, {, c                 S     g | ]}t |qS r%   r"   r,   r   r%   r%   r&   
<listcomp>@  r/   z(SetPredicate.__str__.<locals>.<listcomp>})r"   r   rH   r   joinsortedr   r9   r%   r%   r&   r   =     :zSetPredicate.__str__c              	   C  :   t | jj dt| j ddtdd | jD  dS )r  r  r  r  c                 S  r	  r%   r}   r  r%   r%   r&   r  E  r/   z)SetPredicate.__repr__.<locals>.<listcomp>r  r"   r   rH   r}   r   r  r  r   r9   r%   r%   r&   r~   B  r  zSetPredicate.__repr__r=   r   c                 C  (   t || jr| j|jko| j|jkS dS )z?Return the equality of two instances of the SetPredicate class.Fr!   r   r   r   rB   r%   r%   r&   ry   G     (zSetPredicate.__eq__&Tuple[UnboundTerm[L], Set[Literal[L]]]c                 C  r   )zPickle the SetPredicate class.r   r   r9   r%   r%   r&   r   K  r   zSetPredicate.__getnewargs__Type[BoundSetPredicate[L]]c                 C  r   r    )BoundSetPredicater   r9   r%   r%   r&   rf   O  s   zSetPredicate.as_bound)r   r   r   r)   rh   )r^   r   r_   r`   r   r   r   r   )r   r  )r   r  )rH   rI   rJ   r   rv   rc   r   r~   ry   r   ri   r   rf   r   r%   r%   r   r&   r   2  s   
 



r   c                      sp   e Zd ZU ded< d fddZedd	d
ZdddZdddZdddZ	dddZ
eed ddZ  ZS )!r  r*   r   r   r   c                   r   r    r   r   r   r%   r&   rv   X  s   zBoundSetPredicate.__init__r   Set[L]c                 C  s   dd | j D S )Nc                 S  s   h | ]}|j qS r%   r5   r  r%   r%   r&   r.   _  s    z.BoundSetPredicate.value_set.<locals>.<setcomp>)r   r9   r%   r%   r&   	value_set]  s   zBoundSetPredicate.value_setr"   c              	   C  r  )@Return the string representation of the BoundSetPredicate class.r  r  r  c                 S  r	  r%   r
  r  r%   r%   r&   r  d  r/   z-BoundSetPredicate.__str__.<locals>.<listcomp>r  r  r9   r%   r%   r&   r   a  r  zBoundSetPredicate.__str__c              	   C  r  )r  r  r  r  c                 S  r	  r%   r  r  r%   r%   r&   r  i  r/   z.BoundSetPredicate.__repr__.<locals>.<listcomp>r  r  r9   r%   r%   r&   r~   f  r  zBoundSetPredicate.__repr__r=   r   r`   c                 C  r  )zDReturn the equality of two instances of the BoundSetPredicate class.Fr  rB   r%   r%   r&   ry   k  r  zBoundSetPredicate.__eq__$Tuple[BoundTerm[L], Set[Literal[L]]]c                 C  r   )z#Pickle the BoundSetPredicate class.r  r9   r%   r%   r&   r   o  r   z BoundSetPredicate.__getnewargs__Type[SetPredicate[L]]c                 C  ra   r    r%   r9   r%   r%   r&   r   s  rg   zBoundSetPredicate.as_unbound)r   r   r   r*   )r   r  r   r   )r   r  )r   r   )rH   rI   rJ   r   rv   r   r  r   r~   ry   r   ri   r   r   r   r%   r%   r   r&   r  U  s   
 



r  c                      s@   e Zd Zd fddZdd
dZdddZedddZ  ZS )BoundInr   r   r   r*   r   r6   c                   <   t |}|dkrt S |dkrt|tt|S t | S Nr   rP   )rR   r   BoundEqualTonextiterr   r   r   r   r   countr   r%   r&   r   y  s   zBoundIn.__new__BoundNotIn[L]c                 C     t | j| jS r   )
BoundNotInr   r   r9   r%   r%   r&   r;        zBoundIn.__invert__r=   r   r`   c                 C  r  )z:Return the equality of two instances of the BoundIn class.Fr  rB   r%   r%   r&   ry     r  zBoundIn.__eq__Type[In[L]]c                 C  r   r    )Inr9   r%   r%   r&   r     rg   zBoundIn.as_unboundr   r   r   r*   r   r6   )r   r)  r   )r   r-  )	rH   rI   rJ   r   r;   ry   ri   r   r   r%   r%   r   r&   r!  x  s    
	
r!  c                      6   e Zd Zd fddZdd
dZedddZ  ZS )r+  r   r   r   r*   r   r6   c                   r"  r#  )rR   r   BoundNotEqualTor%  r&  r   r   r'  r   r%   r&   r     s   zBoundNotIn.__new__
BoundIn[L]c                 C  r*  r   )r!  r   r   r9   r%   r%   r&   r;     r,  zBoundNotIn.__invert__Type[NotIn[L]]c                 C  r   r    )NotInr9   r%   r%   r&   r     rg   zBoundNotIn.as_unboundr/  )r   r2  )r   r3  r   r%   r%   r   r&   r+    s
    
r+  c                      r0  )r.  r   r   r   r)   r   r6   c                   sD   t |}t|}|dkrt S |dkrt|tt|S t | S r#  )r0   rR   r   EqualTor%  r&  r   r   r   r   r   literals_setr(  r   r%   r&   r        z
In.__new__NotIn[L]c                 C     t t | j| jS r   )r4  r   r   r   r9   r%   r%   r&   r;     r   zIn.__invert__Type[BoundIn[L]]c                 C  r   r    )r!  r   r9   r%   r%   r&   rf     r   zIn.as_boundr   r   r   r)   r   r6   )r   r9  )r   r;  rH   rI   rJ   r   r;   ri   rf   r   r%   r%   r   r&   r.    
    
r.  c                      r0  )r4  r   r   r   r)   r   r6   c                   sD   t |}t|}|dkrt S |dkrt|tt|S t | S r#  )r0   rR   r   
NotEqualTor%  r&  r   r   r6  r   r%   r&   r     r8  zNotIn.__new__In[L]c                 C  r:  r   )r.  r   r   r   r9   r%   r%   r&   r;     r   zNotIn.__invert__Type[BoundNotIn[L]]c                 C  r   r    )r+  r   r9   r%   r%   r&   rf     r   zNotIn.as_boundr<  )r   r@  )r   rA  r=  r%   r%   r   r&   r4    r>  r4  c                      sZ   e Zd ZU ded< d fddZddddZdddZdddZee	d ddZ
  ZS )!LiteralPredicater4   r   r   r   r3   c                   r   r    )r   rv   r+   r   r:   r   r   r   r%   r&   rv     r   zLiteralPredicate.__init__Tr^   r   r_   r`   r   BoundLiteralPredicate[L]c                 C  s   | j ||}| j| jj}t|tr-t| t	t
tfr!t S t| tttfr,t S nt|trHt| tttfr=t S t| t	t
tfrHt S | ||S r    )r   rc   r   r   rl   rs   r   r!   r   LessThanLessThanOrEqualr?  r   GreaterThanGreaterThanOrEqualr5  r   r   rf   )r:   r^   r_   r   r  r%   r%   r&   rc     s   

zLiteralPredicate.bindr=   r   c                 C  r  )zCReturn the equality of two instances of the LiteralPredicate class.Fr!   r   r   r   rB   r%   r%   r&   ry        zLiteralPredicate.__eq__r"   c                 C  *   t | jj dt| j dt| j dS )z?Return the string representation of the LiteralPredicate class.r   
, literal=r|   r"   r   rH   r}   r   r   r9   r%   r%   r&   r~        *zLiteralPredicate.__repr__Type[BoundLiteralPredicate[L]]c                 C  ra   r    r%   r9   r%   r%   r&   rf     rg   zLiteralPredicate.as_bound)r   r   r   r3   rh   )r^   r   r_   r`   r   rD  r   r   )r   rO  )rH   rI   rJ   r   rv   rc   ry   r~   ri   r   rf   r   r%   r%   r   r&   rB    s   
 

rB  c                      sN   e Zd ZU ded< d fddZdddZdddZeedddZ	  Z
S )BoundLiteralPredicater4   r   r   r   c                   s   t  | || _d S r    )r   rv   r   rC  r   r%   r&   rv     s   
zBoundLiteralPredicate.__init__r=   r   r   r`   c                 C  r  )zHReturn the equality of two instances of the BoundLiteralPredicate class.FrI  rB   r%   r%   r&   ry     rJ  zBoundLiteralPredicate.__eq__r"   c                 C  rK  )zDReturn the string representation of the BoundLiteralPredicate class.r   rL  r|   rM  r9   r%   r%   r&   r~     rN  zBoundLiteralPredicate.__repr__Type[LiteralPredicate[L]]c                 C  ra   r    r%   r9   r%   r%   r&   r     rg   z BoundLiteralPredicate.as_unbound)r   r   r   r4   r   r   )r   rQ  )rH   rI   rJ   r   rv   ry   r~   ri   r   r   r   r%   r%   r   r&   rP    s   
 

rP  c                   @  r   )r$  r   BoundNotEqualTo[L]c                 C  r:  r   )r1  r   r   r   r9   r%   r%   r&   r;     r   zBoundEqualTo.__invert__Type[EqualTo[L]]c                 C  r   r    )r5  r9   r%   r%   r&   r     rg   zBoundEqualTo.as_unboundN)r   rR  )r   rS  rH   rI   rJ   r;   ri   r   r%   r%   r%   r&   r$    r   r$  c                   @  r   )r1  r   BoundEqualTo[L]c                 C  r:  r   )r$  r   r   r   r9   r%   r%   r&   r;     r   zBoundNotEqualTo.__invert__Type[NotEqualTo[L]]c                 C  r   r    )r?  r9   r%   r%   r&   r     rg   zBoundNotEqualTo.as_unboundN)r   rU  )r   rV  rT  r%   r%   r%   r&   r1    r   r1  c                   @  r   )BoundGreaterThanOrEqualr   BoundLessThan[L]c                 C  r:  r   )BoundLessThanr   r   r   r9   r%   r%   r&   r;   %  r   z"BoundGreaterThanOrEqual.__invert__Type[GreaterThanOrEqual[L]]c                 C  r   r    )rH  r   r9   r%   r%   r&   r   )  r   z"BoundGreaterThanOrEqual.as_unboundN)r   rX  )r   rZ  rT  r%   r%   r%   r&   rW  $  r   rW  c                   @  r   )BoundGreaterThanr   BoundLessThanOrEqual[L]c                 C  r*  r   )BoundLessThanOrEqualr   r   r9   r%   r%   r&   r;   /  r,  zBoundGreaterThan.__invert__Type[GreaterThan[L]]c                 C  r   r    )rG  r   r9   r%   r%   r&   r   3  r   zBoundGreaterThan.as_unboundN)r   r\  )r   r^  rT  r%   r%   r%   r&   r[  .  r   r[  c                   @  r   )rY  r   BoundGreaterThanOrEqual[L]c                 C  r:  r   )rW  r   r   r   r9   r%   r%   r&   r;   9  r   zBoundLessThan.__invert__Type[LessThan[L]]c                 C  r   r    )rE  r   r9   r%   r%   r&   r   =  r   zBoundLessThan.as_unboundN)r   r_  )r   r`  rT  r%   r%   r%   r&   rY  8  r   rY  c                   @  r   )r]  r   BoundGreaterThan[L]c                 C  r:  r   )r[  r   r   r   r9   r%   r%   r&   r;   C  r   zBoundLessThanOrEqual.__invert__Type[LessThanOrEqual[L]]c                 C  r   r    )rF  r   r9   r%   r%   r&   r   G  r   zBoundLessThanOrEqual.as_unboundN)r   ra  )r   rb  rT  r%   r%   r%   r&   r]  B  r   r]  c                   @  r   )BoundStartsWithr   BoundNotStartsWith[L]c                 C  r:  r   )BoundNotStartsWithr   r   r   r9   r%   r%   r&   r;   M  r   zBoundStartsWith.__invert__Type[StartsWith[L]]c                 C  r   r    )
StartsWithr   r9   r%   r%   r&   r   Q  r   zBoundStartsWith.as_unboundN)r   rd  )r   rf  rT  r%   r%   r%   r&   rc  L  r   rc  c                   @  r   )re  r   BoundStartsWith[L]c                 C  r:  r   )rc  r   r   r   r9   r%   r%   r&   r;   W  r   zBoundNotStartsWith.__invert__Type[NotStartsWith[L]]c                 C  r   r    )NotStartsWithr   r9   r%   r%   r&   r   [  r   zBoundNotStartsWith.as_unboundN)r   rh  )r   ri  rT  r%   r%   r%   r&   re  V  r   re  c                   @  r   )r5  r   NotEqualTo[L]c                 C  r:  r   )r?  r   r   r   r9   r%   r%   r&   r;   a  r   zEqualTo.__invert__Type[BoundEqualTo[L]]c                 C  r   r    )r$  r   r9   r%   r%   r&   rf   e  r   zEqualTo.as_boundN)r   rk  )r   rl  r   r%   r%   r%   r&   r5  `  r   r5  c                   @  r   )r?  r   
EqualTo[L]c                 C  r:  r   )r5  r   r   r   r9   r%   r%   r&   r;   k  r   zNotEqualTo.__invert__Type[BoundNotEqualTo[L]]c                 C  r   r    )r1  r   r9   r%   r%   r&   rf   o  r   zNotEqualTo.as_boundN)r   rm  )r   rn  r   r%   r%   r%   r&   r?  j  r   r?  c                   @  r   )rE  r   GreaterThanOrEqual[L]c                 C  r:  r   )rH  r   r   r   r9   r%   r%   r&   r;   u  r   zLessThan.__invert__Type[BoundLessThan[L]]c                 C  r   r    )rY  r   r9   r%   r%   r&   rf   y  r   zLessThan.as_boundN)r   ro  )r   rp  r   r%   r%   r%   r&   rE  t  r   rE  c                   @  r   )rH  r   LessThan[L]c                 C  r:  r   )rE  r   r   r   r9   r%   r%   r&   r;     r   zGreaterThanOrEqual.__invert__ Type[BoundGreaterThanOrEqual[L]]c                 C  r   r    )rW  r   r9   r%   r%   r&   rf     r   zGreaterThanOrEqual.as_boundN)r   rq  )r   rr  r   r%   r%   r%   r&   rH  ~  r   rH  c                   @  r   )rG  r   LessThanOrEqual[L]c                 C  r:  r   )rF  r   r   r   r9   r%   r%   r&   r;     r   zGreaterThan.__invert__Type[BoundGreaterThan[L]]c                 C  r   r    )r[  r   r9   r%   r%   r&   rf     r   zGreaterThan.as_boundN)r   rs  )r   rt  r   r%   r%   r%   r&   rG    r   rG  c                   @  r   )rF  r   GreaterThan[L]c                 C  r:  r   )rG  r   r   r   r9   r%   r%   r&   r;     r   zLessThanOrEqual.__invert__Type[BoundLessThanOrEqual[L]]c                 C  r   r    )r]  r   r9   r%   r%   r&   rf     r   zLessThanOrEqual.as_boundN)r   ru  )r   rv  r   r%   r%   r%   r&   rF    r   rF  c                   @  r   )rg  r   NotStartsWith[L]c                 C  r:  r   )rj  r   r   r   r9   r%   r%   r&   r;     r   zStartsWith.__invert__Type[BoundStartsWith[L]]c                 C  r   r    )rc  r   r9   r%   r%   r&   rf     r   zStartsWith.as_boundN)r   rw  )r   rx  r   r%   r%   r%   r&   rg    r   rg  c                   @  r   )rj  r   StartsWith[L]c                 C  r:  r   )rg  r   r   r   r9   r%   r%   r&   r;     r   zNotStartsWith.__invert__Type[BoundNotStartsWith[L]]c                 C  r   r    )re  r   r9   r%   r%   r&   rf     r   zNotStartsWith.as_boundN)r   ry  )r   rz  r   r%   r%   r%   r&   rj    r   rj  N)r   r   r   r   )r(   r)   r   r*   )r2   r3   r   r4   )rL   rM   rN   rO   r   r6   )Y
__future__r   abcr   r   	functoolsr   typingr   r   r   r	   r
   r   r   r   r   r   pyiceberg.expressions.literalsr   r   r   r   pyiceberg.schemar   r   pyiceberg.typedefr   r   pyiceberg.typesr   r   r   pyiceberg.utils.singletonr   r'   r0   r+   r6   rS   rX   r[   r\   r]   rj   rr   r   r#   rA   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r!  r+  r.  r4  rB  rP  r$  r1  rW  r[  rY  r]  rc  re  r5  r?  rE  rH  rG  rF  rg  rj  r%   r%   r%   r&   <module>   s~   0



' )-+'!



##'














