o
    uy‚iâ4 ã                   @   s  d dl 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 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*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d d	l4m5Z5m6Z6 d d
l7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d dlGmHZHmIZI edƒZJG dd„ de
eJ eƒZKededeKeJ deJfdd„ƒZLeL Me¡dedeKeJ deJfdd„ƒZNeL Me¡dedeKeJ deJfdd„ƒZNeL Me+¡de+deKeJ deJfdd„ƒZNeL Me¡dedeKeJ deJfdd„ƒZNeL Me-¡de-e; deKeJ deJfdd„ƒZNeL Me&¡de&e; deKeJ deJfdd„ƒZNeL Me,¡de,deKeJ deJfdd„ƒZNde8ded eOdefd!d"„ZPG d#d$„ d$eKe ƒZQG d%d&„ d&eKeJ eƒZRed'e&e; deKeJ deJfd(d)„ƒZSeS Me¡d'ee; deReJ deJfd*d„ƒZNeS Me"¡d'e"e; deReJ deJfd+d„ƒZNeS Me¡d'ee; deReJ deJfd,d„ƒZNeS Me#¡d'e#e; deReJ deJfd-d„ƒZNeS Me¡d'ee; deReJ deJfd.d„ƒZNeS Me$¡d'e$e; deReJ deJfd/d„ƒZNeS Me¡d'ee; deReJ deJfd0d„ƒZNeS Me!¡d'e!e; deReJ deJfd1d„ƒZNeS Me¡d'ee; deReJ deJfd2d„ƒZNeS Me¡d'ee; deReJ deJfd3d„ƒZNeS Me¡d'ee; deReJ deJfd4d„ƒZNeS Me¡d'ee; deReJ deJfd5d„ƒZNeS Me(¡d'e(e; deReJ deJfd6d„ƒZNeS Me%¡d'e%e; deReJ deJfd7d„ƒZNd'edefd8d9„ZTG d:d;„ d;eKe ƒZUde8d<ed eOdee=geOf fd=d>„ZVG d?d@„ d@eReO ƒZWdAZXdAZYdBZZdBZ[dCZ\dDeAdEe]defdFdG„Z^G dHdI„ dIeReO ƒZ_	Ad|dJe6de8dKed eOdee2geOf f
dLdM„Z`G dNdO„ dOeKe eƒZaG dPdQ„ dQeaƒZb	Ad|de8dRe6d eOdeegef fdSdT„ZcG dUdV„ dVeKe ƒZddAe:fd'edWe8d eOdXe	eeef def
dYdZ„ZfG d[d\„ d\eKeee  ƒZgd'edeee fd]d^„ZhG d_d`„ d`eKeedaf  ƒZid'edeedaf fdbdc„ZjG ddde„ deeReeekekef   ƒZl	Bd}dfeedaf dgeOdeeeekekef   fdhdi„ZmG djdk„ dkeReO eƒZnG dldm„ dmenƒZo	Ad|de8dRe6d eOdeegef fdndo„ZpG dpdq„ dqeaƒZqG drds„ dsenƒZrG dtdu„ dueRe eƒZsG dvdw„ dwesƒZtG dxdy„ dyetƒZudRe6d'ed eOde8detf
dzd{„ZvdS )~é    N)ÚABCÚabstractmethod)Úsingledispatch)
ÚAnyÚCallableÚDictÚGenericÚListÚSetÚSupportsFloatÚTupleÚTypeVarÚUnion)Ú
from_bytes)ÚAlwaysFalseÚ
AlwaysTrueÚAndÚBooleanExpressionÚBoundEqualToÚBoundGreaterThanÚBoundGreaterThanOrEqualÚBoundInÚ
BoundIsNaNÚBoundIsNullÚBoundLessThanÚBoundLessThanOrEqualÚBoundLiteralPredicateÚBoundNotEqualToÚ
BoundNotInÚBoundNotNaNÚBoundNotNullÚBoundNotStartsWithÚBoundPredicateÚBoundSetPredicateÚBoundStartsWithÚ	BoundTermÚBoundUnaryPredicateÚNotÚOrÚUnboundPredicate)ÚLiteral)ÚDataFileÚManifestFileÚPartitionFieldSummary)ÚUNPARTITIONED_PARTITION_SPECÚPartitionSpec)ÚSchema)Ú
EMPTY_DICTÚLÚRecordÚStructProtocol)Ú
DoubleTypeÚ	FloatTypeÚIcebergTypeÚNestedFieldÚPrimitiveTypeÚ
StructTypeÚTimestampTypeÚTimestamptzType)Úmicros_to_timestampÚmicros_to_timestamptzÚTc                   @   s®   e Zd Zedefdd„ƒZedefdd„ƒZededefdd„ƒZed	ed
edefdd„ƒZed	ed
edefdd„ƒZ	ede
e defdd„ƒZedee defdd„ƒZdS )ÚBooleanExpressionVisitorÚreturnc                 C   ó   dS )z™Visit method for an AlwaysTrue boolean expression.

        Note: This visit method has no arguments since AlwaysTrue instances have no context.
        N© ©ÚselfrC   rC   úa/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/pyiceberg/expressions/visitors.pyÚ
visit_trueS   ó    z#BooleanExpressionVisitor.visit_truec                 C   rB   )z›Visit method for an AlwaysFalse boolean expression.

        Note: This visit method has no arguments since AlwaysFalse instances have no context.
        NrC   rD   rC   rC   rF   Úvisit_falseZ   rH   z$BooleanExpressionVisitor.visit_falseÚchild_resultc                 C   rB   )z Visit method for a Not boolean expression.

        Args:
            child_result (T): The result of visiting the child of the Not boolean expression.
        NrC   ©rE   rJ   rC   rC   rF   Ú	visit_nota   rH   z"BooleanExpressionVisitor.visit_notÚleft_resultÚright_resultc                 C   rB   )zïVisit method for an And boolean expression.

        Args:
            left_result (T): The result of visiting the left side of the expression.
            right_result (T): The result of visiting the right side of the expression.
        NrC   ©rE   rM   rN   rC   rC   rF   Ú	visit_andi   rH   z"BooleanExpressionVisitor.visit_andc                 C   rB   )zîVisit method for an Or boolean expression.

        Args:
            left_result (T): The result of visiting the left side of the expression.
            right_result (T): The result of visiting the right side of the expression.
        NrC   rO   rC   rC   rF   Úvisit_orr   rH   z!BooleanExpressionVisitor.visit_orÚ	predicatec                 C   rB   )z¤Visit method for an unbound predicate in an expression tree.

        Args:
            predicate (UnboundPredicate[L): An instance of an UnboundPredicate.
        NrC   ©rE   rR   rC   rC   rF   Úvisit_unbound_predicate{   rH   z0BooleanExpressionVisitor.visit_unbound_predicatec                 C   rB   )zVisit method for a bound predicate in an expression tree.

        Args:
            predicate (BoundPredicate[L]): An instance of a BoundPredicate.
        NrC   rS   rC   rC   rF   Úvisit_bound_predicateƒ   rH   z.BooleanExpressionVisitor.visit_bound_predicateN)Ú__name__Ú
__module__Ú__qualname__r   r?   rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   r@   R   s    r@   ÚobjÚvisitorrA   c                 C   ó   t d| › ƒ‚)a¼  Apply a boolean expression visitor to any point within an expression.

    The function traverses the expression in post-order fashion.

    Args:
        obj (BooleanExpression): An instance of a BooleanExpression.
        visitor (BooleanExpressionVisitor[T]): An instance of an implementation of the generic BooleanExpressionVisitor base class.

    Raises:
        NotImplementedError: If attempting to visit an unsupported expression.
    z%Cannot visit unsupported expression: )ÚNotImplementedError©rY   rZ   rC   rC   rF   ÚvisitŒ   s   r^   Ú_c                 C   ó   |  ¡ S )zPVisit an AlwaysTrue boolean expression with a concrete BooleanExpressionVisitor.)rG   ©r_   rZ   rC   rC   rF   r_   œ   ó   c                 C   r`   )zQVisit an AlwaysFalse boolean expression with a concrete BooleanExpressionVisitor.)rI   ra   rC   rC   rF   r_   ¢   rb   c                 C   s   t | j|d}|j|dS )zHVisit a Not boolean expression with a concrete BooleanExpressionVisitor.©rZ   )rJ   )r^   ÚchildrL   )rY   rZ   rJ   rC   rC   rF   r_   ¨   s   c                 C   ó*   t | j|d}t | j|d}|j||dS )zIVisit an And boolean expression with a concrete BooleanExpressionVisitor.rc   ©rM   rN   )r^   ÚleftÚrightrP   ©rY   rZ   rM   rN   rC   rC   rF   r_   ¯   ó   c                 C   ó   |j | dS )zMVisit an unbound boolean expression with a concrete BooleanExpressionVisitor.©rR   )rT   r]   rC   rC   rF   r_   ·   ó   c                 C   rk   )zJVisit a bound boolean expression with a concrete BooleanExpressionVisitor.rl   ©rU   r]   rC   rC   rF   r_   ½   rm   c                 C   re   )zHVisit an Or boolean expression with a concrete BooleanExpressionVisitor.rc   rf   )r^   rg   rh   rQ   ri   rC   rC   rF   r_   Ã   rj   ÚschemaÚ
expressionÚcase_sensitivec                 C   s   t |t| |ƒƒS )a»  Travers over an expression to bind the predicates to the schema.

    Args:
      schema (Schema): A schema to use when binding the expression.
      expression (BooleanExpression): An expression containing UnboundPredicates that can be bound.
      case_sensitive (bool): Whether to consider case when binding a reference to a field in a schema, defaults to True.

    Raises:
        TypeError: In the case a predicate is already bound.
    )r^   ÚBindVisitor)ro   rp   rq   rC   rC   rF   ÚbindË   s   rs   c                   @   s¾   e Zd ZU dZeed< eed< dededdfdd„Zdefdd	„Z	defd
d„Z
d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e defdd„Zdee defdd„ZdS )rr   a‚  Rewrites a boolean expression by replacing unbound references with references to fields in a struct schema.

    Args:
      schema (Schema): A schema to use when binding the expression.
      case_sensitive (bool): Whether to consider case when binding a reference to a field in a schema, defaults to True.

    Raises:
        TypeError: In the case a predicate is already bound.
    ro   rq   rA   Nc                 C   s   || _ || _d S ©N)ro   rq   )rE   ro   rq   rC   rC   rF   Ú__init__ç   s   
zBindVisitor.__init__c                 C   ó   t ƒ S rt   ©r   rD   rC   rC   rF   rG   ë   ó   zBindVisitor.visit_truec                 C   rv   rt   ©r   rD   rC   rC   rF   rI   î   rx   zBindVisitor.visit_falserJ   c                 C   ó
   t |dS ©N)rd   ©r'   rK   rC   rC   rF   rL   ñ   ó   
zBindVisitor.visit_notrM   rN   c                 C   ó   t ||dS ©N)rg   rh   ©r   rO   rC   rC   rF   rP   ô   ó   zBindVisitor.visit_andc                 C   r~   r   ©r(   rO   rC   rC   rF   rQ   ÷   r   zBindVisitor.visit_orrR   c                 C   ó   |j | j| jdS )N©rq   )rs   ro   rq   rS   rC   rC   rF   rT   ú   ó   z#BindVisitor.visit_unbound_predicatec                 C   ó   t d|› ƒ‚)NzFound already bound predicate: ©Ú	TypeErrorrS   rC   rC   rF   rU   ý   ó   z!BindVisitor.visit_bound_predicate)rV   rW   rX   Ú__doc__r0   Ú__annotations__Úboolru   r   rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   rr   Ù   s   
 
rr   c                   @   sb  e Zd Zedee dee defdd„ƒZedee dee defdd„ƒZ	edee defdd	„ƒZ
edee defd
d„ƒZedee defdd„ƒZedee defdd„ƒZedee dee defdd„ƒZedee dee defdd„ƒZedee dee defdd„ƒZedee dee defdd„ƒZedee dee defdd„ƒZedee dee defdd„ƒZedefdd„ƒZedefdd „ƒZed!edefd"d#„ƒZed$ed%edefd&d'„ƒZed$ed%edefd(d)„ƒZedee dee defd*d+„ƒZedee dee defd,d-„ƒZd.ee defd/d0„Zd.ee defd1d2„Zd3S )4ÚBoundBooleanExpressionVisitorÚtermÚliteralsrA   c                 C   rB   )zVisit a bound In predicate.NrC   ©rE   rŽ   r   rC   rC   rF   Úvisit_in  rH   z&BoundBooleanExpressionVisitor.visit_inc                 C   rB   )zVisit a bound NotIn predicate.NrC   r   rC   rC   rF   Úvisit_not_in  rH   z*BoundBooleanExpressionVisitor.visit_not_inc                 C   rB   )zVisit a bound IsNan predicate.NrC   ©rE   rŽ   rC   rC   rF   Úvisit_is_nan
  rH   z*BoundBooleanExpressionVisitor.visit_is_nanc                 C   rB   )zVisit a bound NotNan predicate.NrC   r“   rC   rC   rF   Úvisit_not_nan  rH   z+BoundBooleanExpressionVisitor.visit_not_nanc                 C   rB   )zVisit a bound IsNull predicate.NrC   r“   rC   rC   rF   Úvisit_is_null  rH   z+BoundBooleanExpressionVisitor.visit_is_nullc                 C   rB   )z Visit a bound NotNull predicate.NrC   r“   rC   rC   rF   Úvisit_not_null  rH   z,BoundBooleanExpressionVisitor.visit_not_nullÚliteralc                 C   rB   )zVisit a bound Equal predicate.NrC   ©rE   rŽ   r˜   rC   rC   rF   Úvisit_equal  rH   z)BoundBooleanExpressionVisitor.visit_equalc                 C   rB   )z!Visit a bound NotEqual predicate.NrC   r™   rC   rC   rF   Úvisit_not_equal  rH   z-BoundBooleanExpressionVisitor.visit_not_equalc                 C   rB   )ú+Visit a bound GreaterThanOrEqual predicate.NrC   r™   rC   rC   rF   Úvisit_greater_than_or_equal"  rH   z9BoundBooleanExpressionVisitor.visit_greater_than_or_equalc                 C   rB   )z$Visit a bound GreaterThan predicate.NrC   r™   rC   rC   rF   Úvisit_greater_than&  rH   z0BoundBooleanExpressionVisitor.visit_greater_thanc                 C   rB   )z!Visit a bound LessThan predicate.NrC   r™   rC   rC   rF   Úvisit_less_than*  rH   z-BoundBooleanExpressionVisitor.visit_less_thanc                 C   rB   )z(Visit a bound LessThanOrEqual predicate.NrC   r™   rC   rC   rF   Úvisit_less_than_or_equal.  rH   z6BoundBooleanExpressionVisitor.visit_less_than_or_equalc                 C   rB   )zVisit a bound True predicate.NrC   rD   rC   rC   rF   rG   2  rH   z(BoundBooleanExpressionVisitor.visit_truec                 C   rB   )zVisit a bound False predicate.NrC   rD   rC   rC   rF   rI   6  rH   z)BoundBooleanExpressionVisitor.visit_falserJ   c                 C   rB   )zVisit a bound Not predicate.NrC   rK   rC   rC   rF   rL   :  rH   z'BoundBooleanExpressionVisitor.visit_notrM   rN   c                 C   rB   )zVisit a bound And predicate.NrC   rO   rC   rC   rF   rP   >  rH   z'BoundBooleanExpressionVisitor.visit_andc                 C   rB   )zVisit a bound Or predicate.NrC   rO   rC   rC   rF   rQ   B  rH   z&BoundBooleanExpressionVisitor.visit_orc                 C   rB   )z!Visit bound StartsWith predicate.NrC   r™   rC   rC   rF   Úvisit_starts_withF  rH   z/BoundBooleanExpressionVisitor.visit_starts_withc                 C   rB   )z$Visit bound NotStartsWith predicate.NrC   r™   rC   rC   rF   Úvisit_not_starts_withJ  rH   z3BoundBooleanExpressionVisitor.visit_not_starts_withrR   c                 C   r†   )zúVisit an unbound predicate.

        Args:
            predicate (UnboundPredicate[L]): An unbound predicate.
        Raises:
            TypeError: This always raises since an unbound predicate is not expected in a bound boolean expression.
        zNot a bound predicate: r‡   rS   rC   rC   rF   rT   N  s   z5BoundBooleanExpressionVisitor.visit_unbound_predicatec                 C   s
   t || ƒS )znVisit a bound predicate.

        Args:
            predicate (BoundPredicate[L]): A bound predicate.
        rn   rS   rC   rC   rF   rU   X  s   
z3BoundBooleanExpressionVisitor.visit_bound_predicateN) rV   rW   rX   r   r%   r2   r
   r?   r‘   r’   r”   r•   r–   r—   r*   rš   r›   r   rž   rŸ   r    rG   rI   rL   rP   rQ   r¡   r¢   r)   rT   r"   rU   rC   rC   rC   rF   r     sR              
r   Úexprc                 C   r[   )NzUnknown predicate: r‡   )r£   r_   rC   rC   rF   rU   a  ó   rU   c                 C   rƒ   ©N)rŽ   r   )r‘   rŽ   Ú	value_set©r£   rZ   rC   rC   rF   r_   f  ó   c                 C   rƒ   r¥   )r’   rŽ   r¦   r§   rC   rC   rF   r_   k  r¨   c                 C   ó   |j | jdS ©N)rŽ   )r”   rŽ   r§   rC   rC   rF   r_   p  r¤   c                 C   r©   rª   )r•   rŽ   r§   rC   rC   rF   r_   u  r¤   c                 C   r©   rª   )r–   rŽ   r§   rC   rC   rF   r_   z  r¤   c                 C   r©   rª   )r—   rŽ   r§   rC   rC   rF   r_     r¤   c                 C   rƒ   ©N©rŽ   r˜   )rš   rŽ   r˜   r§   rC   rC   rF   r_   „  r¨   c                 C   rƒ   r«   )r›   rŽ   r˜   r§   rC   rC   rF   r_   ‰  r¨   c                 C   rƒ   )rœ   r¬   )r   rŽ   r˜   r§   rC   rC   rF   r_   Ž  ó   c                 C   rƒ   r«   )rž   rŽ   r˜   r§   rC   rC   rF   r_   ”  r¨   c                 C   rƒ   r«   )rŸ   rŽ   r˜   r§   rC   rC   rF   r_   ™  r¨   c                 C   rƒ   r«   )r    rŽ   r˜   r§   rC   rC   rF   r_   ž  r¨   c                 C   rƒ   r«   )r¡   rŽ   r˜   r§   rC   rC   rF   r_   £  r¨   c                 C   rƒ   r«   )r¢   rŽ   r˜   r§   rC   rC   rF   r_   ¨  r¨   c                 C   ó   t | tƒ ƒS rt   )r^   Ú_RewriteNotVisitor©r£   rC   rC   rF   Úrewrite_not­  r   r±   c                   @   s–   e Zd ZdZdefdd„Zdefdd„Zd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
e defdd„Zdee defdd„ZdS )r¯   zInverts the negations.rA   c                 C   rv   rt   rw   rD   rC   rC   rF   rG   ´  rx   z_RewriteNotVisitor.visit_truec                 C   rv   rt   ry   rD   rC   rC   rF   rI   ·  rx   z_RewriteNotVisitor.visit_falserJ   c                 C   s   | S rt   rC   rK   rC   rC   rF   rL   º  rx   z_RewriteNotVisitor.visit_notrM   rN   c                 C   r~   r   r€   rO   rC   rC   rF   rP   ½  r   z_RewriteNotVisitor.visit_andc                 C   r~   r   r‚   rO   rC   rC   rF   rQ   À  r   z_RewriteNotVisitor.visit_orrR   c                 C   ó   |S rt   rC   rS   rC   rC   rF   rT   Ã  ó   z*_RewriteNotVisitor.visit_unbound_predicatec                 C   r²   rt   rC   rS   rC   rC   rF   rU   Æ  r³   z(_RewriteNotVisitor.visit_bound_predicateN)rV   rW   rX   rŠ   r   rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   r¯   ±  s    r¯   Úunboundc                 C   ó   t | ||ƒjS rt   )Ú_ExpressionEvaluatorÚeval)ro   r´   rq   rC   rC   rF   Úexpression_evaluatorÊ  r‰   r¸   c                   @   s$  e Zd ZU eed< eed< dededefdd„Zdedefd	d
„Z	de
e dee defdd„Zde
e dee defdd„Zde
e defdd„Zde
e defdd„Zde
e defdd„Zde
e defdd„Zde
e dee defdd„Zde
e dee defdd„Zde
e dee defdd„Zde
e dee defd d!„Zde
e dee defd"d#„Zde
e dee defd$d%„Zde
e dee defd&d'„Zde
e dee defd(d)„Zdefd*d+„Zdefd,d-„Zd.edefd/d0„Zd1ed2edefd3d4„Zd1ed2edefd5d6„Z d7S )8r¶   ÚboundÚstructro   r´   rq   c                 C   s   t |||ƒ| _d S rt   )rs   r¹   )rE   ro   r´   rq   rC   rC   rF   ru   Ò  r…   z_ExpressionEvaluator.__init__rA   c                 C   s   || _ t| j| ƒS rt   )rº   r^   r¹   )rE   rº   rC   rC   rF   r·   Õ  s   z_ExpressionEvaluator.evalrŽ   r   c                 C   s   |  | j¡|v S rt   ©r·   rº   r   rC   rC   rF   r‘   Ù  ó   z_ExpressionEvaluator.visit_inc                 C   s   |  | j¡|vS rt   r»   r   rC   rC   rF   r’   Ü  r¼   z!_ExpressionEvaluator.visit_not_inc                 C   s   |  | j¡}||kS rt   r»   ©rE   rŽ   ÚvalrC   rC   rF   r”   ß  ó   z!_ExpressionEvaluator.visit_is_nanc                 C   s   |  | j¡}||kS rt   r»   r½   rC   rC   rF   r•   ã  r¿   z"_ExpressionEvaluator.visit_not_nanc                 C   s   |  | j¡d u S rt   r»   r“   rC   rC   rF   r–   ç  r¼   z"_ExpressionEvaluator.visit_is_nullc                 C   s   |  | j¡d uS rt   r»   r“   rC   rC   rF   r—   ê  r¼   z#_ExpressionEvaluator.visit_not_nullr˜   c                 C   s   |  | j¡|jkS rt   ©r·   rº   Úvaluer™   rC   rC   rF   rš   í  r…   z _ExpressionEvaluator.visit_equalc                 C   s   |  | j¡|jkS rt   rÀ   r™   rC   rC   rF   r›   ð  r…   z$_ExpressionEvaluator.visit_not_equalc                 C   s   |  | j¡}|d uo||jkS rt   rÀ   ©rE   rŽ   r˜   rÁ   rC   rC   rF   r   ó  ó   z0_ExpressionEvaluator.visit_greater_than_or_equalc                 C   s   |  | j¡}|d uo||jkS rt   rÀ   rÂ   rC   rC   rF   rž   ÷  rÃ   z'_ExpressionEvaluator.visit_greater_thanc                 C   s   |  | j¡}|d uo||jk S rt   rÀ   rÂ   rC   rC   rF   rŸ   û  rÃ   z$_ExpressionEvaluator.visit_less_thanc                 C   s   |  | j¡}|d uo||jkS rt   rÀ   rÂ   rC   rC   rF   r    ÿ  rÃ   z-_ExpressionEvaluator.visit_less_than_or_equalc                 C   s(   |  | j¡}|d uot|ƒ t|jƒ¡S rt   )r·   rº   ÚstrÚ
startswithrÁ   ©rE   rŽ   r˜   Úeval_resrC   rC   rF   r¡     s   z&_ExpressionEvaluator.visit_starts_withc                 C   s   |   ||¡ S rt   )r¡   r™   rC   rC   rF   r¢     r‰   z*_ExpressionEvaluator.visit_not_starts_withc                 C   rB   )NTrC   rD   rC   rC   rF   rG   
  r³   z_ExpressionEvaluator.visit_truec                 C   rB   ©NFrC   rD   rC   rC   rF   rI     r³   z _ExpressionEvaluator.visit_falserJ   c                 C   ó   | S rt   rC   rK   rC   rC   rF   rL     rx   z_ExpressionEvaluator.visit_notrM   rN   c                 C   ó   |o|S rt   rC   rO   rC   rC   rF   rP     ó   z_ExpressionEvaluator.visit_andc                 C   ó   |p|S rt   rC   rO   rC   rC   rF   rQ     rË   z_ExpressionEvaluator.visit_orN)!rV   rW   rX   r   r‹   r4   r0   rŒ   ru   r·   r%   r2   r
   r‘   r’   r”   r•   r–   r—   r*   rš   r›   r   rž   rŸ   r    r¡   r¢   rG   rI   rL   rP   rQ   rC   rC   rC   rF   r¶   Î  s0   
 r¶   TFéÈ   Ú
field_typer¾   c                 C   s&   t | tƒstdt| ƒ› ƒ‚t| |ƒS )NzExpected a PrimitiveType, got: )Ú
isinstancer9   Ú
ValueErrorÚtyper   )rÎ   r¾   rC   rC   rF   Ú_from_byte_buffer!  s   

rÒ   c                   @   s,  e Zd ZU ee ed< eed< dedededdfdd„Z	d	e
defd
d„Zdee dee defdd„Zdee dee defdd„Zdee defdd„Zdee defdd„Zdee defdd„Zdee defdd„Zdee dee defdd„Zdee dee defdd„Zdee dee defdd „Zdee dee defd!d"„Zdee dee defd#d$„Zdee dee defd%d&„Zdee dee defd'd(„Zdee dee defd)d*„Zdefd+d,„Zdefd-d.„Zd/edefd0d1„Z d2ed3edefd4d5„Z!d2ed3edefd6d7„Z"dS )8Ú_ManifestEvalVisitorÚpartition_fieldsÚpartition_filterÚpartition_struct_schemarq   rA   Nc                 C   s   t |t|ƒ|ƒ| _d S rt   )rs   r±   rÕ   )rE   rÖ   rÕ   rq   rC   rC   rF   ru   +  s   z_ManifestEvalVisitor.__init__Úmanifestc                 C   s    |j  }r|| _t| j| ƒS tS rt   )Ú
partitionsrÔ   r^   rÕ   ÚROWS_MIGHT_MATCH)rE   r×   rØ   rC   rC   rF   r·   .  s   
z_ManifestEvalVisitor.evalrŽ   r   c                    sž   |  ¡ jj}| j| }|jd u rtS t|ƒtkrtS t	|  ¡ j
j|jƒ‰ t‡ fdd„|D ƒƒr1tS |jd urMt	|  ¡ j
j|jƒ‰t‡fdd„|D ƒƒrMtS tS )Nc                 3   s    | ]}ˆ |kV  qd S rt   rC   ©Ú.0r¾   ©ÚlowerrC   rF   Ú	<genexpr>B  ó   € z0_ManifestEvalVisitor.visit_in.<locals>.<genexpr>c                 3   s    | ]}ˆ |k V  qd S rt   rC   rÚ   ©ÚupperrC   rF   rÞ   G  rß   )ÚrefÚaccessorÚpositionrÔ   Úlower_boundÚROWS_CANNOT_MATCHÚlenÚIN_PREDICATE_LIMITrÙ   rÒ   ÚfieldrÎ   ÚallÚupper_bound)rE   rŽ   r   Úposré   rC   ©rÝ   rá   rF   r‘   6  s   


z_ManifestEvalVisitor.visit_inc                 C   ó   t S rt   ©rÙ   r   rC   rC   rF   r’   L  ó   z!_ManifestEvalVisitor.visit_not_inc                 C   s(   |  ¡ jj}| j| }|jdu rtS tS rÈ   )râ   rã   rä   rÔ   Úcontains_nanræ   rÙ   ©rE   rŽ   rì   ré   rC   rC   rF   r”   Q  s
   

z!_ManifestEvalVisitor.visit_is_nanc                 C   s<   |  ¡ jj}| j| }|jdu r|jdu r|jd u rtS tS ©NTF)	râ   rã   rä   rÔ   rñ   Úcontains_nullrå   ræ   rÙ   rò   rC   rC   rF   r•   Z  s
   
z"_ManifestEvalVisitor.visit_not_nanc                 C   s$   |  ¡ jj}| j| jdu rtS tS rÈ   )râ   rã   rä   rÔ   rô   ræ   rÙ   )rE   rŽ   rì   rC   rC   rF   r–   c  ó   z"_ManifestEvalVisitor.visit_is_nullc                 C   sb   |  ¡ jj}| j| jdu o| j| jd u }|r+t|  ¡ jjt	t
fƒr+| j| jdu }|r/tS tS ró   )râ   rã   rä   rÔ   rô   rå   rÏ   ré   rÎ   r5   r6   rñ   ræ   rÙ   )rE   rŽ   rì   Úall_nullrC   rC   rF   r—   k  s    z#_ManifestEvalVisitor.visit_not_nullr˜   c                 C   sv   |  ¡ jj}| j| }|jd u s|jd u rtS t|  ¡ jj	|jƒ}||j
kr(tS t|  ¡ jj	|jƒ}|j
|kr9tS tS rt   )râ   rã   rä   rÔ   rå   rë   ræ   rÒ   ré   rÎ   rÁ   rÙ   )rE   rŽ   r˜   rì   ré   rÝ   rá   rC   rC   rF   rš   |  s   


z _ManifestEvalVisitor.visit_equalc                 C   rî   rt   rï   r™   rC   rC   rF   r›     rð   z$_ManifestEvalVisitor.visit_not_equalc                 C   sJ   |  ¡ jj}| j| }|jd u rtS t|  ¡ jj|jƒ}|j	|kr#tS t
S rt   ©râ   rã   rä   rÔ   rë   ræ   rÒ   ré   rÎ   rÁ   rÙ   ©rE   rŽ   r˜   rì   ré   rá   rC   rC   rF   r   •  ó   


z0_ManifestEvalVisitor.visit_greater_than_or_equalc                 C   sJ   |  ¡ jj}| j| }|jd u rtS t|  ¡ jj|jƒ}|j	|kr#tS t
S rt   r÷   rø   rC   rC   rF   rž   £  rù   z'_ManifestEvalVisitor.visit_greater_thanc                 C   sJ   |  ¡ jj}| j| }|jd u rtS t|  ¡ jj|jƒ}|j	|kr#tS t
S rt   ©râ   rã   rä   rÔ   rå   ræ   rÒ   ré   rÎ   rÁ   rÙ   ©rE   rŽ   r˜   rì   ré   rÝ   rC   rC   rF   rŸ   ±  rù   z$_ManifestEvalVisitor.visit_less_thanc                 C   sJ   |  ¡ jj}| j| }|jd u rtS t|  ¡ jj|jƒ}|j	|k r#tS t
S rt   rú   rû   rC   rC   rF   r    ¿  rù   z-_ManifestEvalVisitor.visit_less_than_or_equalc           	      C   s¨   |  ¡ jj}| j| }t|jƒ}t|ƒ}|jd u rtS t	|  ¡ j
j|jƒ}|d ur3|d |… |kr3tS |jd u r:tS t	|  ¡ j
j|jƒ}|d urR|d |… |k rRtS tS rt   )râ   rã   rä   rÔ   rÄ   rÁ   rç   rå   ræ   rÒ   ré   rÎ   rë   rÙ   ©	rE   rŽ   r˜   rì   ré   ÚprefixÚ
len_prefixrÝ   rá   rC   rC   rF   r¡   Í  s   



z&_ManifestEvalVisitor.visit_starts_withc           	      C   sÆ   |  ¡ jj}| j| }t|jƒ}t|ƒ}|js!|jd u s!|j	d u r#t
S t|  ¡ jj|jƒ}t|  ¡ jj|j	ƒ}|d ura|d urat|ƒ|k rGt
S |d |… |krat|ƒ|k rWt
S |d |… |kratS t
S rt   )râ   rã   rä   rÔ   rÄ   rÁ   rç   rô   rå   rë   rÙ   rÒ   ré   rÎ   ræ   rü   rC   rC   rF   r¢   å  s"   

z*_ManifestEvalVisitor.visit_not_starts_withc                 C   rî   rt   rï   rD   rC   rC   rF   rG     r³   z_ManifestEvalVisitor.visit_truec                 C   rî   rt   ©ræ   rD   rC   rC   rF   rI     r³   z _ManifestEvalVisitor.visit_falserJ   c                 C   rÉ   rt   rC   rK   rC   rC   rF   rL     rx   z_ManifestEvalVisitor.visit_notrM   rN   c                 C   rÊ   rt   rC   rO   rC   rC   rF   rP     rË   z_ManifestEvalVisitor.visit_andc                 C   rÌ   rt   rC   rO   rC   rC   rF   rQ     rË   z_ManifestEvalVisitor.visit_or)#rV   rW   rX   r	   r-   r‹   r   r0   rŒ   ru   r,   r·   r%   r2   r
   r‘   r’   r”   r•   r–   r—   r*   rš   r›   r   rž   rŸ   r    r¡   r¢   rG   rI   rL   rP   rQ   rC   rC   rC   rF   rÓ   '  s0   
 		rÓ   Úpartition_specrÕ   c                 C   s&   |   |¡}t|jŽ }t|||ƒ}|jS rt   )Úpartition_typer0   ÚfieldsrÓ   r·   )r   ro   rÕ   rq   r  Úpartition_schemaÚ	evaluatorrC   rC   rF   Úmanifest_evaluator  s   

r  c                   @   s¾   e Zd ZU eed< eed< eed< dededefdd„Zdedefdd	„Z	defd
d„Z
defdd„Zd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e defdd„ZdS )ÚProjectionEvaluatorro   Úspecrq   c                 C   ó   || _ || _|| _d S rt   ©ro   r  rq   )rE   ro   r  rq   rC   rC   rF   ru      ó   
zProjectionEvaluator.__init__r£   rA   c                 C   s   t t| jt|ƒ| jƒ| ƒS rt   )r^   rs   ro   r±   rq   )rE   r£   rC   rC   rF   Úproject%  s   zProjectionEvaluator.projectc                 C   rv   rt   rw   rD   rC   rC   rF   rG   -  rx   zProjectionEvaluator.visit_truec                 C   rv   rt   ry   rD   rC   rC   rF   rI   0  rx   zProjectionEvaluator.visit_falserJ   c                 C   r†   )Nz4Cannot project not expression, should be rewritten: ©rÐ   rK   rC   rC   rF   rL   3  r‰   zProjectionEvaluator.visit_notrM   rN   c                 C   ó
   t ||ƒS rt   r€   rO   rC   rC   rF   rP   6  r}   zProjectionEvaluator.visit_andc                 C   r  rt   r‚   rO   rC   rC   rF   rQ   9  r}   zProjectionEvaluator.visit_orrR   c                 C   r†   )Nz"Cannot project unbound predicate: r  rS   rC   rC   rF   rT   <  r‰   z+ProjectionEvaluator.visit_unbound_predicateN)rV   rW   rX   r0   r‹   r/   rŒ   ru   r   r  rG   rI   rL   rP   rQ   r)   r2   rT   rC   rC   rC   rF   r    s   
 r  c                   @   ó"   e Zd Zdee defdd„ZdS )ÚInclusiveProjectionrR   rA   c                 C   óN   | j  |j ¡ jj¡}tƒ }|D ]}|jj|j	|d}|d ur$t
||ƒ}q|S ©N)ÚnameÚpred)r  Úfields_by_source_idrŽ   râ   ré   Úfield_idr   Ú	transformr  r  r   )rE   rR   ÚpartsÚresultÚpartÚincl_projectionrC   rC   rF   rU   A  s   
€z)InclusiveProjection.visit_bound_predicateN©rV   rW   rX   r"   r   r   rU   rC   rC   rC   rF   r  @  ó    r  r  c                 C   rµ   rt   )r  r  r	  rC   rC   rF   Úinclusive_projectionT  ó   r  c                	   @   sÞ   e Zd ZU dZeed< eed< eee	f ed< e
fdededeee	f ddfdd„Zdefd	d
„Zdefdd„Zd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e defdd„Zdee defdd„ZdS )Ú_ColumnNameTranslatoraÝ  Converts the column names with the ones in the actual file.

    Args:
      file_schema (Schema): The schema of the file.
      case_sensitive (bool): Whether to consider case when binding a reference to a field in a schema, defaults to True.
      projected_field_values (Dict[int, Any]): Values for projected fields not present in the data file.

    Raises:
        TypeError: In the case of an UnboundPredicate.
        ValueError: When a column name cannot be found.
    Úfile_schemarq   Úprojected_field_valuesrA   Nc                 C   r  rt   )r   rq   r!  )rE   r   rq   r!  rC   rC   rF   ru   k  r
  z_ColumnNameTranslator.__init__c                 C   rv   rt   rw   rD   rC   rC   rF   rG   p  rx   z _ColumnNameTranslator.visit_truec                 C   rv   rt   ry   rD   rC   rC   rF   rI   s  rx   z!_ColumnNameTranslator.visit_falserJ   c                 C   rz   r{   r|   rK   rC   rC   rF   rL   v  r}   z_ColumnNameTranslator.visit_notrM   rN   c                 C   r~   r   r€   rO   rC   rC   rF   rP   y  r   z_ColumnNameTranslator.visit_andc                 C   r~   r   r‚   rO   rC   rC   rF   rQ   |  r   z_ColumnNameTranslator.visit_orrR   c                 C   s   t d|j› ƒ‚)NzExpected Bound Predicate, got: )rˆ   rŽ   rS   rC   rC   rF   rT     r¼   z-_ColumnNameTranslator.visit_unbound_predicatec                 C   s  |j  ¡ j}|j}| j |¡}|d u rdt|tƒr| |j	¡}n#t|t
ƒr-| |j	|j¡}nt|tƒr;| |j	|j¡}ntd|› ƒ‚|j| jv rM| j| n|j}tt|ƒ|| jdt|ƒƒratƒ S tƒ S t|tƒrn| |¡S t|t
ƒrz| ||j¡S t|tƒr†| ||j¡S td|› ƒ‚)NzUnsupported predicate: r„   )rŽ   râ   ré   r  r   Úfind_column_namerÏ   r&   Ú
as_unboundr  r   r˜   r#   r   rÐ   r!  Úinitial_defaultr¸   r0   rq   r3   r   r   )rE   rR   ré   r  Úfile_column_namer  Úfield_valuerC   rC   rF   rU   ‚  s2   


ÿÿÿý



z+_ColumnNameTranslator.visit_bound_predicate)rV   rW   rX   rŠ   r0   r‹   rŒ   r   Úintr   r1   ru   r   rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   r  Z  s   
 &r  r   r!  c                 C   s   t | t|||ƒƒS rt   )r^   r  )r£   r   rq   r!  rC   rC   rF   Útranslate_column_namesª  r­   r(  c                   @   sÆ   e Zd ZdZdee fdd„Zdee fdd„Zdee dee fdd	„Zd
ee dee dee fdd„Z	d
ee dee dee fdd„Z
dee dee fdd„Zdee dee fdd„ZdS )Ú_ExpressionFieldIDsz5Extracts the field IDs used in the BooleanExpression.rA   c                 C   rv   rt   ©ÚsetrD   rC   rC   rF   rG   ³  rx   z_ExpressionFieldIDs.visit_truec                 C   rv   rt   r*  rD   rC   rC   rF   rI   ¶  rx   z_ExpressionFieldIDs.visit_falserJ   c                 C   r²   rt   rC   rK   rC   rC   rF   rL   ¹  r³   z_ExpressionFieldIDs.visit_notrM   rN   c                 C   ó
   |  |¡S rt   ©ÚunionrO   rC   rC   rF   rP   ¼  r}   z_ExpressionFieldIDs.visit_andc                 C   r,  rt   r-  rO   rC   rC   rF   rQ   ¿  r}   z_ExpressionFieldIDs.visit_orrR   c                 C   ó   t dƒ‚)NzOnly works on bound recordsr  rS   rC   rC   rF   rT   Â  rË   z+_ExpressionFieldIDs.visit_unbound_predicatec                 C   s   |j  ¡ jjhS rt   )rŽ   râ   ré   r  rS   rC   rC   rF   rU   Å  r¼   z)_ExpressionFieldIDs.visit_bound_predicateN)rV   rW   rX   rŠ   r
   r'  rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   r)  °  s    ""r)  c                 C   r®   rt   )r^   r)  r°   rC   rC   rF   Úextract_field_idsÉ  r   r0  c                   @   sò   e Zd Zdeedf fdd„Zdeedf fdd„Zdeedf deedf fdd	„Zd
eedf deedf deedf fdd„Zd
eedf deedf deedf fdd„Z	de
e deedf fdd„Zdee deedf fdd„ZdS )Ú_RewriteToDNFrA   .c                 C   ó   t ƒ fS rt   rw   rD   rC   rC   rF   rG   Î  rË   z_RewriteToDNF.visit_truec                 C   r2  rt   ry   rD   rC   rC   rF   rI   Ñ  rË   z_RewriteToDNF.visit_falserJ   c                 C   r†   )Nz!Not expressions are not allowed: r  rK   rC   rC   rF   rL   Ô  r‰   z_RewriteToDNF.visit_notrM   rN   c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s$    | ]}ˆ D ]}t ||ƒV  qqd S rt   r€   )rÛ   ÚleÚre©rN   rC   rF   rÞ   Þ  s   €" z*_RewriteToDNF.visit_and.<locals>.<genexpr>)ÚtuplerO   rC   r5  rF   rP   ×  s   z_RewriteToDNF.visit_andc                 C   ó   || S rt   rC   rO   rC   rC   rF   rQ   à  rb   z_RewriteToDNF.visit_orrR   c                 C   ó   |fS rt   rC   rS   rC   rC   rF   rT   å  rx   z%_RewriteToDNF.visit_unbound_predicatec                 C   r8  rt   rC   rS   rC   rC   rF   rU   è  rx   z#_RewriteToDNF.visit_bound_predicateN)rV   rW   rX   r   r   rG   rI   rL   rP   rQ   r)   r2   rT   r"   rU   rC   rC   rC   rF   r1  Í  s(    "
ÿ
ÿ

þ	
ÿ
ÿ

þ"r1  .c                 C   s   t | ƒ}t|tƒ ƒS rt   )r±   r^   r1  )r£   Úexpr_without_notrC   rC   rF   Úrewrite_to_dnfì  s   r:  c                
   @   s†  e Zd ZU eed< d6deddfdd„Zdedeee	e f deee	e f fd	d
„Z
dee de	e deeeeef  fdd„Zdee de	e deeeeef  fdd„Zdee deeeeef  fdd„Zdee deeeeef  fdd„Zdee deeeeef  fdd„Zdee deeeeef  fdd„Zdee dee deeeeef  fdd„Zdee dee deeeeef  fdd„Zdee dee deeeeef  fdd„Zdee dee deeeeef  fdd „Zdee dee deeeeef  fd!d"„Zdee dee deeeeef  fd#d$„Zdee dee deeeeef  fd%d&„Zdee dee deeeeef  fd'd(„Zdeeeeef  fd)d*„Zdeeeeef  fd+d,„Z d-eeeeef  deeeeef  fd.d/„Z!d0eeeeef  d1eeeeef  deeeeef  fd2d3„Z"d0eeeeef  d1eeeeef  deeeeef  fd4d5„Z#dS )7ÚExpressionToPlainFormatÚcast_int_to_dateFrA   Nc                 C   s
   || _ d S rt   )r<  )rE   r<  rC   rC   rF   ru   ö  r}   z ExpressionToPlainFormat.__init__Úiceberg_typer˜   c                    sR   | j r't|ƒ}tttti}||v r'|| ‰ t|tƒr#‡ fdd„|D ƒS ˆ |ƒS |S )Nc                    s   h | ]}ˆ |ƒ’qS rC   rC   ©rÛ   Úlit©Úconversion_functionrC   rF   Ú	<setcomp>   s    z=ExpressionToPlainFormat._cast_if_necessary.<locals>.<setcomp>)r<  rÑ   r;   r=   r<   r>   rÏ   r+  )rE   r=  r˜   Úiceberg_type_classÚconversionsrC   r@  rF   Ú_cast_if_necessaryù  s   
z*ExpressionToPlainFormat._cast_if_necessaryrŽ   r   c                 C   s(   |  ¡ j}|  ¡ jjd|  |j|¡fgS )NÚin©râ   ré   r  rE  rÎ   ©rE   rŽ   r   ré   rC   rC   rF   r‘     s   
z ExpressionToPlainFormat.visit_inc                 C   s"   |  ¡ j}|jd|  |j|¡fgS )Nznot inrG  rH  rC   rC   rF   r’   	  s   
z$ExpressionToPlainFormat.visit_not_inc                 C   ó   |  ¡ jjdtdƒfgS )Nú==Únan©râ   ré   r  Úfloatr“   rC   rC   rF   r”     ó   z$ExpressionToPlainFormat.visit_is_nanc                 C   rI  )Nú!=rK  rL  r“   rC   rC   rF   r•     rN  z%ExpressionToPlainFormat.visit_not_nanc                 C   ó   |  ¡ jjdd fgS ©NrJ  ©râ   ré   r  r“   rC   rC   rF   r–     ó   z%ExpressionToPlainFormat.visit_is_nullc                 C   rP  ©NrO  rR  r“   rC   rC   rF   r—     rS  z&ExpressionToPlainFormat.visit_not_nullc                 C   ó&   |  ¡ jjd|  |  ¡ jj|j¡fgS rQ  ©râ   ré   r  rE  rÎ   rÁ   r™   rC   rC   rF   rš     ó   &z#ExpressionToPlainFormat.visit_equalc                 C   rU  rT  rV  r™   rC   rC   rF   r›     rW  z'ExpressionToPlainFormat.visit_not_equalc                 C   rU  )Nz>=rV  r™   rC   rC   rF   r     rW  z3ExpressionToPlainFormat.visit_greater_than_or_equalc                 C   rU  )Nú>rV  r™   rC   rC   rF   rž   "  rW  z*ExpressionToPlainFormat.visit_greater_thanc                 C   rU  )Nú<rV  r™   rC   rC   rF   rŸ   %  rW  z'ExpressionToPlainFormat.visit_less_thanc                 C   rU  )Nz<=rV  r™   rC   rC   rF   r    (  rW  z0ExpressionToPlainFormat.visit_less_than_or_equalc                 C   ó   g S rt   rC   r™   rC   rC   rF   r¡   +  r³   z)ExpressionToPlainFormat.visit_starts_withc                 C   rZ  rt   rC   r™   rC   rC   rF   r¢   .  r³   z-ExpressionToPlainFormat.visit_not_starts_withc                 C   rZ  rt   rC   rD   rC   rC   rF   rG   1  r³   z"ExpressionToPlainFormat.visit_truec                 C   r/  )NzNot supported: AlwaysFalser  rD   rC   rC   rF   rI   4  rË   z#ExpressionToPlainFormat.visit_falserJ   c                 C   r†   )NúNot allowed: r  rK   rC   rC   rF   rL   7  r‰   z!ExpressionToPlainFormat.visit_notrM   rN   c                 C   r7  rt   rC   rO   rC   rC   rF   rP   :  rb   z!ExpressionToPlainFormat.visit_andc                 C   s   t d|› d|› ƒ‚)Nr[  z || r  rO   rC   rC   rF   rQ   ?  s   z ExpressionToPlainFormat.visit_or©F)$rV   rW   rX   rŒ   r‹   ru   r7   r   r2   r
   rE  r%   r	   r   rÄ   r   r‘   r’   r”   r•   r–   r—   r*   rš   r›   r   rž   rŸ   r    r¡   r¢   rG   rI   rL   rP   rQ   rC   rC   rC   rF   r;  ó  sF   
 .,,$$$$,,,,,,,,.ÿÿ
þÿÿþr;  ÚexpressionsÚcast_int_to_datetimec                    s   t |ƒ‰ ‡ fdd„| D ƒS )a«  Format a Disjunctive Normal Form expression.

    These are the formats that the expression can be fed into:

    - https://arrow.apache.org/docs/python/generated/pyarrow.parquet.read_table.html
    - https://docs.dask.org/en/stable/generated/dask.dataframe.read_parquet.html

    Contrary to normal DNF that may contain Not expressions, but here they should have
    been rewritten. This can be done using ``rewrite_not(...)``.

    Keep in mind that this is only used for page skipping, and still needs to filter
    on a row level.

    Args:
        expressions: Expression in Disjunctive Normal Form.

    Returns:
        Formatter filter compatible with Dask and PyArrow.
    c                    s   g | ]}t |ˆ ƒ‘qS rC   )r^   )rÛ   rp   rc   rC   rF   Ú
<listcomp>]  s    z.expression_to_plain_format.<locals>.<listcomp>)r;  )r]  r^  rC   rc   rF   Úexpression_to_plain_formatE  s   r`  c                   @   sî   e Zd ZU eeef ed< eeef ed< eeef ed< eeef ed< eeef ed< defdd„Zdefd	d
„Z	d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fdd„Zdedefdd„Zdedefdd„ZdS )Ú_MetricsEvaluatorÚvalue_countsÚnull_countsÚ
nan_countsÚlower_boundsÚupper_boundsrA   c                 C   rî   rt   rï   rD   rC   rC   rF   rG   g  ó   z_MetricsEvaluator.visit_truec                 C   rî   rt   rÿ   rD   rC   rC   rF   rI   k  rg  z_MetricsEvaluator.visit_falserJ   c                 C   r†   )NzNOT should be rewritten: r  rK   rC   rC   rF   rL   o  r‰   z_MetricsEvaluator.visit_notrM   rN   c                 C   rÊ   rt   rC   rO   rC   rC   rF   rP   r  rË   z_MetricsEvaluator.visit_andc                 C   rÌ   rt   rC   rO   rC   rC   rF   rQ   u  rË   z_MetricsEvaluator.visit_orr  c                 C   ó,   | j  |¡ }r| j |¡ }r||kS dS rÈ   )rb  Úgetrc  )rE   r  Úvalue_countÚ
null_countrC   rC   rF   Ú_contains_nulls_onlyx  ó    z&_MetricsEvaluator._contains_nulls_onlyc                 C   rh  rÈ   ©rd  ri  rb  ©rE   r  Ú	nan_countrj  rC   rC   rF   Ú_contains_nans_only}  rm  z%_MetricsEvaluator._contains_nans_onlyr¾   c                 C   s"   zt  |¡W S  ty   Y dS w rÈ   )ÚmathÚisnanrˆ   )rE   r¾   rC   rC   rF   Ú_is_nan‚  s
   þz_MetricsEvaluator._is_nanN)rV   rW   rX   r   r'  r‹   ÚbytesrŒ   rG   rI   rL   rP   rQ   rl  rq  r   rt  rC   rC   rC   rF   ra  `  s   
 ra  c                   @   sú  e Zd ZU eed< eed< 	d3dededededd	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e defdd„Zdee defdd„Zdee defdd„Zdee defdd„Zdee dee defdd„Zdee dee defd d!„Zdee dee defd"d#„Zdee dee defd$d%„Zdee dee defd&d'„Zdee dee defd(d)„Zdee d*ee defd+d,„Zdee d*ee defd-d.„Zdee dee defd/d0„Zdee dee defd1d2„Zd	S )4Ú_InclusiveMetricsEvaluatorrº   r£   TFro   rq   Úinclude_empty_filesrA   Nc                 C   ó&   |  ¡ | _|| _t|t|ƒ|ƒ| _d S rt   ©Ú	as_structrº   rw  rs   r±   r£   ©rE   ro   r£   rq   rw  rC   rC   rF   ru   Ž  ó   
z#_InclusiveMetricsEvaluator.__init__Úfilec                 C   sj   | j s
|jdkr
tS |jdk rtS |jpt| _|jpt| _|jp!t| _	|j
p't| _
|jp-t| _t| j| ƒS )zDTest whether the file may contain records that match the expression.r   )rw  Úrecord_countræ   rÙ   rb  r1   Únull_value_countsrc  Únan_value_countsrd  re  rf  r^   r£   ©rE   r}  rC   rC   rF   r·   •  s   
z_InclusiveMetricsEvaluator.evalr  c                 C   s$   | j d u p|| j v o| j  |¡d uS rt   ©rc  ri  )rE   r  rC   rC   rF   Ú_may_contain_null¨  s   $z,_InclusiveMetricsEvaluator._may_contain_nullc                 C   rh  rÈ   rn  ro  rC   rC   rF   rq  «  rm  z._InclusiveMetricsEvaluator._contains_nans_onlyrŽ   c                 C   s$   |  ¡ jj}| j |¡dkrtS tS ©Nr   )râ   ré   r  rc  ri  ræ   rÙ   ©rE   rŽ   r  rC   rC   rF   r–   °  rõ   z(_InclusiveMetricsEvaluator.visit_is_nullc                 C   ó   |  ¡ jj}|  |¡rtS tS rt   )râ   ré   r  rl  ræ   rÙ   r…  rC   rC   rF   r—   ¸  ó   
z)_InclusiveMetricsEvaluator.visit_not_nullc                 C   s2   |  ¡ jj}| j |¡dkrtS |  |¡rtS tS r„  )râ   ré   r  rd  ri  ræ   rl  rÙ   r…  rC   rC   rF   r”   Â  s   
z'_InclusiveMetricsEvaluator.visit_is_nanc                 C   r†  rt   )râ   ré   r  rq  ræ   rÙ   r…  rC   rC   rF   r•   Ï  ó   
z(_InclusiveMetricsEvaluator.visit_not_nanr˜   c                 C   s€   |  ¡ j}|j}|  |¡s|  |¡rtS t|jtƒs"t	d|j› ƒ‚| j
 |¡ }r>t|j|ƒ}|  |¡r7tS ||jkr>tS tS ©NúExpected PrimitiveType: ©râ   ré   r  rl  rq  ræ   rÏ   rÎ   r9   rÐ   re  ri  r   rt  rÙ   rÁ   ©rE   rŽ   r˜   ré   r  Úlower_bound_bytesrå   rC   rC   rF   rŸ   ×  s   


z*_InclusiveMetricsEvaluator.visit_less_thanc                 C   s€   |  ¡ j}|j}|  |¡s|  |¡rtS t|jtƒs"t	d|j› ƒ‚| j
 |¡ }r>t|j|ƒ}|  |¡r7tS ||jkr>tS tS r‰  r‹  rŒ  rC   rC   rF   r    í  s   


z3_InclusiveMetricsEvaluator.visit_less_than_or_equalc                 C   s€   |  ¡ j}|j}|  |¡s|  |¡rtS t|jtƒs"t	d|j› ƒ‚| j
 |¡ }r>t|j|ƒ}||jkr>|  |¡r<tS tS tS r‰  ©râ   ré   r  rl  rq  ræ   rÏ   rÎ   r9   rÐ   rf  ri  r   rÁ   rt  rÙ   ©rE   rŽ   r˜   ré   r  Úupper_bound_bytesrë   rC   rC   rF   rž     ó   


z-_InclusiveMetricsEvaluator.visit_greater_thanc                 C   s€   |  ¡ j}|j}|  |¡s|  |¡rtS t|jtƒs"t	d|j› ƒ‚| j
 |¡ }r>t|j|ƒ}||jk r>|  |¡r<tS tS tS r‰  rŽ  r  rC   rC   rF   r     r‘  z6_InclusiveMetricsEvaluator.visit_greater_than_or_equalc           	      C   s¸   |  ¡ j}|j}|  |¡s|  |¡rtS t|jtƒs"t	d|j› ƒ‚| j
 |¡ }r>t|j|ƒ}|  |¡r7tS ||jkr>tS | j |¡ }rZt|j|ƒ}|  |¡rStS ||jk rZtS tS r‰  )râ   ré   r  rl  rq  ræ   rÏ   rÎ   r9   rÐ   re  ri  r   rt  rÙ   rÁ   rf  )	rE   rŽ   r˜   ré   r  r  rå   r  rë   rC   rC   rF   rš   ,  s&   




z&_InclusiveMetricsEvaluator.visit_equalc                 C   rî   rt   rï   r™   rC   rC   rF   r›   J  r³   z*_InclusiveMetricsEvaluator.visit_not_equalr   c                    sð   |  ¡ j}|j}|  |¡s|  |¡rtS t|ƒtkrtS t	|j
tƒs*td|j
› ƒ‚| j |¡ }rPt|j
|ƒ‰ |  ˆ ¡r?tS ‡ fdd„|D ƒ}t|ƒdkrPtS | j |¡ }rvt|j
|ƒ‰|  ˆ¡retS ‡fdd„|D ƒ}t|ƒdkrvtS tS )NrŠ  c                    ó   h | ]}ˆ |kr|’qS rC   rC   r>  )rå   rC   rF   rB  a  ó    z6_InclusiveMetricsEvaluator.visit_in.<locals>.<setcomp>r   c                    ó   h | ]}ˆ |kr|’qS rC   rC   r>  )rë   rC   rF   rB  k  r“  )râ   ré   r  rl  rq  ræ   rç   rè   rÙ   rÏ   rÎ   r9   rÐ   re  ri  r   rt  rf  )rE   rŽ   r   ré   r  r  r  rC   )rå   rë   rF   r‘   M  s.   


z#_InclusiveMetricsEvaluator.visit_inc                 C   rî   rt   rï   r   rC   rC   rF   r’   q  rð   z'_InclusiveMetricsEvaluator.visit_not_inc                 C   sÄ   |  ¡ j}|j}|  |¡rtS t|jtƒstd|j› ƒ‚t	|j
ƒ}t|ƒ}| j |¡ }rBt	t|j|ƒƒ}|rB|d |… |krBtS | j |¡ }	r`t	t|j|	ƒƒ}
|
d ur`|
d |… |k r`tS tS r‰  )râ   ré   r  rl  ræ   rÏ   rÎ   r9   rÐ   rÄ   rÁ   rç   re  ri  r   rf  rÙ   )rE   rŽ   r˜   ré   r  rý   rþ   r  rå   r  rë   rC   rC   rF   r¡   v  s"   


z,_InclusiveMetricsEvaluator.visit_starts_withc                 C   sÔ   |  ¡ j}|j}|  |¡rtS t|jtƒstd|j› ƒ‚t	|j
ƒ}t|ƒ}| j |¡ }rh| j |¡ }rht	t|j|ƒƒ}	t	t|j|ƒƒ}
t|	ƒ|k rNtS |	d |… |krht|
ƒ|k r^tS |
d |… |krhtS tS r‰  )râ   ré   r  rƒ  rÙ   rÏ   rÎ   r9   rÐ   rÄ   rÁ   rç   re  ri  rf  r   ræ   )rE   rŽ   r˜   ré   r  rý   rþ   r  r  rå   rë   rC   rC   rF   r¢   “  s&   


 z0_InclusiveMetricsEvaluator.visit_not_starts_with©TF) rV   rW   rX   r:   r‹   r   r0   rŒ   ru   r+   r·   r'  rƒ  rq  r%   r2   r–   r—   r”   r•   r*   rŸ   r    rž   r   rš   r›   r
   r‘   r’   r¡   r¢   rC   rC   rC   rF   rv  Š  s@   
 ÿÿÿÿÿ
þ
$"rv  c                 C   rµ   rt   )ÚStrictProjectionr  r	  rC   rC   rF   Ústrict_projectionµ  r  r—  c                   @   r  )r–  rR   rA   c                 C   r  r  )r  r  rŽ   râ   ré   r  r   r  Ústrict_projectr  r(   )rE   rR   r  r  r  r—  rC   rC   rF   rU   ¼  s   
€z&StrictProjection.visit_bound_predicateNr  rC   rC   rC   rF   r–  »  r  r–  c                   @   s  e Zd ZU eed< eed< 	d5dededededd	f
d
d„Zde	defdd„Z
dee defdd„Zdee defdd„Zdee defdd„Zdee defdd„Zdee dee defdd„Zdee dee defdd„Zdee dee defdd„Zdee dee defdd „Zdee dee defd!d"„Zdee dee defd#d$„Zdee d%ee defd&d'„Zdee d%ee defd(d)„Zdee dee defd*d+„Zdee dee defd,d-„Zd.edefd/d0„Zd.edefd1d2„Z d.edefd3d4„Z!d	S )6Ú_StrictMetricsEvaluatorrº   r£   TFro   rq   rw  rA   Nc                 C   rx  rt   ry  r{  rC   rC   rF   ru   Ñ  r|  z _StrictMetricsEvaluator.__init__r}  c                 C   sV   |j dkrtS |jpt| _|jpt| _|jpt| _|jpt| _|j	p#t| _	t
| j| ƒS )zóTest whether all records within the file match the expression.

        Args:
            file: A data file

        Returns: false if the file may contain any row that doesn't match
                    the expression, true otherwise.
        r   )r~  ÚROWS_MUST_MATCHrb  r1   r  rc  r€  rd  re  rf  r^   r£   r  rC   rC   rF   r·   Ø  s   
	z_StrictMetricsEvaluator.evalrŽ   c                 C   r†  rt   )râ   ré   r  rl  rš  ÚROWS_MIGHT_NOT_MATCHr…  rC   rC   rF   r–   ï  r‡  z%_StrictMetricsEvaluator.visit_is_nullc                 C   s0   |  ¡ jj}| j |¡ }d ur|dkrtS tS r„  )râ   ré   r  rc  ri  rš  r›  )rE   rŽ   r  rk  rC   rC   rF   r—   ù  s   z&_StrictMetricsEvaluator.visit_not_nullc                 C   r†  rt   )râ   ré   r  rq  rš  r›  r…  rC   rC   rF   r”     rˆ  z$_StrictMetricsEvaluator.visit_is_nanc                 C   s>   |  ¡ jj}| j |¡ }d ur|dkrtS |  |¡rtS tS r„  )râ   ré   r  rd  ri  rš  rl  r›  )rE   rŽ   r  rp  rC   rC   rF   r•     s   
z%_StrictMetricsEvaluator.visit_not_nanr˜   c                 C   s\   |  ¡ jj}|  |¡s|  |¡rtS | j |¡ }r,|  |¡}t	|j
|ƒ}||jk r,tS tS rt   ©râ   ré   r  Ú_can_contain_nullsÚ_can_contain_nansr›  rf  ri  Ú
_get_fieldrÒ   rÎ   rÁ   rš  ©rE   rŽ   r˜   r  Úupper_bytesré   rá   rC   rC   rF   rŸ     ó   

z'_StrictMetricsEvaluator.visit_less_thanc                 C   s\   |  ¡ jj}|  |¡s|  |¡rtS | j |¡ }r,|  |¡}t	|j
|ƒ}||jkr,tS tS rt   rœ  r   rC   rC   rF   r    '  r¢  z0_StrictMetricsEvaluator.visit_less_than_or_equalc                 C   sj   |  ¡ jj}|  |¡s|  |¡rtS | j |¡ }r3|  |¡}t	|j
|ƒ}|  |¡r,tS ||jkr3tS tS rt   ©râ   ré   r  r  rž  r›  re  ri  rŸ  rÒ   rÎ   rt  rÁ   rš  ©rE   rŽ   r˜   r  Úlower_bytesré   rÝ   rC   rC   rF   rž   8  s   


z*_StrictMetricsEvaluator.visit_greater_thanc                 C   sj   |  ¡ jj}|  |¡s|  |¡rtS | j |¡ }r3|  |¡}t	|j
|ƒ}|  |¡r,tS ||jkr3tS tS rt   r£  r¤  rC   rC   rF   r   N  s   


z3_StrictMetricsEvaluator.visit_greater_than_or_equalc           	      C   s†   |  ¡ jj}|  |¡s|  |¡rtS | j |¡ }rA| j |¡ }rA|  	|¡}t
|j|ƒ}t
|j|ƒ}||jks=||jkr?tS tS tS rt   )râ   ré   r  r  rž  r›  re  ri  rf  rŸ  rÒ   rÎ   rÁ   rš  )	rE   rŽ   r˜   r  r¥  r¡  ré   rÝ   rá   rC   rC   rF   rš   c  s    
z#_StrictMetricsEvaluator.visit_equalc           	      C   s”   |  ¡ jj}|  |¡s|  |¡rtS |  |¡}| j |¡ }r3t	|j
|ƒ}|  |¡r,tS ||jkr3tS | j |¡ }rHt	|j
|ƒ}||jk rHtS tS rt   )râ   ré   r  r  rž  rš  rŸ  re  ri  rÒ   rÎ   rt  r›  rÁ   rf  )	rE   rŽ   r˜   r  ré   r¥  rÝ   r¡  rá   rC   rC   rF   r›   v  s   



z'_StrictMetricsEvaluator.visit_not_equalr   c           	      C   s’   |  ¡ jj}|  |¡s|  |¡rtS |  |¡}| j |¡ }rG| j	 |¡ }rGt
|j|ƒ}||vr3tS t
|j|ƒ}||vr?tS ||krEtS tS tS rt   )râ   ré   r  r  rž  r›  rŸ  re  ri  rf  rÒ   rÎ   rš  )	rE   rŽ   r   r  ré   r¥  r¡  rÝ   rá   rC   rC   rF   r‘   ’  s   
 z _StrictMetricsEvaluator.visit_inc                    s¼   |  ¡ jj}|  |¡s|  |¡rtS |  |¡}| j |¡ }r=t	|j
|ƒ‰ |  ˆ ¡r,tS ‡ fdd„|D ƒ}t|ƒdkr=tS | j |¡ }r\t	|j
|ƒ‰‡fdd„|D ƒ}t|ƒdkr\tS tS )Nc                    r’  rC   rC   rÚ   rÜ   rC   rF   rB  ¿  r“  z7_StrictMetricsEvaluator.visit_not_in.<locals>.<setcomp>r   c                    r”  rC   rC   rÚ   rà   rC   rF   rB  Æ  r“  )râ   ré   r  r  rž  rš  rŸ  re  ri  rÒ   rÎ   rt  r›  rç   rf  )rE   rŽ   r   r  ré   r¥  r¡  rC   rí   rF   r’   ¯  s"   

z$_StrictMetricsEvaluator.visit_not_inc                 C   rî   rt   ©r›  r™   rC   rC   rF   r¡   Í  r³   z)_StrictMetricsEvaluator.visit_starts_withc                 C   rî   rt   r¦  r™   rC   rC   rF   r¢   Ð  r³   z-_StrictMetricsEvaluator.visit_not_starts_withr  c                 C   s(   | j j|d}|d u rtd|› ƒ‚|S )N)r  z/Cannot find field, might be nested or missing: )rº   ré   rÐ   )rE   r  ré   rC   rC   rF   rŸ  Ó  s   z"_StrictMetricsEvaluator._get_fieldc                 C   ó   | j  |¡ }d uo|dkS r„  r‚  )rE   r  rk  rC   rC   rF   r  Ú  ó   z*_StrictMetricsEvaluator._can_contain_nullsc                 C   r§  r„  )rd  ri  )rE   r  rp  rC   rC   rF   rž  Ý  r¨  z)_StrictMetricsEvaluator._can_contain_nansr•  )"rV   rW   rX   r:   r‹   r   r0   rŒ   ru   r+   r·   r%   r2   r–   r—   r”   r•   r*   rŸ   r    rž   r   rš   r›   r
   r‘   r’   r¡   r¢   r'  r8   rŸ  r  rž  rC   rC   rC   rF   r™  Í  sB   
 ÿÿÿÿÿ
þ

r™  c                
       st  e Zd ZU dZeed< eed< eed< eed< dededededdf
dd	„Z	d
e
defdd„Zdefdd„Zdefdd„Zd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e defdd„Zdee defdd„Zdee defdd „Zdee defd!d"„Zdee d#ee defd$d%„Zdee d#ee defd&d'„Zdee d#ee defd(d)„Zdee d#ee defd*d+„Zdee d#ee defd,d-„Zdee d#ee defd.d/„Zdee d0ee defd1d2„Zdee d0ee defd3d4„Z dee d#ee defd5d6„Z!dee d#ee defd7d8„Z"d9e#e$ def‡ fd:d;„Z%d9e&e defd<d=„Z'‡  Z(S )>ÚResidualVisitora+  Finds the residuals for an Expression the partitions in the given PartitionSpec.

    A residual expression is made by partially evaluating an expression using partition values.
    For example, if a table is partitioned by day(utc_timestamp) and is read with a filter expression
    utc_timestamp > a and utc_timestamp < b, then there are 4 possible residuals expressions
    for the partition data, d:


    1. If d > day(a) and d &lt; day(b), the residual is always true
    2. If d == day(a) and d != day(b), the residual is utc_timestamp > a
    3. if d == day(b) and d != day(a), the residual is utc_timestamp < b
    4. If d == day(a) == day(b), the residual is utc_timestamp > a and utc_timestamp < b
    Partition data is passed using StructLike. Residuals are returned by residualFor(StructLike).
    ro   r  rq   r£   rA   Nc                 C   s   || _ || _|| _|| _d S rt   )ro   r  rq   r£   )rE   ro   r  rq   r£   rC   rC   rF   ru   ö  s   
zResidualVisitor.__init__Úpartition_datac                 C   s   || _ t| j| dS )Nrc   )rº   r^   r£   ©rE   rª  rC   rC   rF   r·   ü  s   zResidualVisitor.evalc                 C   rv   rt   rw   rD   rC   rC   rF   rG      rx   zResidualVisitor.visit_truec                 C   rv   rt   ry   rD   rC   rC   rF   rI     rx   zResidualVisitor.visit_falserJ   c                 C   s   t |ƒS rt   r|   rK   rC   rC   rF   rL     rË   zResidualVisitor.visit_notrM   rN   c                 C   r  rt   r€   rO   rC   rC   rF   rP   	  r}   zResidualVisitor.visit_andc                 C   r  rt   r‚   rO   rC   rC   rF   rQ     r}   zResidualVisitor.visit_orrŽ   c                 C   s   |  | j¡d u rtƒ S tƒ S rt   ©r·   rº   r   r   r“   rC   rC   rF   r–     ó   zResidualVisitor.visit_is_nullc                 C   s   |  | j¡d urtƒ S tƒ S rt   r¬  r“   rC   rC   rF   r—     r­  zResidualVisitor.visit_not_nullc                 C   s0   |  | j¡}t|tƒrt |¡r|  ¡ S |  ¡ S rt   ©r·   rº   rÏ   r   rr  rs  rG   rI   r½   rC   rC   rF   r”     ó   zResidualVisitor.visit_is_nanc                 C   s0   |  | j¡}t|tƒrt |¡s|  ¡ S |  ¡ S rt   r®  r½   rC   rC   rF   r•   "  r¯  zResidualVisitor.visit_not_nanr˜   c                 C   s"   |  | j¡|jk r|  ¡ S |  ¡ S rt   ©r·   rº   rÁ   rG   rI   r™   rC   rC   rF   rŸ   )  ó   zResidualVisitor.visit_less_thanc                 C   s"   |  | j¡|jkr|  ¡ S |  ¡ S rt   r°  r™   rC   rC   rF   r    /  r±  z(ResidualVisitor.visit_less_than_or_equalc                 C   s"   |  | j¡|jkr|  ¡ S |  ¡ S rt   r°  r™   rC   rC   rF   rž   5  r±  z"ResidualVisitor.visit_greater_thanc                 C   s"   |  | j¡|jkr|  ¡ S |  ¡ S rt   r°  r™   rC   rC   rF   r   ;  r±  z+ResidualVisitor.visit_greater_than_or_equalc                 C   s"   |  | j¡|jkr|  ¡ S |  ¡ S rt   r°  r™   rC   rC   rF   rš   A  r±  zResidualVisitor.visit_equalc                 C   s"   |  | j¡|jkr|  ¡ S |  ¡ S rt   r°  r™   rC   rC   rF   r›   G  r±  zResidualVisitor.visit_not_equalr   c                 C   s    |  | j¡|v r|  ¡ S |  ¡ S rt   ©r·   rº   rG   rI   r   rC   rC   rF   r‘   M  ó   zResidualVisitor.visit_inc                 C   s    |  | j¡|vr|  ¡ S |  ¡ S rt   r²  r   rC   rC   rF   r’   S  r³  zResidualVisitor.visit_not_inc                 C   s4   |  | j¡}|d urt|ƒ t|jƒ¡rtƒ S tƒ S rt   )r·   rº   rÄ   rÅ   rÁ   r   r   rÆ   rC   rC   rF   r¡   Y  s   z!ResidualVisitor.visit_starts_withc                 C   s   |   ||¡s	tƒ S tƒ S rt   )r¡   r   r   r™   rC   rC   rF   r¢   `  s   z%ResidualVisitor.visit_not_starts_withrR   c                    s  | j  |j ¡ jj¡}|g kr|S dtdtfdd„}|D ]l}|j 	|j
|¡}d}|durI|j|| j  | j¡ƒ| jd}t|tƒrGtƒ  |¡}n|}t|tƒrStƒ   S |j |j
|¡}d}	|dur~|j|| j  | j¡ƒ| jd}
t|
tƒr|tƒ  |
¡}	n|
}	t|	tƒrˆtƒ   S q|S )aŸ  
        If there is no strict projection or if it evaluates to false, then return the predicate.

        Get the strict projection and inclusive projection of this predicate in partition data,
        then use them to determine whether to return the original predicate. The strict projection
        returns true iff the original predicate would have returned true, so the predicate can be
        eliminated if the strict projection evaluates to true. Similarly the inclusive projection
        returns false iff the original predicate would have returned false, so the predicate can
        also be eliminated if the inclusive projection evaluates to false.

        rº   rA   c                 S   s
   t | jŽ S rt   )r0   r  )rº   rC   rC   rF   Ústruct_to_schemav  r}   z?ResidualVisitor.visit_bound_predicate.<locals>.struct_to_schemaNr„   )r  r  rŽ   râ   ré   r  r:   r0   r  r˜  r  rs   r  ro   rq   rÏ   r"   ÚsuperrU   r   r  r   )rE   rR   r  r´  r  r—  Ústrict_resultr¹   r  Úinclusive_resultÚbound_inclusive©Ú	__class__rC   rF   rU   f  s:   ÿ


ÿ


ÿz%ResidualVisitor.visit_bound_predicatec                 C   sB   |j | j| jd}t|tƒr| j|d}t|ttfƒs|S |S |S )Nr„   rl   )rs   ro   rq   rÏ   r"   rU   r   r   )rE   rR   r¹   Úbound_residualrC   rC   rF   rT   œ  s   
z'ResidualVisitor.visit_unbound_predicate))rV   rW   rX   rŠ   r0   r‹   r/   rŒ   r   ru   r3   r·   rG   rI   rL   rP   rQ   r%   r2   r–   r—   r”   r•   r*   rŸ   r    rž   r   rš   r›   r
   r‘   r’   r¡   r¢   r"   r   rU   r)   rT   Ú__classcell__rC   rC   r¹  rF   r©  á  s:   
 6r©  c                   @   s   e Zd Zdedefdd„ZdS )ÚResidualEvaluatorrª  rA   c                 C   s
   |   |¡S rt   )r·   r«  rC   rC   rF   Úresidual_for­  r}   zResidualEvaluator.residual_forN)rV   rW   rX   r3   r   r¾  rC   rC   rC   rF   r½  ¬  s    r½  c                       s8   e Zd Zdedef‡ fdd„Zdedefdd„Z‡  ZS )	ÚUnpartitionedResidualEvaluatorro   r£   c                    s   t ƒ j|t|dd || _d S )NF)ro   r  r£   rq   )rµ  ru   r.   r£   )rE   ro   r£   r¹  rC   rF   ru   ³  s   
z'UnpartitionedResidualEvaluator.__init__rª  rA   c                 C   s   | j S rt   r°   r«  rC   rC   rF   r¾  ·  rx   z+UnpartitionedResidualEvaluator.residual_for)	rV   rW   rX   r0   r   ru   r3   r¾  r¼  rC   rC   r¹  rF   r¿  ±  s    r¿  c                 C   s$   |   ¡ r
t||dS t| |||dS )N)ro   r£   )r  r£   ro   rq   )Úis_unpartitionedr¿  r½  )r  r£   rq   ro   rC   rC   rF   Úresidual_evaluator_of»  s
   ÿÿýrÁ  )Tr\  )wrr  Úabcr   r   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   r   r   r   Úpyiceberg.conversionsr   Ú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(   r)   Úpyiceberg.expressions.literalsr*   Úpyiceberg.manifestr+   r,   r-   Úpyiceberg.partitioningr.   r/   Úpyiceberg.schemar0   Úpyiceberg.typedefr1   r2   r3   r4   Úpyiceberg.typesr5   r6   r7   r8   r9   r:   r;   r<   Úpyiceberg.utils.datetimer=   r>   r?   r@   r^   Úregisterr_   rŒ   rs   rr   r   rU   r±   r¯   r¸   r¶   rÙ   rš  ræ   r›  rè   ru  rÒ   rÓ   r  r  r  r  r  r'  r(  r)  r0  r1  r:  rÄ   r;  r`  ra  rv  r—  r–  r™  r©  r½  r¿  rÁ  rC   rC   rC   rF   Ú<module>   s>  0p(
:  (`               $L mÿÿÿÿÿ
þ	%ÿÿÿÿ
þQÿÿÿÿ
ÿ
þ"Sÿ
ÿÿ
þ*  .ÿÿÿÿ
þ   L
ÿÿÿÿþ