o
    篪g"                     @  s   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Zd dlmZ d d	lmZ e	rRd d
lmZ d dlmZ d dlmZ d dlmZ G dd deZd/ddZd0ddZeddd1d%d&Zd2d)d*Zd3d-d.ZdS )4    )annotationsN)Enum)auto)	lru_cache)TYPE_CHECKING)Any)import_dtypes_module)isinstance_or_issubclass)DuckDBLazyFrame
DuckDBExpr)DType)Versionc                   @  s"   e Zd ZdZe Ze Ze ZdS )ExprKindzDescribe which kind of expression we are dealing with.

    Composition rule is:
    - LITERAL vs LITERAL -> LITERAL
    - TRANSFORM vs anything -> TRANSFORM
    - anything vs TRANSFORM -> TRANSFORM
    - all remaining cases -> AGGREGATION
    N)__name__
__module____qualname____doc__r   LITERALAGGREGATION	TRANSFORM r   r   R/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/narwhals/_duckdb/utils.pyr      s
    	
r   dfr
   objr   	expr_kindreturnc                C  sp   ddl m} t||r3|| }t|dkrd}t||d }|jtju r1|tj	u r1d}t||S t
|S )Nr   r      z^Multi-output expressions (e.g. `nw.all()` or `nw.col('a', 'b')`) not supported in this contextzMixing expressions which aggregate and expressions which don't
is not yet supported by the DuckDB backend. Once they introduce
duckdb.WindowExpression to their Python API, we'll be able to
support this.)narwhals._duckdb.exprr   
isinstance_calllenNotImplementedError
_expr_kindr   r   r   duckdbConstantExpression)r   r   r   r   column_resultsmsgcolumn_resultr   r   r   maybe_evaluate%   s   


r)   exprsr   named_exprsdict[str, duckdb.Expression]c          	      O  s   i }|D ]5}| | }|| }|jd ur||}t|t|kr1d| dt| d}t||t|| q| D ]\}}| | }t|dkrSd}t||d ||< q>|S )Nz!Internal error: got output names z, but only got z resultsr   z-Named expressions must return a single columnr   )	r    _evaluate_output_names_alias_output_namesr!   AssertionErrorupdatezipitems
ValueError)	r   r*   r+   native_resultsexprnative_series_listoutput_namesr'   	col_aliasr   r   r   parse_exprs_and_named_exprs<   s"   




r9      )maxsizeduckdb_dtypestrversionr   r   c                   s  t  | dkr  S | dkr  S | dkr  S | dkr$  S | dkr,  S | dkr4  S | dkr<  S | dkrD  S | d	krL 	 S | d
krT 
 S | dkr\  S | dkrd  S | dkrl  S | dkrt  S | dkr|  S | dkr  S | dkr  S | drtd|   fddttD S td|  }r t|dS td|  }r|d}|d}tdd td|D } jt||dS | dr  S   S )NHUGEINTBIGINTINTEGERSMALLINTTINYINTUHUGEINTUBIGINTUINTEGER	USMALLINTUTINYINTDOUBLEFLOATVARCHARDATE	TIMESTAMPBOOLEANINTERVALSTRUCTz(\w+)\s+(\w+)c                   s.   g | ]}  | d  t| d qS )r   r   )Fieldnative_to_narwhals_dtype).0idtypesmatchstruc_r>   r   r   
<listcomp>z   s    
z,native_to_narwhals_dtype.<locals>.<listcomp>z	(.*)\[\]$r   z(\w+)((?:\[\d+\])+)   c                 s  s    | ]}t |V  qd S )N)int)rS   valuer   r   r   	<genexpr>   s    z+native_to_narwhals_dtype.<locals>.<genexpr>z	\[(\d+)\])innershapezDECIMAL() r   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDateDatetimeBooleanDuration
startswithrefindallStructranger!   matchListrR   grouptupleArrayDecimalUnknown)r<   r>   match_duckdb_inner_typeduckdb_shaper^   r   rU   r   rR   R   sn   

	


rR   dtypeDType | type[DType]c                   s6  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}t|t| |jrt| dd}t| dd }d}t|t| |jrt| dd}d}t|t| |jrdS t| |jrt| j }| dS t| |jrd fdd| jD }d| dS t| |jr| j}ddd |D }| }	|D ]}
|	j}	q t|	 }| | S d|  }t|)Nz(Casting to Decimal is not supported yet.rI   rJ   INT128r@   rA   rB   rC   UINT128rE   rF   rG   rH   rK   rN   z#Categorical not supported by DuckDB	time_unitus	time_zonetodorL   z[]z, c                 3  s*    | ]}d |j  dt|j  V  qdS )"z" N)namenarwhals_to_native_dtyper   )rS   fieldr>   r   r   r\      s
    
z+narwhals_to_native_dtype.<locals>.<genexpr>zSTRUCT() c                 s  s    | ]	}d | dV  qdS )[]Nr   )rS   itemr   r   r   r\      s    zUnknown dtype: ) r   r	   rz   r"   ri   rj   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   rk   rn   Categoricalrm   getattrro   rl   rv   r   r]   rs   joinfieldsry   r^   r/   )r   r>   rV   r'   
_time_unit
_time_zoner]   r^   duckdb_shape_fmtinner_dtype_duckdb_innerr   r   r   r      s   



r   argsDuckDBExpr | Anyc                  G  s6   t dd | D rtjS tdd | D rtjS tjS )Nc                 s  s$    | ]}t |d tjtju V  qdS r#   N)r   r   r   rS   argr   r   r   r\          
z,n_ary_operation_expr_kind.<locals>.<genexpr>c                 s  s$    | ]}t |d tjtju V  qdS r   )r   r   r   r   r   r   r   r   r\      r   )allr   r   anyr   r   )r   r   r   r   n_ary_operation_expr_kind   s   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   )
__future__r   rq   enumr   r   	functoolsr   typingr   r   r$   narwhals.utilsr   r	   narwhals._duckdb.dataframer
   r   r   narwhals.dtypesr   r   r   r)   r9   rR   r   r   r   r   r   r   <module>   s,    


>D