Ë
    Þš§jÖC  ã                  ó8  — U d dl m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Z	d dl
mZ d dlZej                  r
d dlmZ d dlZej"                  eej&                  eedej*                  f   f   Zded<   dd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z!y)é    )ÚannotationsN)ÚDecimal©Úregister_io_source)ÚIteratorÚ_ExpressionTreeztyping_extensions.TypeAliasc                óv   — t        j                  | j                  j                  d¬«      «      }t	        |«      S )a†  Convert a Polars predicate expression to a DuckDB-compatible SQL expression.

    Parameters:
        predicate (pl.Expr): A Polars expression (e.g., col("foo") > 5)

    Returns:
        SQLExpression: A DuckDB SQL expression string equivalent.
        None: If conversion fails.

    Example:
        >>> _predicate_to_expression(pl.col("foo") > 5)
        SQLExpression("(foo > 5)")
    Újson©Úformat)r
   ÚloadsÚmetaÚ	serializeÚ_tree_to_sql_expression)Ú	predicateÚtrees     úSC:\Users\Luka\AppData\Local\Temp\pip-target-o84fipzb\lib\python\duckdb/polars_io.pyÚ_predicate_to_expressionr      s/   € ô �:‰:�i—n‘n×.Ñ.°fÐ.Ó=Ó>€DÜ" 4Ó(Ð(ó    c                ó^   — 	 t        j                  t        | «      «      S # t        $ r Y yw xY w)z—Convert an already-parsed Polars expression tree to a DuckDB expression.

    Returns None if the tree contains a node we cannot translate to SQL.
    N)ÚduckdbÚSQLExpressionÚ_pl_tree_to_sqlÚ	Exception©r   s    r   r   r   )   s/   € ð
Ü×#Ñ#¤O°DÓ$9Ó:Ð:øÜò áðús   ‚   	,«,c                óÔ   — t        | t        «      sy| j                  d«      }t        |t        «      xr5 t        |j                  d«      t        «      xr |d   j	                  d«      S )z­Return True if a serialized node is a dynamic predicate (see the note above).

    Detected by shape: a ``Display`` node whose ``fmt_str`` starts with ``dynamic_pred``.
    FÚDisplayÚfmt_strÚdynamic_pred)Ú
isinstanceÚdictÚgetÚstrÚ
startswith)ÚnodeÚdisplays     r   Ú_is_dynamic_predicate_noder'   B   s^   € ô
 �dœDÔ!ØØ�h‰h�yÓ!€Gä�7œDÓ!ò 	:Ü�w—{‘{ 9Ó-¬sÓ3ò	:à�IÑ×)Ñ)¨.Ó9ðr   c                óÀ   — t        | «      ryt        | t        «      r t        d„ | j	                  «       D «       «      S t        | t
        «      rt        d„ | D «       «      S y)zTReturn True if the serialized expression tree contains a dynamic predicate anywhere.Tc              3  ó2   K  — | ]  }t        |«      –— Œ y ­w©N©Ú _tree_contains_dynamic_predicate©Ú.0Úchilds     r   Ú	<genexpr>z3_tree_contains_dynamic_predicate.<locals>.<genexpr>V   s   è ø€ ÐVÉ¸uÔ3°E×:Éùó   ‚c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr*   r+   r-   s     r   r0   z3_tree_contains_dynamic_predicate.<locals>.<genexpr>X   s   è ø€ ÐMÉ¸uÔ3°E×:Éùr1   F)r'   r    r!   ÚanyÚvaluesÚlist)r%   s    r   r,   r,   Q   sL   € ä! $Ô'ØÜ�$œÔÜÑVÈÏÉÌÓVÓVÐVÜ�$œÔÜÑMÉÓMÓMÐMØr   c                óN  — t        | «      ryt        | t        «      rnd| v rj| d   }t        |t        «      rU|j                  d«      dk(  rAt	        |d   «      \  }}t	        |d   «      \  }}|xs |}|€||fS |€||fS di |¥||dœ¥i|fS t        | «      rd}t        |«      ‚| d	fS )
ué  Remove dynamic-predicate conjuncts from a serialized predicate tree.

    See the note above for what a dynamic predicate is and why we drop it.

    Returns ``(stripped_tree, removed)``. ``stripped_tree`` is ``None`` when the
    predicate was purely dynamic. Raises ``NotImplementedError`` if a dynamic
    predicate appears anywhere other than a top-level ``And`` conjunct â€” a shape
    polars does not produce today, where the hint can neither be safely dropped
    nor applied.
    )NTÚ
BinaryExprÚopÚAndÚleftÚright)r:   r;   zICannot handle a polars dynamic predicate outside a top-level AND conjunctF)r'   r    r!   r"   Ú_strip_dynamic_predicatesr,   ÚNotImplementedError)r   Úbin_exprr:   Úleft_removedr;   Úright_removedÚremovedÚmsgs           r   r<   r<   \   sÓ   € ô " $Ô'ØÜ�$œÔ ,°$Ñ"6Ø˜Ñ%ˆÜ�h¤Ô%¨(¯,©,°tÓ*<ÀÒ*EÜ!:¸8ÀFÑ;KÓ!LÑˆD�,Ü#<¸XÀgÑ=NÓ#OÑ ˆE�=Ø"Ò3 mˆGØˆ|Ø˜g�~Ð%Øˆ}Ø˜W�}Ð$Ø Ð"L XÐ"L°tÀeÒ"LÐMÈwÐVÐVÜ'¨Ô-ØYˆÜ! #Ó&Ð&Ø�ˆ;Ðr   c                ó¬   — t         j                  j                  t        j                  t        j                  | «      j                  «       «      d¬«      S )zORebuild a polars expression from a serialized tree (inverse of meta.serialize).r
   r   )ÚplÚExprÚdeserializeÚioÚBytesIOr
   ÚdumpsÚencoder   s    r   Ú_expression_from_treerK   z   s7   € ä�7‰7×ÑœrŸz™z¬$¯*©*°TÓ*:×*AÑ*AÓ*CÓDÈVÐÓTÐTr   c           	     óP   — 	 ddddddddd	œ|    S # t         $ r t        | «      ‚w xY w)
z}Map Polars binary operation strings to SQL equivalents.

    Example:
        >>> _pl_operation_to_sql("Eq")
        '='
    Ú<z<=Ú>z>=Ú=Ú%ÚANDÚOR)ÚLtÚLtEqÚGtÚGtEqÚEqÚModulusr9   ÚOr)ÚKeyErrorr=   )r8   s    r   Ú_pl_operation_to_sqlr[      sO   € ð&àØØØØØØØñ	
ð ñ	ð 		øô ò &Ü! "Ó%Ð%ð&ús   ‚ �%c                ó2   — | j                  dd«      }d|› d�S )z±Escape SQL identifiers by doubling any double quotes and wrapping in double quotes.

    Example:
        >>> _escape_sql_identifier('column"name')
        '"column""name"'
    Ú"z"")Úreplace)Ú
identifierÚescapeds     r   Ú_escape_sql_identifierra   •   s$   € ð × Ñ   dÓ+€GØˆwˆi�qˆ>Ðr   c                ó�  — | j                  «       \  }|dk(  rÓ| |   }t        |t        «      sJ d|› dt        |«      › �«       ‚|d   |d   |d   }}}t        |t        «      sJ d|› dt        |«      › �«       ‚t        |t        «      sJ d|› d	t        |«      › �«       ‚t        |t        «      sJ d
|› dt        |«      › �«       ‚dt        |«      › dt        |«      › dt        |«      › d�S |dk(  r6| |   }t        |t        «      sJ d|› d	t        |«      › �«       ‚t        |«      S |dv r6| |   }t        |t        «      sJ d|› dt        |«      › �«       ‚t        |«      S |dk(  r9| |   }t        |t        t        f«      sJ dt        |«      › �«       ‚t	        |«      S |dk(  r>| |   }	t        |	t        t        t        f«      sJ dt        |	«      › �«       ‚t	        |	«      S |dk(  rù| |   }
t        |
t        «      sJ d|› dt        |
«      › �«       ‚|
d   }t        |t        «      sJ d|› dt        |«      › �«       ‚|d   }t        |t        «      sJ d|› dt        |«      › �«       ‚|
d   }t        |t        «      sJ d|› dt        |«      › �«       ‚d|v r9|d   }t        |d   «      }|dk(  rd|› d�S |dk(  rd|› d�S d |› �}t        |«      ‚d!|› �}t        |«      ‚|d"k(  r¿| |   }t        |t        «      sJ d|› dt        |«      › �«       ‚|j                  d#«      }|d$k(  r3|j                  d%i «      }t        |t        «      rd&|vr"d'}t        |«      ‚|d(k7  rd)|›�}t        |«      ‚|d%   }t        |t        «      sJ d|› dt        |«      › �«       ‚t        |«      S |d*k(  �r‰| |   }t        |t        «      sJ d|› dt        |«      › �«       ‚d+|v rd,|v rt	        |d+   «      }|d,   }n$t        t        |j                  «       «      «      }|}t        |t        «      sJ d|› d-t        |«      › �«       ‚t        |t        «      sJ d|› d.t        |«      › �«       ‚|j                  d/«      s|d0k(  r�|d0   }t        |t        «      sJ d|› d1t        |«      › �«       ‚d2t!        |«      cxk  rd3k  sn J d|› d1t!        |«      › d4�«       ‚t	        t#        |d   «      t#        d5|d6   z  «      z  «      S |j                  d7«      s|d8k(  rp|d8   }t        |t        «      sJ d|› d9t        |«      › �«       ‚t$        j$                  j'                  |d   d:z  t$        j(                  j*                  ¬;«      }d<|›d=�S |d>v rt	        ||   «      S |d?k(  r~|d?   }t        |t        «      sJ d|› d@t        |«      › �«       ‚|dAz  }|dAz  dBz  }t$        j$                  j,                  t%        j.                  ||¬C«      z   j1                  «       }d<|› dD�S |dEk(  re|dE   }t        |t        t        f«      sJ d|› dFt        |«      › �«       ‚t%        j2                  dGdHdH«      t%        j.                  |¬I«      z   }d<|› dJ�S |dKk(  rT|dK   } t        | t        «      sJ d|› dLt        | «      › �«       ‚t5        | «      }!dMj7                  dN„ |!D «       «      }"d<|"› dO�S |dPk(  s|dQk(  r@|j                  dQ|j                  dPdR«      «      }#t	        t9        j:                  |#«      «      S dS|›dT|› �}t        |«      ‚dU|› dV| |   › �}t        |«      ‚)WaË  Recursively convert a Polars expression tree (as JSON) to a SQL string.

    Parameters:
        tree (dict): JSON-deserialized expression tree from Polars

    Returns:
        str: SQL expression string

    Example:
        Input tree:
        {
            "BinaryExpr": {
                "left": { "Column": "foo" },
                "op": "Gt",
                "right": { "Literal": { "Int": 5 } }
            }
        }
        Output: "(foo > 5)"
    r7   zA z should be a dict but got r:   r8   r;   z	LHS of a zThe op of a z should be a str but got z	RHS of a Ú(Ú Ú)ÚColumnzThe col name of a )ÚLiteralÚDynÚIntz4The value of an Int should be an int or str but got ÚFloatz;The value of a Float should be a float, int or str but got ÚFunctionÚinputz. should have a list of dicts as input but got r   Úfunctionz. should have a function dict as input but got ÚBooleanÚIsNullz	 IS NULL)Ú	IsNotNullz IS NOT NULL)z Boolean function not supported: zUnsupported function type: ÚCastÚoptionsÚStrictÚexprrg   z;Strict cast on non-literal expression cannot be pushed downÚ	NonStrictz9Only NonStrict/Strict casts can be safely unwrapped, got ÚScalarÚdtypeÚvaluez" should have a str dtype but got  z" should have a dict value but got z
{'Decimal'r   z. should be a two or three member list but got é   é   z member listé
   éÿÿÿÿz{'Datetime'ÚDatetimez% should be a one member list but got i@B )ÚtzÚ'z'::TIMESTAMP)ÚInt8ÚInt16ÚInt32ÚInt64ÚInt128ÚUInt8ÚUInt16ÚUInt32ÚUInt64ÚUInt128ÚFloat32ÚFloat64rn   ÚTimez should be an int but got i Êš;iè  )ÚsecondsÚmicrosecondsz'::TIMEÚDatez should be a number but got i²  é   )Údaysz'::DATEÚBinaryz should be a list but got Ú c              3  ó(   K  — | ]
  }d |d›�–— Œ y­w)z\xÚ02xN© )r.   Úbs     r   r0   z"_pl_tree_to_sql.<locals>.<genexpr>U  s   è ø€ ÐA±[°  A c 7œm±[ùs   ‚z'::BLOBÚStringÚStringOwnedNzUnsupported scalar type z, with value zNode type: z is not implemented. )Úkeysr    r!   Útyper#   r   r[   ra   ÚintÚfloatr5   r=   r"   ÚnextÚiterr$   Úlenr   ÚdatetimeÚfromtimestampÚtimezoneÚutcÚminÚ	timedeltaÚtimeÚdateÚbytesÚjoinr   ÚConstantExpression)$r   Ú	node_typeÚbin_expr_treeÚlhsr8   ÚrhsÚcol_nameÚval_treeÚint_literalÚfloat_literalÚ	func_treeÚinputsÚ
input_treeÚ	func_dictÚfuncÚarg_sqlrB   Ú	cast_treerr   Ú	cast_exprÚscalar_treerw   rx   Údecimal_valueÚmicrosÚdt_timestampÚnanosecondsr�   rŽ   Údt_timeÚdays_since_epochr¨   Ú	bin_valueÚbinary_datar`   Ú
string_vals$                                       r   r   r       sº  € ð( —)‘)“+�K€Yà�LÒ à˜Y™ˆÜ˜-¬Ô.Ðo°"°Y°KÐ?YÔZ^Ð_lÓZmÐYnÐ0oÓoÐ.Ø$ VÑ,¨m¸DÑ.AÀ=ÐQXÑCY�ˆRˆÜ˜#œtÔ$Ðb¨	°)°Ð<VÔW[Ð\_ÓW`ÐVaÐ&bÓbÐ$Ü˜"œcÔ"Ða l°9°+Ð=VÔW[Ð\^ÓW_ÐV`Ð$aÓaÐ"Ü˜#œtÔ$Ðb¨	°)°Ð<VÔW[Ð\_ÓW`ÐVaÐ&bÓbÐ$Ø”? 3Ó'Ð(¨Ô*>¸rÓ*BÐ)CÀ1Ä_ÐUXÓEYÐDZÐZ[Ð\Ð\Ø�HÒð ˜	‘?ˆÜ˜(¤CÔ(ÐsÐ,>¸y¸kÐIbÔcgÐhpÓcqÐbrÐ*sÓsÐ(Ü% hÓ/Ð/àÐ&Ñ&à˜	‘?ˆÜ˜(¤DÔ)Ðe¨R°	¨{Ð:TÔUYÐZbÓUcÐTdÐ+eÓeÐ)Ü˜xÓ(Ð(à�EÒà˜9‘oˆÜ˜+¬¬S zÔ2ð 	
ØBÄ4ÈÓCTÐBUÐVó	
Ð2ô �;ÓÐà�GÒà˜Y™ˆÜ˜-¬%´´cÐ):Ô;ð 	
ØIÌ$È}ÓJ]ÐI^Ð_ó	
Ð;ô �=Ó!Ð!à�JÒà˜‘Oˆ	Ü˜)¤TÔ*Ðg¨b°°Ð;UÔVZÐ[dÓVeÐUfÐ,gÓgÐ*Ø˜7Ñ#ˆÜ˜&¤$Ô'Ðu¨2¨i¨[Ð8fÔgkÐlrÓgsÐftÐ)uÓuÐ'Ø˜A‘Yˆ
Ü˜*¤dÔ+ð 	
Ø��ÐIÌ$ÈzÓJZÐI[Ð\ó	
Ð+ð ˜jÑ)ˆ	Ü˜)¤TÔ*ð 	
Ø��ÐIÌ$ÈyË/ÐIZÐ[ó	
Ð*ð ˜	Ñ!Ø˜YÑ'ˆDÜ% f¨Q¡iÓ0ˆGà�xÒØ˜7˜) 9Ð-Ð-Ø�{Ò"Ø˜7˜) =Ð1Ð1Ø4°T°FÐ;ˆCÜ% cÓ*Ð*à+¨I¨;Ð7ˆÜ! #Ó&Ð&à�FÒØ˜‘Oˆ	Ü˜)¤TÔ*Ðg¨b°°Ð;UÔVZÐ[dÓVeÐUfÐ,gÓgÐ*Ø—-‘- 	Ó*ˆØ�hÒð "Ÿ™ f¨bÓ1ˆIÜ˜i¬Ô.°)À9Ñ2LØS�Ü)¨#Ó.Ð.Ø˜Ò#ØMÈgÈ[ÐYˆCÜ% cÓ*Ð*Ø˜fÑ%ˆ	Ü˜)¤TÔ*Ðg¨b°°Ð;UÔVZÐ[dÓVeÐUfÐ,gÓgÐ*Ü˜yÓ)Ð)à�HÓà˜9‘oˆÜ˜+¤tÔ,Ðk°°9°+Ð=WÔX\Ð]hÓXiÐWjÐ.kÓkÐ,Ø�kÑ! g°Ñ&<Ü˜ GÑ,Ó-ˆEØ Ñ(‰Eô œ˜k×.Ñ.Ó0Ó1Ó2ˆEØˆEÜ˜%¤Ô%Ðf¨¨I¨;Ð6XÔY]Ð^cÓYdÐXeÐ'fÓfÐ%Ü˜%¤Ô&Ðg¨"¨Y¨KÐ7YÔZ^Ð_dÓZeÐYfÐ(gÓgÐ&ð ×Ñ˜LÔ)¨U°iÒ-?Ø! )Ñ,ˆMÜ˜m¬TÔ2ð Ø�U�GÐIÌ$È}ÓJ]ÐI^Ð_óÐ2ð œ˜MÓ*Ô/¨aÔ/ð Ø�U�GÐIÌ#ÈmÓJ\ÐI]Ð]iÐjóÐ/ô ”w˜}¨QÑ/Ó0´7¸2ÀÈrÑARÑ;RÓ3SÑSÓTÐTð ×Ñ˜MÔ*¨e°zÒ.AØ˜:Ñ&ˆFÜ˜f¤dÔ+Ðl¨r°%°Ð8]Ô^bÐciÓ^jÐ]kÐ-lÓlÐ+Ü#×,Ñ,×:Ñ:¸6À!¹9ÀyÑ;PÔU]×UfÑUf×UjÑUjÐ:ÓkˆLØ�|Ð& lÐ3Ð3ð ð 
ñ 
ô �u˜U‘|Ó$Ð$ð �FŠ?Ø ™-ˆKÜ˜k¬3Ô/Ðj°2°e°WÐ<VÔW[Ð\gÓWhÐViÐ1jÓjÐ/Ø! ]Ñ2ˆGØ'¨-Ñ7¸EÑAˆLÜ×(Ñ(×,Ñ,¬x×/AÑ/AÈ'Ð`lÔ/mÑm×sÑsÓuˆGØ�w�i˜wÐ'Ð'ð �FŠ?Ø$ V™}ÐÜÐ.´¼°Ô=ð Ø�U�GÐ7¼Ð=MÓ8NÐ7OÐPóÐ=ô —=‘=  q¨!Ó,¬x×/AÑ/AÐGWÔ/XÑXˆDØ�t�f˜GÐ$Ð$ð �HÒØ˜h™ˆIÜ˜i¬Ô.Ðg°"°U°GÐ;UÔVZÐ[dÓVeÐUfÐ0gÓgÐ.Ü 	Ó*ˆKØ—g‘gÑA±[ÓAÓAˆGØ�w�i˜wÐ'Ð'ð �HÒ ¨Ò 6àŸ™ =°%·)±)¸HÀdÓ2KÓLˆJä”v×0Ñ0°Ó<Ó=Ð=à(¨¨	°¸u¸gÐFˆÜ! #Ó&Ð&à˜	�{Ð"7¸¸Y¹Ð7HÐ
I€CÜ
˜cÓ
"Ð"r   c                ó@   ‡ — 	 	 	 	 	 	 	 	 	 	 dˆ fd„}t        ||d¬«      S )zA polars IO plugin for DuckDB.c              3  ó€  •K  — d }d }‰}| �0dj                  t        t        | «      «      }|j                  |«      }|�|j	                  |«      }|�[t        j                  |j                  j                  d¬«      «      }t        |«      \  }	}
|	�t        |	«      }|€|
rt        |	«      n|}|�|j                  |«      }|€|j                  «       n|j                  |«      }t        |j                  d «      D ]B  }|�'t!        j"                  |«      j                  |«      –— Œ,t!        j"                  |«      –— ŒD y ­w)NÚ,r
   r   )rª   Úmapra   ÚprojectÚlimitr
   r   r   r   r<   r   rK   ÚfilterÚto_arrow_readerrŸ   Úread_next_batchrD   Ú
from_arrow)Úwith_columnsr   Ún_rowsÚ
batch_sizeÚduck_predicateÚfallback_predicateÚrelation_finalÚcolsr   Ú	real_treeÚhad_dynamicÚresultsÚrecord_batchÚrelations                €r   Úsource_generatorz'duckdb_source.<locals>.source_generatori  s<  øè ø€ ð ˆØ!ÐØ!ˆØÐ#Ø—8‘8œCÔ 6¸ÓEÓFˆDØ+×3Ñ3°DÓ9ˆNØÐØ+×1Ñ1°&Ó9ˆNØÐ ô —:‘:˜iŸn™n×6Ñ6¸fÐ6ÓEÓFˆDÜ%>¸tÓ%DÑ"ˆI�{ØÐ$ä!8¸Ó!C�Ø!Ð)ñ NYÔ)>¸yÔ)IÐ^gÐ&àÐ%Ø+×2Ñ2°>ÓBˆNØ6@Ð6H�.×0Ñ0Ô2Èn×NlÑNlÐmwÓNxˆä  ×!8Ñ!8¸$Ö?ˆLØ!Ð-ä—m‘m LÓ1×8Ñ8Ð9KÓLÓLä—m‘m LÓ1Ó1ñ @ùs   ƒD;D>T)ÚschemaÚis_pure)
rÐ   zlist[str] | Noner   zpl.Expr | NonerÑ   ú
int | NonerÒ   rß   ÚreturnzIterator[pl.DataFrame]r   )rÛ   rÝ   rÜ   s   `  r   Úduckdb_sourcerá   f  sI   ø€ ð%2Ø&ð%2à!ð%2ð ð%2ð ð	%2ð
 
 õ%2ôN Ð.°vÀtÔLÐLr   )r   úpl.Exprrà   úduckdb.Expression | None)r   r   rà   rã   )r%   ú
typing.Anyrà   Úbool)r   rä   rà   z#tuple[_ExpressionTree | None, bool])r   r   rà   râ   )r8   r#   rà   r#   )r_   r#   rà   r#   )r   r   rà   r#   )rÛ   zduckdb.DuckDBPyRelationrÝ   zpl.schema.Schemarà   zpl.LazyFrame)"Ú
__future__r   r¡   rG   r
   ÚtypingÚdecimalr   ÚpolarsrD   Úpolars.io.pluginsr   r   ÚTYPE_CHECKINGÚcollections.abcr   Útyping_extensionsÚDictr#   ÚUnionrœ   ÚAnyr   Ú__annotations__r   r   r'   r,   r<   rK   r[   ra   r   rá   r–   r   r   Ú<module>rò      s™   ðÞ "ã Û 	Û Û Ý ã Ý 0ã à	×ÒÝ(ãà/5¯{©{¸3ÀÇÁÈSÐRUÐWhÐjp×jtÑjtÐMtÑ@uÐ;uÑ/v€Ð,Ó vó)ó&	ó2óóó<Uó
&ó,óC#ôL*Mr   