
    g                    $   d dl mZ d dl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 erd dlZd d
lmZ d dlmZ d dlmZ d dlmZ 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ ed      dd       ZddZddZy)    )annotationsN)	lru_cache)TYPE_CHECKING)Any)DType)InvalidIntoExprError)import_dtypes_module)isinstance_or_issubclass)DuckDBLazyFrame
DuckDBExpr)IntoDuckDBExpr)Versionc                   |r2t        | j                  j                  |g      j                  d         S t        | j                  j	                  |      j                  d         S )Nr   )str_native_frame	aggregatecolumnsselect)dfcolumnreturns_scalars      K/var/www/openai/venv/lib/python3.12/site-packages/narwhals/_duckdb/utils.pyget_column_namer      sW     2##--vh7??BCCr&&v.66q9::    c                   dd l }ddlm} t        ||      rL|j	                  |       }t        |      dk7  rd}t        |      |d   }|j                  rd}t        |      |S t        |t              r|S  |j                  |      S )Nr   r      z^Multi-output expressions (e.g. `nw.all()` or `nw.col('a', 'b')`) not supported in this contextzbReductions are not yet supported for DuckDB, at least until they implement duckdb.WindowExpression)duckdbnarwhals._duckdb.exprr   
isinstance_calllenNotImplementedError_returns_scalarr
   r   ConstantExpression)r   objr   r   column_resultsmsgcolumn_results          r   maybe_evaluater*      s    0#z"2~!#rC%c**&q)vC%c**U+
$6$$S))r   c           	        i }|D ]{  }t        | |      }t        |t              r|g}n>|j                  &|D cg c]  }t	        | ||j
                         }}n|j                  }|j                  t        ||             } |j                         D ]4  \  }}t        | |      }	t        |	      dk7  rd}
t        |
      |	d   ||<   6 |S c c}w )N)r   r   z-Named expressions must return a single columnr   )_columns_from_exprr    r   _output_namesr   r$   updatezipitemsr"   AssertionError)r   exprsnamed_exprsresult_columnsexprcolumn_listoutput_namescol	col_aliascolumns_listr(   s              r   parse_exprs_and_named_exprsr;   2   s    
 :<N(T2dC  6L' '&C  C8L8LM&  
  --Lc,<=  ',,.	4)"d3|!AC %%$0Oy! / s   Cc                .   t        |t              rddlm}  ||      gS t	        |d      rM|j                  |       }|j                  .t        |      t        |j                        k7  rd}t        |      |S t        j                  t        |            )Nr   )ColumnExpression__narwhals_expr__z_Safety assertion failed, please report a bug to https://github.com/narwhals-dev/narwhals/issues)r    r   r   r=   hasattrr!   r-   r"   r1   r   from_invalid_typetype)r   r5   r=   col_output_listr(   s        r   r,   r,   M   s     $+ &''	*	+**R.) C(:(:$;;sC %%"44T$Z@@r      )maxsizec                   t        |      }| dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j	                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | d	k(  r|j                         S | d
k(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j                         S | dk(  r|j!                         S | dk(  r|j#                         S | j%                  d      rmt'        j(                  d|       }|j+                  t-        t/        |            D cg c]*  }|j1                  ||   d   t3        ||   d   |            , c}      S t'        j4                  d|       x}r*|j7                  t3        |j9                  d      |            S t'        j4                  d|       x}rC|j;                  t3        |j9                  d      |      t=        |j9                  d                  S | j%                  d      r|j?                         S |jA                         S c c}w )NHUGEINTBIGINTINTEGERSMALLINTTINYINTUHUGEINTUBIGINTUINTEGER	USMALLINTUTINYINTDOUBLEFLOATVARCHARDATE	TIMESTAMPBOOLEANINTERVALSTRUCTz(\w+)\s+(\w+)r   r   z	(.*)\[\]$z(\w+)\[(\d+)\]   zDECIMAL()!r	   Int128Int64Int32Int16Int8UInt128UInt64UInt32UInt16UInt8Float64Float32StringDateDatetimeBooleanDuration
startswithrefindallStructranger"   Fieldnative_to_narwhals_dtypematchListgroupArrayintDecimalUnknown)duckdb_dtypeversiondtypesmatchstruc_imatch_s         r   rp   rp   `   s   !'*Fy }}x||~y ||~z!||~y {{}z!~~y }}z!}}{"}}z!||~x~~w~~y }}v{{}{"  y ~~z!  x(jj!1<@}} s;/0
 1A	 N1%,[^A->H 1
 	
 ,55v5{{3FLLOWMNN+\::v:||$V\\!_g>Q 
 	
 z*~~>>#s   9/J=c                   t        |      }t        | |j                        ryt        | |j                        ryt        | |j                        ryt        | |j
                        ryt        | |j                        ryt        | |j                        ryt        | |j                        ryt        | |j                        ryt        | |j                        ry	t        | |j                        ry
t        | |j                        ryt        | |j                        ryt        | |j                        rd}t        |      t        | |j                         r't#        | dd      }t#        | dd       }d}t        |      t        | |j$                        rt#        | dd      }d}t        |      t        | |j&                        ryt        | |j(                        rd}t        |      t        | |j*                        rd}t        |      t        | |j,                        rd}t        |      d|  }t/        |      )NrQ   rP   rG   INTrI   rJ   rL   UINTrN   rO   rR   rU   z#Categorical not supported by DuckDB	time_unitus	time_zonetodorS   zUnknown dtype: )r	   r
   rc   rd   rZ   r[   r\   r]   r_   r`   ra   rb   re   rh   Categoricalr#   rg   getattrri   rf   rr   rm   rt   r1   )dtypery   rz   r(   
_time_unit
_time_zones         r   narwhals_to_native_dtyper      s   !'*Fv~~6v~~6v||4v||4v||4v{{3v}}5v}}5v}}5v||4v}}5v~~6v'9'9:3!#&&v7UK6
UK6
!#&&v7UK6
!#&&v{{3v{{3!#&&v}}5!#&&v||4!#&&E7
#C

r   c                8    | j                   xr t        |dd      S )Nr$   T)r$   r   )lhsrhss     r   binary_operation_returns_scalarr      s     H730A4#HHr   )r   r   r   zduckdb.Expressionr   boolreturnr   )r   r   r&   r   r   r   )r   r   r2   r   r3   r   r   zdict[str, duckdb.Expression])r   r   r5   r   r   zlist[duckdb.Expression])rx   r   ry   r   r   r   )r   zDType | type[DType]ry   r   r   r   )r   r   r   zDuckDBExpr | Anyr   r   )
__future__r   rk   	functoolsr   typingr   r   narwhals.dtypesr   narwhals.exceptionsr   narwhals.utilsr	   r
   r   narwhals._duckdb.dataframer   r   r   narwhals._duckdb.typingr   r   r   r*   r;   r,   rp   r   r    r   r   <module>r      s    " 	     ! 4 / 3:06&;;!2;GK;;*( " "	6AA-AA& 28 8v2jIr   