
    gU-                    `   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r6d dlmZ d dl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+  G d d      Z,y)    )annotations)chain)TYPE_CHECKING)Any)Iterable)Literal)Sequence)native_to_narwhals_dtype)parse_exprs_and_named_exprs
get_duckdb)ColumnNotFoundError)Implementation)Version)flatten)generate_temporary_column_name)parse_columns_to_drop)parse_version)validate_backend_version)
ModuleTypeN)Self)
DuckDBExprDuckDBGroupByDuckDBNamespaceDuckDBInterchangeSeries)DTypec                  n   e Zd Zej                  Z	 	 	 	 	 	 	 	 ddZd dZd dZd!dZ	d"dZ
d#dZd dZd$dZ	 	 	 	 	 	 	 	 d%d	Zd&d
Zd'dZ	 	 	 	 	 	 	 	 d%dZd(dZed)d       Zed*d       Zd+dZd,dZd-dZd.dZd/dZd0dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d1dZd)dZd2dZddd	 	 	 	 	 	 	 	 	 	 	 d3dZy)4DuckDBLazyFramec               n    || _         || _        || _        t        | j                  | j                         y N)_native_frame_version_backend_versionr   _implementation)selfdfbackend_versionversions       O/var/www/openai/venv/lib/python3.12/site-packages/narwhals/_duckdb/dataframe.py__init__zDuckDBLazyFrame.__init__(   s1     79 / !5!5t7L7LM    c                X    | j                   t        j                  urd}t        |      | S )Nz=__narwhals_dataframe__ is not implemented for DuckDBLazyFrame)r%   r   V1AttributeError)r(   msgs     r,   __narwhals_dataframe__z&DuckDBLazyFrame.__narwhals_dataframe__4   s'    ==

*QC %%r.   c                    | S r#    r(   s    r,   __narwhals_lazyframe__z&DuckDBLazyFrame.__narwhals_lazyframe__;       r.   c                    t               S r#   r   r6   s    r,   __native_namespace__z$DuckDBLazyFrame.__native_namespace__>   s
    |r.   c                J    ddl m}  || j                  | j                        S )Nr   r   r*   r+   )narwhals._duckdb.namespacer   r&   r%   )r(   r   s     r,   __narwhals_namespace__z&DuckDBLazyFrame.__narwhals_namespace__A   s!    > 114==
 	
r.   c                h    ddl m}  || j                  j                  |      | j                        S )Nr   r   )r+   )narwhals._duckdb.seriesr   r$   selectr%   )r(   itemr   s      r,   __getitem__zDuckDBLazyFrame.__getitem__H   s,    C&%%d+T]]
 	
r.   c                    	 dd l }ddlm}  || j                  j                         t        |j                        | j                        S # t        $ r}d}t        |      |d }~ww xY w)Nr   zfPyArrow>=11.0.0 is required to collect `LazyFrame` backed by DuckDcollect `LazyFrame` backed by DuckDB)ArrowDataFrame)native_dataframer*   r+   )	pyarrowModuleNotFoundErrornarwhals._arrow.dataframerE   r$   arrowr   __version__r%   )r(   paexcr2   rE   s        r,   collectzDuckDBLazyFrame.collectO   se    	4 
 	=!//557)"..9MM
 	
 # 	4zC%c*3	4s   A 	A(A##A(c                V    | j                  | j                  j                  |            S r#   )_from_native_framer$   limit)r(   ns     r,   headzDuckDBLazyFrame.head^   s$    &&t'9'9'?'?'BCCr.   c                   t        | g|i |}|s*| j                  | j                  j                  d            S t	        d |D              rzt	        d |j                         D              rZ| j                  | j                  j                  |j                         D cg c]  \  }}|j                  |       c}}            S | j                   | j                  j                  d |j                         D               S c c}}w )Nr   c              3  6   K   | ]  }t        |d d        yw_returns_scalarFNgetattr.0xs     r,   	<genexpr>z)DuckDBLazyFrame.select.<locals>.<genexpr>k   s     CUwq+U3U   c              3  6   K   | ]  }t        |d d        ywrV   rX   rZ   s     r,   r]   z)DuckDBLazyFrame.select.<locals>.<genexpr>k   s       L
:NQGA(%0:Nr^   c              3  D   K   | ]  \  }}|j                  |        y wr#   )alias)r[   colvals      r,   r]   z)DuckDBLazyFrame.select.<locals>.<genexpr>v   s     I1HXS##))C.1Hs    )
r   rP   r$   rQ   allvalues	aggregateitemsra   rA   )r(   exprsnamed_exprsnew_columns_maprb   rc   s         r,   rA   zDuckDBLazyFrame.selecta   s    
 6dRURkR**4+=+=+C+CA+FGGCUCC L
:E:L:L:NL
 I
 **"",,4C4I4I4KL4KSSYYs^4KL  &&%D%%I1F1F1HI
 	
	 Ms   !Dc                    t        | ||      fd| j                  D        }| j                   | j                  j                  |       S )N)compliant_framecolumnsstrictc              3  ,   K   | ]  }|vs|  y wr#   r5   )r[   rb   columns_to_drops     r,   r]   z'DuckDBLazyFrame.drop.<locals>.<genexpr>~   s     OLSC4NSLs   	)r   rm   rP   r$   rA   )r(   rm   rn   	selectionrp   s       @r,   dropzDuckDBLazyFrame.dropz   sJ    / '&
 PDLLO	&&'@t'9'9'@'@)'LMMr.   c                    | S r#   r5   r6   s    r,   lazyzDuckDBLazyFrame.lazy   r8   r.   c                   ddl m} t        | g|i |}g }| j                  j                  D ]M  }||v r0|j                  |j                  |      j                  |             7|j                   ||             O |j                         D ]%  \  }}|j                  |j                  |             ' | j                   | j                  j                  |       S )Nr   )ColumnExpression)duckdbrv   r   r$   rm   appendpopra   rg   rP   rA   )r(   rh   ri   rv   rj   resultrb   values           r,   with_columnszDuckDBLazyFrame.with_columns   s    
 	,5dRURkR%%--Co%o11#6<<SAB.s34	 .
 *//1JCMM%++c*+ 2&&'@t'9'9'@'@&'IJJr.   c                    | j                          j                  t        |fd|j                         D               }|j	                  |       d   }| j                  | j                  j                  |            S )Nc              3  L   K   | ]  \  }}j                  |      |k(    y wr#   )rb   )r[   namevplxs      r,   r]   z)DuckDBLazyFrame.filter.<locals>.<genexpr>   s%     VBUwtQ 2BUs   !$r   )r>   all_horizontalr   rg   _callrP   r$   filter)r(   
predicatesconstraintsexprmaskr   s        @r,   r   zDuckDBLazyFrame.filter   ss    ))+!s!!:V+BSBSBUVW
 zz$"&&t'9'9'@'@'FGGr.   c           
         t        | j                  j                  | j                  j                        D ci c]%  \  }}|t	        t        |      | j                        ' c}}S c c}}w r#   zipr$   rm   typesr
   strr%   r(   column_nameduckdb_dtypes      r,   schemazDuckDBLazyFrame.schema   sj     .1""**D,>,>,D,D.
.)\ 1#l2CT]]SS.
 	
 
   *A&c                .    | j                   j                  S r#   )r$   rm   r6   s    r,   rm   zDuckDBLazyFrame.columns   s    !!)))r.   c                    dd l }t        |j                        t        d      k\  r| j                  j	                         S d|j                   }t        |      )Nr   z1.0.0z3Conversion to pandas requires pandas>=1.0.0, found )pandasr   rK   r$   r)   NotImplementedError)r(   pdr2   s      r,   	to_pandaszDuckDBLazyFrame.to_pandas   sL    (M',BB%%((**GGWXC%c**r.   c                6    | j                   j                         S r#   )r$   rJ   r6   s    r,   to_arrowzDuckDBLazyFrame.to_arrow   s    !!''))r.   c                R    | j                  | j                  || j                        S )N)r+   r*   )	__class__r$   r&   )r(   r+   s     r,   _change_versionzDuckDBLazyFrame._change_version   s+    ~~AVAV  
 	
r.   c                R    | j                  || j                  | j                        S )Nr<   )r   r&   r%   )r(   r)   s     r,   rP   z"DuckDBLazyFrame._from_native_frame   s)    ~~ 5 5t}}  
 	
r.   c               T    ddl m} |rd}t        |       || t        |      |      S )Nr   r   todo)rl   keysdrop_null_keys)narwhals._duckdb.group_byr   r   list)r(   r   r   r   r2   s        r,   group_byzDuckDBLazyFrame.group_by   s0    ;C%c** tDz.
 	
r.   c                    | j                   }|j                  D cg c]  }||v r
| d||    n| }}| j                  |j                  dj	                  |                  S c c}w )N as , )r$   rm   rP   rA   join)r(   mappingr)   rb   rq   s        r,   renamezDuckDBLazyFrame.rename   sq    MOZZ
MWc#.se4~&cAZ 	 
 &&ryy91E'FGG
s   A#inner)howc               R   t        |t              r|g}t        |t              r|g}|dvrd}t        |      |J |J t        ||      D cg c]  \  }}d| d|  }	}}| j                  j
                  }
dj                  |	      }| j                  j                  d      j                  |j                  j                  d      ||      }| j                  j                  D cg c]  }d| 	 }}|j                  j                  D ]N  }|| j                  j                  v r||vr|j                  d	| d
| |        9||vs>|j                  |       P |j                  dj                  |            j                  |
      }| j                  |      S c c}}w c c}w )N)r   leftz2Only inner and left join is implemented for DuckDBzlhs.z = rhs.z and lhsrhs)	conditionr   zrhs.r   r   )
isinstancer   r   r   r$   ra   r   	set_aliasrm   rx   rA   rP   )r(   otherr   left_onright_onsuffixr2   r   right
conditionsoriginal_aliasr   relr\   rA   rb   ress                    r,   r   zDuckDBLazyFrame.join   s    gs#iGh$ zH''FC%c** """### <?w;Q
;QKD%d4&w';Q 	 
 ++11LL,	  **5166))%0I3 7 
 '+&8&8&@&@A&@D*&@A&&..Cd((000S5HSEcU6(;<H$c"	 / jj6*+55nE&&s++#
 Bs   F)F$c           
         t        | j                  j                  | j                  j                        D ci c]%  \  }}|t	        t        |      | j                        ' c}}S c c}}w r#   r   r   s      r,   collect_schemazDuckDBLazyFrame.collect_schema   sj     .1""**D,>,>,D,D.
.)\ 1#l2CT]]SS.
 	
 
r   c                  	 |dd l }| j                  	t        	fd|D              r@dt        |      j	                  	j
                         d	j
                   d}t        |      dt        d	j
                         d}dt        dg 	j
                  |       d}|dk(  rd	| d
}nd	| d
}ddj                  |       d| ddj                  |       d| d| d| d| d}| j                   |j                  |            S | j                  | j                  j                  dj                  | j
                                    S )Nr   c              3  :   K   | ]  }|j                   v  y wr#   )rm   )r[   r\   r   s     r,   r]   z)DuckDBLazyFrame.unique.<locals>.<genexpr>  s     8A1CKK's   zColumns z not found in ."   nonezwhere z=1zx
                with cte as (
                    select *,
                           row_number() over (partition by ,z) as z9,
                           count(*) over (partition by zR
                    from rel
                )
                select * exclude (r   z) from cte z
                )rw   r$   anyset
differencerm   r   r   r   rP   sqlunique)
r(   subsetkeeprw   r2   idx_name
count_namekeep_conditionqueryr   s
            @r,   r   zDuckDBLazyFrame.unique  sy   $$C888 V!7!7!D E^TWT_T_S``ab)#..9!S[[IJ!LH216N6NX6NOPPQR  v~#)*R!8#)(2!6< =@HHV<L;MUS[R\ ]88;8H7Izl [# $,*Bzl+nEU VE **:6::e+<==&&t'9'9'@'@4<<AX'YZZr.   F)
descending
nulls_lastc          	     @   t        g t        |g      |      }t        |t              r|gt        |      z  }|D cg c]  }|rdnd
 }}| j                  j                  dj                  fdt        ||      D                    }| j                  |      S c c}w )Ndesc r   c              3  H   K   | ]  \  }}r| d | dn| d | d  yw) z nulls lastz nulls firstNr5   )r[   rb   r   r   s      r,   r]   z'DuckDBLazyFrame.sort.<locals>.<genexpr>2  sJ       &B	T " e1TF+.5$|45 &Bs   ")	r   r   boollenr$   orderr   r   rP   )	r(   byr   r   more_byflat_byr\   descending_strrz   s	      `     r,   sortzDuckDBLazyFrame.sort$  s     4GRDM4G45j$'$G4J7ABz!A&2-zB##))HH &).%A		
 &&v.. Cs   BN)r)   zduckdb.DuckDBPyRelationr*   ztuple[int, ...]r+   r   returnNone)r   r   )r(   r   r   r   )r   r   )rB   r   r   r   )rR   intr   r   )r(   r   rh   r   ri   r   r   r   )r(   r   rm   	list[str]rn   r   r   r   )r   r   )r   r   r   r   r   r   )r   zdict[str, DType])r   r   )r(   r   r   zpd.DataFrame)r(   r   r   zpa.Table)r(   r   r+   r   r   r   )r(   r   r)   r   r   r   )r(   r   r   r   r   r   r   r   )r(   r   r   zdict[str, str]r   r   )r(   r   r   r   r   z:Literal['left', 'inner', 'outer', 'cross', 'anti', 'semi']r   str | list[str] | Noner   r   r   r   r   r   )r   zSequence[str] | Noner   r   r   r   )r(   r   r   zstr | Iterable[str]r   r   r   zbool | Sequence[bool]r   r   r   r   ) __name__
__module____qualname__r   DUCKDBr'   r-   r3   r7   r:   r>   rC   rN   rS   rA   rr   rt   r|   r   propertyr   rm   r   r   r   rP   r   r   r   r   r   r   r5   r.   r,   r!   r!   %   s   $++O
N#
N )	
N
 
N 

N


D


 
 
	
2NKKK K 
	K$H 
 
 * *+*



	
H KR	',',', H	',
 (', )', ', 
',R
[B -2 /// / *	/
 / 
/r.   r!   )-
__future__r   	itertoolsr   typingr   r   r   r   r	   narwhals._duckdb.utilsr
   r   narwhals.dependenciesr   narwhals.exceptionsr   narwhals.utilsr   r   r   r   r   r   r   r   r   rw   r   r   rG   rL   typing_extensionsr   narwhals._duckdb.exprr   r   r   r=   r   r@   r   narwhals.dtypesr   r!   r5   r.   r,   <module>r      sh    "        ; > , 3 ) " " 9 0 ( 3 &07:?%U/ U/r.   