
    Wh5                    L   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r0d 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jF                  Z$	 ejJ                  Z&	 ejN                  Z(	 ejR                  Z*	 dd d;d!Z+	 	 	 	 	 	 d<d"Z, G d# d$      Z-	 	 	 	 	 	 	 	 d=d%Z.d>d&Z/ ed'(      d?d)       Z0ejb                  jd                  Z2i e2jf                  ejh                  e2jj                  ejl                  e2jn                  ejp                  e2jr                  ejt                  e2jv                  ejx                  e2jz                  ej|                  e2j~                  ej                  e2j                  ej                  e2j                  ej                  e2j                  ej                  e2j                  ej                  e2j                   e	d*      e2j                  ej                  e2j                  ej                  e2j                  ej                  e2j                  ej                  e2j                   e	d+      ZSd,eTd-<   ej                  ej                  ej                  ej                  d.ZYd/eTd0<   e2j                  e2j                  fZ\	 	 	 	 	 	 	 	 d@d1Z]dAd2Z^dBd3Z_dCd4Z`	 	 	 	 	 	 	 	 dDd5Za	 	 	 	 dEddd6d7	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dFd8Zb	 	 	 	 	 	 dGd9ZcdHd:Zdy)I    )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 )	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.

    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,   exprss     P/var/www/html/jupyter_env/lib/python3.12/site-packages/narwhals/_duckdb/utils.py
concat_strr4   5   s,     6?1[#i.151WAhDWQVDWW    c               4   g }|D ]  }|j                  |       }|j                  |       }|j                  |j                  |      }t        |      t        |      k7  rd| dt        |       d}t	        |      |j                  t        ||              |S )Nz!Internal error: got output names z, but only got z results)_call_evaluate_output_names_alias_output_nameslenAssertionErrorextendzip)dfr2   native_resultsexprnative_series_listoutput_namesmsgs          r3   evaluate_exprsrD   G   s     46N E!ZZ^2226##/33LAL|$6 775l^?SVWiSjRkkstC %%c,0BCDE r5   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     r3   __init__zDeferredTimeZone.__init__k   s	    	r5   c                f    | j                   t        | j                        | _         | j                   S )z;Fetch relation time zone (if it wasn't calculated already).)rG   fetch_rel_time_zonerJ   )rK   s    r3   	time_zonezDeferredTimeZone.time_zonen   s-     !!)%8%CD"%%%r5   )rL   r   returnNone)rQ   str)	__name__
__module____qualname____doc__rG   __annotations__rM   propertyrP    r5   r3   rF   rF   W   s-    " %)z( & &r5   rF   c                J   | 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(  rF|t        j                  u r|j                         S | j
                  d   d   }
|j                  |
	      S |d
k(  r|j                  |j                        S t!        ||      S c c}w )Nliststructr      )namedtypearray)innershapeenum)
categoriesztimestamp with time zone)rP   )iddtypesListnative_to_narwhals_dtypechildchildrenStructFieldinsertArraytupler   V1EnumDatetimerP   $_non_nested_native_to_narwhals_dtype)duckdb_dtypeversiondeferred_time_zoneduckdb_dtype_idrg   rk   rj   sizerc   rb   re   s              r3   ri   ri   v   s    #ooO^^F & {{$\%7%7BTU
 	
 ("((}} &
 	 q258WFXY  
 	
 '!"++t G9AhkkW$(++KE4LLDG$ AhkkW$ )q7<NO||%uU||<<& gjj ;;= !**1-a0
{{j{1144);)E)EFF/II;s   $+F c                T    | j                  dd      j                         }|J |d   S )Nzduckdb_settings()z;select value from duckdb_settings() where name = 'TimeZone'r   )queryfetchone)rL   results     r3   rO   rO      s8    YYZhj  !9r5      )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'                         |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decimaltimeblob)rg   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDaters   BooleanDurationDecimalTimeBinarygetUnknown)rx   rv   rg   s      r3   rt   rt      s   ^^F6==?&,,. 	6<<> 	FLLN	
 	6;;= 	FNN$ 	6==? 	FMMO 	V]]_ 	FLLN 	&.." 	! 	6==? 	 	vs+  	-!" 	V__&#$ ->>#OO%>>#/0 
c/6>>+,1-r5   INT128UINT128z"Mapping[type[DType], DuckDBPyType]NW_TO_DUCKDB_DTYPES)r%   r&   r'   r(   zMapping[TimeUnit, DuckDBPyType]TIME_UNIT_TO_TIMESTAMPc           	        |j                   }| j                         }t        j                  |      x}r|S t	        | |j
                        rZ|t        j                  u rd}t        |      t        | |j
                        rt        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>                        ry| }t        ||j>                        r#|j.                  }t        ||j>                        r#t-        |||      }djA                  d | jB                  D              }t        | |       S tE        |tF              rd|jH                   d}t        |      d|  }tK        |      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)[]NrZ   ).0items     r3   	<genexpr>z+narwhals_to_native_dtype.<locals>.<genexpr>  s     "G4QtfA;"Gs   zConverting to z# dtype is not supported for DuckDB.zUnknown dtype: )&rg   	base_typer   r   r   rr   r   rq   NotImplementedError
isinstancer   re   
ValueErrorrs   	time_unitrP   r   duckdb_dtypesTIMESTAMP_TZr   INTERVALrh   narwhals_to_native_dtyperb   duckdb	list_typerl   fieldsr_   r`   struct_typero   joinrc   
issubclassUNSUPPORTED_DTYPESrT   r;   )r`   rv   rw   rg   r   duckdb_typerC   tutzrel_tzrb   fieldr   nw_innerduckdb_innerduckdb_shape_fmts                   r3   r   r      s    ^^F!I)--i88{8v{{3gjj MC%c**eV[[)$u'7'7&: ;<<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-=,>?@@)/0y1122UV!#&&E7
#C

!
s   )Kc                <    t        | t              rt        |       S | S rI   )r   rS   col)into_expressions    r3   parse_into_expressionr     s    #-os#C3XXr5   c                 n    | sydj                  | D cg c]  }t        |        c}      }d| S c c}w )Nr+   , zpartition by )r   r   )partition_byxby_sqls      r3   generate_partition_by_sqlr   #  s@    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rI   )rS   r   )r   r_   s     r3   r   z$join_column_names.<locals>.<genexpr>+  s     6ST^6s    )r   )namess    r3   join_column_namesr   *  s    996666r5   c                X    |sydj                  d t        || |      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       r3   r   z(generate_order_by_sql.<locals>.<genexpr>3  sD      'A{K !#
$A&9+&F%GqI`alImHnos   /1z	order by )r   r	   )
descending
nulls_lastorder_byr   s       r3   generate_order_by_sqlr   .  s=     XX +5h
J+W F vhr5   F)r   r   ignore_nullsc          
        	 ddl m} t        | }|xs dgt        |      z  }|xs dgt        |      z  }t        |||d}||d|  d| d}n|d	| d}n|d|  d
}nd}|rt        |       j                  d       dn
t        |       } || d| d| d| d      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 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   rS   removesuffix)r@   r   r   
rows_startrows_endr   r   r   r   excrC   pbobrowsfuncs                  r3   window_expressionr   :  s   0( 
#L	1B6wX6J6wX6J	ZJ	WB("6
{m?8*JO		6xj
K		
{m+MN=Ic$i$$S)*.9sSWyDD6AbT4&:;;%  0LVM_M_L`a!#&C/0s   B$ $	C-CCc                    t         t        j                        r4t         fddD              r t	        j
                  |j                        S  S )Nc              3  8   K   | ]  }|t              v   y wrI   )rS   )r   rC   	exceptions     r3   r   z)catch_duckdb_exception.<locals>.<genexpr>a  s"      = 	s9~=s   )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   frames   ` r3   catch_duckdb_exceptionr  ^  sO     )V334 =
= : #>>#mm
 	
 r5   c                J    | dk(  r|d   j                         S t        | g| S )Nisnullr   )r  r0   )r_   argss     r3   functionr  o  s)    xAw~~T>D>r5   )r2   r   r,   rS   rQ   r   )r>   r   r2   r   rQ   zlist[tuple[str, Expression]])ru   r   rv   r   rw   rF   rQ   r   )rL   zduckdb.DuckDBPyRelationrQ   rS   )rx   rS   rv   r   rQ   r   )r`   r   rv   r   rw   rF   rQ   r   )r   str | ExpressionrQ   r   )r   r	  rQ   rS   )r   rS   rQ   rS   )r   r	  r   Sequence[bool]r   r
  rQ   rS   )rZ   rZ   NN)r@   r   r   Sequence[str | Expression]r   r  r   
int | Noner   r  r   Sequence[bool] | Noner   r  r   boolrQ   r   )r   	Exceptionr  r   rQ   zColumnNotFoundError | Exception)r_   rS   r  r   rQ   r   )e
__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   ConstantExpressionr1   CaseExpressionwhenFunctionExpressionr0   r4   rD   rF   ri   rO   rt   MAINrg   r   DOUBLEr   FLOATr   BLOBr   VARCHARr   BOOLEANr   DATEr   TIMEr   TINYINTr   SMALLINTr   INTEGERr   BIGINTr   r   UTINYINTr   	USMALLINTr   UINTEGERr   UBIGINTr   r   rX   TIMESTAMP_STIMESTAMP_MS	TIMESTAMPTIMESTAMP_NSr   r   Categoricalr   r   r   r   r   r   r   r  r  rZ   r5   r3   <module>r7     s   "     % & I I 313@:0%3 
	
				



 $E2 !-mD  * , (
 , 57 X$$.! & &>,J,J)0,JFV,J
,J^ 2- -: 
		;
NNM((;
NNM''; MM=%%; MM=((	;
 NNM)); KK##; KK##; KK&&; LL-((; LL-''; LL-&&; MM<); LL-((; MM=**; MM=));  MM=((!;" NNL+#; 7 ( 
	"	"

$
$

!
!

$
$	; 7  nnf&8&89 44&4<L44nY$7	 	 -;	 IW	 	  02+-!!< )-(,!<
!<,!< )!< 	!<
 !< &!< &!< !< !<H!6$"r5   