o
    h$                     @  s&  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 erNd d
lmZ d dlmZ d dlmZ d dlmZ ejZ	 ejZ	 ejZ	 G dd dZddd>ddZd?ddZd@d$d%Zed&d'dAd)d*ZdBd-d.Z dCd0d1Z!dDd5d6Z"dEd<d=Z#dS )F    )annotations)	lru_cache)TYPE_CHECKING)Any)SequenceN)Version)import_dtypes_module)isinstance_or_issubclass)DuckDBPyType)DuckDBLazyFrame)
DuckDBExpr)DTypec                   @  s   e Zd ZdZdd	d
ZdS )WindowInputs)exprorder_bypartition_byr   duckdb.Expressionr   Sequence[str]r   returnNonec                 C  s   || _ || _|| _d S N)r   r   r   )selfr   r   r    r   J/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_duckdb/utils.py__init__#   s   
zWindowInputs.__init__N)r   r   r   r   r   r   r   r   )__name__
__module____qualname__	__slots__r   r   r   r   r   r       s    r    )	separatorexprsr   r    strr   c                 G  s.   | rt jdt| g|R  S t jdg|R  S )a  Concatenate many strings, NULL inputs are skipped.

    Wraps [concat] and [concat_ws] `FunctionExpression`(s).

    Arguments:
        exprs: Native columns.
        separator: String that will be used to separate the values of each column.

    Returns:
        A new native expression.

    [concat]: https://duckdb.org/docs/stable/sql/functions/char.html#concatstring-
    [concat_ws]: https://duckdb.org/docs/stable/sql/functions/char.html#concat_wsseparator-string-
    	concat_wsconcat)duckdbFunctionExpressionlit)r    r!   r   r   r   
concat_str.   s
   r(   dfr   r   #list[tuple[str, duckdb.Expression]]c                G  sx   g }|D ]5}| | }|| }|jd ur||}t|t|kr1d| dt| d}t||t|| q|S )Nz!Internal error: got output names z, but only got z results)_call_evaluate_output_names_alias_output_nameslenAssertionErrorextendzip)r)   r!   native_resultsr   native_series_listoutput_namesmsgr   r   r   evaluate_exprsD   s   



r6   duckdb_dtyper
   versionr   r   c           	        s   | j }t |dkr t| jdS |dkr)| j}  fdd|D S |dkre| j\}}|d g}|d j dkrT|d j\}}|d|d  |d j dks>t|d d} j|t	|d	S |d
krv| jd d } j
|dS t|S )Nlistr8   structc                   s*   g | ]} j |d  t|d ddqS )r      r:   )namedtype)Fieldnative_to_narwhals_dtype).0childdtypesr8   r   r   
<listcomp>_   s    z,native_to_narwhals_dtype.<locals>.<listcomp>arrayr<   r   )innershapeenum)
categories)idr   Listr@   rB   childrenStructinsertArraytupleEnum$_non_nested_native_to_narwhals_dtype)	r7   r8   duckdb_dtype_idrM   rB   sizerH   rG   rJ   r   rC   r   r@   T   s0   



r@      )maxsizerT   c                 C  s   t |}i d| d| d| d| d| d| d| d| d	|	 d
|
 d| d| d| d| d| d|jddd| | | | | d| | S )Nhugeintbigintintegersmallinttinyintuhugeintubigintuinteger	usmallintutinyintdoublefloatvarchardate	timestampztimestamp with time zoneUTC)	time_zoneboolean)intervaldecimaltimeblob)r   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDateDatetimeBooleanDurationDecimalTimeBinarygetUnknown)rT   r8   rD   r   r   r   rS   z   sV   	
rS   r>   DType | type[DType]c                   s  t  }t| |jrd}t|t| |jrdS t| |jr dS t| |jr(dS t| |jr0dS t| |jr8dS t| |j	r@dS t| |j
rHdS t| |jrPd	S t| |jrXd
S t| |jr`dS t| |jrhdS t| |jrpdS t| |jrxdS t| |jrdS t| |jrdS t| |jrdS t| |jrd}t|t| |jrɈ tju rd}t|t| |jrdd| j d }d| dS d}t|t| |jr| j}| j}d}t|t| |jr| j}d}t|t| |j rdS t| |j!rt"| j# }| dS t| |j$rd fdd| j%D }d| dS t| |j&rH| j'}d d!d |D }	| }
|D ]}|
j#}
q6t"|
 }| |	 S d"|  }t(|)#Nz(Casting to Decimal is not supported yet.DOUBLEFLOATINT128BIGINTINTEGERSMALLINTTINYINTUINT128UBIGINTUINTEGER	USMALLINTUTINYINTVARCHARBOOLEANTIMEBLOBz#Categorical not supported by DuckDBz9Converting to Enum is not supported in narwhals.stable.v1'z', 'zENUM ()z9Can not cast / initialize Enum without categories presenttodoDATEz[], c                 3  s*    | ]}d |j  dt|j  V  qdS )"z" N)r=   narwhals_to_native_dtyper>   )rA   fieldr:   r   r   	<genexpr>   s
    
z+narwhals_to_native_dtype.<locals>.<genexpr>zSTRUCT(r   c                 s  s    | ]	}d | dV  qdS )[]Nr   )rA   itemr   r   r   r      s    zUnknown dtype: ))r   r	   r   NotImplementedErrorrx   ry   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rz   r}   r   r   CategoricalrR   r   V1
isinstancejoinrJ   
ValueErrorr|   	time_unitrh   r~   r{   rL   r   rG   rN   fieldsrP   rH   r/   )r>   r8   rD   r5   rJ   
_time_unit
_time_zonerG   rH   duckdb_shape_fmtinner_dtype_duckdb_innerr   r:   r   r      s   




r   r   c                  G  s&   | sdS d dd | D }d| S )Nr   r   c                 S  s   g | ]}t | qS r   colrA   xr   r   r   rE      s    z-generate_partition_by_sql.<locals>.<listcomp>zpartition by r   )r   by_sqlr   r   r   generate_partition_by_sql   s   
r   r   	ascendingboolc                 G  s8   | rd dd |D }n
d dd |D }d| S )Nr   c                 S     g | ]	}t | d qS )z asc nulls firstr   r   r   r   r   rE          z)generate_order_by_sql.<locals>.<listcomp>c                 S  r   )z desc nulls lastr   r   r   r   r   rE      r   z	order by r   )r   r   r   r   r   r   generate_order_by_sql   s   
r   objr   valid_types	type[Any]r   c                 G  s@   t | |sddd |D }d|dt| j}t|d S )Nz | c                 s  s    | ]}|j V  qd S r   )r   )rA   tpr   r   r   r      s    zensure_type.<locals>.<genexpr>z	Expected z, got: )r   r   typer   	TypeError)r   r   tp_namesr5   r   r   r   ensure_type   s
   
r   )r!   r   r    r"   r   r   )r)   r   r!   r   r   r*   )r7   r
   r8   r   r   r   )rT   r"   r8   r   r   r   )r>   r   r8   r   r   r"   )r   r"   r   r"   )r   r"   r   r   r   r"   )r   r   r   r   r   r   )$
__future__r   	functoolsr   typingr   r   r   r%   narwhals.utilsr   r   r	   duckdb.typingr
   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   ColumnExpressionr   ConstantExpressionr'   CaseExpressionwhenr   r(   r6   r@   rS   r   r   r   r   r   r   r   r   <module>   s<    

&

R
