
    h;                       S SK Jr  S SKrS SKJrJrJr  S SKJrJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  \R(                  " \5         S SKJr  SSS5        \(       a  S SKJr  S S	KJr  S S
KJrJrJr  SSSSS.           SS jjrSS jr SS.       SS jjr!SS.     S S jjr"SS.     S!S jjr#SS.     S"S jjr$    S#S jr%S$S jr&SS.     S%S jjr'      S&S jr(S'S jr)S(S jr*g! , (       d  f       N= f))    )annotationsN)
CollectionIterableMapping)TYPE_CHECKINGAny)	functions)qualified_type_name)ComputeError)Expr)PyExpr)ColumnNameOrSelectorIntoExprPolarsDataTypeF)
str_as_litlist_as_series	structifydtypec                  [        U [        R                  5      (       a   U nU(       a  [        U5      nUR                  $ [        U [        5      (       a)  U(       d"  [
        R                  " U 5      nUR                  $ [        U [        5      (       a<  U(       a5  [
        R                  " [        R                  " U 5      US9nUR                  $ [
        R                  " XS9nUR                  $ )aR  
Parse a single input into an expression.

Parameters
----------
input
    The input to be parsed as an expression.
str_as_lit
    Interpret string input as a string literal. If set to `False` (default),
    strings are parsed as column names.
list_as_series
    Interpret list input as a Series literal. If set to `False` (default),
    lists are parsed as list literals.
structify
    Convert multi-column expressions to a single struct expression.
dtype
    If the input is expected to resolve to a literal with a known dtype, pass
    this to the `lit` constructor.

Returns
-------
PyExpr
)r   )
isinstanceplr   _structify_expressionstrFcollistlitSeries_pyexpr)inputr   r   r   r   exprs         R/home/james-whalen/.local/lib/python3.13/site-packages/polars/_utils/parse/expr.pyparse_into_expressionr#      s    > %!!(.D << 
E3		
uuU| << 
E4	 	 ^uuRYYu%U3 << uuU(<<    c                J   U R                   R                  5       nUR                   R                  5       (       aB   U R                   R                  5       n[        R
                  " U5      R                  U5      n U $ U $ ! [         a    [        R
                  " U 5      n  U $ f = fN)metaundo_aliaseshas_multiple_outputsoutput_namer   structaliasr   )r!   unaliased_expr	expr_names      r"   r   r   C   s    YY++-N//11	=		--/I 88N+11)<DK4K	  	"88D>D K		"s   A> > B"!B")__structifyc                Z    [        XS9nU(       a  [        X S9nUR                  U5        U$ )a  
Parse multiple inputs into a list of expressions.

Parameters
----------
*inputs
    Inputs to be parsed as expressions, specified as positional arguments.
**named_inputs
    Additional inputs to be parsed as expressions, specified as keyword arguments.
    The expressions will be renamed to the keyword used.
__structify
    Convert multi-column expressions to a single struct expression.

Returns
-------
list of PyExpr
r   )_parse_positional_inputs_parse_named_inputsextend)r/   inputsnamed_inputsexprsnamed_exprss        r"   parse_into_list_of_expressionsr9   O   s,    , %VCE),N[!Lr$   Tstrictc               D   [        U [        5      (       a  SS KJn  UR	                  U /US9$ [        U [
        R                  5      (       a  U $ [        U [
        R                  5      (       a  U R                  R                  5       $ S[        U 5      < S3n[        U5      e)Nr   require_allzcannot turn z into selector)r   r   polars.selectors	selectorsby_namer   Selectorr   r'   as_selectorr
   	TypeError)ir;   csmsgs       r"   parse_into_selectorrH   m   s    
 !S%zz1#6z22	Ar{{	#	#	Arww		vv!!##036nEnr$   c               ^   [        U [        5      (       a  [        U [        5      (       d{  SS KJn  [        [        S U 5      5      nUR                  X1S9n[        U5      [        U 5      :X  a  U$ [        U5      S:X  a  UR                  5       nU  H  nU[        XQS9-  nM     U$ [        XS9$ )Nr   c                "    [        U [        5      $ r&   )r   r   )rE   s    r"   <lambda>*parse_list_into_selector.<locals>.<lambda>   s    
1c(:r$   r=   r:   )r   r   r   r?   r@   r   filterrA   lenemptyrH   )r5   r;   rF   columnsselectorrE   s         r"   parse_list_into_selectorrR      s    
 &*%%j.E.E%v:FCD::g::w<3v;&O w<1xxzHA+A==H "699r$   r1   c               V    [        U 5      nU Vs/ s H  n[        X1S9PM     sn$ s  snf Nr1   )_parse_inputs_as_iterabler#   )r5   r   inputs_iteres       r"   r2   r2      s,    
 ,F3KCNO;a!!9;OOOs   &c                    U (       d  / $ [        U 5      S:X  a%  [        U S   [        5      (       a  Sn[        U5      e[        U 5      S:X  a  [	        U S   5      (       a  U S   $ U $ )N   r   u8  Cannot pass a dictionary as a single positional argument.
If you merely want the *keys*, use:
  • df.method(*your_dict.keys())
If you need the key value pairs, use one of:
  • unpack as keywords:    df.method(**your_dict)
  • build expressions:     df.method(expr.alias(k) for k, expr in your_dict.items()))rN   r   r   rD   _is_iterable)r5   rG   s     r"   rU   rU      sl     	 6{aJvay'::e 	 n 6{aL33ayMr$   c                    [        U [        5      =(       a*    [        U [        [        [        R
                  45      (       + $ r&   )r   r   r   bytesr   r   )r    s    r"   rZ   rZ      s2    eX& zUBII&0 , r$   c             #  r   #    U R                  5        H  u  p#[        X1S9R                  U5      v   M!     g 7frT   )itemsr#   r,   )r6   r   namer    s       r"   r3   r3      s2      $))+#E?EEdKK ,s   57c                 t    [        U 5      nU(       a  [        U5      nUR                  U5        [        U5      $ )a  
Parse predicates and constraints into a single expression.

The result is an AND-reduction of all inputs.

Parameters
----------
*predicates
    Predicates to be parsed, specified as positional arguments.
**constraints
    Constraints to be parsed, specified as keyword arguments.
    These will be converted to predicates of the form "keyword equals input value".

Returns
-------
PyExpr
)r2   _parse_constraintsr4   _combine_predicates)
predicatesconstraintsall_predicatesconstraint_predicatess       r"   ,parse_predicates_constraints_into_expressionrg      s6    * .j9N 2; ?34~..r$   c              #     #    U R                  5        H6  u  p[        R                  " U5      R                  U5      R                  v   M8     g 7fr&   )r^   r   r   eqr   )rd   r_   values      r"   ra   ra      s7     "((*eeDknnU#+++ +s   AAc                ~    U (       d  Sn[        U5      e[        U 5      S:X  a  U S   $ [        R                  " U 5      $ )Nz5at least one predicate or constraint must be providedrY   r   )rD   rN   plrall_horizontal)rc   rG   s     r"   rb   rb      s;    En
:!!}j))r$   )r    r   r   boolr   rn   r   rn   r   zPolarsDataType | Nonereturnr   )r!   r   ro   r   )r5   IntoExpr | Iterable[IntoExpr]r/   rn   r6   r   ro   list[PyExpr])rE   r   r;   rn   ro   pl.Selector)r5   z7ColumnNameOrSelector | Collection[ColumnNameOrSelector]r;   rn   ro   rr   )r5   z0tuple[IntoExpr, ...] | tuple[Iterable[IntoExpr]]r   rn   ro   rq   )r5   z&tuple[Any, ...] | tuple[Iterable[Any]]ro   zIterable[Any])r    zAny | Iterable[Any]ro   rn   )r6   dict[str, IntoExpr]r   rn   ro   Iterable[PyExpr])rc   rp   rd   r   ro   r   )rd   rs   ro   rt   )rc   rq   ro   r   )+
__future__r   
contextlibcollections.abcr   r   r   typingr   r   polars._reexport	_reexportr   polarsr	   r   polars._utils.variousr
   polars.exceptionsr   suppressImportErrorpolars._plr_plrrl   r   r   polars._typingr   r   r   r#   r   r9   rH   rR   r2   rU   rZ   r3   rg   ra   rb    r$   r"   <module>r      s   "  9 9 %  ! 5 *% & "MM  #'++ + 	+
 + !+ +\	 *  	B   	* :C: : 	:8 P<P P 	P22 =BL%L59LL/.// /<,
*} &%s   C;;
D	