
    [i=                       U d dl m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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
jH                  jK                         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jX                  Z-	 ej\                  Z/	 ej`                  Z1	 ejd                  Z3	 	 	 	 	 	 	 dBd%Z4d&d'dCd(Z5	 	 	 	 	 	 dDd)Z6 G d* d+      Z7	 	 	 	 	 	 	 	 dEd,Z8dFd-Z9 ed./      dGd0       Z:ejv                  jx                  Z<i 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                  e(j                  Z_d1e#d2<   e(j                  e(j                  e(j                  e(j                  d3Zdd4e#d5<   e<j                  Zf	 	 	 	 	 	 	 	 dHd6ZgdId7ZhdJd8ZidKd9Zj	 	 	 	 	 	 	 	 dLd:Zk	 	 	 	 dMddd;d<	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dNd=Zl	 	 	 	 	 	 dOd>ZmdPd?ZndQd@Zog dAZpy)R    )annotations)	lru_cache)TYPE_CHECKINGAnyN)
Expression)ImplementationVersionextend_boolisinstance_or_issubclass
zip_strict)ColumnNotFoundError)MappingSequence)DuckDBPyRelation)	TypeAlias)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)duckdbr4   ModuleNotFoundError__version__NotImplementedError
isinstancer   )paramsexprr4   excmsgargss         g/var/www/html/userprofiledev.eatanceapp.com/venv/lib/python3.12/site-packages/narwhals/_duckdb/utils.pylambda_exprr@   G   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)rB   exprss     r?   
concat_strrI   W   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        ||              |S )Nz!Internal error: got output names z, but only got z results)_evaluate_output_names_alias_output_nameslenAssertionErrorextendzip)dfrH   native_resultsr;   native_series_listoutput_namesr=   s          r?   evaluate_exprs_and_aliasesrV   g   s     46N!"X2226##/33LAL|$6 775l^?SVWiSjRkkstC %%c,0BCD  rJ   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	    	rJ   c                f    | j                   t        | j                        | _         | j                   S )z;Fetch relation time zone (if it wasn't calculated already).)rY   fetch_rel_time_zoner\   )r]   s    r?   	time_zonezDeferredTimeZone.time_zone   s-     !!)%8%CD"%%%rJ   )r^   r   returnNone)rc   str)	__name__
__module____qualname____doc__rY   __annotations__r_   propertyrb    rJ   r?   rX   rX   w   s-    " %)z( & &rJ   rX   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)rb   decimal)iddtypesListnative_to_narwhals_dtypechildchildrenStructFieldinsertArraytupler	   V1EnumDatetimerb   Decimal$_non_nested_native_to_narwhals_dtype)duckdb_dtypeversiondeferred_time_zoneduckdb_dtype_idrx   r|   r{   sizert   rs   
categories_	precisionscales                 r?   rz   rz      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?   ra   ra      s8    YYZhj  !9rJ      )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.   	timestampr0   )timestamp_nsbooleanintervaltimeblob)rx   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDater   BooleanDurationTimeBinarygetUnknown)r   r   rx   s      r?   r   r      s   ^^F6==?&,,. 	6<<> 	FLLN	
 	6;;= 	FNN$ 	6==? 	FMMO 	V]]_ 	FLLN 	&.." 	! 	6==? 	 	vs+  	-!" 	V__&#$ ->>#OO%-. 
c/6>>+,/-rJ   z0Mapping[type[DType], duckdb_dtypes.DuckDBPyType]NW_TO_DUCKDB_DTYPES)r-   r.   r/   r0   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 rA   c              3  (   K   | ]
  }d | d  yw)[]Nrl   ).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: ))rx   	base_typer   r   r   r   r	   r   r8   r9   duckdb_dtypesDuckDBPyTyper   
ValueErrorr   	time_unitrb   r   TIMESTAMP_TZr   INTERVALry   narwhals_to_native_dtypers   r5   	list_typer}   fieldsrp   rq   struct_typer   joinrt   r   r   r   
issubclassUNSUPPORTED_DTYPESrf   rO   )rq   r   r   rx   r   duckdb_typer=   tutzrel_tzrs   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[   )r9   re   col)into_expressions    r?   parse_into_expressionr   J  s    #-os#C3XXrJ   c                 n    | sydj                  | D cg c]  }t        |        c}      }d| S c c}w )NrA   r   zpartition by )r   r   )partition_byxby_sqls      r?   generate_partition_by_sqlr   N  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[   )re   r   )r   rp   s     r?   r   z$join_column_names.<locals>.<genexpr>V  s     6ST^s    )r   )namess    r?   join_column_namesr   U  s    996666rJ   c                X    |sydj                  d t        || |      D              }d| S )NrA   ,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>^  sE      +W'A{K !#
$A&9+&F%GqI`alImHno+Ws   /1z	order by )r   r   )
descending
nulls_lastorder_byr   s       r?   generate_order_by_sqlr   Y  s=     XX +5h
J+W F vhrJ   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 followingrA   r   z ignore nulls)z over (r   )r   r
   rN   r   re   removesuffixsql_expression)r;   r   r   
rows_startrows_endr   r   r   pbflagsobrowsfuncs                r?   window_expressionr  e  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;<<rJ   c                    t         t        j                        r4t         fddD              r t	        j
                  |j                        S  S )Nc              3  8   K   | ]  }|t              v   y wr[   )re   )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)r9   r5   BinderExceptionanyr   from_available_column_namescolumns)r  frames   ` r?   catch_duckdb_exceptionr    sO     )V334 =
= : #>>#mm
 	
 rJ   c                x    | dk(  r|d   j                         S | dk(  rt        d|d    d      S t        | g| S )Nisnullr   count_distinctzcount(distinct r   )r  r   rF   )rp   r>   s     r?   functionr    sJ    xAw~~Qy:;;T>D>rJ   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 )r5   r  ImportErrorr7   r8   )r;   r  r<   r=   s       r?   r   r     sI    0(   0LVM_M_L`a!#&C/0s    	=8=)
UNITS_DICTrX   rF   r  r   rI   r   ra   r  r   r   r   r@   rG   r   rz   r   r   whenr  )r:   z)str | Expression | tuple[Expression, ...]r;   r   rc   r   )rH   r   rB   re   rc   r   )rR   r   rH   r   rc   zlist[tuple[str, Expression]])r   duckdb_dtypes.DuckDBPyTyper   r	   r   rX   rc   r   )r^   zduckdb.DuckDBPyRelationrc   re   )r   re   r   r	   rc   r   )rq   r   r   r	   r   rX   rc   r  )r   str | Expressionrc   r   )r   r  rc   re   )r   re   rc   re   )r   r  r   Sequence[bool]r   r  rc   re   )rl   rl   NN)r;   r   r   Sequence[str | Expression]r   r  r  
int | Noner  r   r   Sequence[bool] | Noner   r!  r   boolrc   r   )r  	Exceptionr  r   rc   zColumnNotFoundError | Exception)rp   re   r>   r   rc   r   )r;   re   rc   r   )q
__future__r   	functoolsr   r   r   r   r5   r   narwhals._utilsr   r	   r
   r   r   narwhals.exceptionsr   collections.abcr   r   r   typing_extensionsr   narwhals._compliant.typingr   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   narwhals.typingr   r   r   rj   DUCKDB_backend_versionBACKEND_VERSIONr   r   r  r   r   ColumnExpressionr   ConstantExpressionrG   CaseExpressionr  FunctionExpressionrF   r@   rI   rV   rX   rz   ra   r   MAINrx   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  r   __all__rl   rJ   r?   <module>rN     sv   "  %    4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$"rJ   