o
    篪g8                     @  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 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& G dd ded Z'G dd dZ(G d d! d!eZ)dS )"    )annotationsN)reduce)TYPE_CHECKING)Any)Callable)Literal)Sequence)cast)CaseExpression)CoalesceOperatorColumnExpression)ConstantExpressionFunctionExpression)
DuckDBExpr)DuckDBSelectorNamespace)ExprKind)n_ary_operation_expr_kind)narwhals_to_native_dtype)combine_alias_output_names)combine_evaluate_output_names)CompliantNamespace)Self)DuckDBLazyFrame)DType)Versionc                   @  s   e Zd Zd?d	d
Zed@ddZdAddZdBddZdCddZdDdd Z	dDd!d"Z
dDd#d$ZdDd%d&ZdDd'd(ZdDd)d*ZdEd-d.ZdFd0d1ZdGd4d5ZdHd:d;ZdAd<d=Zd>S )IDuckDBNamespaceselfr   backend_versiontuple[int, ...]versionr   returnNonec                C  s   || _ || _d S N)_backend_version_version)r   r   r!    r'   V/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/narwhals/_duckdb/namespace.py__init__&   s   
zDuckDBNamespace.__init__r   c                 C  s   t | j| jdS Nr   r!   )r   r%   r&   )r   r'   r'   r(   	selectors,   s   zDuckDBNamespace.selectorsr   c              	   C  *   ddd}t |ddd	 d tj| j| jd
S )Ndfr   r"   list[duckdb.Expression]c                 S  s   dd | j D S )Nc                 S  s   g | ]}t |qS r'   r   ).0col_namer'   r'   r(   
<listcomp>4   s    z5DuckDBNamespace.all.<locals>._all.<locals>.<listcomp>columnsr.   r'   r'   r(   _all3   s   z!DuckDBNamespace.all.<locals>._allallc                 S  s   | j S r$   r3   r5   r'   r'   r(   <lambda>9       z%DuckDBNamespace.all.<locals>.<lambda>callfunction_nameevaluate_output_namesalias_output_names	expr_kindr   r!   r.   r   r"   r/   )r   r   	TRANSFORMr%   r&   )r   r6   r'   r'   r(   r7   2      
zDuckDBNamespace.allitemsSequence[DuckDBLazyFrame]how-Literal['horizontal', 'vertical', 'diagonal']r   c                  s   |dkr
d}t ||dkrd}t||d }|j |dkr4t fdd|d	d  D s4d
}t |tdd dd |D }||S )N
horizontalz?horizontal concat not supported for duckdb. Please join insteaddiagonalzNot implemented yetr   verticalc                 3  s    | ]}|j  kV  qd S r$   schema)r0   xrJ   r'   r(   	<genexpr>N   s    z)DuckDBNamespace.concat.<locals>.<genexpr>   z&inputs should all have the same schemac                 S  s
   |  |S r$   )unionrL   yr'   r'   r(   r8   R   s   
 z(DuckDBNamespace.concat.<locals>.<lambda>c                 s  s    | ]}|j V  qd S r$   )_native_frame)r0   itemr'   r'   r(   rM   R   s    )	TypeErrorNotImplementedErrorrK   r7   	functoolsr   _from_native_frame)r   rC   rE   msgfirstresr'   rJ   r(   concat@   s   &
zDuckDBNamespace.concatexprs	separatorstrignore_nullsboolc             	     s8   d	 fdd}t |dt  t  t  | j| jdS )
Nr.   r   r"   r/   c                   s   fddD  fddD }s;t tj|}dd  fddt D D }t| tdg|R  d}|gS dd t |D ^}}fd	d
|d d D }t dd dd
 t||D |}|gS )Nc                      g | ]}| D ]}|qqS r'   r'   r0   _exprsr5   r'   r(   r2   ]       z<DuckDBNamespace.concat_str.<locals>.func.<locals>.<listcomp>c                   s"   g | ]}| D ]}|  qqS r'   )isnullrb   r5   r'   r(   r2   ^   s   " c                 S  s   g | ]	}|D ]}|qqS r'   r'   )r0   rL   rQ   r'   r'   r(   r2   b   s    c                   s>   g | ]\}}|t  d  kr|dfn|dtfqS )rN   string)lenr	   r   )r0   icol)colsr]   r'   r(   r2   d   s    r[   	conditionvaluec                 S  s,   g | ]\}}t | |d tdqS )rg    )r
   r	   	otherwiser   )r0   rj   nmr'   r'   r(   r2   q   s    c                 3  s(    | ]}t |td t V  qdS )ro   N)r
   r   rp   )r0   rq   )r]   r'   r(   rM   w   s    
z;DuckDBNamespace.concat_str.<locals>.func.<locals>.<genexpr>c                 S  s   t d| |S )Nr[   r   rP   r'   r'   r(   r8   ~   s    z:DuckDBNamespace.concat_str.<locals>.func.<locals>.<lambda>c                 s  s     | ]\}}t d ||V  qdS )r[   Nr   )r0   rd   vr'   r'   r(   rM      s
    

)r   operatoror_	enumerater
   r   zip)r.   	null_masknull_mask_resultcols_separatedresult
init_valuevalues
separatorsr\   r_   r]   )rk   r.   r(   func\   s8   



	z(DuckDBNamespace.concat_str.<locals>.func
concat_strr:   r@   r   r   r   r   r%   r&   )r   r]   r_   r\   r   r'   r   r(   r   V   s   ,zDuckDBNamespace.concat_strc              	     4   d	 fdd}t |dt  t  t  | j| jdS )
Nr.   r   r"   r/   c                        fddD }t tj|gS )Nc                 3  "    | ]}| D ]}|V  qqd S r$   r'   r0   rc   cr5   r'   r(   rM           z?DuckDBNamespace.all_horizontal.<locals>.func.<locals>.<genexpr>)r   rt   and_r.   rk   r\   r5   r(   r         z,DuckDBNamespace.all_horizontal.<locals>.funcall_horizontalr:   r@   r   r   r\   r   r'   r   r(   r         zDuckDBNamespace.all_horizontalc              	     r   )
Nr.   r   r"   r/   c                   r   )Nc                 3  r   r$   r'   r   r5   r'   r(   rM      r   z?DuckDBNamespace.any_horizontal.<locals>.func.<locals>.<genexpr>)r   rt   ru   r   r   r5   r(   r      r   z,DuckDBNamespace.any_horizontal.<locals>.funcor_horizontalr:   r@   r   r   r'   r   r(   any_horizontal   r   zDuckDBNamespace.any_horizontalc              	     r   )
Nr.   r   r"   r/   c                   $    fddD }t dg|R  gS )Nc                 3  r   r$   r'   r   r5   r'   r(   rM      r   z?DuckDBNamespace.max_horizontal.<locals>.func.<locals>.<genexpr>greatestr   r   r   r5   r(   r         z,DuckDBNamespace.max_horizontal.<locals>.funcmax_horizontalr:   r@   r   r   r'   r   r(   r      r   zDuckDBNamespace.max_horizontalc              	     r   )
Nr.   r   r"   r/   c                   r   )Nc                 3  r   r$   r'   r   r5   r'   r(   rM      r   z?DuckDBNamespace.min_horizontal.<locals>.func.<locals>.<genexpr>leastr   r   r   r5   r(   r      r   z,DuckDBNamespace.min_horizontal.<locals>.funcmin_horizontalr:   r@   r   r   r'   r   r(   r      r   zDuckDBNamespace.min_horizontalc              	     r   )
Nr.   r   r"   r/   c                   r   )Nc                 3  s,    | ]}| D ]
}t |td V  qqdS r   Nr   r   )r0   rc   rj   r5   r'   r(   rM      s    z?DuckDBNamespace.sum_horizontal.<locals>.func.<locals>.<genexpr>r   rt   addr   r   r5   r(   r      s   
z,DuckDBNamespace.sum_horizontal.<locals>.funcsum_horizontalr:   r@   r   r   r'   r   r(   r      s   zDuckDBNamespace.sum_horizontalc              	     r   )
Nr.   r   r"   r/   c                   s@    fddD }t tjdd |D t tjdd |D  gS )Nc                   ra   r'   r'   r   r5   r'   r(   r2      re   zADuckDBNamespace.mean_horizontal.<locals>.func.<locals>.<listcomp>c                 s  s    | ]
}t |td V  qdS r   r   r0   rj   r'   r'   r(   rM          z@DuckDBNamespace.mean_horizontal.<locals>.func.<locals>.<genexpr>c                 s  s    | ]
}|  d V  qdS )intN)	isnotnullr	   r   r'   r'   r(   rM      r   r   r   r   r5   r(   r      s   z-DuckDBNamespace.mean_horizontal.<locals>.funcmean_horizontalr:   r@   r   r   r'   r   r(   r      s   zDuckDBNamespace.mean_horizontal
predicates
DuckDBWhenc                 G  s2   | j | j| jd}|j| }t|| jtj| jdS )Nr+   )r?   r!   )	__class__r%   r&   r   r   r   rA   )r   r   plxrm   r'   r'   r(   when   s   
zDuckDBNamespace.whencolumn_namesc                 G     t j|| j| jdS r*   )r   from_column_namesr%   r&   )r   r   r'   r'   r(   rj        
zDuckDBNamespace.colcolumn_indicesr   c                 G  r   r*   )r   from_column_indicesr%   r&   )r   r   r'   r'   r(   nth
  r   zDuckDBNamespace.nthrn   r   dtypeDType | Nonec              	     s2   d fdd}t |ddd	 d tjjjd
S )N_dfr   r"   r/   c                   s,    d urt t jdgS t gS )N)r!   )r   r	   r   r&   r   r   r   rn   r'   r(   r     s   
z!DuckDBNamespace.lit.<locals>.funclitc                 S     dgS Nliteralr'   r   r'   r'   r(   r8     r9   z%DuckDBNamespace.lit.<locals>.<lambda>r<   r=   r>   r?   r   r!   r   r   r"   r/   )r   r   LITERALr%   r&   )r   rn   r   r   r'   r   r(   r     s   	zDuckDBNamespace.litc              	   C  r-   )Nr   r   r"   r/   c                 S  s
   t dgS )Ncountr   r   r'   r'   r(   r   $  s   
z!DuckDBNamespace.len.<locals>.funcrh   c                 S  r   )Nrh   r'   r   r'   r'   r(   r8   *  r9   z%DuckDBNamespace.len.<locals>.<lambda>r:   r   )r   r   AGGREGATIONr%   r&   )r   r   r'   r'   r(   rh   #  rB   zDuckDBNamespace.lenN)r   r   r   r    r!   r   r"   r#   )r   r   r"   r   )r   r   r"   r   )r   r   rC   rD   rE   rF   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   rn   r   r   r   r"   r   )__name__
__module____qualname__r)   propertyr,   r7   r[   r   r   r   r   r   r   r   r   rj   r   r   rh   r'   r'   r'   r(   r   %   s$    




<








r   duckdb.Expressionc                   @  s0   e Zd Z		ddddZdddZd ddZdS )!r   Nr   r   rm   r   r   r    
then_valuer   otherwise_valuer?   r   r!   r   r"   r#   c                C  s(   || _ || _|| _|| _|| _|| _d S r$   )r%   
_condition_then_value_otherwise_value
_expr_kindr&   )r   rm   r   r   r   r?   r!   r'   r'   r(   r)   3  s   

zDuckDBWhen.__init__r.   r   Sequence[duckdb.Expression]c                 C  s   |  |d }td|}t| jtr| |d }nt| j}td|}| jd u r0t||dgS t| jtsCt||dt| jgS | |d }t||d|gS )Nr   r   rl   )	r   r	   
isinstancer   r   r   r   r
   rp   )r   r.   rm   rn   rp   r'   r'   r(   __call__D  s   



zDuckDBWhen.__call__rn   DuckDBExpr | Any
DuckDBThenc              	   C  s6   || _ t| dt|ddd t|dd | j| j| jdS )Nwhenthen_evaluate_output_namesc                 S  r   r   r'   r   r'   r'   r(   r8   b  r9   z!DuckDBWhen.then.<locals>.<lambda>_alias_output_namesr   )r   r   getattrr   r%   r&   r   rn   r'   r'   r(   then[  s   

zDuckDBWhen.then)NN)r   r   rm   r   r   r    r   r   r   r   r?   r   r!   r   r"   r#   )r   r   r.   r   r"   r   )r   r   rn   r   r"   r   )r   r   r   r)   r   r   r'   r'   r'   r(   r   2  s    
r   c                   @  s    e Zd ZdddZdddZdS )r   r   r   r;   r   r<   r^   r=   *Callable[[DuckDBLazyFrame], Sequence[str]]r>   /Callable[[Sequence[str]], Sequence[str]] | Noner?   r   r   r    r!   r   r"   r#   c                C  s.   || _ || _|| _|| _|| _|| _|| _d S r$   )r%   r&   _call_function_namer   r   r   )r   r;   r<   r=   r>   r?   r   r!   r'   r'   r(   r)   l  s   
zDuckDBThen.__init__rn   r   r   c                 C  s   || j _d| _| S )Nwhenotherwise)r   r   r   r   r'   r'   r(   rp     s   zDuckDBThen.otherwiseN)r   r   r;   r   r<   r^   r=   r   r>   r   r?   r   r   r    r!   r   r"   r#   )r   r   rn   r   r"   r   )r   r   r   r)   rp   r'   r'   r'   r(   r   k  s    
r   )*
__future__r   rV   rt   r   typingr   r   r   r   r   r	   duckdbr
   r   r   r   r   narwhals._duckdb.exprr   narwhals._duckdb.selectorsr   narwhals._duckdb.utilsr   r   r   narwhals._expression_parsingr   r   narwhals.typingr   typing_extensionsr   narwhals._duckdb.dataframer   narwhals.dtypesr   narwhals.utilsr   r   r   r   r'   r'   r'   r(   <module>   sD      9