
    j                    d   U d Z ddlmZ ddlZddlZddlZddlZddl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mZ dd	lmZ dd
lmZmZmZmZmZmZ ddlmZ ddlmZmZ er"ddl m!Z!m"Z"m#Z# ddl m$Z% ddlm&Z& ddlm'Z' ddlm(Z(  G d de          Z)ed         Z*de+d<   e,e)z  Z-de+d<   ej.        dk    Z/de+d<   e/o
ej.        dk    Z0de+d<   e0o
ej.        dk    Z1de+d<    ed          Z2d e+d!<    G d" d#          Z3 e4d$          Z5d%e+d&<    e4d'          Z6d%e+d(<    e4d)          Z7d%e+d*<   d+d,d-d.d/d0d1d2d3Z8d4e+d5<   d6d7d8d9Z9d4e+d:<    e4e9          d;hz  Z:d%e+d<<   i d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddZ;d4e+de<   dfdghgg e3j<        gg e6gg e7gdhdfdghgg e3j<        gg dihgg e5gdhdfhgg e3j<        gg djhgg dkhgdhdfhgdghge3j<        gg dlhgg dmhgdndodfhgdghgdphge3j<        gdldqhgdlhgdmhgdndogZ=dre+ds<   dt e=D             Z=dudvdwdxdydzd{d|Z>d4e+d}<    ej?        d~          Z@de+d<    ej?        d          ZAde+d<    ej?        d          ZBde+d<   ddZCddZD G d d          ZE G d d          ZF G d d          ZGddZHddZIddgZJdS )zNUtilities related to user defined functions (such as those passed to `apply`).    )annotationsN)bisect_left)defaultdict)get_instructions)	signature)countzip_longest)Path)TYPE_CHECKINGAnyClassVarFinalLiteral
NamedTuple)LRUCache)
NO_DEFAULT	re_escape)CallableIteratorMutableMapping)Set)Instruction)	TypeAlias)	NoDefaultc                  F    e Zd ZU ded<   ded<   ded<   ded<   dZded	<   dS )

StackValuestroperatorintoperator_arityleft_operandright_operandN
str | Nonefrom_module)__name__
__module____qualname____annotations__r$        W/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/polars/_utils/udfs.pyr   r   &   sP         MMM"K""""""r*   r   )exprframeseriesr   	MapTarget
StackEntry)      r   
_MIN_PY311)r1      
_MIN_PY312)r1      
_MIN_PY314    z@MutableMapping[tuple[Callable[[Any], Any], str], BytecodeParser]_BYTECODE_PARSER_CACHE_c                     e Zd ZU ddddddddd	d
dddZded<    eerdhnddh          Zer	esdddddndddddZ	ded<    ed          Z
 eddh          Ze
ez  ZdddZded<   ddiZded <   d
dd!d"Zded#<    eh d$ ee          z   ee	          z   ee          z  e
z            Z ee          ez   ee          z  ez  ez  Z ee                                          Zd%S )&OpNames+&z//<<>>%*|z**-/^)
BINARY_ADD
BINARY_ANDBINARY_FLOOR_DIVIDEBINARY_LSHIFTBINARY_RSHIFTBINARY_MODULOBINARY_MULTIPLY	BINARY_ORBINARY_POWERBINARY_SUBTRACTBINARY_TRUE_DIVIDE
BINARY_XORzClassVar[dict[str, str]]BINARYCALLCALL_FUNCTIONCALL_METHOD)POP_JUMP_FORWARD_IF_FALSEPOP_JUMP_FORWARD_IF_TRUEJUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POP)POP_JUMP_IF_FALSEPOP_JUMP_IF_TRUErX   rY   CONTROL_FLOW)
LOAD_CONST
LOAD_DEREF	LOAD_FASTLOAD_GLOBALLOAD_METHOD	LOAD_ATTRr_   r]   )LOAD_FAST_BORROWLOAD_SMALL_INTSIMPLIFY_SPECIALIZEDPOLARS_EXPRESSION   zClassVar[dict[str, int]]	SYNTHETIC~)UNARY_NEGATIVEUNARY_POSITIVE	UNARY_NOTUNARY>   IS_OP	BINARY_OP
COMPARE_OPCONTAINS_OPBINARY_SUBSCRN)r%   r&   r'   rR   r(   	frozensetr3   rS   r5   r\   LOAD_VALUESrb   LOADre   rh   rm   setPARSEABLE_OPSMATCHABLE_OPSvaluesUNARY_VALUESr)   r*   r+   r;   r;   :   s        #!( (F     9QfXX/=1QRRD 	
 )	
),(+$'#&		
 	
 	
 "% #$'#&	
 
       )TUUK	=+677I"D'&6 6    
 	Q+I     ' 'E    
 ILLL
#e**	
#l

	 #i..	 		 M 	 !!M1CCKK?)KdR  9U\\^^,,LLLr*   r;   )acosacoshasinasinhatanatanhcbrtceilcoscoshdegreesexpfloorloglog10log1ppowradianssinsinhsqrttantanhzFinal[frozenset[str]]_MATH_FUNCTIONS)npnumpy_NUMPY_MODULE_ALIASES)arccosarccosharcsinarcsinharctanarctanhr   r   r   r   r   r   r   r   r   r   r   signr   r   r   r   r   _NUMPY_FUNCTIONSz	dt.date()zdt.day()z	dt.hour()zdt.microsecond()zdt.minute()z
dt.month()zdt.second()z	dt.year())datedayhourmicrosecondminutemonthsecondyearzFinal[dict[str, str]]_PYTHON_ATTRS_MAPFloat64Int64String)floatr   r   _PYTHON_CASTS_MAPabs_PYTHON_BUILTINSendswithstr.ends_withlowerzstr.to_lowercaselstripzstr.strip_chars_startremoveprefixzstr.strip_prefixremovesuffixzstr.strip_suffixreplacestr.replacerstripzstr.strip_chars_end
startswithstr.starts_withstripzstr.strip_charstitlezstr.to_titlecaseupperzstr.to_uppercasezfillz	str.zfillr   zdt.dater   zdt.dayr   zdt.hour
isoweekdayz
dt.weekdayr   zdt.microsecondzdt.monthz	dt.secondzdt.strftimezdt.timezdt.year)r   r   strftimetimer   _PYTHON_METHODS_MAPr_   r]   )argument_1_opnameargument_2_opnamemodule_opnameattribute_opnamemodule_nameattribute_namefunction_namemathjsonloadsdatetimestrptimeF)r   r   r   r   r   r   r   check_load_globalrb   dtz'list[dict[str, list[AbstractSet[str]]]]_MODULE_FUNCTIONSc                \    g | ])}t          t          j                  gg fD ]
}i |d |i*S )argument_1_unary_opname)rv   r;   rm   ).0kindunarys      r+   
<listcomp>r     sa       w}%%&+  	 /t.&..   r*   r   r   r   r   r   r   str.json_decode)z	math.acosz
math.acoshz	math.asinz
math.asinhz	math.atanz
math.atanhz
json.loads_MODULE_FUNC_TO_EXPR_NAMEz,pl\.col\("([^"]*)"\) & pl\.col\("\1"\)\.(.+)_RE_IMPLICIT_BOOLz^(s|srs\d?|series)\._RE_SERIES_NAMESz^bool\((.+)\)$_RE_STRIP_BOOLreturndict[str, Any]c                 8   t          t                    j        j        } t          j                    }d}	 |rFt          j        |          }|                    t          |                     r|j        }|dz  }nn|F|i }ni |j	        |j
        }~n# ~w xY w|S )z7Get all local and global variables from caller's frame.r   rg   )r
   __file__parentinspectcurrentframegetfiler   r   f_backf_locals	f_globals)pkg_dirr-   nfname	variabless        r+   _get_all_caller_variablesr   ,  s    8nn#*G  ""E	A 	OE**EG-- Q  	 =II=5>=U_=I EE				s   AB Bcolr   
expression
map_targetc                   d|  d}|dk    r|S |dk    rt                               |          r|                    dd          d         S |                    |d          }d	D ]}t	          j        d
| d
|          s|c S  t                      }	 dt          |           }t	          j        d
| d
|          s|S .d|}t          |          )z@The name of the object against which the 'map' is being invoked.pl.col("")r,   r.   .rg   r    )ssrsr.   z\bTr   zTODO: map_target = )	r   matchsplitr   researchr   nextNotImplementedError)r   r   r   col_exprsearch_exprnamer   msgs           r+   _get_target_namer   I  s   !#!!!HV	x		!!*-- 	/##C++A.. !((266* 	 	D9^4^^^[99 GG	"a??D9^4^^^[99 	
 /

.
.C
c
"
""r*   c                     e Zd ZU dZdZded<   dZded<   dZded<   eZ	d	ed
<   d*dZ
d+dZed,d            Zd-dZed.d            Zd/dZd0dZed1d             Zed2d!            Zed3d"            Zed2d#            Zd4d%Zddd&d5d)ZdS )6BytecodeParserzMIntrospect UDF bytecode and determine if we can rewrite as native expression.Nr#   _map_target_namezbool | None_can_attempt_rewritedict[str, Any] | None_caller_variablesz"tuple[str, str] | NoDefault | None_col_expressionfunctionCallable[[Any], Any]r   r/   r   Nonec                    	 t          |          }n# t          $ r t          g           }Y nw xY w|| _        || _        |                     |          | _        t          || j        |          | _	        dS )aI  
        Initialize BytecodeParser instance and prepare to introspect UDFs.

        Parameters
        ----------
        function : callable
            The function/lambda to disassemble and introspect.
        map_target : {'expr','series','frame'}
            The underlying target object type of the map operation.
        )instructionscaller_variablesr  N)
r   	TypeErroriter	_function_map_target_get_param_name_param_nameRewrittenInstructionsr  _rewritten_instructions)selfr  r   original_instructionss       r+   __init__zBytecodeParser.__init__j  s    	-$4X$>$>!! 	- 	- 	- %)HH!!!	-
 "%//99'<.!3(
 (
 (
$$$s    ..r,   r   c                    t                               |          r6t                               d|          }t                               |          6|S )zIDrop extraneous/implied bool (eg: `pl.col("d") & pl.col("d").dt.date()`).zpl.col("\1").\2)replstring)r   r   sub)r  r,   s     r+   _omit_implicit_boolz"BytecodeParser._omit_implicit_bool  sP    &&t,, 	O$((.@(NND  &&t,, 	Or*   c                    	 t          |           }n# t          $ r Y dS w xY wt          |j        x}          dk    r.t	          t          |                                                    ndS )z&Return single function parameter name.Nrg   )r   
ValueErrorlen
parametersr   r  keys)r  sigr   s      r+   r  zBytecodeParser._get_param_name  s~    	H%%CC 	 	 	44	 /:00A55 joo''(()))	
s    
  expression_blocksdict[int, str]logical_instructionslist[Instruction]list[tuple[int, str]]c                   |rt          d |D                       dk    rt          |                                          }d}|D ]v}|t          ||j                  dz
           }|t          ||j                  dz
           }|dk    r||d         k    s&|||fvr d||         z   ||<   ||xx         dz  cc<   |}w|D ]!}t          j        |j                 ||j        <   "t          |
                                          S )zBInject nesting boundaries into expression blocks (as parentheses).c                    h | ]	}|j         
S r)   opnamer   insts     r+   	<setcomp>z1BytecodeParser._inject_nesting.<locals>.<setcomp>  s    AAADDKAAAr*   rg   r   ())r  listr!  r   offsetargvalr;   r\   r+  sorteditems)r  r#  r%  block_offsetsprev_endr-  startends           r+   _inject_nestingzBytecodeParser._inject_nesting  s=      	S AA,@AAABBQFF+/0A0F0F0H0H+I+I0 + +D)+mT[*Q*QTU*UVE'M4;(O(ORS(STC!QJJ3-2C+C+C#E3<777:=Nu=U7U-e4-c222c9222'*H, S S181Edk1R!$+..'--//000r*   c                    | j         S )z8The map target, eg: one of 'expr', 'frame', or 'series'.)r  r  s    r+   r   zBytecodeParser.map_target       r*   boolc                    | j         f| j        duoWt          | j                  dk    o?t	          d | j        D                       o!t          d | j        D                       dk    | _         | j         S )aN  
        Determine if we may be able to offer a native polars expression instead.

        Note that `lambda x: x` is inefficient, but we ignore it because it is not
        guaranteed that using the equivalent bare constant value will return the
        same output. (Hopefully nobody is writing lambdas like that anyway...)
        N   c              3  <   K   | ]}|j         t          j        v V  d S N)r+  r;   rw   r,  s     r+   	<genexpr>z5BytecodeParser.can_attempt_rewrite.<locals>.<genexpr>  s@         K7#88     r*   c              3  0   K   | ]}|j         d k    dV  dS )RETURN_VALUErg   Nr*  r,  s     r+   rD  z5BytecodeParser.can_attempt_rewrite.<locals>.<genexpr>  s;        {n44 4444 r*   rg   )r  r  r  r  allsumr  r=  s    r+   can_attempt_rewritez"BytecodeParser.can_attempt_rewrite  s     $, , 455:    $ <        $ :    
  %  ((r*   c                8    t          j         | j                   dS )z%Print disassembled function bytecode.N)disr  r=  s    r+   rK  zBytecodeParser.dis  s    r*   c                    | j         S )zThe function being parsed.)r  r=  s    r+   r  zBytecodeParser.function  s     ~r*   c                4    t          | j        j                  S )zDThe original bytecode instructions from the function we are parsing.)r2  r  _original_instructionsr=  s    r+   r  z$BytecodeParser.original_instructions  s     D0GHHHr*   c                    | j         S )z0The parameter name of the function being parsed.)r  r=  s    r+   
param_namezBytecodeParser.param_name  r>  r*   c                *    t          | j                  S )zEThe rewritten bytecode instructions from the function we are parsing.)r2  r  r=  s    r+   rewritten_instructionsz%BytecodeParser.rewritten_instructions  s     D0111r*   r   c                     j         t          urZ j         S j         \  }}|k    rAt          j        dt	          |           ddt	                     d|          }|f _         |S d _         j        	d _         dS t          t                    }g d}t           j
                  D ]^\  }}|j        t          j        v r+ j
        |dz            j        }                    |           C||                             |           _	                       fd|                                D                       }n# t$          $ r d _         Y dS w xY wd	                    d
 |D                       }	d|	vr	d _         dS                      |	          }	 j        dk    r9 j        x}
t-          |	 j                  }
|	                    d d|
          }	|	f _         |	S )zDTranslate postfix bytecode instructions to polars expression/string.Nz
pl\.col\("z"\)r   r   r   rg   c                    i | ]]\  }}|t          |j        j        j                                       j        t          t                                        ^S ))r  r  r   r  )r   rP  depth)InstructionTranslatorr  r  r  to_expressionr  r   r?  )r   r3  opsr   r%  r  s      r+   
<dictcomp>z0BytecodeParser.to_expression.<locals>.<dictcomp>  s        $ 1%()-)?#'#3!%	  
 $m#'#3!$';"<"<== $    r*    c              3      K   | ]	\  }}|V  
d S rC  r)   )r   _offsetr,   s      r+   rD  z/BytecodeParser.to_expression.<locals>.<genexpr>  s&      LLtLLLLLLr*   pl.col(r.   )r  r   r   r  r   r  r  r   r2  	enumerater  r+  r;   r\   r3  appendr;  r6  r   joinr  r  r   r   )r  r   col_namer,   control_flow_blocksjump_offsetidxr-  expression_stringspolars_exprtarget_namer%  s   ``         @r+   rW  zBytecodeParser.to_expression  sp   z11d6J6V!1NHdhv:)H"5"5:::1y~~111 
 ),T{$K $##'D 4 *$//!"4#?@@ 	> 	>IC{g222":37CJ$++D1111#K077====	!%!5!5      (;'@'@'B'B   %" "  # 	 	 	#'D 44	 hhLL9KLLLLL K''#'D 422;??K8++#'#88KA"23TEU"V"VK)112DS2D2D2DkRR$'#5D s   6E EEsuggestion_overrideudf_overrideri  rj  c          
        ddl m}m} ddlm} |p|                     |          }|| j        x}t          ||| j                  }|p| j	        j
        pd}	|	dk    rd| j         d}	d	|v rd
nd}
| j        dk    rdnd\  }} |            rd| d|	 dd| d|
 fnd| d|	 dd| d|
 f\  }}t          j        d| d| d| d| | |                       dS dS )zFGenerate warning that suggests an equivalent native polars expression.r   )find_stacklevel in_terminal_that_supports_colour)PolarsInefficientMapWarningNz...z<lambda>zlambda z: ...z
pl.col("")zHNote: in list.eval context, pl.col("") should be written as pl.element()r   r,   )expressionsExpr)r.   Seriesz	  [31m- z.map_elements(z)[0m
z	  [32m+ z[0m
z  - z)
z  + 
z6.map_elements is significantly slower than the native zc API.
Only use if you absolutely CANNOT implement your logic otherwise.
Replace this expression...
zwith this one instead:
)
stacklevel)polars._utils.variousrl  rm  polars.exceptionsrn  rW  r  r   r  r  r%   r  warningswarn)r  r   ri  rj  rl  rm  rn  suggested_expressionrg  	func_nameaddendumapitypeclsnamebeforeafters                  r+   rw  zBytecodeParser.warn/  s   	
 	
 	
 	
 	
 	
 	
 	
 	BAAAAA2Md6H6H6M6M+#44=.-t/?  %H(?H5IJ&&=d&6===	  #777 [Z  #v-- (') GW 4355	S;SSiSSSL#7LL(LL  E;DDiDDD=/==8== FE MW  T[    
   ,*?,,	 	 	 	 	 	= ,+r*   )r  r  r   r/   r   r	  )r,   r   r   r   )r  r  r   r#   )r#  r$  r%  r&  r   r'  )r   r/   )r   r?  )r   r	  )r   r  )r   r&  )r   r#   )r   r   r   r#   )r   r   ri  r#   rj  r#   r   r	  )r%   r&   r'   __doc__r  r(   r  r  r   r  r  r  staticmethodr  r;  propertyr   rI  rK  r  r  rP  rR  rW  rw  r)   r*   r+   r  r  b  s        WW#'''''(,,,,,/33333:DODDDD
 
 
 
6    
 
 
 \
1 1 1 14       X ) ) ) )6           X I I I XI       X  2 2 2 X2B B B BP +/#'9 9 9 9 9 9 9 9r*   r  c                  J    e Zd ZdZddZddZedd            ZddZddZ	dS ) rV  z>Translates Instruction bytecode to a polars expression string.r  r&  r  r  r  r  r   r/   r   r	  c                X    |                      ||          | _        || _        || _        d S rC  )_to_intermediate_stack_stackr  r  )r  r  r  r  r   s        r+   r  zInstructionTranslator.__init__n  s.     11,
KK!1!r*   r   r   rP  rU  r   c                <    |                      | j        |||          S )z7Convert intermediate stack to polars expression string.)_exprr  )r  r   rP  rU  s       r+   rW  z#InstructionTranslator.to_expressiony  s    zz$+sJ>>>r*   r-  r   c                .   | j         x}t          j        v rt          j        |         S | j        r| j        S |dk    r| j        rdndS |dk    r| j        rdndS |t          j        v rt          j        |         S |dk    rdS d	| d
| }t          |          )z@Convert bytecode instruction to suitable intermediate op string.rn   is notisrq   not ininrr   replace_strictz$unexpected or unrecognised op name (z)

Please report a bug to https://github.com/pola-rs/polars/issues with the content of function you were passing to the `map` expression and the following instruction object:
)r+  r;   r\   argreprr4  rm   AssertionError)r-  r+  r   s      r+   opzInstructionTranslator.op}  s     k!Fg&:::'//\ 	&<w#{4884}$$#{4884w}$$=((&&##Nv N N FJN N  !%%%r*   valuer0   c                   t          |t                    rGt                              d|j                  }|                     |j        |||dz             }|j        dk    r|t          j	        vr|
                    d          r"|                    d          rdnd}| d| | S |d         t          j	        v r@|dd	         
                    d          r#|                    d          rdnd}d
| d| | S |j        t          v r|t          v rd}n5|j        dk    r(t                              d| |          t"          v rd}nd}| | d
| dS | | S |                     |j        |||dz             }	|dv r|j        dk    r|dk    rdnd}
| d|
 dS |dv r#|dk    rdnd}
d|v r|
 d
| d|	 dn	|
 | d|	 dS |dk    rd| j        st)                      | _        t          | j                            |d	          t*                    sd}t-          |          |	 d| d
| dS |dk    r	d
| d|	 dS |d k    r	d
| d!|	 dS | d| d|	 }|rd
| dn|S ||k    rd"| d#S |S )$z?Take stack entry value and convert to polars expression string.z\1rg   r]  r1  r   ()r   r   Nr0  z).znp.r   math.)r  r  r	  r  not_z.is_znull())r  r  r  ri   rZ  z.is_in(z))r  zrequire dict mappingr>   z * 2**z).cast(pl.Int64)r?   z / 2**r   r   )
isinstancer   r   r  r   r  r!   r    r;   rz   r   r   r$   r   r   r   getr   r"   r  r   dictr   )r  r  r   rP  rU  r  e1callpfxe2r  r   r,   s                r+   r  zInstructionTranslator._expr  s|   eZ(( =	&##E5>::BE.ZKKB#q((W111}}Y// 2%'[[%5%5?rr4"$11r14111!u 444ABB9J9J99U9U4%'[[%5%5?rr432333T333
 )-BBB"222#)V33599,",,KK*+ + & !-2------{b{{"ZZ 3S*eaiPP)))e.@F.J.J!#t22D 22d2222+++!#t22D "99  33"33R3333 $6b66666
 +++1 M1J1L1L.%d&<&@&@T&J&JDQQ 741#666 --2------4ZZ >r======4ZZ=r====== ,,2,,,,D*/9;t;;;;T9j  %c%%%%r*   c                p   |dv rg }|D ]}|                     |j        t          j        v r|j        n|j        t          j        v s(t          j                            |j                  dk    rHt          | 	                    |          d|
                                dt          |dd                    n[t          | 	                    |          d|
                    d          |
                    d          t          |dd                               |d	         S d
|d}t          |          )zITake postfix bytecode and convert to an intermediate natural-order stack.)r,   r.   rg   N_from_module)r   r    r!   r"   r$   rA  r/  r   zTODO: z map target not yet supported.)r_  r+  r;   ru   r  rm   rh   r  r   r  popgetattrr   )r  r  r   stackr-  r   s         r+   r  z,InstructionTranslator._to_intermediate_stack  sE    +++&(E$  {gl22 LL !K7=88&044T[AAQFF #%)WWT]]+,).*.(/nd(K(K    (%)WWT]]+,).2*/))B--(/nd(K(K     0 8O DzCCC!#&&&r*   N)
r  r&  r  r  r  r  r   r/   r   r	  )r   r   rP  r   rU  r   r   r   )r-  r   r   r   )
r  r0   r   r   rP  r   rU  r   r   r   )r  r&  r   r/   r   r0   )
r%   r&   r'   r  r  rW  r  r  r  r  r)   r*   r+   rV  rV  k  s        HH	" 	" 	" 	"? ? ? ? & & & \&.A A A AF#' #' #' #' #' #'r*   rV  c                      e Zd ZdZ eg d          Zd-dZd.dZd/dZd0dZ	ddd1dZ
d2dZd3d Zd3d!Zd3d"Zd3d#Zed4d$            Zed5d&            Zd6d+Zd,S )7r  a]  
    Standalone class that applies Instruction rewrite/filtering rules.

    This significantly simplifies subsequent parsing by injecting
    synthetic POLARS_EXPRESSION ops into the Instruction stream for
    easy identification/translation, and separates the parsing logic
    from the identification of expression translation opportunities.
    )	COPYCOPY_FREE_VARS	NOT_TAKENPOP_TOPPRECALL	PUSH_NULLRESUMErF  TO_BOOLr  Iterator[Instruction]r  r  r  r  r   r	  c                f   || _         || _        t          |          | _        g }|                     | j                  D ]W}|j        | j        vrG|j        t          j        vr
g | _	         d S | 
                    |          }|                    |           X|                     |          | _	        d S rC  )r  r  r2  rN  _unpack_superinstructionsr+  _ignored_opsr;   rx   r  _update_instructionr_  _rewrite)r  r  r  r  normalised_instructionsr-  upgraded_insts          r+   r  zRewrittenInstructions.__init__  s     "!1&*<&8&8#"$2243NOO 	> 	>D{$"333;g&;;;35D0FF $ 8 8 > >'..}==='+}}5L'M'M$$$r*   r   c                *    t          | j                  S rC  )r  r  r=  s    r+   __len__zRewrittenInstructions.__len__,  s    4/000r*   c                *    t          | j                  S rC  )r  r  r=  s    r+   __iter__zRewrittenInstructions.__iter__/  s    D0111r*   itemr   r   c                    | j         |         S rC  )r  )r  r  s     r+   __getitem__z!RewrittenInstructions.__getitem__2  s    +D11r*   F)is_attrrd  opnameslist[AbstractSet[str]]argvals5list[AbstractSet[Any] | dict[Any, Any] | None] | Noner  r?  r&  c               0   t          |          |pg }}||z   }|r/| j        ||dz            x}r|d         j        t          j        v rg S | j        ||         }t          |          |k    r*t          d t          |||          D                       r|S g S )a  
        Check if a sequence of Instructions matches the specified ops/argvals.

        Parameters
        ----------
        idx
            The index of the first instruction to check.
        opnames
            The full opname sequence that defines a match.
        argvals
            Associated argvals that must also match (in same position as opnames).
        is_attr
            Indicate if the match represents pure attribute access (cannot be called).
        rg   r   c              3  J   K   | ]\  }}}|j         |v o|d u p|j        |v V  d S rC  )r+  r4  )r   r-  match_opnamesmatch_argvals       r+   rD  z1RewrittenInstructions._matches.<locals>.<genexpr>U  s_       7
 7
 2m\ K=( F%D)D7
 7
 7
 7
 7
 7
r*   )r  _instructionsr+  r;   rS   rG  r	   )	r  rd  r  r  r  n_required_ops
idx_offsettrailing_instr  s	            r+   _matcheszRewrittenInstructions._matches5  s    , #&g,,2>)
	"&"4Z*q.5P"QQ	 a '7<77I)#j.9|..3 7
 7
 6Agw6 67
 7
 7
 4
 4
.  	r*   c                j   || _         g dt          | j                   k     r| j                  dc}|j        t          j        vs5t          fd| j        | j        | j        | j	        fD                       s
                    |           pdz  t          | j                   k     S )a#  
        Apply rewrite rules, potentially injecting synthetic operations.

        Rules operate on the instruction stream and can examine/modify
        it as needed, pushing updates into "updated_instructions" and
        returning True/False to indicate if any changes were made.
        r   rg   c              3  4   K   | ]} |          xV  d S rC  r)   )r   map_rewriterd  	incrementupdated_instructionss     r+   rD  z1RewrittenInstructions._rewrite.<locals>.<genexpr>l  sI       	: 	: *k#/CDDD	: 	: 	: 	: 	: 	:r*   )r  r  r+  r;   ru   any_rewrite_functions_rewrite_methods_rewrite_builtins_rewrite_attrsr_  )r  r  r-  rd  r  r  s      @@@r+   r  zRewrittenInstructions._rewrite_  s     *24C*++++"05qOD){',..c 	: 	: 	: 	: 	: 	: +)*'$	: 	: 	: 	7 	7. %++D1119>!C C*++++ $#r*   r  c                
   |                      |dhdhgdt          gd          x}rO|d         }t          |j                 }|                    d||          }|                    |d	         |g           t          |          S )
zDReplace python attribute lookup with synthetic POLARS_EXPRESSION op.r_   rb   NT)r  r  r  rg   rf   r+  r4  r  r   )r  r   r4  _replaceextendr  )r  rd  r  matching_instructionsr-  	expr_namepxs          r+   r  z$RewrittenInstructions._rewrite_attrsz  s    $(MM!][M2,-	 %2 %
 %
 
  	H )+D)$+6I*9i   B !'')>q)A2(FGGG()))r*   c                   |                      |dhddht          j        gt          g          x}r|dd         \  }}|j        x}t
          v rt
          |         }d| d}|                    d	|||j        
          }|                    |j                  }	|                    |	|f           t          |          S )zEReplace builtin function calls with a synthetic POLARS_EXPRESSION op.r`   r_   r]   r  r  NrA  cast(pl.r1  rf   r+  r4  r  r3  r3  )
r  r;   rS   r   r4  r   r  r3  r  r  )
r  rd  r  r  inst1inst2r4  dtyper  operands
             r+   r  z'RewrittenInstructions._rewrite_builtins  s     %)MM#_{L&A7<P%& %2 %
 %
 
  	7
 1!4LE5,&+<<<)&1,E,,,*|	    B nnELn99G ''"666()))r*   c           	     p   dD ]}t           D ]}|r|                    dd          s  dS |r)ddhg|d         |d         |d	         t          j        n8ddhg|d
         |d         |d         |d         |d	         t          j        }|d         }|                     |||r
g |d         ng |d         |d         |d                   x}rt          |d                   }||d|z            \  }	}
}|r|| j        st                      | _        |	j        x}| j        vr| j        |         j	        t          fd|D                       sMt                               d| |          }n|	j        dk    rd}n|	j        dk    rQ||dz            j        }d| d}|                     |	j        |d         j        |          st          |          c c S n;|	j        dk    r)t                              d|
j         |
j                  }n|
j        }|r|
n|}|	                    d|||j                  }|rdn|	j        pd|_        |                    |	j                  }|                    |d         r||d|z            |fn||f           t          |          c c S dS )z=Replace function calls with a synthetic POLARS_EXPRESSION op.)FTr   Tr   r`   r^   r   r   r   r   r   r   r   r   r  r1   c              3      K   | ]}|v V  	d S rC  r)   )r   mr   s     r+   rD  z;RewrittenInstructions._rewrite_functions.<locals>.<genexpr>  s(      &R&Raq(8&R&R&R&R&R&Rr*   r   r   r   r   zstr.to_datetime(format="r   r   r  rf   r  Nr  )r   r  r;   rS   r  r  r  r   r4  r&   r  r   _is_stdlib_datetimer  r3  r  r  )r  rd  r  check_globalsfunction_kindr  module_aliasesr  attribute_countr  r  inst3r  fmt	swap_instr  r  r   s                    @r+   r  z(RewrittenInstructions._rewrite_functions  s&    + ]	6 ]	6M!2 \6 \6  ):):;NPT)U)U 111 %&5&':; ''@A '':;	
    '5&7 ''9: '':;	
 ''@A '':;   & "/}!=,0MM# % &7 &}5&'78 '7 -: - - ( D6 '*-8H*I&J&JO*?'!o*==+'E5% % 1#5 Q5N5P5PD2).5Id>TTT$*.*@*K*VK#&&R&R&R&R>&R&R&R#R#R ) ((A(E(E#. < < < <i) )II //$5		333Oa4GHO$Fs$F$F$F	#77!L1!4;+    > $''<#=#======> //$=$A$A2EL22EL% %		 %*L	 *7 AEI2( )(/	 (  B /<&Wdd%,BVRVBO'000EEG(// ))BC+#1!o2EF  &r]   45555555ID61\6| qr*   c           	        t           rt          j        ndh}|                     ||dht          j        gt
          g          p)|                     ||t          j        gt
          g          x}r|d         }t
          |j                 }|d         j        dk    rr|d         j        }t          |t                    rG|dv rCd|v rdnd	\  }}	d

                    d |D                       }
d|v rdnd}d| | d|
 d|	 | d	}n	|d|dz  }|                    d||          }|                    |           n/|                     ||dhdhdht          j        gt
          g          p-|                     ||dhdht          j        gt
          g          x}r|d         }t
          |j                 }d |dt          |          dz
           D             }|dk    r8t          |          dk    r|\  }}}|d|d|d| dz  }n5|\  }}d|d|d}n&|dd
                    d |D                        dz  }|                    d||          }|                    |           t          |          S )z@Replace python method calls with synthetic POLARS_EXPRESSION op.ra   r]   r  r   rg   )r   r   starts)rE   r   )r   $rB   c              3  4   K   | ]}t          |          V  d S rC  )r   r   vs     r+   rD  z9RewrittenInstructions._rewrite_methods.<locals>.<genexpr>(  s(      !D!D1)A,,!D!D!D!D!D!Dr*   '"zstr.contains(rr0  r1  rf   r  c                    g | ]	}|j         
S r)   )r4  )r   is     r+   r   z:RewrittenInstructions._rewrite_methods.<locals>.<listcomp>I  s*          r*   r   r1   ,z,n=z,literal=True)zstr.replace_all(c              3  4   K   | ]}t          |          V  d S rC  )reprr  s     r+   rD  z9RewrittenInstructions._rewrite_methods.<locals>.<genexpr>U  s(      $C$CT!WW$C$C$C$C$C$Cr*   )r5   r;   rb   r  rS   r   r4  r+  r  tupler`  r  r_  r  )r  rd  r  ra   r  r-  r,   param_valuer  endsrxqr  param_valuesoldnewr   s                    r+   r  z&RewrittenInstructions._rewrite_methods
  sT    ,6Jg''M? MM$|nglC,-     MM$gl3,-   
  I	, )+D&t{3D$Q'.,>>3A6=k511 	1d ? 7 7 19D0@0@99iLFD!D!D!D!D!DDDB"k11sAGAGvGGGGTG1GGGDD00000D&9$PTUUB ''++++ MM!N!N!NL --  
 
  MM$|n|nglS,-   
" '	,* )+D&t{3D .q37L3M3MPQ3Q/QR  L }$$|$$))&2OCeGGGGG%GGGGDD+HCKcKKcKKKDDFCHH$C$Cl$C$C$CCCFFFF&9$PTUUB ''+++()))r*   c              #     K   | D ]E}|j         dv r6dD ]2}|                    d|j        |         |j        |                   V  3A|V  FdS )z<Expand known 'superinstructions' into their component parts.)LOAD_FAST_LOAD_FAST!LOAD_FAST_BORROW_LOAD_FAST_BORROW)r   rg   r_   r  N)r+  r  r4  )r  r-  rd  s      r+   r  z/RewrittenInstructions._unpack_superinstructions\  s      
 ! 	 	D{    "  C--*#{3/ $C 0 (       



	 	r*   r-  c                   t           s@| j        t          j        v r-|                     t          j        | j                 d          } nt
          r| j        x}t          j        v rDdt          j        | j                 i}|dk    rt          | j                  |d<    | j        d
i |} n(|dk    r"| j	        dk    r|                     dd	          } | S )zFUpdate/modify specific instructions to simplify multi-version parsing.ro   )r  r+  r+  rd   r  z[]rr   r   )r+  r  r)   )
r3   r+  r;   rR   r  r7   re   r   r4  r  )r-  r+  updated_paramss      r+   r  z)RewrittenInstructions._update_instructiono  s      	IdkW^;;==t{3" !  DD  	I+%'*FFF #+G,H,U!V---03DK0@0@N9-$t}66~66;&&4<4+?+?}}OR}HHr*   r   r   r   r  c                    | j         st                      | _         | j         }|dk    o |                    |          t          j        u p!|dk    o|                    |          t          u S )Nr   rg   )r  r   r  r   )r  r   r   r  varss        r+   r  z)RewrittenInstructions._is_stdlib_datetime  sq     % 	A%>%@%@D"%q QTXXm%<%<@Q%QJ"Htxx'<'<'H	Jr*   N)r  r  r  r  r  r  r   r	  )r   r   )r   r  )r  r   r   r   )
rd  r   r  r  r  r  r  r?  r   r&  )r  r&  r   r&  )rd  r   r  r&  r   r   )r  r&  r   r  )r-  r   r   r   )r   r   r   r   r  r   r   r?  )r%   r&   r'   r  rs   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)   r*   r+   r  r    s         9
	
 
	
 
	
 LN N N N,1 1 1 12 2 2 22 2 2 2 ( ( ( ( ( (T$ $ $ $6* * * *"* * * *4c c c cJP* P* P* P*d    \$    \.J J J J J Jr*   r  r  r  tuple[str, str]c                v   	 | j         j        }| j        }n# t          $ r Y dS w xY w|dk    r|t          v rd| dfS |dk    rv|t
          v rddt
          |          dfS |t          v r<dd	l}| t          ||          u r%t          
                    d
| |          }d| dfS n|dk    rdd	l}| |j        u rdS dS )zIIdentify translatable calls that aren't wrapped inside a lambda/function.)r   r   r   r   r  builtinsr  r1  r   Nr  r   r   )r   zstr.json_decode())	__class__r&   r%   AttributeErrorr   r   r   r   r  r   r  r   r   )r  func_modulery  r   r  r   s         r+   _raw_function_metar    s4   (3%		   vv g)/?"?"?	%%%%% 

	"	")))I*;I*FIIIII/))KKK743333599'I'' 	 )/////	 4
 '!!KKK4:%%226s    
$$columns	list[str]r	  c                   |dk    rd}t          |          |o|d         }|s|dk    rdS t                              | |fx}          x}t          | |          }|t          |<   |                                r|                    |           dS t          |           \  }}|rM|rMt          |||          }	|	|_        | j	        }
|                    ||	 d| |dk    r|
n| d|
            dS dS dS )	a  
    Generate `PolarsInefficientMapWarning` on poor usage of a `map` function.

    Parameters
    ----------
    function
        The function passed to `map`.
    columns
        The column name(s) of the original object; in the case of an `Expr` this
        will be a list of length 1, containing the expression's root name.
    map_target
        The target of the `map` call. One of `"expr"`, `"frame"`, or `"series"`.
    r-   z"TODO: 'frame' map-function parsingr   r   Nr   r  rh  )
r   r9   r  r  rI  rw  r  r   r  r%   )r  r  r   r   r   keyparsermodule
suggestionrg  fns              r+   warn_on_inefficient_mapr    sb     W2!#&&& %71:C 3"99t *--h
5K.KcLLLU*55'-$!!## C 099
 	j 	*3
JGGK&1F#"BKK'2$A$AZ$A$A#)Z#7#7RR=M=M=M=M      		 	 	 	r*   r  )r   r   )r   r   r   r   r   r   r   r   )r  r  r   r
  )r  r  r  r  r   r/   r   r	  )Kr  
__future__r   r   rK  r   r   sysrv  bisectr   collectionsr   r   r   	itertoolsr   r	   pathlibr
   typingr   r   r   r   r   r   polars._utils.cacher   rt  r   r   collections.abcr   r   r   r   AbstractSetr   r   r   r   r/   r(   r   r0   version_infor3   r5   r7   r9   r;   rs   r   r   r   r   r   r   r   rb   r   r   compiler   r   r   r   r   r  rV  r  r  r  __all__r)   r*   r+   <module>r'     s   T T T " " " " " "  



  				 



        # # # # # #                   ( ( ( ( ( ( ( (                      ) ( ( ( ( ( 7 7 7 7 7 7 7 7 0BBBBBBBBBB222222      //////# # # # # # # # 89	 9 9 9 9j(
 ( ( ( ($/
 / / / />3#3w#>
 > > > >>3#3w#>
 > > > > HRLL     
9- 9- 9- 9- 9- 9- 9- 9-z *3* *    : 09y/I/I  I I I I*3)+ +     > %	, 	,  	 	 	 	 , ,     
 +4)4E*F*F%*P  P P P P.. . %	.
 &. &. }. #. #. . . . [. I.  
8!." I#.$ ,%.& #'.( 1. . .     >  +L9:!+,-.*+   +L9:!+,z)*   +m_!+,z")   +m_+n-!+,#~%,"	 	  +m_+n-&-$./#T*+&<.%,"	 	[7>  7 7 7 7t !    #4 4      &2:&UVV  V V V V$"*%<==  = = = ="
#455 5 5 5 5   :# # # #2F F F F F F F FRP' P' P' P' P' P' P' P'fQJ QJ QJ QJ QJ QJ QJ QJh   B, , , ,^ 6
7r*   