o
    ht                     @  s~  d dl mZ d dlZd 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	 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( d dl&m)Z) erd 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"l0m1Z1 d d#l2m3Z3 d d$l4m5Z5 d d%l$m6Z6 d d&l7m8Z8 d d'l9m:Z: d d(l9m;Z; d d)l9m<Z< d d*l9m=Z= d d+l9m>Z> d d,l&m?Z? d d-l&m@Z@ eAeB d d.lmCZC W d   n	1 s.w   Y  G d/d0 d0ed1 ZDdS )2    )annotationsN)TYPE_CHECKING)Any)Callable)Literal)Sequence)castCoalesceOperatorFunctionExpression)StarExpression)DuckDBPyType)LazyExprDuckDBExprDateTimeNamespaceDuckDBExprListNamespaceDuckDBExprStringNamespaceDuckDBExprStructNamespaceWindowInputscol)ensure_type)generate_order_by_sql)generate_partition_by_sql)lit)narwhals_to_native_dtype)when)ExprKind)Implementation)not_implemented)requires)Self)
AliasNames)	EvalNames)
EvalSeries)DuckDBLazyFrameDuckDBNamespace)WindowFunction)ExprMetadata)DType)NonNestedLiteral)NumericLiteral)
RankMethod)RollingInterpolationMethod)TemporalLiteral)Version)_FullContext)SQLExpressionc                   @  s  e Zd ZejZdddZdddZdddZdddZ	dddZ
d d!dd)d*Zdd.d/Zedd3d4Zedd6d7Zdd;d<Zdd>d?ZddAdBZddDdEZddFdGZddHdIZddJdKZddLdMZddNdOZddPdQZddRdSZddTdUZddVdWZddXdYZddZd[Zdd\d]Zdd^d_Z dd`daZ!ddbdcZ"ddddeZ#ddfdgZ$ddhdiZ%ddjdkZ&ddldmZ'ddpdqZ(ddrdsZ)ddtduZ*ddvdwZ+ddxdyZ,ddzd{Z-dd|d}Z.dddZ/dddZ0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9e:;ddddZ<dddZ=dddZ>dddZ?dddZ@dddZAe:;ddddZBe:;ddddZCe:;ddddZDe:;ddddZEe:;ddddZFe:;ddddZGe:;ddddZHe:;ddddZIe:;ddddZJe:;ddddZKe:;ddddĄZLe:;ddddƄZMe:;ddddȄZNd ddτZOdddӄZPe:;ddddՄZQe:;ddddڄZReSddd݄ZTeSdddZUeSdddZVeSdddZWeX ZYeX ZZd S (  
DuckDBExprcall.EvalSeries[DuckDBLazyFrame, duckdb.Expression]evaluate_output_namesEvalNames[DuckDBLazyFrame]alias_output_namesAliasNames | Nonebackend_versiontuple[int, ...]versionr5   returnNonec                C  s.   || _ || _|| _|| _|| _d | _d | _d S N)_call_evaluate_output_names_alias_output_names_backend_version_version_window_function	_metadata)selfr9   r;   r=   r?   rA    rM   I/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_duckdb/expr.py__init__>   s   	
zDuckDBExpr.__init__dfr*   Sequence[duckdb.Expression]c                 C  
   |  |S rD   rE   )rL   rP   rM   rM   rN   __call__O      
zDuckDBExpr.__call__c                 C  s   d S rD   rM   rL   rM   rM   rN   __narwhals_expr__R   s    zDuckDBExpr.__narwhals_expr__r,   c                 C  s   ddl m} || j| jdS )Nr   r+   )r?   rA   )narwhals._duckdb.namespacer,   rH   rI   )rL   r,   rM   rM   rN   __narwhals_namespace__T   s   z!DuckDBExpr.__narwhals_namespace__reversebool	func_name0Literal['sum', 'max', 'min', 'count', 'product']r-   c                  s   d fdd}|S )Nwindow_inputsr   rB   duckdb.Expressionc                   sB   t | jd i}t| j }  d| j d| d| d}t|S )N	ascendingz () over ( z2 rows between unbounded preceding and current row)r   order_byr   partition_byexprr7   r^   order_by_sqlpartition_by_sqlsqlr\   rZ   rM   rN   funcb   s   
z)DuckDBExpr._cum_window_func.<locals>.funcr^   r   rB   r_   rM   )rL   rZ   r\   rl   rM   rk   rN   _cum_window_func\   s   zDuckDBExpr._cum_window_funcNddof$Literal['sum', 'mean', 'std', 'var']centerwindow_sizeintmin_samplesrp   
int | Nonec          	        s   t |ttd  t t g d|r,|d d }|d d }||  d| dn	|d  ddd fdd}|S )N)summeanstdvar      z
 precedingz
 followingzcurrent rowr^   r   rB   r_   c           	   	     s  t | jddi}t| j }d| d| d d d	}dv r#}nGd	kr. d
kr.d}n<d	v r9 dkr9d}n1dkrD d
krDd}n&dkrO dkrOd}ndv r]d d}t|d d d}t|d| j d| d }t|}t| d| j d| }t||S )Nr`   T(rb   z rows between z and )>   rw   rx   rz   r   var_popr{   var_sampry   
stddev_popstddev_samp>   ry   rz   z;Only ddof=0 and ddof=1 are currently supported for rolling_.z,Only the following functions are supported: z.
Got: zcount(z) over z >= )r   rd   r   re   
ValueErrorrf   r7   r!   )	r^   rh   ri   windowfunc_msgcondition_sql	conditionvaluerp   endr\   ru   startsupported_funcsrM   rN   rl      s,   

z-DuckDBExpr._rolling_window_func.<locals>.funcrm   )r   rt   type)	rL   r\   rr   rs   ru   rp   half	remainderrl   rM   r   rN   _rolling_window_funco   s   	
zDuckDBExpr._rolling_window_funckind/Literal[ExprKind.AGGREGATION, ExprKind.LITERAL]r&   c                   sT   |t ju r S  jdk rd}t|dd fdd	} j| j j j jd
S )Nr{      z`At least version 1.3 of DuckDB is required for binary operations between aggregates and columns.z{expr} over ()rP   r*   rB   rQ   c                   s   fdd | D S )Nc                      g | ]
}t  j|d qS )rf   r7   format.0rf   templaterM   rN   
<listcomp>   s    z6DuckDBExpr.broadcast.<locals>.func.<locals>.<listcomp>rM   rP   rL   r   rM   rN   rl      s   z"DuckDBExpr.broadcast.<locals>.funcr;   r=   r?   rA   rP   r*   rB   rQ   )r"   LITERALrH   NotImplementedError	__class__rF   rG   rI   )rL   r   r   rl   rM   r   rN   	broadcast   s   

zDuckDBExpr.broadcastevaluate_column_namescontextr6   c                 s$   d fdd}| | d |j |jdS )	NrP   r*   rB   list[duckdb.Expression]c                   s   dd  | D S )Nc                 S  s   g | ]}t |qS rM   r   )r   namerM   rM   rN   r          z>DuckDBExpr.from_column_names.<locals>.func.<locals>.<listcomp>rM   r   r   rM   rN   rl         z*DuckDBExpr.from_column_names.<locals>.funcr   rP   r*   rB   r   rH   rI   )clsr   r   rl   rM   r   rN   from_column_names   s   zDuckDBExpr.from_column_namescolumn_indicesc                  s,   d
 fdd}| | fddd |j |jd	S )NrP   r*   rB   r   c                   s   | j   fddD S )Nc                   s   g | ]}t  | qS rM   r   r   icolumnsrM   rN   r      s    z@DuckDBExpr.from_column_indices.<locals>.func.<locals>.<listcomp>r   r   r   r   rN   rl      s   z,DuckDBExpr.from_column_indices.<locals>.funcc                   s    fddD S )Nc                   s   g | ]} j | qS rM   r   r   r   rM   rN   r      s    zDDuckDBExpr.from_column_indices.<locals>.<lambda>.<locals>.<listcomp>rM   r   r   r   rN   <lambda>   s    z0DuckDBExpr.from_column_indices.<locals>.<lambda>r   r   r   )r   r   r   rl   rM   r   rN   from_column_indices   s   
zDuckDBExpr.from_column_indices Callable[..., duckdb.Expression]expressifiable_args
Self | Anyc                  s.   d	 fdd}j |jjjjdS )
aN  Create expression from callable.

        Arguments:
            call: Callable from compliant DataFrame to native Expression
            expr_name: Expression name
            expressifiable_args: arguments pass to expression which should be parsed
                as expressions (e.g. in `nw.col('a').is_between('b', 'c')`)
        rP   r*   rB   r   c                   s4    } fdd  D fdd|D S )Nc                   s.   i | ]\}}| |r |nt|qS rM   )_is_expr_evaluate_exprr   )r   keyr   )rP   rL   rM   rN   
<dictcomp>   s    z;DuckDBExpr._with_callable.<locals>.func.<locals>.<dictcomp>c                   s   g | ]
} |fi qS rM   rM   )r   native_series)r9   other_native_seriesrM   rN   r          z;DuckDBExpr._with_callable.<locals>.func.<locals>.<listcomp>)items)rP   native_series_listr9   r   rL   )rP   r   rN   rl      s   z'DuckDBExpr._with_callable.<locals>.funcr   Nr   )r   rF   rG   rH   rI   )rL   r9   r   rl   rM   r   rN   _with_callable   s   zDuckDBExpr._with_callablerl   c                C  s   t | | j| j|| j| jdS )N)r9   r;   r=   r?   rA   )r   rE   rF   rH   rI   rL   rl   rM   rM   rN   _with_alias_output_names   s   z#DuckDBExpr._with_alias_output_nameswindow_functionc                 C  s(   | j | j| j| j| j| jd}||_|S )Nr   )r   rE   rF   rG   rH   rI   rJ   )rL   r   resultrM   rM   rN   _with_window_function   s   z DuckDBExpr._with_window_functionotherc                 C     | j dd |dS )Nc                 S  s   | |@ S rD   rM   _inputr   rM   rM   rN   r         z$DuckDBExpr.__and__.<locals>.<lambda>r   r   rL   r   rM   rM   rN   __and__  r   zDuckDBExpr.__and__c                 C  r   )Nc                 S  s   | |B S rD   rM   r   rM   rM   rN   r     r   z#DuckDBExpr.__or__.<locals>.<lambda>r   r   r   rM   rM   rN   __or__
  r   zDuckDBExpr.__or__c                 C  r   )Nc                 S  s   | | S rD   rM   r   rM   rM   rN   r     r   z$DuckDBExpr.__add__.<locals>.<lambda>r   r   r   rM   rM   rN   __add__  r   zDuckDBExpr.__add__c                 C  r   )Nc                 S  s   | | S rD   rM   r   rM   rM   rN   r     r   z(DuckDBExpr.__truediv__.<locals>.<lambda>r   r   r   rM   rM   rN   __truediv__  r   zDuckDBExpr.__truediv__c                 C     | j dd |ddS )Nc                 S  
   | | S rD   )r   r   rM   rM   rN   r        
 z)DuckDBExpr.__rtruediv__.<locals>.<lambda>r   literalr   aliasr   rM   rM   rN   __rtruediv__  
   zDuckDBExpr.__rtruediv__c                 C  r   )Nc                 S  rR   rD   __floordiv__r   rM   rM   rN   r     r   z)DuckDBExpr.__floordiv__.<locals>.<lambda>r   r   r   rM   rM   rN   r        zDuckDBExpr.__floordiv__c                 C  r   )Nc                 S  r   rD   r   r   rM   rM   rN   r     r   z*DuckDBExpr.__rfloordiv__.<locals>.<lambda>r   r   r   r   rM   rM   rN   __rfloordiv__  r   zDuckDBExpr.__rfloordiv__c                 C  r   )Nc                 S  rR   rD   __mod__r   rM   rM   rN   r   $  r   z$DuckDBExpr.__mod__.<locals>.<lambda>r   r   r   rM   rM   rN   r   "  r   zDuckDBExpr.__mod__c                 C  r   )Nc                 S  r   rD   r   r   rM   rM   rN   r   )  r   z%DuckDBExpr.__rmod__.<locals>.<lambda>r   r   r   r   rM   rM   rN   __rmod__'  r   zDuckDBExpr.__rmod__c                 C  r   )Nc                 S  s   | | S rD   rM   r   rM   rM   rN   r   -  r   z$DuckDBExpr.__sub__.<locals>.<lambda>r   r   r   rM   rM   rN   __sub__,  r   zDuckDBExpr.__sub__c                 C  r   )Nc                 S  r   rD   )r   r   rM   rM   rN   r   1  r   z%DuckDBExpr.__rsub__.<locals>.<lambda>r   r   r   r   rM   rM   rN   __rsub__/  r   zDuckDBExpr.__rsub__c                 C  r   )Nc                 S  s   | | S rD   rM   r   rM   rM   rN   r   5  r   z$DuckDBExpr.__mul__.<locals>.<lambda>r   r   r   rM   rM   rN   __mul__4  r   zDuckDBExpr.__mul__c                 C  r   )Nc                 S  s   | | S rD   rM   r   rM   rM   rN   r   8  r   z$DuckDBExpr.__pow__.<locals>.<lambda>r   r   r   rM   rM   rN   __pow__7  r   zDuckDBExpr.__pow__c                 C  r   )Nc                 S  r   rD   )r   r   rM   rM   rN   r   <  r   z%DuckDBExpr.__rpow__.<locals>.<lambda>r   r   r   r   rM   rM   rN   __rpow__:  r   zDuckDBExpr.__rpow__c                 C  r   )Nc                 S  s   | |k S rD   rM   r   rM   rM   rN   r   @  r   z#DuckDBExpr.__lt__.<locals>.<lambda>r   r   r   rM   rM   rN   __lt__?  r   zDuckDBExpr.__lt__c                 C  r   )Nc                 S  s   | |kS rD   rM   r   rM   rM   rN   r   C  r   z#DuckDBExpr.__gt__.<locals>.<lambda>r   r   r   rM   rM   rN   __gt__B  r   zDuckDBExpr.__gt__c                 C  r   )Nc                 S  s   | |kS rD   rM   r   rM   rM   rN   r   F  r   z#DuckDBExpr.__le__.<locals>.<lambda>r   r   r   rM   rM   rN   __le__E  r   zDuckDBExpr.__le__c                 C  r   )Nc                 S  s   | |kS rD   rM   r   rM   rM   rN   r   I  r   z#DuckDBExpr.__ge__.<locals>.<lambda>r   r   r   rM   rM   rN   __ge__H  r   zDuckDBExpr.__ge__c                 C  r   )Nc                 S  s   | |kS rD   rM   r   rM   rM   rN   r   L  r   z#DuckDBExpr.__eq__.<locals>.<lambda>r   r   r   rM   rM   rN   __eq__K  r   zDuckDBExpr.__eq__c                 C  r   )Nc                 S  s   | |kS rD   rM   r   rM   rM   rN   r   O  r   z#DuckDBExpr.__ne__.<locals>.<lambda>r   r   r   rM   rM   rN   __ne__N  r   zDuckDBExpr.__ne__c                 C  s   t dtj}| |S )Nr   )r   operatorinvertr   )rL   r   rM   rM   rN   
__invert__Q  s   
zDuckDBExpr.__invert__r   strc                   s*   d fdd}| j | j| j|| j| jdS )NnamesSequence[str]rB   c                   s$   t | dkrd|  }t| gS )Nr{   z:Expected function with single output, found output names: )lenr   )r   r   r   rM   rN   r=   V  s   
z,DuckDBExpr.alias.<locals>.alias_output_namesr   )r   r   rB   r   )r   rE   rF   rH   rI   )rL   r   r=   rM   r   rN   r   U  s   zDuckDBExpr.aliasc                 C     |  dd S )Nc                 S  
   t d| S )Nabsr   r   rM   rM   rN   r   e  r   z DuckDBExpr.abs.<locals>.<lambda>r   rV   rM   rM   rN   r   d     zDuckDBExpr.absc                 C  r   )Nc                 S  r   )Nrx   r   r   rM   rM   rN   r   h  r   z!DuckDBExpr.mean.<locals>.<lambda>r   rV   rM   rM   rN   rx   g  r   zDuckDBExpr.meanc                 C     ddd}|  |S )Nr   r_   rB   c                 S  s   t d| }t d| |td  t d||td   }t|tdktd t|tdkttdt|tdktd|S )	Ncountskewnessr|   sqrtr{   r   nang        )r   r   r!   	otherwisefloat)r   r  sample_skewnessrM   rM   rN   rl   k  s   

zDuckDBExpr.skew.<locals>.funcr   r_   rB   r_   r   r   rM   rM   rN   skewj  s   

zDuckDBExpr.skewc                 C  r   )Nc                 S  r   )Nmedianr   r   rM   rM   rN   r   |  r   z#DuckDBExpr.median.<locals>.<lambda>r   rV   rM   rM   rN   r  {  r   zDuckDBExpr.medianc                 C  r   )Nc                 S  r   )Nbool_andr   r   rM   rM   rN   r     r   z DuckDBExpr.all.<locals>.<lambda>r   rV   rM   rM   rN   all~  r   zDuckDBExpr.allc                 C  r   )Nc                 S  r   )Nbool_orr   r   rM   rM   rN   r     r   z DuckDBExpr.any.<locals>.<lambda>r   rV   rM   rM   rN   any  r   zDuckDBExpr.anyquantiler  interpolationr3   c                   s   d fdd}|  |S )Nr   r_   rB   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   r   )r   r   r  r  rM   rN   rl     s   z!DuckDBExpr.quantile.<locals>.funcr	  r   )rL   r  r  rl   rM   r  rN   r    s   
zDuckDBExpr.quantilelower_bound.Self | NumericLiteral | TemporalLiteral | Noneupper_boundc                 C  sZ   ddd}dd	d
}ddd}|d u r| j ||dS |d u r%| j ||dS | j |||dS )Nr   r_   r  r   rB   c                 S     t d| |S )Ngreatestr   )r   r  rM   rM   rN   _clip_lower     z$DuckDBExpr.clip.<locals>._clip_lowerr  c                 S  r  )Nleastr   )r   r  rM   rM   rN   _clip_upper  r  z$DuckDBExpr.clip.<locals>._clip_upperc                 S  s   t dt d| ||S )Nr  r  r   )r   r  r  rM   rM   rN   
_clip_both  s   z#DuckDBExpr.clip.<locals>._clip_both)r  )r  )r  r  )r   r_   r  r   rB   r_   )r   r_   r  r   rB   r_   )r   r_   r  r   r  r   rB   r_   r   )rL   r  r  r  r  r  rM   rM   rN   clip  s   


zDuckDBExpr.clipc                 C  r   )Nc                 S  r   )Nrw   r   r   rM   rM   rN   r     r   z DuckDBExpr.sum.<locals>.<lambda>r   rV   rM   rM   rN   rw     r   zDuckDBExpr.sumc                 C  r  )Nr   r_   rB   c                 S  s2   t dt d| t dt|  tdtd S )Narray_unique	array_aggmaxr   r{   )r   r!   	isnotnullr   r  r   rM   rM   rN   rl     s   
z!DuckDBExpr.n_unique.<locals>.funcr	  r   r   rM   rM   rN   n_unique  s   

zDuckDBExpr.n_uniquec                 C  r   )Nc                 S  r   Nr  r   r   rM   rM   rN   r     r   z"DuckDBExpr.count.<locals>.<lambda>r   rV   rM   rM   rN   r    r   zDuckDBExpr.countc                 C  r   )Nc                 S  s   t dS r%  r   r   rM   rM   rN   r     r   z DuckDBExpr.len.<locals>.<lambda>r   rV   rM   rM   rN   r     r   zDuckDBExpr.lenc                   D    dkr|  dd S  dkr|  dd S d fd	d
}|  |S )Nr   c                 S  r   )Nr   r   r   rM   rM   rN   r     r   z DuckDBExpr.std.<locals>.<lambda>r{   c                 S  r   )Nr   r   r   rM   rM   rN   r     r   r   r_   rB   c                   s0   t d| }t d| t d| t d|t   S )Nr  r   r  r   r   r   	n_samplesro   rM   rN   _std  s   
zDuckDBExpr.std.<locals>._stdr	  r   )rL   rp   r*  rM   ro   rN   ry        
zDuckDBExpr.stdc                   r&  )Nr   c                 S  r   )Nr   r   r   rM   rM   rN   r     r   z DuckDBExpr.var.<locals>.<lambda>r{   c                 S  r   )Nr   r   r   rM   rM   rN   r     r   r   r_   rB   c                   s$   t d| }t d| | |t   S )Nr  r   r'  r(  ro   rM   rN   _var  s   

zDuckDBExpr.var.<locals>._varr	  r   )rL   rp   r,  rM   ro   rN   rz     r+  zDuckDBExpr.varc                 C  r   )Nc                 S  r   )Nr"  r   r   rM   rM   rN   r     r   z DuckDBExpr.max.<locals>.<lambda>r   rV   rM   rM   rN   r"    r   zDuckDBExpr.maxc                 C  r   )Nc                 S  r   )Nminr   r   rM   rM   rN   r     r   z DuckDBExpr.min.<locals>.<lambda>r   rV   rM   rM   rN   r-    r   zDuckDBExpr.minc                 C  r   )Nc                 S  s   t d|  dS )Nrw   rt   )r   isnullr   r   rM   rM   rN   r     r   z'DuckDBExpr.null_count.<locals>.<lambda>r   rV   rM   rM   rN   
null_count  s   zDuckDBExpr.null_countr   re   r   rd   Sequence[str] | Nonec                   sp   j  d ur d usJ d fdd}nt }d| ddfd	d}j|jjjjd
S )NrP   r*   rB   r   c                   s    fdd | D S )Nc                   s   g | ]
}t | qS rM   r   r   )rd   re   r   rM   rN   r     r   1DuckDBExpr.over.<locals>.func.<locals>.<listcomp>rS   r   )rd   re   rL   r   rM   rN   rl     s   zDuckDBExpr.over.<locals>.funcz{expr} over (r~   c                   s   fdd  | D S )Nc                   r   r   r   r   r   rM   rN   r     s    r1  rS   r   r   rM   rN   rl     s   
r   r   )rJ   r   r   rF   rG   rH   rI   )rL   re   rd   rl   ri   rM   )rd   re   rL   r   r   rN   over  s   zDuckDBExpr.overc                 C  r   )Nc                 S  s   |   S rD   )r.  r   rM   rM   rN   r     r   z$DuckDBExpr.is_null.<locals>.<lambda>r   rV   rM   rM   rN   is_null  r   zDuckDBExpr.is_nullc                 C  r   )Nc                 S  r   )Nisnanr   r   rM   rM   rN   r     r   z#DuckDBExpr.is_nan.<locals>.<lambda>r   rV   rM   rM   rN   is_nan  r   zDuckDBExpr.is_nanc                 C  r   )Nc                 S  r   )Nisfiniter   r   rM   rM   rN   r     r   z&DuckDBExpr.is_finite.<locals>.<lambda>r   rV   rM   rM   rN   	is_finite  r   zDuckDBExpr.is_finiteSequence[Any]c                      |   fddS )Nc                   s   t dt | S )Ncontainsr'  r   r   rM   rN   r         z"DuckDBExpr.is_in.<locals>.<lambda>r   r   rM   r   rN   is_in     
zDuckDBExpr.is_indecimalsc                   r9  )Nc                   s   t d| t S )Nroundr'  r   r>  rM   rN   r     r;  z"DuckDBExpr.round.<locals>.<lambda>r   )rL   r>  rM   r@  rN   r?    r=  zDuckDBExpr.roundnc                   s"   t  t d fdd}| |S )Nr^   r   rB   r_   c              	     sB   t | jddi}t| j }d| j d  d| d| d	}t|S )Nr`   Tlag(, ra   rb   r~   rc   rg   rA  rM   rN   rl   "  s
   
zDuckDBExpr.shift.<locals>.funcrm   )r   rt   r   )rL   rA  rl   rM   rD  rN   shift  s   

zDuckDBExpr.shiftc                 C     ddd}|  |S )Nr^   r   rB   r_   c                 S  d   t | jddi}| jrt| j d| j  }nd| j }td d| d| d}t|td	kS )
Nr`   TrC  partition by 
row_number over(rb   r~   r{   r   rd   re   r   rf   r   r7   r   rg   rM   rM   rN   rl   .     
z*DuckDBExpr.is_first_distinct.<locals>.funcrm   r   r   rM   rM   rN   is_first_distinct,     

zDuckDBExpr.is_first_distinctc                 C  rF  )Nr^   r   rB   r_   c                 S  rG  )
Nr`   FrC  rH  rI  rJ  rb   r~   r{   rK  rg   rM   rM   rN   rl   >  rL  z)DuckDBExpr.is_last_distinct.<locals>.funcrm   rM  r   rM   rM   rN   is_last_distinct<  rO  zDuckDBExpr.is_last_distinctc                 C  rF  )Nr^   r   rB   r_   c                 S  sB   t | jddi}t| j }d| j d| d| d}| jt| S )Nr`   TrB  ra   rb   r~   rc   rg   rM   rM   rN   rl   N  s   
zDuckDBExpr.diff.<locals>.funcrm   rM  r   rM   rM   rN   diffL  s   

zDuckDBExpr.diffc                C     |  | j|ddS )Nrw   rZ   r\   r   rn   rL   rZ   rM   rM   rN   cum_sumV     zDuckDBExpr.cum_sumc                C  rR  )Nr"  rS  rT  rU  rM   rM   rN   cum_max\  rW  zDuckDBExpr.cum_maxc                C  rR  )Nr-  rS  rT  rU  rM   rM   rN   cum_minb  rW  zDuckDBExpr.cum_minc                C  rR  )Nr  rS  rT  rU  rM   rM   rN   	cum_counth  rW  zDuckDBExpr.cum_countc                C  rR  )NproductrS  rT  rU  rM   rM   rN   cum_prodn  rW  zDuckDBExpr.cum_prodc                C     |  | jd|||dS )Nrw   r\   rr   rs   ru   r   r   rL   rs   ru   rr   rM   rM   rN   rolling_sumt     zDuckDBExpr.rolling_sumc                C  r]  )Nrx   r^  r_  r`  rM   rM   rN   rolling_mean  rb  zDuckDBExpr.rolling_meanc             	   C     |  | jd||||dS )Nrz   r\   rr   rs   ru   rp   r_  rL   rs   ru   rr   rp   rM   rM   rN   rolling_var     zDuckDBExpr.rolling_varc             	   C  rd  )Nry   re  r_  rf  rM   rM   rN   rolling_std  rh  zDuckDBExpr.rolling_stdr   Self | NonNestedLiteralstrategyr   limitc                 C  s,   |d ur
d}t |d
dd}| j||d	S )Ntodor   r_   r   r   rB   c                 S  s
   t | |S rD   r	   )r   r   rM   rM   rN   rl     rU   z"DuckDBExpr.fill_null.<locals>.func)r   )r   r_   r   r   rB   r_   )r   r   )rL   r   rk  rl  r   rl   rM   rM   rN   	fill_null  s
   
zDuckDBExpr.fill_nulldtypeDType | type[DType]c                   s   d fdd} |S )Nr   r_   rB   c                   s   t  j}| t|S rD   )r    rI   r   r   )r   native_dtypero  rL   rM   rN   rl     s   zDuckDBExpr.cast.<locals>.funcr	  r   )rL   ro  rl   rM   rr  rN   r     s   
zDuckDBExpr.castc                 C  r  )Nr   r_   rB   c                 S  s   d|  d}t |tdkS )Nzcount(*) over (partition by r~   r{   )r7   r   )r   rj   rM   rM   rN   rl     s   z"DuckDBExpr.is_unique.<locals>.funcr	  r   r   rM   rM   rN   	is_unique  s   

zDuckDBExpr.is_uniquemethodr2   
descendingc                  s^   | j dk rd}t|dv rtdndkrtdntdd fdd}| |S )Nr   z6At least version 1.3 of DuckDB is required for `rank`.>   r"  r-  averagerankdense
dense_rankrI  r   r_   rB   c                   s    r|  d}n|  d}d| }t dt }dkr5t d| dt| d|  d td	 }n+d
krVt d| dt| d|  dtd	 td  }n
t d| d}t|  |S )Nz desc nulls lastz asc nulls lastz	order by r  r"  z OVER (r~   z OVER (PARTITION BY r{   rv  g       @)r   r   r7   r   r!   r#  )r   by_sqlrh   
count_exprrf   ru  rl   rt  rM   rN   _rank  s&   

zDuckDBExpr.rank.<locals>._rankr	  )rH   r   r   r   )rL   rt  ru  r   r}  rM   r|  rN   rw    s   



zDuckDBExpr.rankr   c                 C     t | S rD   r   rV   rM   rM   rN   r        zDuckDBExpr.strr   c                 C  r~  rD   r   rV   rM   rM   rN   dt  r  zDuckDBExpr.dtr   c                 C  r~  rD   r   rV   rM   rM   rN   list  r  zDuckDBExpr.listr   c                 C  r~  rD   r   rV   rM   rM   rN   struct  r  zDuckDBExpr.struct)r9   r:   r;   r<   r=   r>   r?   r@   rA   r5   rB   rC   r   )rB   rC   )rB   r,   )rZ   r[   r\   r]   rB   r-   )r\   rq   rr   r[   rs   rt   ru   rt   rp   rv   rB   r-   )r   r   rB   r&   )r   r<   r   r6   rB   r&   )r   rt   r   r6   rB   r&   )r9   r   r   r   rB   r&   )rl   r>   rB   r&   )r   r-   rB   r&   )r   r8   rB   r&   )rB   r&   )r   r   rB   r&   )r  r  r  r3   rB   r&   )r  r  r  r  rB   r&   )rp   rt   rB   r&   )re   r   rd   r0  rB   r&   )r   r8  rB   r&   )r>  rt   rB   r&   )rA  rt   rB   r&   )rZ   r[   rB   r&   )rs   rt   ru   rt   rr   r[   rB   r&   )
rs   rt   ru   rt   rr   r[   rp   rt   rB   r&   )r   rj  rk  r   rl  rv   rB   r&   )ro  rp  rB   r&   )rt  r2   ru  r[   rB   r&   )rB   r   )rB   r   )rB   r   )rB   r   )[__name__
__module____qualname__r#   DUCKDB_implementationrO   rT   rW   rY   rn   r   r   classmethodr   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   rx   r
  r  r  r  r  r  rw   r$  r  r   ry   rz   r"  r-  r/  r%   r?   r2  r3  r5  r7  r<  r?  rE  rN  rP  rQ  rV  rX  rY  rZ  r\  ra  rc  rg  ri  rn  r   rs  rw  propertyr   r  r  r  r$   
drop_nullsuniquerM   rM   rM   rN   r8   ;   s    





0


	











































	

$
r8   )r*   r_   )E
__future__r   
contextlibr   typingr   r   r   r   r   r   duckdbr
   r   r   duckdb.typingr   narwhals._compliantr   narwhals._duckdb.expr_dtr   narwhals._duckdb.expr_listr   narwhals._duckdb.expr_strr   narwhals._duckdb.expr_structr   narwhals._duckdb.utilsr   r   r   r   r   r   r    r!   narwhals._expression_parsingr"   narwhals.utilsr#   r$   r%   typing_extensionsr&   narwhals._compliant.typingr'   r(   r)   narwhals._duckdb.dataframer*   rX   r,   narwhals._duckdb.typingr-   r.   narwhals.dtypesr/   narwhals.typingr0   r1   r2   r3   r4   r5   r6   suppressImportErrorr7   r8   rM   rM   rM   rN   <module>   sh    