o
    篪gG                     @  s\  d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ erd dlZd dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dlm'Z' G dd ded Z(dS )    )annotations)TYPE_CHECKING)Any)Callable)Literal)Sequence)CaseExpression)CoalesceOperatorColumnExpressionConstantExpressionFunctionExpressionDuckDBExprDateTimeNamespaceDuckDBExprListNamespaceDuckDBExprNameNamespaceDuckDBExprStringNamespace)ExprKindmaybe_evaluate)n_ary_operation_expr_kind)narwhals_to_native_dtype)CompliantExpr)ImplementationN)Self)DuckDBLazyFrameDuckDBNamespace)DType)Versionc                   @  s6  e Zd ZejZdZdddZdddZdddZ	dddZ
edd#d$Zedd'd(Zdd-d.Zdd0d1Zdd2d3Zdd4d5Zdd6d7Zdd8d9Zdd:d;Zdd<d=Zdd>d?Zdd@dAZddBdCZddDdEZddFdGZddHdIZddJdKZddLdMZddNdOZddQdRZddSdTZ ddUdVZ!ddWdXZ"ddYdZZ#dd[d\Z$dd]d^Z%ddcddZ&ddhdiZ'ddjdkZ(ddldmZ)ddndoZ*ddpdqZ+ddsdtZ,ddudvZ-ddwdxZ.ddydzZ/dd{d|Z0dd}d~Z1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7e8dddZ9e8dddZ:e8dddZ;e8dddZ<dS )
DuckDBExprr   selfr   call8Callable[[DuckDBLazyFrame], Sequence[duckdb.Expression]]function_namestrevaluate_output_names*Callable[[DuckDBLazyFrame], Sequence[str]]alias_output_names/Callable[[Sequence[str]], Sequence[str]] | None	expr_kindr   backend_versiontuple[int, ...]versionr$   returnNonec                C  s.   || _ || _|| _|| _|| _|| _|| _d S N)_call_function_name_evaluate_output_names_alias_output_names
_expr_kind_backend_version_version)r&   r'   r)   r+   r-   r/   r0   r2    r=   Q/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/narwhals/_duckdb/expr.py__init__(   s   
zDuckDBExpr.__init__dfr    Sequence[duckdb.Expression]c                 C  
   |  |S r5   )r6   )r&   r@   r=   r=   r>   __call__;   s   
zDuckDBExpr.__call__c                 C  s   d S r5   r=   r&   r=   r=   r>   __narwhals_expr__>   s    zDuckDBExpr.__narwhals_expr__r"   c                 C  s   ddl m} || j| jdS )Nr   r!   )r0   r2   )narwhals._duckdb.namespacer"   r;   r<   )r&   r"   r=   r=   r>   __narwhals_namespace__@   s   z!DuckDBExpr.__narwhals_namespace__cls
type[Self]column_namesc             	     .   d fdd}| |d fdd	d t j||d
S )N_r    r3   list[duckdb.Expression]c                   s   dd  D S )Nc                 S     g | ]}t |qS r=   r
   ).0col_namer=   r=   r>   
<listcomp>P       z>DuckDBExpr.from_column_names.<locals>.func.<locals>.<listcomp>r=   )rL   rJ   r=   r>   funcO   s   z*DuckDBExpr.from_column_names.<locals>.funccolc                   s   t  S r5   )list)_dfrS   r=   r>   <lambda>U       z.DuckDBExpr.from_column_names.<locals>.<lambda>r)   r+   r-   r/   r0   r2   )rL   r    r3   rM   r   	TRANSFORM)rH   r0   r2   rJ   rT   r=   rS   r>   from_column_namesH   s   
zDuckDBExpr.from_column_namescolumn_indicesintc             	     rK   )Nr@   r    r3   rM   c                   s   | j   fddD S )Nc                   s   g | ]}t  | qS r=   r
   rO   icolumnsr=   r>   rQ   f   s    z@DuckDBExpr.from_column_indices.<locals>.func.<locals>.<listcomp>rb   r@   r^   rb   r>   rT   c   s   z,DuckDBExpr.from_column_indices.<locals>.funcnthc                   s    fddD S )Nc                   s   g | ]} j | qS r=   rb   r`   rd   r=   r>   rQ   k   s    zDDuckDBExpr.from_column_indices.<locals>.<lambda>.<locals>.<listcomp>r=   rd   re   rd   r>   rX   k   s    z0DuckDBExpr.from_column_indices.<locals>.<lambda>rZ   r@   r    r3   rM   r[   )rH   r0   r2   r^   rT   r=   re   r>   from_column_indices\   s   
zDuckDBExpr.from_column_indices Callable[..., duckdb.Expression]	expr_nameexpressifiable_args
Self | Anyc             	     s@   d
 fdd}j |j d| jjjjdS )a  Create expression from callable.

        Arguments:
            call: Callable from compliant DataFrame to native Expression
            expr_name: Expression name
            expr_kind: kind of output expression
            expressifiable_args: arguments pass to expression which should be parsed
                as expressions (e.g. in `nw.col('a').is_between('b', 'c')`)
        r@   r    r3   rM   c                   s6     } fdd D fdd|D S )Nc                   s    i | ]\}}|t  |d qS )r/   r   )rO   keyvalue)r@   r/   r=   r>   
<dictcomp>   s    z7DuckDBExpr._from_call.<locals>.func.<locals>.<dictcomp>c                   s   g | ]
} |fi qS r=   r=   )rO   native_series)r'   other_native_seriesr=   r>   rQ      s    z7DuckDBExpr._from_call.<locals>.func.<locals>.<listcomp>)r6   items)r@   native_series_listr'   r/   rk   r&   )r@   rr   r>   rT      s   
z#DuckDBExpr._from_call.<locals>.funcz->rZ   Nrg   )	__class__r7   r8   r9   r;   r<   )r&   r'   rj   r/   rk   rT   r=   ru   r>   
_from_callr   s   zDuckDBExpr._from_callotherc                 C     | j dd d|t| |dS )Nc                 S  s   | |@ S r5   r=   _inputrx   r=   r=   r>   rX      rY   z$DuckDBExpr.__and__.<locals>.<lambda>__and__rx   r/   rw   r   r&   rx   r=   r=   r>   r|         zDuckDBExpr.__and__c                 C  ry   )Nc                 S  s   | |B S r5   r=   rz   r=   r=   r>   rX      rY   z#DuckDBExpr.__or__.<locals>.<lambda>__or__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__or__c                 C  ry   )Nc                 S  s   | | S r5   r=   rz   r=   r=   r>   rX      rY   z$DuckDBExpr.__add__.<locals>.<lambda>__add__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__add__c                 C  ry   )Nc                 S  s   | | S r5   r=   rz   r=   r=   r>   rX      rY   z(DuckDBExpr.__truediv__.<locals>.<lambda>__truediv__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__truediv__c                 C  ry   )Nc                 S  rB   r5   )__floordiv__rz   r=   r=   r>   rX         
 z)DuckDBExpr.__floordiv__.<locals>.<lambda>r   r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__floordiv__c                 C  ry   )Nc                 S  rB   r5   )__mod__rz   r=   r=   r>   rX      r   z$DuckDBExpr.__mod__.<locals>.<lambda>r   r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__mod__c                 C  ry   )Nc                 S  s   | | S r5   r=   rz   r=   r=   r>   rX      rY   z$DuckDBExpr.__sub__.<locals>.<lambda>__sub__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__sub__c                 C  ry   )Nc                 S  s   | | S r5   r=   rz   r=   r=   r>   rX      rY   z$DuckDBExpr.__mul__.<locals>.<lambda>__mul__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__mul__c                 C  ry   )Nc                 S  s   | | S r5   r=   rz   r=   r=   r>   rX      rY   z$DuckDBExpr.__pow__.<locals>.<lambda>__pow__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__pow__c                 C  ry   )Nc                 S  s   | |k S r5   r=   rz   r=   r=   r>   rX      rY   z#DuckDBExpr.__lt__.<locals>.<lambda>__lt__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__lt__c                 C  ry   )Nc                 S  s   | |kS r5   r=   rz   r=   r=   r>   rX      rY   z#DuckDBExpr.__gt__.<locals>.<lambda>__gt__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__gt__c                 C  ry   )Nc                 S  s   | |kS r5   r=   rz   r=   r=   r>   rX      rY   z#DuckDBExpr.__le__.<locals>.<lambda>__le__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__le__c                 C  ry   )Nc                 S  s   | |kS r5   r=   rz   r=   r=   r>   rX      rY   z#DuckDBExpr.__ge__.<locals>.<lambda>__ge__r}   r~   r   r=   r=   r>   r      r   zDuckDBExpr.__ge__c                 C  ry   )Nc                 S  s   | |kS r5   r=   rz   r=   r=   r>   rX     rY   z#DuckDBExpr.__eq__.<locals>.<lambda>__eq__r}   r~   r   r=   r=   r>   r     r   zDuckDBExpr.__eq__c                 C  ry   )Nc                 S  s   | |kS r5   r=   rz   r=   r=   r>   rX     rY   z#DuckDBExpr.__ne__.<locals>.<lambda>__ne__r}   r~   r   r=   r=   r>   r   	  r   zDuckDBExpr.__ne__c                 C     | j dd d| jdS )Nc                 S  s   |  S r5   r=   r{   r=   r=   r>   rX     s    z'DuckDBExpr.__invert__.<locals>.<lambda>
__invert__rm   rw   r:   rD   r=   r=   r>   r     
   zDuckDBExpr.__invert__namec              	     s2   d fdd}| j | j| j| j|| j| j| jdS )NnamesSequence[str]r3   c                   s$   t | dkrd|  }t| gS )N   z:Expected function with single output, found output names: )len
ValueError)r   msgr   r=   r>   r-     s   
z,DuckDBExpr.alias.<locals>.alias_output_namesrZ   )r   r   r3   r   )rv   r6   r7   r8   r:   r;   r<   )r&   r   r-   r=   r   r>   alias  s   zDuckDBExpr.aliasc                 C  r   )Nc                 S  
   t d| S )Nabsr   r   r=   r=   r>   rX   +  r   z DuckDBExpr.abs.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r   )  r   zDuckDBExpr.absc                 C     | j dd dtjdS )Nc                 S  r   )Nmeanr   r   r=   r=   r>   rX   2  r   z!DuckDBExpr.mean.<locals>.<lambda>r   rm   rw   r   AGGREGATIONrD   r=   r=   r>   r   0  r   zDuckDBExpr.meanc                 C     ddd}| j |dtjdS )	Nr{   duckdb.Expressionr3   c              	   S  sZ   t d| }t|dktd dt|dkttddt|dktddt d| S )	Ncountr   	conditionro   r   nan   g        skewness)r   r   r   	otherwisefloat)r{   r   r=   r=   r>   rT   8  s    
zDuckDBExpr.skew.<locals>.funcskewrm   r{   r   r3   r   r   r&   rT   r=   r=   r>   r   7  s   
zDuckDBExpr.skewc                 C  r   )Nc                 S  r   )Nmedianr   r   r=   r=   r>   rX   J  r   z#DuckDBExpr.median.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r   H  r   zDuckDBExpr.medianc                 C  r   )Nc                 S  r   )Nbool_andr   r   r=   r=   r>   rX   Q  r   z DuckDBExpr.all.<locals>.<lambda>allrm   r   rD   r=   r=   r>   r   O  r   zDuckDBExpr.allc                 C  r   )Nc                 S  r   )Nbool_orr   r   r=   r=   r>   rX   X  r   z DuckDBExpr.any.<locals>.<lambda>anyrm   r   rD   r=   r=   r>   r   V  r   zDuckDBExpr.anyquantiler   interpolation;Literal['nearest', 'higher', 'lower', 'midpoint', 'linear']c                   s"   d fdd}| j |dtjdS )	Nr{   r   r3   c                   s$    dkrt d| tS d}t|)Nlinearquantile_contzDOnly linear interpolation methods are supported for DuckDB quantile.)r   r   NotImplementedError)r{   r   r   r   r=   r>   rT   b  s   
z!DuckDBExpr.quantile.<locals>.funcr   rm   r   r   )r&   r   r   rT   r=   r   r>   r   ]  s   zDuckDBExpr.quantilelower_boundr   upper_boundc                 C  s    ddd}| j |d	||| jd
S )Nr{   r   r   r   r   r3   c                 S  s   t dt d| ||S )Ngreatestleastr   )r{   r   r   r=   r=   r>   rT   q  s   zDuckDBExpr.clip.<locals>.funcclip)r   r   r/   )r{   r   r   r   r   r   r3   r   r   )r&   r   r   rT   r=   r=   r>   r   p  s   
zDuckDBExpr.clipc                 C  r   )Nc                 S  r   )Nsumr   r   r=   r=   r>   rX     r   z DuckDBExpr.sum.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.sumc                 C  r   )	Nr{   r   r3   c                 S  s4   t dt d| t dt|  tddtd S )Narray_unique	array_aggmaxr   r   r   )r   r   	isnotnullr   r   r   r=   r=   r>   rT     s   

z!DuckDBExpr.n_unique.<locals>.funcn_uniquerm   r   r   r   r=   r=   r>   r     s   
zDuckDBExpr.n_uniquec                 C  r   )Nc                 S  r   Nr   r   r   r=   r=   r>   rX     r   z"DuckDBExpr.count.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.countc                 C  r   )Nc                 S  s   t dS r   r   r   r=   r=   r>   rX     rY   z DuckDBExpr.len.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.lenddofc                 C     d
dd}| j |d|tjd	S )Nr{   r   r   r_   r3   c                 S  s,   t d| }t d| t d| t d||  S )Nr   
stddev_popsqrtr   r{   r   	n_samplesr=   r=   r>   _std  s   
zDuckDBExpr.std.<locals>._stdstdr   r/   r{   r   r   r_   r3   r   r   )r&   r   r   r=   r=   r>   r     s   
	zDuckDBExpr.stdc                 C  r   )Nr{   r   r   r_   r3   c                 S  s    t d| }t d| | ||  S )Nr   var_popr   r   r=   r=   r>   _var  s   
zDuckDBExpr.var.<locals>._varvarr   r   r   )r&   r   r   r=   r=   r>   r     s   
zDuckDBExpr.varc                 C  r   )Nc                 S  r   )Nr   r   r   r=   r=   r>   rX     r   z DuckDBExpr.max.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.maxc                 C  r   )Nc                 S  r   )Nminr   r   r=   r=   r>   rX     r   z DuckDBExpr.min.<locals>.<lambda>r   rm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.minc                 C  r   )Nc                 S  s   t d|  dS )Nr   r_   )r   isnullcastr   r=   r=   r>   rX     rR   z'DuckDBExpr.null_count.<locals>.<lambda>
null_countrm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.null_countc                 C  r   )Nc                 S  s   |   S r5   )r   r   r=   r=   r>   rX     rY   z$DuckDBExpr.is_null.<locals>.<lambda>is_nullrm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.is_nullc                 C  r   )Nc                 S  r   )Nisnanr   r   r=   r=   r>   rX     r   z#DuckDBExpr.is_nan.<locals>.<lambda>is_nanrm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.is_nanc                 C  r   )Nc                 S  r   )Nisfiniter   r   r=   r=   r>   rX     r   z&DuckDBExpr.is_finite.<locals>.<lambda>	is_finiterm   r   rD   r=   r=   r>   r     r   zDuckDBExpr.is_finiteSequence[Any]c                      | j  fddd| jdS )Nc                   s   | j dd  D  S )Nc                 S  rN   r=   r   )rO   xr=   r=   r>   rQ     rR   z6DuckDBExpr.is_in.<locals>.<lambda>.<locals>.<listcomp>)isinr   rx   r=   r>   rX     rR   z"DuckDBExpr.is_in.<locals>.<lambda>is_inrm   r   r   r=   r   r>   r     s
   
zDuckDBExpr.is_indecimalsc                   r   )Nc                   s   t d| t S )Nround)r   r   r   r   r=   r>   rX     s    
z"DuckDBExpr.round.<locals>.<lambda>r   rm   r   )r&   r   r=   r   r>   r     s
   
zDuckDBExpr.roundro   strategylimit
int | Nonec                   s.   |d ur
d}t || j fddd| jdS )Ntodoc                   s   t | t S r5   )r	   r   r   ro   r=   r>   rX     s    z&DuckDBExpr.fill_null.<locals>.<lambda>	fill_nullrm   )r   rw   r:   )r&   ro   r   r   r   r=   r   r>   r     s   
zDuckDBExpr.fill_nulldtypeDType | type[DType]c                   s"   d fdd}j |djdS )	Nr{   r   r3   c                   s   t  j}| |S r5   )r   r<   r   )r{   native_dtyper   r&   r=   r>   rT   
  s   
zDuckDBExpr.cast.<locals>.funcr   rm   r   r   )r&   r   rT   r=   r   r>   r   	  s   zDuckDBExpr.castr   c                 C     t | S r5   r   rD   r=   r=   r>   r*        zDuckDBExpr.strr   c                 C  r   r5   r   rD   r=   r=   r>   dt  r   zDuckDBExpr.dtr   c                 C  r   r5   r   rD   r=   r=   r>   r     r   zDuckDBExpr.namer   c                 C  r   r5   r   rD   r=   r=   r>   rV      r   zDuckDBExpr.listN)r&   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r0   r1   r2   r$   r3   r4   )r&   r   r@   r    r3   rA   )r3   r4   )r3   r"   )
rH   rI   rJ   r*   r0   r1   r2   r$   r3   r   )
rH   rI   r^   r_   r0   r1   r2   r$   r3   r   )r&   r   r'   ri   rj   r*   r/   r   rk   rl   r3   r   )r&   r   rx   r%   r3   r   )r&   r   r3   r   )r&   r   r   r*   r3   r   )r&   r   r   r   r   r   r3   r   )r&   r   r   r   r   r   r3   r   )r&   r   r   r_   r3   r   )r&   r   rx   r   r3   r   )r&   r   r   r_   r3   r   )
r&   r   ro   r   r   r   r   r   r3   r   )r&   r   r   r   r3   r   )r&   r   r3   r   )r&   r   r3   r   )r&   r   r3   r   )r&   r   r3   r   )=__name__
__module____qualname__r   DUCKDB_implementation_depthr?   rC   rE   rG   classmethodr]   rh   rw   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr*   r   r   rV   r=   r=   r=   r>   r%   $   sz    





'






































	
r%   r   ))
__future__r   typingr   r   r   r   r   duckdbr   r	   r   r   r   narwhals._duckdb.expr_dtr   narwhals._duckdb.expr_listr   narwhals._duckdb.expr_namer   narwhals._duckdb.expr_strr   narwhals._duckdb.utilsr   r   r   r   narwhals.typingr   narwhals.utilsr   typing_extensionsr   narwhals._duckdb.dataframer    rF   r"   narwhals.dtypesr#   r$   r%   r=   r=   r=   r>   <module>   s:    