o
    $&]iF<                     @  s  U d dl mZ d dlZd dlmZmZmZmZmZ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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  erd dl!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dlm:Z: d dl;m<Z<m=Z=m>Z> ed Z?de@d< e3e5e&f ZAe.e& ZBG dd ded ZCdS )    )annotationsN)TYPE_CHECKINGAnyCallableClassVarLiteralcastSparkLikeExprDateTimeNamespaceSparkLikeExprListNamespaceSparkLikeExprStringNamespaceSparkLikeExprStructNamespace)import_functionsimport_native_dtypesimport_windownarwhals_to_native_dtypetrue_divide)SQLExpr)ImplementationVersionextend_bool
no_defaultnot_implemented
zip_strict)IteratorMappingSequence)Column)Window
WindowSpec)Self	TypeAlias)WindowInputs)
AliasNames	EvalNames
EvalSeriesWindowFunction)SparkLikeLazyFrameSparkLikeNamespace)	NoDefault)_LimitedContext)FillNullStrategy	IntoDType
RankMethod)rank
dense_rank
row_numberr$   NativeRankMethodc                   @  s  e Zd ZU 	ddddZddddddZded< dddZ				dddddd'd(Zdd*d+Zdd,d-Z	dd0d1Z
dd3d4Zed5d6 Zed7d8 Zedd:d;Zddddd?d@ZddBdCZddEdFZeddHdIZeddOdPZeddSdTZddVdWZddXdYZddZd[Zdd\d]Zdd^d_ZddbdcZddddeZddfdgZddhdiZddkdlZ ddmdnZ!ddodpZ"ddqdrZ#ddsdtZ$ddzd{Z%dddZ&edddZ'edddZ(edddZ)edddZ*e+ Z,dS )SparkLikeExprNcall&EvalSeries[SparkLikeLazyFrame, Column]window_functionSparkWindowFunction | Noneevaluate_output_namesEvalNames[SparkLikeLazyFrame]alias_output_namesAliasNames | Noneversionr   implementationr   returnNonec                C  s(   || _ || _|| _|| _|| _|| _d S N)_call_evaluate_output_names_alias_output_names_version_implementation_window_function)selfr7   r9   r;   r=   r?   r@    rK   W/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/_spark_like/expr.py__init__5   s   

zSparkLikeExpr.__init__r2   r3   r4   )minmaxaveragedenseordinalz/ClassVar[Mapping[RankMethod, NativeRankMethod]]_REMAP_RANK_METHODr    c                 C  s   | j dS N*_FcountrJ   rK   rK   rL   _count_starN   s   zSparkLikeExpr._count_starrK   
descending
nulls_lastexprpartition_bySequence[str | Column]order_by
rows_start
int | Nonerows_endr\   Sequence[bool] | Noner]   c          	      C  s   | j | }|r|j| j|||d }|d ur"|d ur"|||}n|d ur/|| jj|}n|d ur;||| jj}||S )Nr[   )r_   orderBy_sortrowsBetween_WindowunboundedPrecedingunboundedFollowingover)	rJ   r^   r_   ra   rb   rd   r\   r]   windowrK   rK   rL   _window_expressionQ   s   

z SparkLikeExpr._window_expressionstrc                 G     d}t |)Nz%`first` is not supported for PySpark.NotImplementedErrorrJ   r^   ra   msgrK   rK   rL   _firsti      zSparkLikeExpr._firstc                 G  rp   )Nz$`last` is not supported for PySpark.rq   rs   rK   rK   rL   _lastn   rv   zSparkLikeExpr._lastignore_nullsboolc                C  s   | j j||dS )NignoreNulls)rW   	any_value)rJ   r^   rx   rK   rK   rL   
_any_values   s   zSparkLikeExpr._any_valuer#   c                 C  s   |  | jdgg S )N   )rl   rW   litrY   rK   rK   rL   	broadcastv      zSparkLikeExpr.broadcastc                 C     t r
ddlm} |S t| jS )Nr   )	functions)r   sqlframe.baser   r   rH   )rJ   r   rK   rK   rL   rW   y      
zSparkLikeExpr._Fc                 C  r   )Nr   )types)r   r   r   r   rH   )rJ   r   rK   rK   rL   _native_dtypes   r   zSparkLikeExpr._native_dtypestype[Window]c                 C  r   )Nr   )r!   )r   sqlframe.base.windowr!   r   rH   )rJ   r!   rK   rK   rL   ri      r   zSparkLikeExpr._WindowcolsColumn | strIterator[Column]c                '  sf    | j }t|}t|pd|}t|pd|}|j|j|j|jd  fddt|||D E d H  d S )NF))FF)FT)TF)TTc                 3  s&    | ]\}}} ||f |V  qd S rC   rK   ).0col_desc_nulls_lastmappingrK   rL   	<genexpr>   s
    
z&SparkLikeExpr._sort.<locals>.<genexpr>)rW   lenr   asc_nulls_firstasc_nulls_lastdesc_nulls_firstdesc_nulls_lastr   )rJ   r\   r]   r   FnrK   r   rL   rg      s   

zSparkLikeExpr._sortr"   c                 G  s   | j j|p| jdg S )zGWraps `Window().partitionBy`, with default and `WindowInputs` handling.r~   )ri   partitionByrW   r   )rJ   r   rK   rK   rL   r_      s   zSparkLikeExpr.partition_byr,   c                 C  s   ddl m} || j| jdS )Nr   r+   )r?   r@   )narwhals._spark_like.namespacer,   rG   rH   )rJ   r,   rK   rK   rL   __narwhals_namespace__   s   z$SparkLikeExpr.__narwhals_namespace__namec                 C  s
   | |S rC   )alias)clsr^   r   rK   rK   rL   _alias_native   s   
zSparkLikeExpr._alias_nativer   
type[Self]evaluate_column_namescontextr.   c                 s$   d fdd}| | d |j |jdS )	Ndfr*   rA   list[Column]c                   s    fdd D S )Nc                   s   g | ]} j |qS rK   rW   r   )r   col_namer   rK   rL   
<listcomp>   s    zASparkLikeExpr.from_column_names.<locals>.func.<locals>.<listcomp>rK   r   r   r   rL   func   r   z-SparkLikeExpr.from_column_names.<locals>.funcr;   r=   r?   r@   r   r*   rA   r   )rG   rH   )r   r   r   r   rK   r   rL   from_column_names   s   zSparkLikeExpr.from_column_namescolumn_indicesintc                  s*   d fdd}| ||   d |j|jdS )	Nr   r*   rA   r   c                   s   j   fddD S )Nc                   s   g | ]
}j  | qS rK   r   )r   icolumnsr   rK   rL   r      s    zCSparkLikeExpr.from_column_indices.<locals>.func.<locals>.<listcomp>)r   r   r   r   rL   r      s   z/SparkLikeExpr.from_column_indices.<locals>.funcr   r   )_eval_names_indicesrG   rH   )r   r   r   r   rK   r   rL   from_column_indices   s   z!SparkLikeExpr.from_column_indicesotherc                      d fdd}  ||S )Nr^   r    r   rA   c                   s   t  j| |S rC   r   rW   r^   r   rY   rK   rL   _truediv      z+SparkLikeExpr.__truediv__.<locals>._truedivr^   r    r   r    rA   r    _with_binary)rJ   r   r   rK   rY   rL   __truediv__   s   zSparkLikeExpr.__truediv__c                       d fdd}  ||dS )	Nr^   r    r   rA   c                   s   t  j|| S rC   r   r   rY   rK   rL   	_rtruediv   r   z-SparkLikeExpr.__rtruediv__.<locals>._rtruedivliteralr   r   r   )rJ   r   r   rK   rY   rL   __rtruediv__   s   zSparkLikeExpr.__rtruediv__c                   r   )Nr^   r    r   rA   c              	     s6    j }|||dk|t|| ||d S Nr   rW   whenr   floorr   	otherwiser^   r   r   rY   rK   rL   	_floordiv      z-SparkLikeExpr.__floordiv__.<locals>._floordivr   r   )rJ   r   r   rK   rY   rL   __floordiv__   s   zSparkLikeExpr.__floordiv__c                   r   )	Nr^   r    r   rA   c              	     s6    j }|| |dk|t||| |d S r   r   r   rY   rK   rL   
_rfloordiv   r   z/SparkLikeExpr.__rfloordiv__.<locals>._rfloordivr   r   r   )rJ   r   r   rK   rY   rL   __rfloordiv__   s   zSparkLikeExpr.__rfloordiv__c                 C  s   t dtj}| |S )NzCallable[..., Column])r   operatorinvert_with_elementwise)rJ   r   rK   rK   rL   
__invert__   s   
zSparkLikeExpr.__invert__dtyper0   c                   s>   d fdd}d fd	d
}j ||jjjjdS )Nr   r*   rA   Sequence[Column]c                   s,   t jj| jj  fdd| D S )Nc                      g | ]}|  qS rK   r   r   r^   spark_dtyperK   rL   r          z4SparkLikeExpr.cast.<locals>.func.<locals>.<listcomp>)r   rG   r   nativesparkSessionr   r   rJ   r   rL   r      s   z SparkLikeExpr.cast.<locals>.funcinputsSparkWindowInputsc                   s0   t jj| jj  fdd| |D S )Nc                   r   rK   r   r   r   rK   rL   r     r   z8SparkLikeExpr.cast.<locals>.window_f.<locals>.<listcomp>)r   rG   r   r   r   r9   r   r   r   r   rL   window_f   s   z$SparkLikeExpr.cast.<locals>.window_fr   )r   r*   rA   r   r   r*   r   r   rA   r   )	__class__rE   rF   rG   rH   )rJ   r   r   r   rK   r   rL   r      s   zSparkLikeExpr.castc                      d fdd}  |S )Nr^   r    rA   c                   s@    j tjtjhv rtj dk r j| ddS  j| S )N)      doubleg      ?)	rH   r   PYSPARKPYSPARK_CONNECT_backend_versionrW   percentile_approxr   medianr^   rY   rK   rL   _median  s   z%SparkLikeExpr.median.<locals>._medianr^   r    rA   r    _with_callable)rJ   r   rK   rY   rL   r     s   

zSparkLikeExpr.medianc                   r   )Nr^   r    rA   c                   s    j  j | S rC   )rW   count_ifisnullr   rY   rK   rL   _null_count  s   z-SparkLikeExpr.null_count.<locals>._null_countr   r   )rJ   r   rK   rY   rL   
null_count     
zSparkLikeExpr.null_countc                   r   )Nr^   r    rA   c                   sT    j |  |  j tdk@ |  j tdk@ } j  j |  |d S )Ninfz-inf)rW   isnanr   floatr   r   r   )r^   is_finite_conditionrY   rK   rL   
_is_finite$  s   z+SparkLikeExpr.is_finite.<locals>._is_finiter   r   )rJ   r   rK   rY   rL   	is_finite#  s   
zSparkLikeExpr.is_finiteSequence[Any]c                   s   d fdd} |S )Nr^   r    rA   c                   s    r|   S jdS )NF)isinrW   r   r   r   rJ   rK   rL   _is_in3  s   z#SparkLikeExpr.is_in.<locals>._is_inr   r   )rJ   r   r  rK   r  rL   is_in2  s   
zSparkLikeExpr.is_inc                   r   )N_exprr    rA   c                   s    j dS rT   rV   )r  rY   rK   rL   _len9  s   zSparkLikeExpr.len.<locals>._len)r  r    rA   r    r   )rJ   r  rK   rY   rL   r   8  s   
zSparkLikeExpr.lenc                 C     |  | jjS rC   )r   rW   skewnessrY   rK   rK   rL   skew?  r   zSparkLikeExpr.skewc                 C  r  rC   )r   rW   kurtosisrY   rK   rK   rL   r  B  r   zSparkLikeExpr.kurtosisc                   r   )Nr^   r    rA   c                   s$    j  j | d  j | S rC   )rW   r   r   r   r   r   rY   rK   rL   _is_nanF  s   $z%SparkLikeExpr.is_nan.<locals>._is_nanr   r   )rJ   r  rK   rY   rL   is_nanE  r   zSparkLikeExpr.is_nanvalueSelf | NonestrategyFillNullStrategy | Nonelimitc                   sL   d urd fdd} |S dfdd}|d usJ j||dS )Nr   r*   r   r   rA   r   c                   sz   dkrj jnj jdkr d u rjjn jj njjd u r,jjn  fdd| D S )Nforwardc                   s<   g | ]}|d d jj jjj   qS )Trz   )rl   r_   rf   rg   ra   rh   r   )endfnr   rJ   startrK   rL   r   Z  s    
zHSparkLikeExpr.fill_null.<locals>._fill_with_strategy.<locals>.<listcomp>)rW   
last_valuefirst_valueri   rj   
currentRowrk   r   r  rJ   r  )r  r  r   r  rL   _fill_with_strategyP  s   
z4SparkLikeExpr.fill_null.<locals>._fill_with_strategyr^   r    r  c                   s    j | |S rC   )rW   ifnull)r^   r  rY   rK   rL   _fill_constante  r   z/SparkLikeExpr.fill_null.<locals>._fill_constant)r  r   )r^   r    r  r    rA   r    )_with_window_functionr   )rJ   r  r  r  r  r  rK   r  rL   	fill_nullK  s   
zSparkLikeExpr.fill_nulldefaultSparkLikeExpr | NoDefaultoldnewreturn_dtypeIntoDType | Nonec          	        s   t u r
d}t|jtjurdj d}t|ddlm} j t	t
||}  fdd||  D d fdd}j|d jjjjdS )NzU`replace_strict` requires an explicit value for `default` for any spark-like backend.z.`replace_strict` is not (yet) implemented for .r   )chainc                   s   g | ]}  |qS rK   )r   )r   x)r   rK   rL   r     r   z0SparkLikeExpr.replace_strict.<locals>.<listcomp>r   r*   rA   r   c                   sX   |    fdd| D }r*| jj}tjj|fdd|D S |S )Nc              	     s0   g | ]}    || qS rK   )r   array_containsmap_keysr   r   )r   default_colmapping_exprrK   rL   r     s    z>SparkLikeExpr.replace_strict.<locals>.func.<locals>.<listcomp>c                   r   rK   r   )r   resultr   rK   rL   r     r   )_evaluate_single_output_exprr   r   r   rG   r   )r   resultssessionr   r   r,  r$  rJ   )r+  r   rL   r     s   
z*SparkLikeExpr.replace_strict.<locals>.funcr   r   )r   
ValueErrorrH   r   r   rr   	itertoolsr'  rW   dictzip
create_mapitemsr   rE   rF   rG   )	rJ   r   r"  r#  r$  rt   r'  r   r   rK   r1  rL   replace_strictk  s&    zSparkLikeExpr.replace_strictr   c                 C     t | S rC   r   rY   rK   rK   rL   ro        zSparkLikeExpr.strr
   c                 C  r9  rC   r	   rY   rK   rK   rL   dt  r:  zSparkLikeExpr.dtr   c                 C  r9  rC   r   rY   rK   rK   rL   list  r:  zSparkLikeExpr.listr   c                 C  r9  rC   r   rY   rK   rK   rL   struct  r:  zSparkLikeExpr.structrC   )r7   r8   r9   r:   r;   r<   r=   r>   r?   r   r@   r   rA   rB   )rA   r    )rK   rK   NN)r^   r    r_   r`   ra   r`   rb   rc   rd   rc   r\   re   r]   re   rA   r    )r^   r    ra   ro   rA   r    )r^   r    rx   ry   rA   r    )rA   r#   )rA   r   )r   r   r\   re   r]   re   rA   r   )r   r   rA   r"   )rA   r,   )r^   r    r   ro   rA   r    )r   r   r   r<   r   r.   rA   r#   )r   r   r   r.   rA   r#   )r   r#   rA   r#   )r   r0   rA   r#   )r   r  rA   r#   )r  r  r  r  r  rc   rA   r#   )
r   r!  r"  r  r#  r  r$  r%  rA   r#   )rA   r   )rA   r
   )rA   r   )rA   r   )-__name__
__module____qualname__rM   rS   __annotations__rZ   rn   ru   rw   r}   r   propertyrW   r   ri   rg   r_   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r  r   r
  r  r  r  r8  ro   r;  r<  r=  r   quantilerK   rK   rK   rL   r6   4   s   
 













	
	










 2
r6   )r*   r    )D
__future__r   r   typingr   r   r   r   r   r   narwhals._spark_like.expr_dtr
   narwhals._spark_like.expr_listr   narwhals._spark_like.expr_strr    narwhals._spark_like.expr_structr   narwhals._spark_like.utilsr   r   r   r   r   narwhals._sql.exprr   narwhals._utilsr   r   r   r   r   r   collections.abcr   r   r   sqlframe.base.columnr    r   r!   r"   typing_extensionsr#   r$   narwhals._compliantr%   narwhals._compliant.typingr&   r'   r(   r)   narwhals._spark_like.dataframer*   r   r,   narwhals._typingr-   r.   narwhals.typingr/   r0   r1   r5   rA  SparkWindowFunctionr   r6   rK   rK   rK   rL   <module>   s4      	