
    -Phf(                    d   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	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ddddddddd
Zej        Z	 ej        Z	 ej        Z	 ddd>dZd?d#Z G d$ d%          Z d@d,Z!dAd/Z" ed01          dBd3            Z#dCd6Z$dDd9Z%dEd=Z&dS )F    )annotations)	lru_cache)TYPE_CHECKINGAnyN)Versionisinstance_or_issubclass)DuckDBPyRelation
Expression)DuckDBPyType)DuckDBLazyFrame)
DuckDBExpr)DType)	IntoDTypeyearquartermonthdayhourminutesecondmillisecondmicrosecond
nanosecond)
yqmodhmsmsusns )	separatorexprsr
   r%   strreturnc                j    | r t          j        dt          |           g|R  nt          j        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)duckdbFunctionExpressionlit)r%   r&   s     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/narwhals/_duckdb/utils.py
concat_strr0   *   sG    " 	9!+s9~~FFFFF&x8%888    dfr   r   list[tuple[str, Expression]]c               p   g }|D ]}|                     |           }|                    |           }|j        |                    |          }t          |          t          |          k    r%d| dt          |           d}t	          |          |                    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)r2   r&   native_resultsexprnative_series_listoutput_namesmsgs          r/   evaluate_exprsrA   @   s     46N E E!ZZ^^22266#/33LAAL|$6 7 777tlttSVWiSjSjtttC %%%c,0BCCDDDDr1   c                  B    e Zd ZU dZdZded<   dd	Ze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                    || _         d S )N)_rel)selfrE   s     r/   __init__zDeferredTimeZone.__init__d   s    			r1   r'   c                P    | j         t          | j                  | _         | j         S )z;Fetch relation time zone (if it wasn't calculated already).)rD   fetch_rel_time_zonerH   )rI   s    r/   	time_zonezDeferredTimeZone.time_zoneg   s(     !)%8%C%CD"%%r1   )rE   r	   r(   rF   )r(   r'   )	__name__
__module____qualname____doc__rD   __annotations__rJ   propertyrM    r1   r/   rC   rC   P   sh          " %)((((    & & & X& & &r1   rC   duckdb_dtyper   versionr   deferred_time_zoner   c                *  
 | j         }j        
|dk    r)
                    t          | j                            S |dk    r*| j        }
                    
fd|D                       S |dk    r| j        \  }}|d         g}|d         j         dk    r=|d         j        \  }}|                    d|d                    |d         j         dk    =t          |d                   }
                    |t          |                    S |dk    rKt          j        u r
                                S | j        d         d         }	
                    |		          S |d
k    r
                    j                  S t          |          S )Nliststructc           
     t    g | ]4}                     |d          t          |d                             5S )r      )namedtype)Fieldnative_to_narwhals_dtype).0childrW   dtypesrV   s     r/   
<listcomp>z,native_to_narwhals_dtype.<locals>.<listcomp>~   sY       
 	 q258WFXYY     r1   arrayr\   r   )innershapeenum)
categoriesztimestamp with time zone)rM   )idrc   Listr`   rb   childrenStructinsertArraytupler   V1EnumDatetimerM   $_non_nested_native_to_narwhals_dtype)rU   rV   rW   duckdb_dtype_idrl   rb   sizerg   rf   ri   rc   s    ``       @r/   r`   r`   o   s    #oO^F &  {{$\%7BTUU
 
 	
 (""(}}     
 &  
 
 	
 '!!"+t G9AhkW$$(+KE4LLDG$$$ AhkW$$ )q7<NOO||%uU|||<<<&  gj  ;;== !*1-a0
{{j{111444);)EFFF/IIIr1   rE   duckdb.DuckDBPyRelationc                j    |                      dd                                          }|J |d         S )Nzduckdb_settings()z;select value from duckdb_settings() where name = 'TimeZone'r   )queryfetchone)rE   results     r/   rL   rL      s?    YYZ hjj  !9r1      )maxsizeru   c                   |j         }i 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booleaninterval)decimaltimeblob)rc   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDaters   BooleanDurationDecimalTimeBinarygetUnknown)ru   rV   rc   s      r/   rt   rt      s   ^F6==??&,,.. 	6<<>> 	FLLNN	
 	6;;== 	FNN$$ 	6==?? 	FMMOO 	V]]__ 	FLLNN 	&.."" 	!! 	6==?? 	 	V__&&  	6>>##!" 	FOO%%#$ >>##)  * 
c/6>>++,,+-r1   r^   r   c                @   j         }t          | |j                  rd}t          |          t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j	                  rdS t          | |j
                  rdS t          | |j                  rd	S t          | |j                  rd
S t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rdS t          | |j                  rd}t          |          t          | |j                  rkt,          j        u rd}t          |          t1          | |j                  r&dd                    | j                  z   dz   }d| dS d}t7          |          t          | |j                  r| j        }| j        }d}t          |          t          | |j                  r| j        }d}t          |          t          | |j                   rdS t          | |j!                  rtE          | j#                  }| dS t          | |j$                  r,d                    fd| j%        D                       }d| dS t          | |j&                  rJ| j'        }d                    d  |D                       }	| }
|D ]	}|
j#        }

tE          |
          }| |	 S d!|  }tQ          |          )"Nz(Casting to Decimal is not supported yet.DOUBLEFLOATINT128BIGINTINTEGERSMALLINTTINYINTUINT128UBIGINTUINTEGER	USMALLINTUTINYINTVARCHARBOOLEANTIMEBLOBz#Categorical not supported by DuckDBz9Converting to Enum is not supported in narwhals.stable.v1'z', 'zENUM ()z9Can not cast / initialize Enum without categories presenttodoDATEz[], c              3  X   K   | ]$}d |j          dt          |j                   V  %dS )"z" N)r]   narwhals_to_native_dtyper^   )ra   fieldrV   s     r/   	<genexpr>z+narwhals_to_native_dtype.<locals>.<genexpr>  sW       
 
 O
NN6u{GLLNN
 
 
 
 
 
r1   zSTRUCT(r$   c              3  "   K   | ]
}d | dV  dS )[]NrT   )ra   items     r/   r   z+narwhals_to_native_dtype.<locals>.<genexpr>	  s*      "A"A4;t;;;"A"A"A"A"A"Ar1   zUnknown dtype: ))rc   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Categoricalrr   r   rq   
isinstancejoinri   
ValueErrorrs   	time_unitrM   r   r   rk   r   rf   rm   fieldsro   rg   r9   )r^   rV   rc   r@   ri   
_time_unit
_time_zonerf   rg   duckdb_shape_fmtinner_dtype_duckdb_inners    `           r/   r   r      s   ^Fv~66 '8!#&&&v~66 xv~66 wv}55 xv|44 xv|44 yv|44 zv{33 yv~66 yv}55 yv}55 zv}55 {v|44 zv}55 yv~66 yv{33 vv}55 vv'9:: '3!#&&&v{33 gj  MC%c***eV[)) 	*v{{5+;<<<sBJ)J))))Ioov77 '_
_
!#&&&v77 '_
!#&&&v{33 vv{33 (g>>|||v}55 "		 
 
 
 

 
 
 
 
 "!!!!v|44 377"A"A5"A"A"AAA  	, 	,A%+KK/WEE2 0222
#E
#
#C


r1   partition_bystr | Expressionc                 R    | sdS d                     d | D                       }d| S )Nr$   r   c                \    g | ])}t          |t                    rt          |          n| *S rT   )r   r'   colra   xs     r/   rd   z-generate_partition_by_sql.<locals>.<listcomp>  s4    WWWQZ3%7%7>3q666Q@WWWr1   zpartition by r   )r   by_sqls     r/   generate_partition_by_sqlr     s=     rYYWW,WWWXXF#6###r1   order_by	ascendingboolc                    | r d                     d |D                       }nd                     d |D                       }d| S )Nr   c                2    g | ]}t          |           d S )z asc nulls firstr   r   s     r/   rd   z)generate_order_by_sql.<locals>.<listcomp>  '    JJJAs1vv777JJJr1   c                2    g | ]}t          |           d S )z desc nulls lastr   r   s     r/   rd   z)generate_order_by_sql.<locals>.<listcomp>  r   r1   z	order by r   )r   r   r   s      r/   generate_order_by_sqlr     s[     LJJJJJKKJJJJJKKvr1   )r&   r
   r%   r'   r(   r
   )r2   r   r&   r   r(   r3   )rU   r   rV   r   rW   rC   r(   r   )rE   rw   r(   r'   )ru   r'   rV   r   r(   r   )r^   r   rV   r   r(   r'   )r   r   r(   r'   )r   r'   r   r   r(   r'   )'
__future__r   	functoolsr   typingr   r   r,   narwhals._utilsr   r   r	   r
   duckdb.typingr   narwhals._duckdb.dataframer   narwhals._duckdb.exprr   narwhals.dtypesr   narwhals.typingr   
UNITS_DICTColumnExpressionr   ConstantExpressionr.   CaseExpressionwhenr0   rA   rC   r`   rL   rt   r   r   r   rT   r1   r/   <module>r      s0   " " " " " "       % % % % % % % %  = = = = = = = = *33333333******::::::000000%%%%%%)))))) 
	
				


 
  * , ( 57      ,    & & & & & & & &>,J ,J ,J ,J^    2- - - -4O O O Od$ $ $ $           r1   