
    ˀh!                       U d dl mZ d dlZd dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ erd d	lm Z mZ d d
l!m"Z" d dl#m$Z$m%Z% eedZ&de'd<   	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ(ddZ)edd       Z*e*jW                  e      dd       Z,e*jW                  e      dd       Z,e*jW                  e      dd       Z,e*jW                  e      d d       Z,e*jW                  e      d!d       Z,e*jW                  e      d"d       Z,e*jW                  e      d#d       Z,e*jW                  e      d$d       Z,y)%    )annotationsN)GtELtLtE)	AttributeBinOpBitAndBitOrCallCompareConstantEqGtInvertListNameUnaryOp)singledispatch)TYPE_CHECKINGAnyCallable)
to_py_dateto_py_datetime)	pyiceberg)datedatetime)Table)	DataFrameSeriesz)dict[str, Callable[..., datetime | date]]_temporal_conversionsc                   ddl m} | j                  ||      }| |j                  | }|(	 t	        |      }t        |      }	|j                  |	      } ||j                               S # t        $ r}
d| }t        |      |
d}
~
ww xY w)a"  
    Take the projected columns and materialize an arrow table.

    Parameters
    ----------
    tbl
        pyarrow dataset
    with_columns
        Columns that are projected
    predicate
        pyarrow expression that can be evaluated with eval
    n_rows:
        Materialize only n rows from the arrow dataset.
    snapshot_id:
        The snapshot ID to scan from.
    batch_size
        The maximum row count for scanned pyarrow record batches.
    kwargs:
        For backward compatibility

    Returns
    -------
    DataFrame
    r   )
from_arrow)limitsnapshot_idNz*Could not convert predicate to PyIceberg: )	polarsr"   scanselect_to_ast_convert_predicate
ValueErrorfilterto_arrow)tblwith_columns	predicaten_rowsr$   kwargsr"   r&   expr_astpyiceberg_expremsgs               t/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/polars/io/iceberg/_utils.py_scan_pyarrow_dataset_implr7   '   s    @ "88&k8:Dt{{L)	)y)H/9N
 {{>*dmmo&&  	)>ykJCS/q(	)s   A+ +	B
4BB
c                D    t        j                  | d      j                  S )a<  
    Converts a Python string to an AST.

    This will take the Python Arrow expression (as a string), and it will
    be converted into a Python AST that can be traversed to convert it to a PyIceberg
    expression.

    The reason to convert it to an AST is because the PyArrow expression
    itself doesn't have any methods/properties to traverse the expression.
    We need this to convert it into a PyIceberg expression.

    Parameters
    ----------
    expr
        The string expression

    Returns
    -------
    The AST representing the Arrow expression
    eval)mode)astparsebody)exprs    r6   r(   r(   [   s    * 99T',,,    c                "    d|  }t        |      )zJWalks the AST to convert the PyArrow expression to a PyIceberg expression.zUnexpected symbol: )r*   ar5   s     r6   r)   r)   s   s      s
#C
S/r?   c                    | j                   S N)valuerB   s    r6   _rG   z   s    77Nr?   c                    | j                   S rD   )idrF   s    r6   rG   rG      s    44Kr?   c                    t        | j                  t              r2t        j                  j                  t        | j                              S d|  }t        |      )NzUnexpected UnaryOp: )	
isinstanceopr   r   expressionsNotr)   operand	TypeErrorrA   s     r6   rG   rG      sG    !$$$$(();AII)FGG$QC(nr?   c                "   | j                   D cg c]  }t        |       }}t        | j                        }|dk(  r|S |dk(  r|d   S |t        v rt        |   | j	                         S t        | j                  j
                        d   }|dk(  r#t        j                  j                  ||d         S |dk(  rt        j                  j                  |      S |dk(  rt        j                  j                  |      S d|}t        |      c c}w )Nfieldscalarr   isinis_nullis_nanzUnknown call: )argsr)   funcr    	isoformatrE   r   rM   InIsNullIsNaNr*   )rB   argrW   frefr5   s         r6   rG   rG      s    /0vv6s#6D6166"AG|	
hAw	
#	#$Q'.88:: .q1;((++Ca99)^((//44(]((..s331%
 C
S/' 7s   Dc                    | j                   S rD   )attrrF   s    r6   rG   rG      s    66Mr?   c                Z   t        | j                        }t        | j                        }| j                  }t	        |t
              r t        j                  j                  ||      S t	        |t              r t        j                  j                  ||      S d| d| d| }t        |      )Nz	Unknown:  )r)   leftrightrL   rK   r	   r   rM   Andr
   OrrP   )rB   lhsrhsrL   r5   s        r6   rG   rG      s    
QVV
$C
QWW
%C	
B"f$$((c22"e$$''S11#at1SE*nr?   c                   | j                   d   }t        | j                        d   }t        | j                  d         }t	        |t
              r t        j                  j                  ||      S t	        |t              r t        j                  j                  ||      S t	        |t              r t        j                  j                  ||      S t	        |t              r t        j                  j                  ||      S t	        |t              r t        j                  j!                  ||      S d| }t#        |      )Nr   zUnknown comparison: )opsr)   rd   comparatorsrK   r   r   rM   GreaterThanr   GreaterThanOrEqualr   EqualTor   LessThanr   LessThanOrEqualrP   )rB   rL   rh   ri   r5   s        r6   rG   rG      s    	
qB
QVV
$Q
'C
Q]]1-
.C"b$$00c::"c$$77SAA"b$$,,S#66"b$$--c377"c$$44S#>>$RD)nr?   c                R    | j                   D cg c]  }t        |       c}S c c}w rD   )eltsr)   )rB   r4   s     r6   rG   rG      s     +,662aq!222s   $)NNNN)r-   r   r.   zlist[str] | Noner/   z
str | Noner0   
int | Noner$   rt   r1   r   returnzDataFrame | Series)r>   strru   zast.expr)rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )rB   r   ru   r   )-
__future__r   r;   _astr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   	functoolsr   typingr   r   r   polars._utils.convertr   r   polars.dependenciesr   r   r   pyiceberg.tabler   r%   r   r   r    __annotations__r7   r(   r)   registerrG    r?   r6   <module>r      s   " 
      % / / < )'%( $D @  &* "1'	1'"1' 1' 	1'
 1' 1' 1'h-0   X& ' T" # W% & T" #. Y' ( U# $ W% &( T"3 #3r?   