o
    $&]i$                     @  s   d dl mZ d dlmZmZm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mZ d dlmZmZmZ d dlmZ erjd 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$ d dlm%Z%m&Z& G dd dedef Z'dS )    )annotations)TYPE_CHECKINGAnycastN)ArrowSeries)	EagerExpr)evaluate_nodes!evaluate_output_names_and_aliases)Implementationgenerate_temporary_column_namenot_implemented)col)Sequence)Self)ArrowDataFrameArrowNamespace)
AliasNames	EvalNames
EvalSeries)Version_LimitedContextc                   @  s~   e Zd ZU ejZded< ejdd/ddZed0ddZ	ed1ddZ
d2ddZd d!d3d%d&Zd4d)d*Zd5d,d-Ze Zd.S )6	ArrowExprr
   _implementation)implementationcall'EvalSeries[ArrowDataFrame, ArrowSeries]evaluate_output_namesEvalNames[ArrowDataFrame]alias_output_namesAliasNames | Noneversionr   r   returnNonec                C  s   || _ || _|| _|| _d S )N)_call_evaluate_output_names_alias_output_names_version)selfr   r   r   r!   r    r)   R/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/_arrow/expr.py__init__    s   	
zArrowExpr.__init__cls
type[Self]evaluate_column_namescontextr   r   c                 s    d fdd}| | d |j dS )	Ndfr   r"   list[ArrowSeries]c              
     sL   z fdd D W S  t y% } z   }r || d }~ww )Nc                   s"   g | ]}t  j| | jd qS ))namer!   )r   nativer'   ).0column_namer0   r)   r*   
<listcomp>8   s    z=ArrowExpr.from_column_names.<locals>.func.<locals>.<listcomp>)KeyError_check_columns_exist)r0   eerrorr.   r6   r*   func6   s   
z)ArrowExpr.from_column_names.<locals>.funcr   r   r!   r0   r   r"   r1   )r'   )r,   r.   r/   r=   r)   r<   r*   from_column_names.   s   zArrowExpr.from_column_namescolumn_indicesintc                  s&   d fdd}| ||   d |jdS )	Nr0   r   r"   r1   c                   s"   j j  fddD S )Nc                   s$   g | ]}t j|  | d qS ))r2   r/   )r   from_native)r4   icolsr0   tblr)   r*   r7   O   s    z?ArrowExpr.from_column_indices.<locals>.func.<locals>.<listcomp>)r3   columnsr6   rA   rE   r*   r=   L   s
   z+ArrowExpr.from_column_indices.<locals>.funcr>   r?   )_eval_names_indicesr'   )r,   r/   rA   r=   r)   rI   r*   from_column_indicesJ   s   zArrowExpr.from_column_indicesr   c                 C  s   ddl m} || jdS )Nr   r   )r!   )narwhals._arrow.namespacer   r'   )r(   r   r)   r)   r*   __narwhals_namespace__[   s   z ArrowExpr.__narwhals_namespace__F)returns_scalarrN   booldict[str, Any]c                C  s   |rddiS i S )N_return_py_scalarFr)   )r(   rN   r)   r)   r*   _reuse_series_extra_kwargs`   s   z$ArrowExpr._reuse_series_extra_kwargsorder_bySequence[str]c                   s8   sJ j  d fdd}j|jjjdS )	Nr0   r   r"   Sequence[ArrowSeries]c                   s   t d| j}| j|d djddd} | j|gdd}d ur2jr2t|   fdd|D S t| 	|j
fd	d|D S )
N   )rS   F
descending
nulls_lastT)strictc                   s"   g | ]}| t|  qS r)   )_with_nativeparepeatitemr4   s)sizer)   r*   r7   u   s   " zFArrowExpr._over_without_partition_by.<locals>.func.<locals>.<listcomp>c                   s   g | ]}| |j qS r)   )r[   r3   taker_   )sorting_indicesr)   r*   r7   {   s    )r   rH   with_row_indexsortdropis_scalar_likelenpcsort_indices
get_columnr3   )r0   tokenresultsmetarS   r(   )ra   rc   r*   r=   k   s   z2ArrowExpr._over_without_partition_by.<locals>.funcr>   r0   r   r"   rU   )	_metadata	__class__r%   r&   r'   )r(   rS   r=   r)   rn   r*   _over_without_partition_bye   s   z$ArrowExpr._over_without_partition_bypartition_byc                   s   ssJ  S j r$ jjjr jd ur$ jjs$d}t|tt	tj
 d	 fdd}j|jjjdS )
NzOnly elementary aggregations are supported for `.over` in PyArrow backend when `partition_by` is specified.

Please see: https://narwhals-dev.github.io/narwhals/concepts/improve_group_by_operation/r0   r   r"   rU   c                   s    }jd ur0| tdtd d |} t| g \}}tdt| d |}n
t| g \}}}rE| j	ddd} t
| }rXd| d}t|| j }dd |jjD }t|s| jdd	||jd
ddfdd|D S | j| j}	}
  }g }g }t|j|D ]6\}}|s|| qtd|
}|| |
| |jj|	|d j||d}||j| q| j| }|j|dd	|}|j| j|||ddd  fdd|D S )Nr   FrW   zColumn names zV appear in both expression output names and in `over` keys.
This is not yet supported.c                 S  s   g | ]}|j d kqS )r   )
null_count)r4   car)   r)   r*   r7          z0ArrowExpr.over.<locals>.func.<locals>.<listcomp>)drop_null_keysleft_right)howleft_onright_onsuffixc                      g | ]}  |qS r)   rk   r4   alias)tmpr)   r*   r7      rx   rV   encode)r/   r2   inner)r}   r~   r|   r   c                   r   r)   r   r   )retr)   r*   r7      rx   )rM   prevwith_columnsr   r   r	   nw_col_append_node_to_compliant_exprre   setintersectionNotImplementedErrorsimple_selectr3   rH   anygroup_byaggjoinzipappendr   _seriesrC   columndictionary_encodecombine_chunksindices_expr_from_series)r0   plx_aliasesleaf_ceoverlapmsgpartition_tbl	has_nulls
tbl_nativecurrent_cols
group_keysencoded_colscol_namehas_nulltmp_namer   tbl_encodedwindowedro   nodesrS   rt   r(   )r   r   r*   r=      sr   







zArrowExpr.over.<locals>.funcr>   rp   )rs   rq   current_nodekindrg   r   is_elementwiser   listreversediter_nodes_reversedrr   r%   r&   r'   )r(   rt   rS   r   r=   r)   r   r*   over   s&   
KzArrowExpr.overN)r   r   r   r   r   r    r!   r   r   r
   r"   r#   )r,   r-   r.   r   r/   r   r"   r   )rA   rB   r/   r   r"   r   )r"   r   )rN   rO   r"   rP   )rS   rT   r"   r   )rt   rT   rS   rT   r"   r   )__name__
__module____qualname__r
   PYARROWr   __annotations__r+   classmethodr@   rK   rM   rR   rs   r   r   ewm_meanr)   r)   r)   r*   r      s   
 	



kr   r   )(
__future__r   typingr   r   r   pyarrowr\   pyarrow.computecomputeri   narwhals._arrow.seriesr   narwhals._compliantr   narwhals._expression_parsingr   r	   narwhals._utilsr
   r   r   narwhals.functionsr   r   collections.abcr   typing_extensionsr   narwhals._arrow.dataframer   rL   r   narwhals._compliant.typingr   r   r   r   r   r   r)   r)   r)   r*   <module>   s"    