o
    Lh25                     @  s  U 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mZmZ d dlmZ ered dlmZm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 d dlmZmZ ddddddddddd
Z dddZ!dddZ"ej#Z$	 ej%Z&	 ej'Z(	 ej)Z*	 dd dqd&d'Z+drd,d-Z,G d.d/ d/Z-dsd6d7Z.dtd:d;Z/ed<d=dud?d@Z0ej1j2Z2i e2j3ej4e2j5ej6e2j7ej8e2j9ej:e2j;ej<e2j=ej>e2j?ej@e2jAejBe2jCejDe2jEejFe2jGejHe2jIe	dAe2jJejKe2jLejMe2jNejOe2jPejQe2jRe	dBZSdCeTdD< ejUejVejWejXdEZYdFeTdG< e2jZe2j[fZ\dvdJdKZ]dwdNdOZ^dxdQdRZ_dydWdXZ`	Y	Y		dzdddZd[d{dddeZad|dkdlZbd}dodpZcdS )~    )annotations)	lru_cache)TYPE_CHECKINGN)DuckDBPyType)Versionisinstance_or_issubclass
zip_strict)ColumnNotFoundError)MappingSequence)DuckDBPyRelation
Expression)CompliantLazyFrameAny)DuckDBLazyFrame)
DuckDBExpr)DType)	IntoDTypeTimeUnityearquartermonthdayhourminutesecondmillisecondmicrosecond
nanosecond)
yqmodhmsmsusnsdescasc)TFz
nulls lastznulls first )	separatorexprsr   r+   strreturnc                 G  s*   | rt dt| g|R  S t 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)Flit)r+   r,    r3   W/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/narwhals/_duckdb/utils.py
concat_str5   s   *r5   dfr   r   list[tuple[str, 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)r6   r,   native_resultsexprnative_series_listoutput_namesmsgr3   r3   r4   evaluate_exprsG   s   



rD   c                   @  s6   e Zd ZU dZdZded< dd	d
ZedddZdS )DeferredTimeZonea  Object which gets passed between `native_to_narwhals_dtype` calls.

    DuckDB stores the time zone in the connection, rather than in the dtypes, so
    this ensures that when calculating the schema of a dataframe with multiple
    timezone-aware columns, that the connection's time zone is only fetched once.

    Note: we cannot make the time zone a cached `DuckDBLazyFrame` property because
    the time zone can be modified after `DuckDBLazyFrame` creation:

    ```python
    df = nw.from_native(rel)
    print(df.collect_schema())
    rel.query("set timezone = 'Asia/Kolkata'")
    print(df.collect_schema())  # should change to reflect new time zone
    ```
    Nz
str | None_cached_time_zonerelr   r.   Nonec                 C  s
   || _ d S N)_rel)selfrG   r3   r3   r4   __init__k   s   
zDeferredTimeZone.__init__r-   c                 C  s   | j du rt| j| _ | j S )z;Fetch relation time zone (if it wasn't calculated already).N)rF   fetch_rel_time_zonerJ   )rK   r3   r3   r4   	time_zonen   s   
zDeferredTimeZone.time_zone)rG   r   r.   rH   )r.   r-   )	__name__
__module____qualname____doc__rF   __annotations__rL   propertyrN   r3   r3   r3   r4   rE   W   s   
 
rE   duckdb_dtyper   versionr   deferred_time_zoner   c           
        s  | j }j|dkrt| j 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  }j|t	|dS |d	krt
ju rr S | jd d }	j|	d
S |dkrj jdS t|S )Nliststructc                   s*   g | ]}j |d  t|d  dqS )r      )namedtype)Fieldnative_to_narwhals_dtype).0childrW   dtypesrV   r3   r4   
<listcomp>   s    z,native_to_narwhals_dtype.<locals>.<listcomp>arrayrZ   r   )innershapeenum)
categoriesztimestamp with time zone)rN   )idrb   Listr^   r`   childrenStructinsertArraytupler   V1EnumDatetimerN   $_non_nested_native_to_narwhals_dtype)
rU   rV   rW   duckdb_dtype_idrk   r`   sizerf   re   rh   r3   ra   r4   r^   v   s<   




r^   rG   duckdb.DuckDBPyRelationc                 C  s$   |  dd }|d usJ |d S )Nzduckdb_settings()z;select value from duckdb_settings() where name = 'TimeZone'r   )queryfetchone)rG   resultr3   r3   r4   rM      s   rM      )maxsizert   c                 C  s   |j }i d| d| d| d| d| d| d| d| d	|	 d
|
 d| d| d| d| d|dd|dd| |d| | | | | d| | S )Nhugeintbigintintegersmallinttinyintuhugeintubigintuinteger	usmallintutinyintdoublefloatvarchardatetimestamp_sr$   timestamp_msr%   	timestampr'   )timestamp_nsbooleanintervaldecimaltimeblob)rb   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDaterr   BooleanDurationDecimalTimeBinarygetUnknown)rt   rV   rb   r3   r3   r4   rs      sZ   	


rs   INT128UINT128z"Mapping[type[DType], DuckDBPyType]NW_TO_DUCKDB_DTYPES)r$   r%   r&   r'   zMapping[TimeUnit, DuckDBPyType]TIME_UNIT_TO_TIMESTAMPr\   r   c                   s  j }|  }t| }r|S t| |jr5tju r!d}t|t	| |jr/t
d| jS d}t|t| |jrl| j}| j}|sGt| S |dkrUd| d}t|| j }	krid|	 d| d	}t|tjS t| |jr| j }dkrd
| d}tjS t| |jrt| j }
t|
S t| |jr fdd| jD }t|S t	| |jr| }t	||jr|j}t	||jst| }ddd | jD }t
| | S t |t!rd|j" d}t|d|  }t#|)Nz9Converting to Enum is not supported in narwhals.stable.v1ENUMz9Can not cast / initialize Enum without categories presentr&   zUOnly microsecond precision is supported for timezone-aware `Datetime` in DuckDB, got z
 precisionzOnly the connection time zone z is supported, got: .z6Only microsecond-precision Duration is supported, got c                   s   i | ]}|j t|j qS r3   )r[   narwhals_to_native_dtyper\   )r_   fieldrW   rV   r3   r4   
<dictcomp>  s    z,narwhals_to_native_dtype.<locals>.<dictcomp>r*   c                 s  s    | ]	}d | dV  qdS )[]Nr3   )r_   itemr3   r3   r4   	<genexpr>  s    z+narwhals_to_native_dtype.<locals>.<genexpr>zConverting to z# dtype is not supported for DuckDB.zUnknown dtype: )$rb   	base_typer   r   r   rq   r   rp   NotImplementedError
isinstancer   rh   
ValueErrorrr   	time_unitrN   r   duckdb_dtypesTIMESTAMP_TZr   INTERVALrj   r   re   duckdb	list_typerl   fieldsstruct_typern   joinrf   
issubclassUNSUPPORTED_DTYPESrO   r<   )r\   rV   rW   rb   r   duckdb_typerC   tutzrel_tzre   r   nw_innerduckdb_innerduckdb_shape_fmtr3   r   r4   r      sb   




r   into_expressionstr | Expressionc                 C  s   t | tr	t| S | S rI   )r   r-   col)r   r3   r3   r4   parse_into_expression  s   r   partition_byc                  G  s&   | sdS d dd | D }d| S )Nr*   z, c                 S  s   g | ]}t | qS r3   )r   )r_   xr3   r3   r4   rc   &  s    z-generate_partition_by_sql.<locals>.<listcomp>zpartition by )r   )r   by_sqlr3   r3   r4   generate_partition_by_sql#  s   
r   order_by
descendingSequence[bool]
nulls_lastc                 G  s.   |sdS d dd t|| |D }d| S )Nr*   ,c                 s  s6    | ]\}}}t | d t|  d t|  V  qdS ) N)r   DESCENDING_TO_ORDERNULLS_LAST_TO_NULLS_POS)r_   r   _descending_nulls_lastr3   r3   r4   r   /  s
    
z(generate_order_by_sql.<locals>.<genexpr>z	order by )r   r   )r   r   r   r   r3   r3   r4   generate_order_by_sql*  s   


r   r3   F)r   r   ignore_nullsr@   Sequence[str | Expression]
rows_start
int | Nonerows_endSequence[bool] | Noner   boolc             
   C  s  zddl m} W n ty }	 zdt j }
t|
|	d }	~	ww t| }|p,dgt| }|p5dgt| }t|||d}|d urQ|d urQd|  d| d}n|d ur\d	| d}n|d urhd|  d
}nd}|rvt| 	d dnt| }|| d| d| d| dS )Nr   )SQLExpressionz<DuckDB>=1.3.0 is required for this operation. Found: DuckDB F)r   r   zrows between z preceding and z
 followingz%rows between unbounded preceding and z" preceding and unbounded followingr*   )z ignore nulls)z over (r   )
r   r   ModuleNotFoundError__version__r   r   r;   r   r-   removesuffix)r@   r   r   r   r   r   r   r   r   excrC   pbobrowsfuncr3   r3   r4   window_expression6  s(   
  r   	exception	Exceptionframer   ColumnNotFoundError | Exceptionc                  s4   t  tjrt fdddD rtj|jdS  S )Nc                 3  s    | ]	}|t  v V  qd S rI   )r-   )r_   rC   r   r3   r4   r   ]  s
    

z)catch_duckdb_exception.<locals>.<genexpr>)znot found in FROM clausez5this column cannot be referenced before it is defined)available_columns)r   r   BinderExceptionanyr	   from_available_column_namescolumns)r   r   r3   r   r4   catch_duckdb_exceptionZ  s   r   r[   argsc                 G  s$   | dkr
|d   S t| g|R  S )Nisnullr   )r   r1   )r[   r   r3   r3   r4   functionk  s   r   )r,   r   r+   r-   r.   r   )r6   r   r,   r   r.   r7   )rU   r   rV   r   rW   rE   r.   r   )rG   rv   r.   r-   )rt   r-   rV   r   r.   r   )r\   r   rV   r   rW   rE   r.   r   )r   r   r.   r   )r   r   r.   r-   )r   r   r   r   r   r   r.   r-   )r3   r3   NN)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   )d
__future__r   	functoolsr   typingr   r   duckdb.typingr   r   narwhals._utilsr   r   r   narwhals.exceptionsr	   collections.abcr
   r   r   r   narwhals._compliant.typingr   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   narwhals.typingr   r   
UNITS_DICTr   r   ColumnExpressionr   ConstantExpressionr2   CaseExpressionwhenFunctionExpressionr1   r5   rD   rE   r^   rM   rs   MAINrb   r   DOUBLEr   FLOATr   BLOBr   VARCHARr   BOOLEANr   DATEr   TIMEr   TINYINTr   SMALLINTr   INTEGERr   BIGINTr   r   UTINYINTr   	USMALLINTr   UINTEGERr   UBIGINTr   r   rS   TIMESTAMP_STIMESTAMP_MS	TIMESTAMPTIMESTAMP_NSr   r   Categoricalr   r   r   r   r   r   r   r   r3   r3   r3   r4   <module>   s    




/	




7


$