o
    hK                     @  sV  d dl 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	 d dlm
Z
 d dlmZ d d	l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 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r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!l0m1Z1 d d"l2m3Z3 d d#l4m5Z5 d d$l6m7Z7 d d%l8m9Z9 d d&lm:Z: d d'lm;Z; d d(lm<Z< d d)lm=Z= e>e? d d*lm@Z@ W d   n	1 sw   Y  G d+d, d,ed- ZAdS ).    )annotationsN)reduce)and_)TYPE_CHECKING)Any)Iterator)Mapping)Sequence)FunctionExpression)StarExpressioncol)evaluate_exprs)generate_partition_by_sql)lit)native_to_narwhals_dtype
get_duckdb)ColumnNotFoundError)InvalidOperationError)CompliantDataFrame)CompliantLazyFrame)Implementation)Version)generate_temporary_column_name)import_dtypes_module)not_implemented)parse_columns_to_drop)parse_version)validate_backend_version)
ModuleType)Self)TypeIs)
DuckDBExprDuckDBGroupByDuckDBNamespaceDuckDBInterchangeSeries)DType)AsofJoinStrategy)JoinStrategy)LazyUniqueKeepStrategy)_FullContext)SQLExpressionc                   @  s  e Zd ZejZdd	d
ZedddZe	dddZ
dddZdddZdddZdddZdd#d$Zdd&d'Zdd-d.Zdd1d2Zdd4d5Zdd8d9Zdd:d;Zdd@dAZdBdCddEdFZddGdHZddJdKZeddMdNZeddPdQZddSdTZddVdWZddXdYZddZd[Z dd_d`Z!ddcddZ"ddldmZ#ddsdtZ$ddudvZ%ddzd{Z&dddZ'dddZ(dddZ)dddZ*e+,dZ-e+,dZ.e+ Z/dBS )DuckDBLazyFramedfduckdb.DuckDBPyRelationbackend_versiontuple[int, ...]versionr   returnNonec                C  s0   || _ || _|| _d | _d | _t| j| j d S N)_native_frame_version_backend_version_cached_schema_cached_columnsr   _implementation)selfr1   r3   r5    r@   N/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_duckdb/dataframe.py__init__<   s   zDuckDBLazyFrame.__init__objduckdb.DuckDBPyRelation | AnyTypeIs[duckdb.DuckDBPyRelation]c                 C  s   t | tjS r8   )
isinstanceduckdbDuckDBPyRelation)rC   r@   r@   rA   
_is_nativeJ   s   zDuckDBLazyFrame._is_nativedatacontextr.   r!   c               C  s   | ||j |jdS Nr3   r5   )r;   r:   )clsrJ   rK   r@   r@   rA   from_nativeN   s   
zDuckDBLazyFrame.from_nativec                 C  s   | j tjurd}t|| S )Nz=__narwhals_dataframe__ is not implemented for DuckDBLazyFrame)r:   r   V1AttributeError)r?   msgr@   r@   rA   __narwhals_dataframe__V   s   z&DuckDBLazyFrame.__narwhals_dataframe__c                 C  s   | S r8   r@   r?   r@   r@   rA   __narwhals_lazyframe__]   s   z&DuckDBLazyFrame.__narwhals_lazyframe__r    c                 C  s   t  S r8   r   rT   r@   r@   rA   __native_namespace__`      z$DuckDBLazyFrame.__native_namespace__r'   c                 C  s   ddl m} || j| jdS )Nr   r&   rM   )narwhals._duckdb.namespacer'   r;   r:   )r?   r'   r@   r@   rA   __narwhals_namespace__c   s   z&DuckDBLazyFrame.__narwhals_namespace__namestrr)   c                 C  s"   ddl m} || j|| jdS )Nr   r(   )r5   )narwhals._duckdb.seriesr)   nativeselectr:   )r?   rZ   r)   r@   r@   rA   
get_columnj   s   zDuckDBLazyFrame.get_columnIterator[duckdb.Expression]c                 c  s    | j D ]}t|V  qd S r8   )columnsr   )r?   rZ   r@   r@   rA   _iter_columnso   s   
zDuckDBLazyFrame._iter_columnsbackend(ModuleType | Implementation | str | Nonekwargsr   !CompliantDataFrame[Any, Any, Any]c           
      K  s   |d u s	|t ju r!dd l}ddlm} || j t|| jddS |t j	u r@dd l
}ddlm} || j t j	t|| jddS |t ju r\dd l}ddlm} || j t|| jdS d	| }	t|	)
Nr   )ArrowDataFrameT)r3   r5   validate_column_names)PandasLikeDataFrame)implementationr3   r5   rh   )PolarsDataFramerM   zUnsupported `backend` value: )r   PYARROWpyarrownarwhals._arrow.dataframerg   r]   arrowr   r:   PANDASpandasnarwhals._pandas_like.dataframeri   r1   POLARSpolarsnarwhals._polars.dataframerk   pl
ValueError)
r?   rc   re   parg   pdri   rv   rk   rR   r@   r@   rA   collects   s6   


zDuckDBLazyFrame.collectnintc                 C  s   |  | j|S r8   )_with_nativer]   limit)r?   r{   r@   r@   rA   head      zDuckDBLazyFrame.headcolumn_namesc                 G  s   |  | jj| S r8   )r}   r]   r^   )r?   r   r@   r@   rA   simple_select   r   zDuckDBLazyFrame.simple_selectexprsr#   c                 G  s,   dd t | g|R  D }| | j|S )Nc                 S  s   g | ]	\}}| |qS r@   alias.0rZ   valr@   r@   rA   
<listcomp>   s    z-DuckDBLazyFrame.aggregate.<locals>.<listcomp>)r   r}   r]   	aggregater?   r   	selectionr@   r@   rA   r      s   zDuckDBLazyFrame.aggregatec                 G  s,   dd t | g|R  D }| | jj| S )Nc                 s      | ]
\}}| |V  qd S r8   r   r   r@   r@   rA   	<genexpr>       z)DuckDBLazyFrame.select.<locals>.<genexpr>)r   r}   r]   r^   r   r@   r@   rA   r^      s   zDuckDBLazyFrame.selectra   Sequence[str]strictboolc                  s4   t | ||d  fdd| jD }| | jj| S )N)ra   r   c                 3  s    | ]	}| vr|V  qd S r8   r@   r   rZ   columns_to_dropr@   rA   r          z'DuckDBLazyFrame.drop.<locals>.<genexpr>)r   ra   r}   r]   r^   )r?   ra   r   r   r@   r   rA   drop   s   zDuckDBLazyFrame.dropN)rc   Implementation | Nonec                C  s   |d ur
d}t || S )Nz.`backend` argument is not supported for DuckDB)rw   )r?   rc   rR   r@   r@   rA   lazy   s   zDuckDBLazyFrame.lazyc                   sR   t t| g|R    fdd| jD }|dd   D  | | jj| S )Nc                   s,   g | ]}| v r  ||nt|qS r@   )popr   r   r   new_columns_mapr@   rA   r      s    z0DuckDBLazyFrame.with_columns.<locals>.<listcomp>c                 s  r   r8   r   )r   rZ   valuer@   r@   rA   r      r   z/DuckDBLazyFrame.with_columns.<locals>.<genexpr>)dictr   ra   extenditemsr}   r]   r^   )r?   r   resultr@   r   rA   with_columns   s   
zDuckDBLazyFrame.with_columns	predicatec                 C  s   || d }|  | j|S )Nr   )r}   r]   filter)r?   r   maskr@   r@   rA   r      s   zDuckDBLazyFrame.filterdict[str, DType]c                   s2    j d u r fddt jj jjD  _  j S )Nc                   s   i | ]\}}|t | jqS r@   )r   r:   )r   column_nameduckdb_dtyperT   r@   rA   
<dictcomp>   s    z*DuckDBLazyFrame.schema.<locals>.<dictcomp>)r<   zipr]   ra   typesrT   r@   rT   rA   schema   s   

zDuckDBLazyFrame.schema	list[str]c                 C  s.   | j d u r| jd urt| jn| jj| _ | j S r8   )r=   r<   listr   r]   ra   rT   r@   r@   rA   ra      s   


zDuckDBLazyFrame.columnspd.DataFramec                 C  s2   dd l }t|dkr| j S d|j }t|)Nr   )   r   r   z3Conversion to pandas requires pandas>=1.0.0, found )rq   r   r]   r1   __version__NotImplementedError)r?   ry   rR   r@   r@   rA   	to_pandas   s
   
zDuckDBLazyFrame.to_pandaspa.Tablec                 C  s
   | j  S r8   )r]   ro   rT   r@   r@   rA   to_arrow   s   
zDuckDBLazyFrame.to_arrowc                 C  s   | j | j|| jdS )N)r5   r3   )	__class__r]   r;   )r?   r5   r@   r@   rA   _with_version      
zDuckDBLazyFrame._with_versionc                 C  s   | j || j| jdS rL   )r   r;   r:   )r?   r1   r@   r@   rA   r}      r   zDuckDBLazyFrame._with_nativekeysdrop_null_keysr%   c                G  s   ddl m} || ||dS )Nr   r$   )r   )narwhals._duckdb.group_byr%   )r?   r   r   r%   r@   r@   rA   group_by   s   zDuckDBLazyFrame.group_bymappingMapping[str, str]c                   s,   | j } fdd|jD }| | j j| S )Nc                 3  s2    | ]}| v rt | | nt |V  qd S r8   )r   r   r   r   r@   rA   r     s
     
z)DuckDBLazyFrame.rename.<locals>.<genexpr>)r]   ra   r}   r^   )r?   r   r1   r   r@   r   rA   rename  s
   
zDuckDBLazyFrame.renameotherhowr,   left_onSequence[str] | Noneright_onsuffixc                C  s  |dkrdn|}|dkr)| j dk rd| j  }t|| jd|jd}n+|d us/J |d us5J dd	 t||D }	tt|	}
| jdj|jd|
|d
}|dv rdd | j	D }|j	D ]I}|| j	v }|dkr||s||
td| d qc|dks|r|d u s||vr|
td| d| |  qc|d u s||vr|
t| qc|j| | jj}n
|d| jj}| |S )Nfulloutercross)r   r      z9DuckDB>=1.1.4 is required for cross-join, found version: lhsrhsc                 s  4    | ]\}}t d | dt d| dkV  qdS lhs.""rhs."Nr   r   leftrightr@   r@   rA   r     
    
z'DuckDBLazyFrame.join.<locals>.<genexpr>)	conditionr   >   r   r   innerr   c                 S  s   g | ]
}t d | dqS )r   r   r   r   xr@   r@   rA   r   *  s    z(DuckDBLazyFrame.join.<locals>.<listcomp>r   r   lhs.*)r;   r   r]   	set_aliasr   r   r   r   joinra   appendr   r   r^   r}   )r?   r   r   r   r   r   
native_howrR   relitr   r^   rZ   
col_in_lhsresr@   r@   rA   r   	  sD   	




&
zDuckDBLazyFrame.join
str | Noneby_leftby_rightstrategyr+   c             	   C  sZ  | j }|j }	g }
|d ur|d ur|
dd t||D  ng  }}|dkr:|
td| dtd| dk n|dkrR|
td| dtd| dk nd}t|tt|
}d	g}|	jD ]5}||jv r|d u su||h|vr|d| d
| | d qc|d u s||h|vr|t	t| qcdd
| d| d}| t|S )Nc                 s  r   r   r   r   r@   r@   rA   r   J  r   z,DuckDBLazyFrame.join_asof.<locals>.<genexpr>backwardr   r   r   forwardzKOnly 'backward' and 'forward' strategies are currently supported for DuckDBr   z" as "z
            SELECT ,zD
            FROM lhs
            ASOF LEFT JOIN rhs
            ON z
            )r]   r   r   r   r   r   r   r   ra   r[   r   r}   rG   sql)r?   r   r   r   r   r   r   r   r   r   
conditionsrR   r   r^   rZ   queryr@   r@   rA   	join_asof;  s:   

((


zDuckDBLazyFrame.join_asofc                 C  s   | j S r8   )r   rT   r@   r@   rA   collect_schemaj  rW   zDuckDBLazyFrame.collect_schemasubsetkeepr-   c                  s:  |dkr|n|p
 j  }r jdk rd}t|t fdd|D r7dt| j  d j  d}t|td	 j }td	g  j |}t| }|d
krQ|n|}t	t
d d| d|}	t	t
dt  d| d|}
  jt |	|
t|tdkt||gdS   jd j S )Nany)r      zZAt least version 1.3 of DuckDB is required for `unique` operation
with `subset` specified.c                 3  s    | ]}| j vV  qd S r8   ra   r   rT   r@   rA   r   x  s    z)DuckDBLazyFrame.unique.<locals>.<genexpr>zColumns z not found in .   none
row_numberz over ()countr   )exclude, )ra   r;   r   r   set
differencer   r   r   r/   r
   r   r   r}   r]   r^   r   r   r   uniquer   )r?   r   r   subset_rR   idx_name
count_namepartition_by_sqlrZ   idx_expr
count_exprr@   rT   rA   r   m  s8   
 zDuckDBLazyFrame.uniqueby
descendingbool | Sequence[bool]
nulls_lastc                G  sX   t |tr|gt| }|rdd t||D }n
dd t||D }| | jj| S )Nc                 s  4    | ]\}}|st | nt |  V  qd S r8   )r   r  descr   rZ   r
  r@   r@   rA   r     r   z'DuckDBLazyFrame.sort.<locals>.<genexpr>c                 s  r	  r8   )r   nulls_firstr
  r  r@   r@   rA   r     r   )rF   r   lenr   r}   r]   sort)r?   r  r  r  r   r@   r@   rA   r    s   
zDuckDBLazyFrame.sortc                 C  s8   |d ur|n| j }ttdd |D }| | j|S )Nc                 s  s    | ]	}t | V  qd S r8   )r   	isnotnullr   r@   r@   rA   r     r   z-DuckDBLazyFrame.drop_nulls.<locals>.<genexpr>)ra   r   r   r}   r]   r   )r?   r   r   keep_conditionr@   r@   rA   
drop_nulls  s   zDuckDBLazyFrame.drop_nullsc                   s   t | j}|  }D ]}|| }||jkr d| d}t|qtdkr-d}t|td  | j}| j	} 
 td @ tdk}	||	j fdd|D  }
||	 jfd	d|D  }| |
|S )
Nz-`explode` operation not supported for dtype `z`, expected List typer   zExploding on multiple columns is not supported with DuckDB backend since we cannot guarantee that the exploded columns have matching element counts.r   r  c                 3  s,    | ]}|v rt d  |n|V  qdS )unnestN)r
   r   r   col_to_explodera   r@   rA   r     s    
z*DuckDBLazyFrame.explode.<locals>.<genexpr>c                 3  s*    | ]}| v rt d |n|V  qd S r8   )r   r   r   r   r@   rA   r     s
    
)r   r:   r   Listr   r  r   r   r]   ra   r  r
   r   r   r^   r}   union)r?   ra   dtypesr   rZ   dtyperR   r   original_columnsnot_null_conditionnon_null_relnull_relr@   r  rA   explode  s@   



	
zDuckDBLazyFrame.explodeonindexvariable_name
value_namec           
        s   |d u rg n| |d u r fdd| j D n|}|dkr"d}t||dkr,d}t|ddd |D }| j}d	| d
| d| d}	| t|	jg  || S )Nc                   s   g | ]}| vr|qS r@   r@   )r   cindex_r@   rA   r     s    z+DuckDBLazyFrame.unpivot.<locals>.<listcomp> z:`variable_name` cannot be empty string for duckdb backend.z7`value_name` cannot be empty string for duckdb backend.r   c                 s  s    | ]	}t t|V  qd S r8   )r[   r   r   r@   r@   rA   r     r   z*DuckDBLazyFrame.unpivot.<locals>.<genexpr>z(
            unpivot rel
            on z(
            into
                name "z"
                value "z"
            )ra   r   r   r]   r}   rG   r   r^   )
r?   r  r  r   r!  on_rR   
unpivot_onr   r   r@   r#  rA   unpivot  s(    zDuckDBLazyFrame.unpivotzO`LazyFrame.gather_every` is deprecated and will be removed in a future version.zG`LazyFrame.tail` is deprecated and will be removed in a future version.)r1   r2   r3   r4   r5   r   r6   r7   )rC   rD   r6   rE   )rJ   r2   rK   r.   r6   r!   )r6   r!   )r6   r    )r6   r'   )rZ   r[   r6   r)   )r6   r`   )rc   rd   re   r   r6   rf   )r{   r|   r6   r!   )r   r[   r6   r!   )r   r#   r6   r!   )ra   r   r   r   r6   r!   )rc   r   r6   r!   )r   r#   r6   r!   )r6   r   )r6   r   )r6   r   )r6   r   )r5   r   r6   r!   )r1   r2   r6   r!   )r   r[   r   r   r6   r%   )r   r   r6   r!   )r   r!   r   r,   r   r   r   r   r   r[   r6   r!   )r   r!   r   r   r   r   r   r   r   r   r   r+   r   r[   r6   r!   )r   r   r   r-   r6   r!   )r  r[   r  r  r  r   r6   r!   )r   r   r6   r!   )ra   r   r6   r!   )
r  r   r  r   r   r[   r!  r[   r6   r!   )0__name__
__module____qualname__r   DUCKDBr>   rB   staticmethodrI   classmethodrO   rS   rU   rV   rY   r_   rb   rz   r   r   r   r^   r   r   r   r   propertyr   ra   r   r   r   r}   r   r   r   r   r   r   r  r  r  r(  r   
deprecatedgather_everytailwith_row_indexr@   r@   r@   rA   r0   9   s^    








*







	







2
/




,!
r0   )r#   r2   )B
__future__r   
contextlib	functoolsr   operatorr   typingr   r   r   r   r	   rG   r
   r   narwhals._duckdb.utilsr   r   r   r   r   narwhals.dependenciesr   narwhals.exceptionsr   r   narwhals.typingr   r   narwhals.utilsr   r   r   r   r   r   r   r   r   r    rq   ry   rm   rx   typing_extensionsr!   r"   narwhals._duckdb.exprr#   r   r%   rX   r'   r\   r)   narwhals.dtypesr*   r+   r,   r-   r.   suppressImportErrorr/   r0   r@   r@   r@   rA   <module>   sb    