
    }i              	      l   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
Z
d dl
mZ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mZmZmZmZ d dlmZmZm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z& er&d dl'm(Z(m)Z) d dl
m*Z* d dl+m,Z, d dl#m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 ej3        Z3 G d de"eedef                   Z4dS )    )annotationsN)reduce)chain)TYPE_CHECKINGAny)CoalesceOperator
ExpressionDuckDBLazyFrame
DuckDBExpr)DuckDBSelectorNamespace)	DeferredTimeZoneF
concat_strduckdb_dtypesfunctionlitnarwhals_to_native_dtypesql_expressionwhen)combine_alias_output_namescombine_evaluate_output_names!evaluate_output_names_and_aliases)SQLNamespace)Implementationrequires
zip_strict)IterableMapping)DuckDBPyRelation)WindowInputs)Version)ConcatMethodCorrelationMethod	IntoDTypePythonLiteralc                      e Zd ZU ej        Zded<   d5dZed6d	            Z	ed7d            Z
ed8d            Zd9dZd:dZ	 d;d<dZd=dZd>d"Zd?d'Zd@d(ZdAd,ZdBd-ZdCd2Z ej        d3          d@d4            ZdS )DDuckDBNamespacer   _implementationversionr#   returnNonec                   || _         d S N)_version)selfr+   s     N/home/jrussi/.local/lib/python3.11/site-packages/narwhals/_duckdb/namespace.py__init__zDuckDBNamespace.__init__2   s        r   c                *    t          j        |           S r/   )r   from_namespacer1   s    r2   	selectorszDuckDBNamespace.selectors5   s    &5d;;;r4   type[DuckDBExpr]c                    t           S r/   r   r7   s    r2   _exprzDuckDBNamespace._expr9   s    r4   type[DuckDBLazyFrame]c                    t           S r/   r
   r7   s    r2   
_lazyframezDuckDBNamespace._lazyframe=   s    r4   namestrargsr	   c                    t          |g|R  S r/   )r   )r1   r?   rA   s      r2   	_functionzDuckDBNamespace._functionA   s    $t$$$$r4   valuer   c                     t          |          S r/   )r   )r1   rD   s     r2   _litzDuckDBNamespace._litD   s    5zzr4   N	condition	otherwiseExpression | Nonec                l    |t          ||          S t          ||                              |          S r/   )r   rH   )r1   rG   rD   rH   s       r2   _whenzDuckDBNamespace._whenG   s8     	5)))Iu%%//	:::r4   exprsc                    t          | S r/   )r   )r1   rL   s     r2   	_coalescezDuckDBNamespace._coalesceQ   s    ''r4   itemsIterable[DuckDBLazyFrame]howr$   r   c                  d |D             }t          |          }|d         }|j        |dk    r4t          fd|dd          D                       sd}t          |          |dk    r=|j        }|dd          D ]}t          j        d          }|                    |          S t          d	 |          }|                    |          S )
Nc                    g | ]	}|j         
S  )_native_frame).0items     r2   
<listcomp>z*DuckDBNamespace.concat.<locals>.<listcomp>W   s    ===t*===r4   r   verticalc              3  .   K   | ]}|j         k    V  d S r/   )schema)rV   xr[   s     r2   	<genexpr>z)DuckDBNamespace.concat.<locals>.<genexpr>[   s*      (O(OV);(O(O(O(O(O(Or4      z&inputs should all have the same schemadiagonalz]
                    from res select * union all by name from _item select *
                c                ,    |                      |          S r/   )union)r\   ys     r2   <lambda>z(DuckDBNamespace.concat.<locals>.<lambda>f   s    !''!** r4   )	listr[   all	TypeErrornativeduckdbsql_with_nativer   )	r1   rO   rQ   native_itemsfirstmsgres_itemr[   s	           @r2   concatzDuckDBNamespace.concatT   s     >=u===Ua*S(O(O(O(OU122Y(O(O(O%O%O:CC.. *,C%abb)  j "   %%c***,,l;;!!#&&&r4   r   	separatorignore_nullsboolc               p    dfd}|                      |t           t           | j                  S )Ndfr   r,   list[Expression]c                    t          j         fdD                       }rt          |digS t          |          }t	          t
          j        d |D                       }d |D             }t          | t          |di          gS )Nc              3  .   K   | ]} |          V  d S r/   rT   )rV   eru   s     r2   r]   z;DuckDBNamespace.concat_str.<locals>.func.<locals>.<genexpr>m   s+      <R<RqQQrUU<R<R<R<R<R<Rr4   rq   c              3  >   K   | ]}|                                 V  d S r/   )isnull)rV   ss     r2   r]   z;DuckDBNamespace.concat_str.<locals>.func.<locals>.<genexpr>q   s*      -G-GQahhjj-G-G-G-G-G-Gr4   c              3  J   K   | ]}|                     t                    V  d S r/   )castVARCHAR)rV   cs     r2   r]   z;DuckDBNamespace.concat_str.<locals>.func.<locals>.<genexpr>r   s,      66Aw666666r4   )r   from_iterabler   tupler   operatoror_r   )ru   cols	null_maskcols_strrL   rr   rq   s   `   r2   funcz(DuckDBNamespace.concat_str.<locals>.funcl   s    ).)<<R<R<R<RE<R<R<R)R)RD @"D>I>>??;;Dx|-G-G$-G-G-GHHI66666H)Z%OY%O%OPPQQr4   callevaluate_output_namesalias_output_namesr+   ru   r   r,   rv   )r;   r   r   r0   )r1   rq   rr   rL   r   s    ``` r2   r   zDuckDBNamespace.concat_stri   sj    	R 	R 	R 	R 	R 	R 	R 	R zz"?"G95AM	  
 
 	
r4   c                0    dd} | j         j        |g|R  S )Nr   Iterable[Expression]r,   r	   c                    t          |           } t          t          j        d | D                       }t          t          j        d | D                       }||z  S )Nc              3  P   K   | ]!}t          |t          d                     V  "dS )r   N)r   r   rV   cols     r2   r]   z@DuckDBNamespace.mean_horizontal.<locals>.func.<locals>.<genexpr>   s3      )X)XC*:3A*G*G)X)X)X)X)X)Xr4   c              3  x   K   | ]5}|                                                     t          j                  V  6d S r/   )	isnotnullr~   r   BIGINTr   s     r2   r]   z@DuckDBNamespace.mean_horizontal.<locals>.func.<locals>.<genexpr>   s;      ZZcs}}33M4HIIZZZZZZr4   )r   r   r   add)r   totalcounts      r2   r   z-DuckDBNamespace.mean_horizontal.<locals>.func}   s`    ;;D8<)X)XSW)X)X)XYYEZZUYZZZ E 5= r4   )r   r   r,   r	   )r;   _from_elementwise_horizontal_op)r1   rL   r   s      r2   mean_horizontalzDuckDBNamespace.mean_horizontal|   s5    	! 	! 	! 	! :tz9$GGGGGr4   r'   dtypeIntoDType | Nonec                f     d fddfd}                      |d	 d  j        
          S )Nru   r   r,   rv   c                   t          t                    rsd}t          |          t          | j                  }9t          j        |          }t                                        |          gS t                    gS )Nz5Cannot create an empty struct type for DuckDB backend)	
isinstancedictNotImplementedErrorr   rg   r   r0   r   r~   )ru   rm   tztargetr   r1   rD   s       r2   r   z!DuckDBNamespace.lit.<locals>.func   s    %&& /u /M)#...!"),,B 1%KKE

//00JJ<r4   _window_inputsWindowInputs[Expression]c                     |           S r/   rT   )ru   r   r   s     r2   window_funcz(DuckDBNamespace.lit.<locals>.window_func   s     488Or4   c                    dgS )NliteralrT   _dfs    r2   rc   z%DuckDBNamespace.lit.<locals>.<lambda>   s    yk r4   )r   r   r+   r   )ru   r   r   r   r,   rv   r;   r0   )r1   rD   r   r   r   s   ``` @r2   r   zDuckDBNamespace.lit   s}    		  		  		  		  		  		  		  		 	 	 	 	 	 	
 zz"9"9#M  
 
 	
r4   c                H    dd}|                      |d d | j                  S )	Nr   r   r,   rv   c                "    t          d          gS )Nr   )r   r   s    r2   r   z!DuckDBNamespace.len.<locals>.func   s    gJJ<r4   c                    dgS )NlenrT   r   s    r2   rc   z%DuckDBNamespace.len.<locals>.<lambda>   s    ug r4   r   )r   r   r,   rv   r   )r1   r   s     r2   r   zDuckDBNamespace.len   sD    	  	  	  	  zz"5"5#M	  
 
 	
r4   abmethodr%   c                   |dk    rd}t          |          d	fd}|                     |t                    t                    | j                  S )
Npearsonz3Only 'pearson' correlation is supported for DuckDB.ru   r   r,   rv   c                |    |                                }|                                }t          d||          gS )Ncorr)_evaluate_single_output_exprr   )ru   a_b_r   r   s      r2   r   z"DuckDBNamespace.corr.<locals>.func   s>    0033B0033Bfb"%%&&r4   r   r   )r   r;   r   r   r0   )r1   r   r   r   rm   r   s    ``   r2   r   zDuckDBNamespace.corr   s     YGC%c***	' 	' 	' 	' 	' 	' 	'
 zz"?1"E"E9!Q??M	  
 
 	
r4   )r^      c                l    | j         }dfd}|                     |t           t           |          S )Nru   r   r,   rv   c                      fdD             }d                     d |                                D                       }t          d| d          gS )Nc           
     n    i | ]1}t           |          gt          |g           R  D ]	\  }}}||
2S rT   )r   r   )rV   exprnative_expr_aliasru   s        r2   
<dictcomp>z8DuckDBNamespace.struct.<locals>.func.<locals>.<dictcomp>   sv     7 7 7-7DHH.@r2NN. . .7 7 *KE {7 7 7 7r4   z, c              3  ,   K   | ]\  }}d | d| V  dS )"z" := NrT   )rV   r?   r   s      r2   r]   z7DuckDBNamespace.struct.<locals>.func.<locals>.<genexpr>   sH       # #)2s$D$$s$$# # # # # #r4   zstruct_pack())joinrO   r   )ru   names_to_cols
field_argsrL   s   `  r2   r   z$DuckDBNamespace.struct.<locals>.func   s    7 7 7 7!7 7 7M  # #6C6I6I6K6K# # #  J ##?*#?#?#?@@AAr4   r   r   )r0   r;   r   r   )r1   rL   r+   r   s    `  r2   structzDuckDBNamespace.struct   sa    -	B 	B 	B 	B 	B 	B zz"?"G95A	  
 
 	
r4   )r+   r#   r,   r-   )r,   r   )r,   r9   )r,   r<   )r?   r@   rA   r	   r,   r	   )rD   r   r,   r	   r/   )rG   r	   rD   r	   rH   rI   r,   r	   )rL   r	   r,   r	   )rO   rP   rQ   r$   r,   r   )rL   r   rq   r@   rr   rs   r,   r   )rL   r   r,   r   )rD   r'   r   r   r,   r   )r,   r   )r   r   r   r   r   r%   r,   r   )__name__
__module____qualname__r   DUCKDBr*   __annotations__r3   propertyr8   r;   r>   rC   rF   rK   rN   rp   r   r   r   r   r   r   backend_versionr   rT   r4   r2   r)   r)   -   s         '5&;O;;;;        < < < X<    X    X% % % %    (,	; ; ; ; ;( ( ( (' ' ' '*
 
 
 
&	H 	H 	H 	H
 
 
 
2	
 	
 	
 	

 
 
 
& Xf%%
 
 
 &%
 
 
r4   r)   r!   )5
__future__r   r   	functoolsr   	itertoolsr   typingr   r   rh   r   r	   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals._duckdb.selectorsr   narwhals._duckdb.utilsr   r   r   r   r   r   r   r   r   narwhals._expression_parsingr   r   r   narwhals._sql.namespacer   narwhals._utilsr   r   r   collections.abcr   r    r!   narwhals._compliant.windowr"   r#   narwhals.typingr$   r%   r&   r'   r   r)   rT   r4   r2   <module>r      sV   " " " " " "              % % % % % % % %  / / / / / / / / 6 6 6 6 6 6 , , , , , , > > > > > >
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
         
 1 0 0 0 0 0 @ @ @ @ @ @ @ @ @ @ Z11111111''''''777777''''''YYYYYYYYYYYY

g
 g
 g
 g
 g
*.@*LMg
 g
 g
 g
 g
r4   