
    /_i:                       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mZ d dlmZ er.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 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jL                  Z'	 ejP                  Z)	 ejT                  Z+	 ejX                  Z-	 	 	 	 	 	 	 d<dZ.d d!d=d"Z/	 	 	 	 	 	 d>d#Z0 G d$ d%      Z1	 	 	 	 	 	 	 	 d?d&Z2d@d'Z3 ed()      dAd*       Z4ejj                  jl                  Z6i e6jn                  e
jp                  e6jr                  e
jt                  e6jv                  e
jx                  e6jz                  e
j|                  e6j~                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  e6j                  e
j                  ZYd+eZd,<   e
j                  e
j                  e
j                  e
j                  d-Z_d.eZd/<   e6j                  e6j                  fZb	 	 	 	 	 	 	 	 dBd0ZcdCd1ZddDd2ZedEd3Zf	 	 	 	 	 	 	 	 dFd4Zg	 	 	 	 dGddd5d6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dHd7Zh	 	 	 	 	 	 dId8ZidJd9ZjdKd:Zkg d;Zly# e$ r
 d dlmZ
 Y *w xY w)L    )annotations)	lru_cache)TYPE_CHECKINGN)
Expression)Versionextend_boolisinstance_or_issubclass
zip_strict)ColumnNotFoundError)MappingSequence)DuckDBPyRelation)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 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)duckdbr,   ModuleNotFoundError__version__NotImplementedError
isinstancer   )paramsexprr,   excmsgargss         U/var/www/html/land_sniper/venv/lib/python3.12/site-packages/narwhals/_duckdb/utils.pylambda_exprr8   :   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)r:   exprss     r7   
concat_strrA   J   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)dfr@   native_resultsr3   native_series_listoutput_namesr5   s          r7   evaluate_exprs_and_aliasesrN   Z   s     46N E!"X2226##/33LAL|$6 775l^?SVWiSjRkkstC %%c,0BCDE rB   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     r7   __init__zDeferredTimeZone.__init__~   s	    	rB   c                f    | j                   t        | j                        | _         | j                   S )z;Fetch relation time zone (if it wasn't calculated already).)rQ   fetch_rel_time_zonerT   )rU   s    r7   	time_zonezDeferredTimeZone.time_zone   s-     !!)%8%CD"%%%rB   )rV   r   returnNone)r[   str)	__name__
__module____qualname____doc__rQ   __annotations__rW   propertyrZ    rB   r7   rP   rP   j   s-    " %)z( & &rB   rP   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)rZ   )iddtypesListnative_to_narwhals_dtypechildchildrenStructFieldinsertArraytupler   V1EnumDatetimerZ   $_non_nested_native_to_narwhals_dtype)duckdb_dtypeversiondeferred_time_zoneduckdb_dtype_idrq   ru   rt   sizerm   rl   ro   s              r7   rs   rs      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)rV   results     r7   rY   rY      s8    YYZhj  !9rB      )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)rq   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDater}   BooleanDurationDecimalTimeBinarygetUnknown)r   r   rq   s      r7   r~   r~      s   ^^F6==?&,,. 	6<<> 	FLLN	
 	6;;= 	FNN$ 	6==? 	FMMO 	V]]_ 	FLLN 	&.." 	! 	6==? 	 	vs+  	-!" 	V__&#$ ->>#OO%>>#/0 
c/6>>+,1-rB   z0Mapping[type[DType], duckdb_dtypes.DuckDBPyType]NW_TO_DUCKDB_DTYPES)r%   r&   r'   r(   z-Mapping[TimeUnit, duckdb_dtypes.DuckDBPyType]TIME_UNIT_TO_TIMESTAMPc           	        |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 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 r9   c              3  (   K   | ]
  }d | d  yw)[]Nrd   ).0items     r7   	<genexpr>z+narwhals_to_native_dtype.<locals>.<genexpr>+  s     "G4QtfA;"Gs   zConverting to z# dtype is not supported for DuckDB.zUnknown dtype: )&rq   	base_typer   r   r	   r|   r   r{   r0   r1   duckdb_dtypesDuckDBPyTypero   
ValueErrorr}   	time_unitrZ   r   TIMESTAMP_TZr   INTERVALrr   narwhals_to_native_dtyperl   r-   	list_typerv   fieldsri   rj   struct_typery   joinrm   
issubclassUNSUPPORTED_DTYPESr^   rG   )rj   r   r   rq   r   duckdb_typer5   tutzrel_tzrl   fieldr   nw_innerduckdb_innerduckdb_shape_fmts                   r7   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)/0y1122UV!#&&E7
#C

!
s   )K+c                <    t        | t              rt        |       S | S rS   )r1   r]   col)into_expressions    r7   parse_into_expressionr   4  s    #-os#C3XXrB   c                 n    | sydj                  | D cg c]  }t        |        c}      }d| S c c}w )Nr9   , zpartition by )r   r   )partition_byxby_sqls      r7   generate_partition_by_sqlr   8  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rS   )r]   r   )r   ri   s     r7   r   z$join_column_names.<locals>.<genexpr>@  s     6ST^6s    )r   )namess    r7   join_column_namesr   ?  s    996666rB   c                X    |sydj                  d t        || |      D              }d| S )Nr9   ,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       r7   r   z(generate_order_by_sql.<locals>.<genexpr>H  sD      'A{K !#
$A&9+&F%GqI`alImHnos   /1z	order by )r   r
   )
descending
nulls_lastorder_byr   s       r7   generate_order_by_sqlr   C  s=     XX +5h
J+W F vhrB   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 followingr9   )z ignore nulls)z over (r   )r   r   rF   r   r]   removesuffixsql_expression)r3   r   r   
rows_startrows_endr   r   r   pbflagsobrowsfuncs                r7   window_expressionr   O  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;<<rB   c                    t         t        j                        r4t         fddD              r t	        j
                  |j                        S  S )Nc              3  8   K   | ]  }|t              v   y wrS   )r]   )r   r5   	exceptions     r7   r   z)catch_duckdb_exception.<locals>.<genexpr>r  s"      = 	s9~=s   )znot found in FROM clausez5this column cannot be referenced before it is defined)available_columns)r1   r-   BinderExceptionanyr   from_available_column_namescolumns)r  frames   ` r7   catch_duckdb_exceptionr  o  sO     )V334 =
= : #>>#mm
 	
 rB   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   r>   )ri   r6   s     r7   functionr    sJ    xAw~~Qy:;;T>D>rB   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 )r-   r  ImportErrorr/   r0   )r3   r  r4   r5   s       r7   r   r     sI    0(   0LVM_M_L`a!#&C/0s    	=8=)
UNITS_DICTrP   r>   r  r   rA   r   rY   r  r   r   r   r8   r?   r   rs   r   r   whenr   )r2   z)str | Expression | tuple[Expression, ...]r3   r   r[   r   )r@   r   r:   r]   r[   r   )rJ   r   r@   r   r[   zlist[tuple[str, Expression]])r   duckdb_dtypes.DuckDBPyTyper   r   r   rP   r[   r   )rV   zduckdb.DuckDBPyRelationr[   r]   )r   r]   r   r   r[   r   )rj   r   r   r   r   rP   r[   r  )r   str | Expressionr[   r   )r   r  r[   r]   )r   r]   r[   r]   )r   r  r   Sequence[bool]r   r  r[   r]   )rd   rd   NN)r3   r   r   Sequence[str | Expression]r   r  r   
int | Noner   r  r   Sequence[bool] | Noner   r  r   boolr[   r   )r  	Exceptionr  r   r[   zColumnNotFoundError | Exception)ri   r]   r6   r   r[   r   )r3   r]   r[   r   )m
__future__r   	functoolsr   typingr   r-   r   duckdb.sqltypessqltypesr   r.   duckdb.typingnarwhals._utilsr   r   r	   r
   narwhals.exceptionsr   collections.abcr   r   r   narwhals._compliant.typingr   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   narwhals.typingr   r   r  r   r   ColumnExpressionr   ConstantExpressionr?   CaseExpressionr  FunctionExpressionr>   r8   rA   rN   rP   rs   rY   r~   MAINrq   r   DOUBLEr   FLOATr   BLOBr   VARCHARr   BOOLEANr   DATEr   TIMEr   TINYINTr   SMALLINTr   INTEGERr   BIGINTr   HUGEINTr   UTINYINTr   	USMALLINTr   UINTEGERr   UBIGINTr   UHUGEINTr   rb   TIMESTAMP_STIMESTAMP_MS	TIMESTAMPTIMESTAMP_NSr   r   Categoricalr   r   r   r   r   r   r   r  r  r   __all__rd   rB   r7   <module>rD     sa   "     *+
 W V 31'@:0%3 
	
				



 $E2 !-mD  * , (
 ,(5(=G((  57 X $.! & &>.J,.J.J ).J 	.Jb 2- -: 
		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  nnf&8&89 44&4<L44nY$7	 	 -;	 IW	 	  02+-!= )-(,=
=,= )= 	=
 = &= &= = =@!6$"M  *))*s   M MM