
    O3j>                       U d dl mZ d dlZd dlmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZmZmZmZ d dlmZ er4d 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 d dlmZ d dlmZm Z  eZ!de"d<   	 ejF                  jI                         Z%	 ese%dk\  rd dlm&Z' nd dlmZ' ddddddddddd
Z(d d!d"Z)d#d$d"Z*ejV                  Z,	 ejZ                  Z.	 ej^                  Z0	 ejb                  Z2	 	 	 	 	 	 	 dCd%Z3d&d'dDd(Z4	 	 	 	 	 	 dEd)Z5 G d* d+      Z6	 	 	 	 	 	 	 	 dFd,Z7dGd-Z8 ed./      dHd0       Z9ejt                  jv                  Z;i e;jx                  e'jz                  e;j|                  e'j~                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  e;j                  e'j                  Z^d1e"d2<   e'j                  e'j                  e'j                  e'j                  d3Zcd4e"d5<   e;j                  Ze	 	 	 	 	 	 	 	 dId6ZfdJd7ZgdKd8ZhdLd9Zi	 	 	 	 	 	 	 	 dMd:Zj	 	 	 	 dNddd;d<	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dOd=Zk	 	 	 	 	 	 dPd>Zlej                  ej                  d?ZodQd@ZpdRdAZqg dBZry)S    )annotationsN)	lru_cache)TYPE_CHECKINGAny)
Expression)ImplementationVersionextend_boolisinstance_or_issubclass)ColumnNotFoundError)MappingSequence)	TypeAlias)DuckDBPyRelation)CompliantLazyFrameAny)DuckDBLazyFrame)
DuckDBExpr)DType)	IntoDTypeTimeUnitr   
Incomplete)      )sqltypes)typing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 firstc                   	 ddl m} t        | t              r| fn| } |||      S # t        $ r$}dt         j                   }t	        |      |d}~ww xY w)z}Wraps [`duckdb.LambdaExpression`].

    [`duckdb.LambdaExpression`]: https://duckdb.org/docs/stable/sql/functions/lambda
    r   )LambdaExpressionz<DuckDB>=1.2.0 is required for this operation. Found: DuckDB N)duckdbr3   ModuleNotFoundError__version__NotImplementedError
isinstancer   )paramsexprr3   excmsgargss         C/DATA/.local/lib/python3.12/site-packages/narwhals/_duckdb/utils.pylambda_exprr?   B   s]    0+ #6:6F9FDD$''	  0LVM_M_L`a!#&C/0s   & 	AAA )	separatorc                J    | rt        dt        |       g| S t        dg| 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.


    [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)rA   exprss     r>   
concat_strrH   R   s,     6?1[#i.151WAhDWQVDWW    c               &   g }|D ]  } ||       }|j                  |       }|j                  |j                  |      }t        |      t        |      k7  rd| dt        |       d}t        |      |j	                  t        ||d              |S )Nz!Internal error: got output names z, but only got z resultsFstrict)_evaluate_output_names_alias_output_nameslenAssertionErrorextendzip)dfrG   native_resultsr:   native_series_listoutput_namesr<   s          r>   evaluate_exprs_and_aliasesrW   b   s     46N!"X2226##/33LAL|$6 775l^?SVWiSjRkkstC %%c,0B5QR  rI   c                  :    e Zd ZU dZdZded<   ddZedd       Zy)	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_zonec                    || _         y N)_rel)selfrels     r>   __init__zDeferredTimeZone.__init__   s	    	rI   c                f    | j                   t        | j                        | _         | j                   S )z;Fetch relation time zone (if it wasn't calculated already).)rZ   fetch_rel_time_zoner]   )r^   s    r>   	time_zonezDeferredTimeZone.time_zone   s-     !!)%8%CD"%%%rI   )r_   r   returnNone)rd   str)	__name__
__module____qualname____doc__rZ   __annotations__r`   propertyrc    rI   r>   rY   rY   r   s-    " %)z( & &rI   rY   c                   | j                   }|j                  }|dk(  r&|j                  t        | j                  ||            S |dk(  rM| j
                  }|j                  |D cg c]&  }|j                  |d   t        |d   ||            ( c}      S |dk(  r| j
                  \  }}|d   g}|d   j                   dk(  r:|d   j
                  \  }}|j                  d|d          |d   j                   dk(  r:t        |d   ||      }	|j                  |	t        |            S |dk(  rE|t        j                  u r|j                         S | j
                  d   d   }
|j                  |
      S |d	k(  r|j                  |j                  
      S |dk(  r'| j
                  \  \  }}\  }}|j!                  ||      S t#        ||      S c c}w )Nliststructr   r   )namedtypearray)innershapeenumztimestamp with time zone)rc   decimal)iddtypesListnative_to_narwhals_dtypechildchildrenStructFieldinsertArraytupler	   V1EnumDatetimerc   Decimal$_non_nested_native_to_narwhals_dtype)duckdb_dtypeversiondeferred_time_zoneduckdb_dtype_idry   r}   r|   sizeru   rt   
categories_	precisionscales                 r>   r{   r{      s   
 (??O^^F & {{$\%7%7BTU
 	
 ("8D8M8M}} &
 &E	 q258WFXY   &
 	
 '! #++ta	AhkkW$(++KE4LLDG$ AhkkW$ )q7<NO||%uU||<<& gjj ;;= !-!6!6q!9!!<
{{:&&44);)E)EFF)# &2%:%:"I
E~~i///IIKs   $+Gc                T    | j                  dd      j                         }|J |d   S )Nzduckdb_settings()z;select value from duckdb_settings() where name = 'TimeZone'r   )queryfetchone)r_   results     r>   rb   rb      s8    YYZhj  !9rI      )maxsizec                >   |j                   }i d|j                         d|j                         d|j                         d|j	                         d|j                         d|j                         d|j                         d|j                         d	|j                         d
|j                         d|j                         d|j                         d|j                         d|j                         d|j                  d      d|j                  d      d|j                         |j                  d      |j!                         |j#                         |j%                         |j'                         dj)                  | |j+                               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timeblob)ry   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDater   BooleanDurationTimeBinarygetUnknown)r   r   ry   s      r>   r   r      s   ^^F6==?&,,. 	6<<> 	FLLN	
 	6;;= 	FNN$ 	6==? 	FMMO 	V]]_ 	FLLN 	&.." 	! 	6==? 	 	vs+  	-!" 	V__&#$ ->>#OO%-. 
c/6>>+,/-rI   z0Mapping[type[DType], duckdb_dtypes.DuckDBPyType]NW_TO_DUCKDB_DTYPES)r,   r-   r.   r/   z-Mapping[TimeUnit, duckdb_dtypes.DuckDBPyType]TIME_UNIT_TO_TIMESTAMPc           	     l   |j                   }| j                         }t        j                  |      x}r|S t	        | |j
                        rd|t        j                  u rd}t        |      t        | |j
                        r"t        j                  d| j                        S d}t        |      t	        | |j                        rn| j                  }| j                   }|s	t"        |   S |dk7  rd| d}t        |      ||j                   x}	k7  rd|	 d| d	}t        |      t        j$                  S t	        | |j&                        r'| j                  x}dk7  rd
| d}t        j(                  S t	        | |j*                        r,t-        | j.                  ||      }
t1        j2                  |
      S t	        | |j4                        rN| j6                  D ci c]$  }|j8                  t-        |j:                  ||      & }}t1        j<                  |      S t        | |j>                        r| }t        ||j>                        r#|j.                  }t        ||j>                        r#t-        |||      }djA                  d | jB                  D              }t        j                  | |       S t        | |jD                        r0t        j                  d| jF                   d| jH                   d      S tK        |tL              rd|jN                   d}t        |      d|  }tQ        |      c c}w )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 r@   c              3  (   K   | ]
  }d | d  yw)[]Nrm   ).0items     r>   	<genexpr>z+narwhals_to_native_dtype.<locals>.<genexpr>:  s     "G;4QtfA;;s   zDECIMAL(, )zConverting to z# dtype is not supported for DuckDB.zUnknown dtype: ))ry   	base_typer   r   r   r   r	   r   r7   r8   duckdb_dtypesDuckDBPyTyper   
ValueErrorr   	time_unitrc   r   TIMESTAMP_TZr   INTERVALrz   narwhals_to_native_dtypert   r4   	list_typer~   fieldsrq   rr   struct_typer   joinru   r   r   r   
issubclassUNSUPPORTED_DTYPESrg   rP   )rr   r   r   ry   r   duckdb_typer<   tutzrel_tzrt   fieldr   nw_innerduckdb_innerduckdb_shape_fmts                   r>   r   r     s    ^^F!I)--i88{8v{{3gjj MC%c**eV[[) --U5E5E4H.IJJIov7____)"--:ijlimmwxCS/!.888&926(:NrdRSTCS/!)))v7//!Bd*J2$jYC%%%v{{3(g?QR&&v}}5 
% JJ0gGYZZ% 	 
 !!&))%&#6<<0~~H 6<<0/'CUV77"G5;;"GG))\N;K:L*MNN%())HU__4ER}TU*VWW)/0y1122UV!#&&E7
#C

%
s   )L1c                <    t        | t              rt        |       S | S r\   )r8   rf   col)into_expressions    r>   parse_into_expressionr   E  s    #-os#C3XXrI   c                 n    | sydj                  | D cg c]  }t        |        c}      }d| S c c}w )Nr@   r   zpartition by )r   r   )partition_byxby_sqls      r>   generate_partition_by_sqlr   I  sD    YY|L|!0345|LMF6(## Ms   2c                 2    dj                  d | D              S )Nr   c              3  D   K   | ]  }t        t        |              y wr\   )rf   r   )r   rq   s     r>   r   z$join_column_names.<locals>.<genexpr>Q  s     6ST^s    )r   )namess    r>   join_column_namesr   P  s    996666rI   c           	     \    |sydj                  d t        || |d      D              }d| S )Nr@   ,c              3  f   K   | ])  \  }}}t        |       d t        |    d t        |     + yw) N)r   DESCENDING_TO_ORDERNULLS_LAST_TO_NULLS_POS)r   r   _descending_nulls_lasts       r>   r   z(generate_order_by_sql.<locals>.<genexpr>Y  sI      ,
'A{K !#
$A&9+&F%GqI`alImHno,
s   /1TrK   z	order by )r   rR   )
descending
nulls_lastorder_byr   s       r>   generate_order_by_sqlr   T  sB     XX +.j*T,
 F vhrI   F)r   r   ignore_nullsc          
     6   t        | }t        dt        |            }	|xs |	}|xs |	}t        |||d}
||d|  d| d}n|d| d}n|d|  d}nd}|rt	        |       j                  d	       d
n
t	        |       }t        | d| d|
 d| d	      S )NF)r   r   zrows between z preceding and z
 followingz%rows between unbounded preceding and z" preceding and unbounded followingr@   r   z ignore nulls)z over (r   )r   r
   rO   r   rf   removesuffixsql_expression)r:   r   r   
rows_startrows_endr   r   r   pbflagsobrowsfuncs                r>   window_expressionr	  b  s     
#L	1Bs8}-E$uJ$uJ	ZJ	WB("6
{m?8*JO		6xj
K		
{m+MN=Ic$i$$S)*.9sSWyDTF'"Qrd!D6;<<rI   c                    t         t        j                        r4t         fddD              r t	        j
                  |j                        S  S )Nc              3  8   K   | ]  }|t              v   y wr\   )rf   )r   r<   	exceptions     r>   r   z)catch_duckdb_exception.<locals>.<genexpr>  s&      =
C 	s9~
s   )znot found in FROM clausez5this column cannot be referenced before it is defined)available_columns)r8   r4   BinderExceptionanyr   from_available_column_namescolumns)r  frames   ` r>   catch_duckdb_exceptionr    sO     )V334 =
= : #>>#mm
 	
 rI   )floordivandc                    | t         v rt        |    | S | dv r t        |d   |              S | dk(  rt        d|d    d      S t        | g| S )N>   isnull	isnotnullr   count_distinctzcount(distinct r   )_BINARY_OPSgetattrr  rE   )rq   r=   s     r>   functionr    sh    {4 $''&&%wtAw%''Qy:;;T>D>rI   c                    	 ddl m}  ||       S # t        $ r$}dt         j                   }t	        |      |d }~ww xY w)Nr   )SQLExpressionz<DuckDB>=1.3.0 is required for this operation. Found: DuckDB )r4   r  ImportErrorr6   r7   )r:   r  r;   r<   s       r>   r  r    sI    0(   0LVM_M_L`a!#&C/0s    	=8=)
UNITS_DICTrY   rE   r  r   rH   r   rb   r  r   r   r   r?   rF   r   r{   r   r  whenr	  )r9   z)str | Expression | tuple[Expression, ...]r:   r   rd   r   )rG   r   rA   rf   rd   r   )rS   r   rG   r   rd   zlist[tuple[str, Expression]])r   duckdb_dtypes.DuckDBPyTyper   r	   r   rY   rd   r   )r_   zduckdb.DuckDBPyRelationrd   rf   )r   rf   r   r	   rd   r   )rr   r   r   r	   r   rY   rd   r"  )r   str | Expressionrd   r   )r   r#  rd   rf   )r   rf   rd   rf   )r   r#  r   Sequence[bool]r   r$  rd   rf   )rm   rm   NN)r:   r   r   Sequence[str | Expression]r   r%  r  
int | Noner  r&  r   Sequence[bool] | Noner   r'  r   boolrd   r   )r  	Exceptionr  r   rd   zColumnNotFoundError | Exception)rq   rf   r=   r   rd   r   )r:   rf   rd   r   )s
__future__r   operator	functoolsr   r   r   r   r4   r   narwhals._utilsr   r	   r
   r   narwhals.exceptionsr   collections.abcr   r   r   r   narwhals._compliant.typingr   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   narwhals.typingr   r   r   rk   DUCKDB_backend_versionBACKEND_VERSIONr   r   r   r   r   ColumnExpressionr   ConstantExpressionrF   CaseExpressionr!  FunctionExpressionrE   r?   rH   rW   rY   r{   rb   r   MAINry   r   DOUBLEr   FLOATr   BLOBr   VARCHARr   BOOLEANr   DATEr   TIMEr   TINYINTr   SMALLINTr   INTEGERr   BIGINTr   HUGEINTr   UTINYINTr   	USMALLINTr   UINTEGERr   UBIGINTr   UHUGEINTr   TIMESTAMP_STIMESTAMP_MS	TIMESTAMPTIMESTAMP_NSr   Categoricalr   r   r   r   r   r   r	  r  r  and_r  r  r  __all__rm   rI   r>   <module>rU     s   "   %   Z Z 31 '@:0%3
I > !''88: *Ov-0. 
	
				



 $E2 !-mD  * , (
 ,(5(=G((  57 X $.! & &>6J,6J6J )6J 	6Jr 2- -8 
		I
NNM((I
NNM''I MM=%%I MM=((	I
 NNM))I KK##I KK##I KK&&I LL-((I LL-''I LL-&&I MM=((I LL-((I MM=**I MM=))I  MM=((!I" NNM**#I E ( 
	"	"

$
$

!
!

$
$	I E  '' 66&6<L66rY$7  -; IW    02+-!= )-(,=
=,= )= 	=
 = &= &= = =@!6$" $,,X]]CrI   