
    AHj[                       U d dl mZ d dlZd dlmZmZmZ 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
lmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dl m!Z! d dl"m#Z#  ejH                  e%      5  d dl&m'Z' ddd       erd dl(Z(d dl)m*Z*m+Z+m,Z, d dl-m.Z. d dlm/Z/m0Z0m1Z1m2Z2 e(jf                  dk\  rd dlm4Z4 nd dl5m4Z4 ee!z  e#z  ej>                  z  ejF                  e/   z  ejl                  z  ejn                  z  Z8de9d<   dgZ:ddZ;d dZ<ddd	 	 	 	 	 	 	 d!dZ= G d dee         Z>y# 1 sw Y   xY w)"    )annotationsN)TYPE_CHECKINGGenericoverload)_check_for_pandas_check_for_pyarrow)pandas)pyarrow)	FrameType)deprecate_renamed_parameter)is_pycapsule)issue_unstable_warning)_get_stack_localsqualified_type_name)wrap_ldf)
from_arrowfrom_pandas)	DataFrame)	LazyFrame)Series)PySQLContext)Callable
CollectionMapping)TracebackType)AnyFinalLiteral	TypeAlias)      )Selfr   CompatibleFrameType
SQLContextc                    t        |       xs t        | t              xsp t        |       xr* t        | t        j
                  t        j                  f      xs7 t        |       xr* t        | t        j                  t        j                  f      S )z2Check if the object can be converted to DataFrame.)r   
isinstancer   r   pdr   r   r   paTableRecordBatch)objs    J/root/tools/cai/cai_env/lib/python3.12/site-packages/polars/sql/context.py_compatible_framer-   3   sq     	S 	Uc9%	Uc"Qz#bii7P'Q	U s#S
32>>8R(S	    c                n   t        | t        t        f      r| j                         S t        | t              r| j                         j                         S t        |       ret        | t        j                  t        j                  f      r;t        t        |       x}t              r|j                         }|j                         S t        |       s5t        |       rCt        | t        j                  t        j                  f      rt        |       j                         S dt        |        }t!        |      )z'Return LazyFrame from compatible input.zunrecognised frame type: )r&   r   r   lazyr   to_framer   r'   r   r   r   r(   r)   r*   r   r   
ValueError)r+   framemsgs      r,   _ensure_lazyframer5   =   s    #	9-.xxz	C	 ||~""$$	3	JsR\\2994M$N{3//e8NN$Ezz|	c	3JsRXXr~~4N$O###%%)*=c*B)CDor.   )	n_objectsnamedc                P    | rt         nt        t        t        f}t	        |||      S )z5Return compatible frame objects from the local stack.)of_typer6   r7   )r-   r   r   r   r   )all_compatibler6   r7   r9   s       r,   _get_frame_localsr;   P   s$     $2	9f7UGW	OOr.   c                     e Zd ZU dZded<   ded<   ded<   e	 d,dd	d
	 	 	 	 	 	 	 	 	 	 	 d-d       Ze	 d,dd	 	 	 	 	 	 	 	 	 	 	 d.d       Ze	 d,dd	 	 	 	 	 	 	 	 	 	 	 d/d       Z eddd      	 d0d	d	d
	 	 	 	 	 	 	 	 	 d1d       Zeed	d	 	 	 	 	 d2d              Z	eed3d              Z	eed4d              Z	ed	d	 	 	 	 	 d4d       Z	d5dZ
	 	 	 	 	 	 	 	 d6dZd7dZedd	 	 	 	 	 	 	 d8d       Ze	 	 	 	 	 	 	 	 d9d       Ze	 	 	 	 	 	 	 	 d:d       Zedd	 	 	 	 	 	 	 d;d        Ze	 	 	 	 	 	 	 	 d<d!       Ze	 	 	 	 	 	 	 	 d=d"       Zedd	 	 	 	 	 d>d#       Zdd	 	 	 	 	 d>d$Zd?d%Z	 d0d&d'	 	 	 	 	 d@d(Z	 d0	 	 	 	 	 dAd)ZdBd*ZdCd+Zy)Dr$   a   
    Run SQL queries against DataFrame, LazyFrame, and Series data.

    .. warning::
        This functionality is considered **unstable**, although it is close to being
        considered stable. It may be changed at any point without it being considered
        a breaking change.
    r   _ctxtzFinal[bool]_eager_executionzlist[set[str]]_tables_scope_stack.F)register_globalseagerrA   c                    y N selfframesr@   rA   named_framess        r,   __init__zSQLContext.__init__o        r.   )r@   c                    y rC   rD   rE   s        r,   rI   zSQLContext.__init__y   rJ   r.   c                    y rC   rD   rE   s        r,   rI   zSQLContext.__init__   rJ   r.   eager_executionz0.20.31)versionNc               ,   t        d       t        j                         | _        || _        t        |xs i       }|r1t        d      j                         D ]  \  }}||vs||vs|||<    |s|r#|j                  |       | j                  |       yy)u  
        Initialize a new `SQLContext`.

        .. versionchanged:: 0.20.31
            The `eager_execution` parameter was renamed `eager`.

        Parameters
        ----------
        frames
            A `{name:frame, ...}` mapping which can include Polars frames *and*
            pandas DataFrames, Series and pyarrow Table and RecordBatch objects.
        register_globals
            Register compatible objects (polars DataFrame, LazyFrame, and Series) found
            in the globals, automatically mapping their variable name to a table name.
            To register other objects (pandas/pyarrow data) pass them explicitly, or
            call the `execute_global` classmethod. If given an integer then only the
            most recent "n" objects found will be registered.
        eager
            If True, returns execution results as `DataFrame` instead of `LazyFrame`.
            (Note that the query itself is always executed in lazy-mode; this parameter
            impacts whether :meth:`execute` returns an eager or lazy result frame).
        **named_frames
            Named eager/lazy frames, provided as kwargs.

        Examples
        --------
        >>> lf = pl.LazyFrame({"a": [1, 2, 3], "b": ["x", None, "z"]})
        >>> res = pl.SQLContext(frame=lf).execute(
        ...     "SELECT b, a*2 AS two_a FROM frame WHERE b IS NOT NULL"
        ... )
        >>> res.collect()
        shape: (2, 2)
        ┌─────┬───────┐
        │ b   ┆ two_a │
        │ --- ┆ ---   │
        │ str ┆ i64   │
        ╞═════╪═══════╡
        │ x   ┆ 2     │
        │ z   ┆ 6     │
        └─────┴───────┘
        zY`SQLContext` is considered **unstable**, although it is close to being considered stable.Fr:   N)
r   r   newr=   r>   dictr;   itemsupdateregister_many)rF   rG   r@   rA   rH   namer+   s          r,   rI   zSQLContext.__init__   s    d 	g	
 "%%'
 %fl#.$eg-	c v%$l*B),L&	- \MM,'v& "r.   )rA   c                    y rC   rD   clsqueryrA   s      r,   execute_globalzSQLContext.execute_global   s     r.   c                    y rC   rD   rX   s      r,   r[   zSQLContext.execute_global   s    ORr.   c                    y rC   rD   rX   s      r,   r[   zSQLContext.execute_global   s    RUr.   c                   t        t        j                  |dd            }t        d|      } | |d      5 }|j	                  ||      cddd       S # 1 sw Y   yxY w)u  
        Immediately execute a SQL query, automatically registering frame globals.

        Notes
        -----
        * This convenience method automatically registers all compatible objects in
          the local stack that are referenced in the query, mapping their variable name
          to a table name. Note that in addition to polars DataFrame, LazyFrame, and
          Series this method *also* registers pandas DataFrame, Series, and pyarrow
          Table and RecordBatch objects.
        * Instead of calling this classmethod you should consider using `pl.sql`,
          which will use this code internally.

        Parameters
        ----------
        query
            A valid SQL query string.
        eager
            If True, returns execution results as `DataFrame` instead of `LazyFrame`.
            (Note that the query itself is always executed in lazy-mode).

        Examples
        --------
        >>> import pandas as pd
        >>> df = pl.LazyFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
        >>> df_pandas = pd.DataFrame({"a": [2, 3, 4], "c": [7, 8, 9]})

        Join a polars LazyFrame with a pandas DataFrame (note use of the preferred
        `pl.sql` method, which is equivalent to `SQLContext.execute_global`):

        >>> pl.sql("SELECT df.*, c FROM df JOIN df_pandas USING(a)").collect()
        shape: (2, 3)
        ┌─────┬─────┬─────┐
        │ a   ┆ b   ┆ c   │
        │ --- ┆ --- ┆ --- │
        │ i64 ┆ i64 ┆ i64 │
        ╞═════╪═════╪═════╡
        │ 2   ┆ 5   ┆ 7   │
        │ 3   ┆ 6   ┆ 8   │
        └─────┴─────┴─────┘
        FT)include_schemaunique)r:   r7   )rG   r@   )rZ   rA   N)setr   table_identifiersr;   execute)rY   rZ   rA   table_namesrH   ctxs         r,   r[   zSQLContext.execute_global   se    ^ **$
 )KPu= 	9;;U%;8	9 	9 	9s   AAc                    t        | dg       | _        | j                  j                  t        | j	                                      | S )zITrack currently registered tables on scope entry; supports nested scopes.r?   )getattrr?   appendra   tablesrF   s    r,   	__enter__zSQLContext.__enter__  s8    #*41F#K   ''DKKM(:;r.   c                    | j                  t        | j                               | j                  j	                         z
         y)z
        Unregister any tables created within the given scope on context exit.

        See Also
        --------
        unregister
        )namesN)
unregisterra   ri   r?   pop)rF   exc_typeexc_valexc_tbs       r,   __exit__zSQLContext.__exit__   s7     	t{{}%(@(@(D(D(FF 	 	
r.   c                Z    t        | j                               }d| dt        |       ddS )Nz<SQLContext [tables:z] at 0xx>)lenri   id)rF   n_tabless     r,   __repr__zSQLContext.__repr__1  s-    t{{}%%hZwr$xl!DDr.   c                    y rC   rD   rF   rZ   rA   s      r,   rc   zSQLContext.execute8       r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.execute=  r}   r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.executeB  r}   r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.executeG  r}   r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.executeL  r}   r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.executeQ  r}   r.   c                    y rC   rD   r|   s      r,   rc   zSQLContext.executeV  s     !$r.   c                   t        | j                  j                  |            }|s| j                  r|j	                         S |S )u  
        Parse the given SQL query and execute it against the registered frame data.

        Parameters
        ----------
        query
            A valid string SQL query.
        eager
            Apply the query eagerly, returning `DataFrame` instead of `LazyFrame`.
            If unset, the value of the init-time "eager" parameter will be used.
            Note that the query itself is always executed in lazy-mode; this
            parameter only impacts the type of the returned frame.

        Examples
        --------
        Declare frame data and register with a SQLContext:

        >>> df = pl.DataFrame(
        ...     data=[
        ...         ("The Godfather", 1972, 6_000_000, 134_821_952, 9.2),
        ...         ("The Dark Knight", 2008, 185_000_000, 533_316_061, 9.0),
        ...         ("Schindler's List", 1993, 22_000_000, 96_067_179, 8.9),
        ...         ("Pulp Fiction", 1994, 8_000_000, 107_930_000, 8.9),
        ...         ("The Shawshank Redemption", 1994, 25_000_000, 28_341_469, 9.3),
        ...     ],
        ...     schema=["title", "release_year", "budget", "gross", "imdb_score"],
        ...     orient="row",
        ... )
        >>> ctx = pl.SQLContext(films=df)

        Execute a SQL query against the registered frame data:

        >>> ctx.execute(
        ...     '''
        ...     SELECT title, release_year, imdb_score
        ...     FROM films
        ...     WHERE release_year > 1990
        ...     ORDER BY imdb_score DESC
        ...     ''',
        ...     eager=True,
        ... )
        shape: (4, 3)
        ┌──────────────────────────┬──────────────┬────────────┐
        │ title                    ┆ release_year ┆ imdb_score │
        │ ---                      ┆ ---          ┆ ---        │
        │ str                      ┆ i64          ┆ f64        │
        ╞══════════════════════════╪══════════════╪════════════╡
        │ The Shawshank Redemption ┆ 1994         ┆ 9.3        │
        │ The Dark Knight          ┆ 2008         ┆ 9.0        │
        │ Schindler's List         ┆ 1993         ┆ 8.9        │
        │ Pulp Fiction             ┆ 1994         ┆ 8.9        │
        └──────────────────────────┴──────────────┴────────────┘

        Execute a GROUP BY query:

        >>> ctx.execute(
        ...     '''
        ...     SELECT
        ...         MAX(release_year // 10) * 10 AS decade,
        ...         SUM(gross) AS total_gross,
        ...         COUNT(title) AS n_films,
        ...     FROM films
        ...     GROUP BY (release_year // 10) -- decade
        ...     ORDER BY total_gross DESC
        ...     ''',
        ...     eager=True,
        ... )
        shape: (3, 3)
        ┌────────┬─────────────┬─────────┐
        │ decade ┆ total_gross ┆ n_films │
        │ ---    ┆ ---         ┆ ---     │
        │ i64    ┆ i64         ┆ u32     │
        ╞════════╪═════════════╪═════════╡
        │ 2000   ┆ 533316061   ┆ 1       │
        │ 1990   ┆ 232338648   ┆ 3       │
        │ 1970   ┆ 134821952   ┆ 1       │
        └────────┴─────────────┴─────────┘
        )r   r=   rc   r>   collect)rF   rZ   rA   ress       r,   rc   zSQLContext.execute[  s9    b tzz))%01!&$*?*?s{{}IcIr.   c                    |
t               n
t        |      }| j                  j                  ||j                         | S )u  
        Register a single frame as a table, using the given name.

        Parameters
        ----------
        name
            Name of the table.
        frame
            eager/lazy frame to associate with this table name.

        See Also
        --------
        register_globals
        register_many
        unregister

        Examples
        --------
        >>> df = pl.DataFrame({"hello": ["world"]})
        >>> ctx = pl.SQLContext()
        >>> ctx.register("frame_data", df).execute("SELECT * FROM frame_data").collect()
        shape: (1, 1)
        ┌───────┐
        │ hello │
        │ ---   │
        │ str   │
        ╞═══════╡
        │ world │
        └───────┘
        )r   r5   r=   register_ldf)rF   rV   r3   s      r,   r   zSQLContext.register  s4    >  %}	2CE2J

D%**-r.   TrP   c               @    t        ||      }| j                  |      S )u9  
        Register all frames (lazy or eager) found in the current globals scope.

        Automatically maps variable names to table names.

        See Also
        --------
        register
        register_many
        unregister

        Parameters
        ----------
        n
            Register only the most recent "n" frames.
        all_compatible
            Control whether we *also* register pandas DataFrame, Series, and
            pyarrow Table and RecordBatch objects. If False, only Polars
            classes are registered with the SQL engine.

        Examples
        --------
        >>> df1 = pl.DataFrame({"a": [1, 2, 3], "b": ["x", None, "z"]})
        >>> df2 = pl.DataFrame({"a": [2, 3, 4], "c": ["t", "w", "v"]})

        Register frames directly from variables found in the current globals scope:

        >>> ctx = pl.SQLContext(register_globals=True)
        >>> ctx.tables()
        ['df1', 'df2']

        Query using the register variable/frame names

        >>> ctx.execute(
        ...     "SELECT a, b, c FROM df1 LEFT JOIN df2 USING (a) ORDER BY a DESC"
        ... ).collect()
        shape: (3, 3)
        ┌─────┬──────┬──────┐
        │ a   ┆ b    ┆ c    │
        │ --- ┆ ---  ┆ ---  │
        │ i64 ┆ str  ┆ str  │
        ╞═════╪══════╪══════╡
        │ 3   ┆ z    ┆ w    │
        │ 2   ┆ null ┆ t    │
        │ 1   ┆ x    ┆ null │
        └─────┴──────┴──────┘
        )r:   r6   )rG   )r;   rU   )rF   nr:   rG   s       r,   r@   zSQLContext.register_globals  s%    d #.AN!!!00r.   c                    t        |xs i       }|j                  |       |j                         D ]  \  }}| j                  ||        | S )a   
        Register multiple eager/lazy frames as tables, using the associated names.

        Parameters
        ----------
        frames
            A `{name:frame, ...}` mapping.
        **named_frames
            Named eager/lazy frames, provided as kwargs.

        See Also
        --------
        register
        register_globals
        unregister

        Examples
        --------
        >>> lf1 = pl.LazyFrame({"a": [1, 2, 3], "b": ["m", "n", "o"]})
        >>> lf2 = pl.LazyFrame({"a": [2, 3, 4], "c": ["p", "q", "r"]})
        >>> lf3 = pl.LazyFrame({"a": [3, 4, 5], "b": ["s", "t", "u"]})
        >>> lf4 = pl.LazyFrame({"a": [4, 5, 6], "c": ["v", "w", "x"]})

        Register multiple frames at once, either by passing in as a dict...

        >>> ctx = pl.SQLContext().register_many({"tbl1": lf1, "tbl2": lf2})
        >>> ctx.tables()
        ['tbl1', 'tbl2']

        ...or using keyword args:

        >>> ctx.register_many(tbl3=lf3, tbl4=lf4).tables()
        ['tbl1', 'tbl2', 'tbl3', 'tbl4']
        )rR   rT   rS   r   )rF   rG   rH   rV   r3   s        r,   rU   zSQLContext.register_many  sK    N fl#l#!<<> 	'KD%MM$&	'r.   c                p    t        |t              r|g}|D ]  }| j                  j                  |        | S )a  
        Unregister one or more eager/lazy frames by name.

        Parameters
        ----------
        names
            Names of the tables to unregister.

        Notes
        -----
        You can also control table registration lifetime by using `SQLContext` as a
        context manager; this can often be more useful when such control is wanted:

        >>> df0 = pl.DataFrame({"colx": [0, 1, 2]})
        >>> df1 = pl.DataFrame({"colx": [1, 2, 3]})
        >>> df2 = pl.DataFrame({"colx": [2, 3, 4]})

        Frames registered in-scope are automatically unregistered on scope-exit. Note
        that frames registered on construction will persist through subsequent scopes.

        >>> # register one frame at construction time, and the other two in-scope
        >>> with pl.SQLContext(tbl0=df0) as ctx:
        ...     ctx.register_many(tbl1=df1, tbl2=df2).tables()
        ['tbl0', 'tbl1', 'tbl2']

        After scope exit, none of the tables registered in-scope remain:

        >>> ctx.tables()
        ['tbl0']

        See Also
        --------
        register
        register_globals
        register_many

        Examples
        --------
        >>> df0 = pl.DataFrame({"ints": [9, 8, 7, 6, 5]})
        >>> lf1 = pl.LazyFrame({"text": ["a", "b", "c"]})
        >>> lf2 = pl.LazyFrame({"misc": ["testing1234"]})

        Register with a SQLContext object:

        >>> ctx = pl.SQLContext(test1=df0, test2=lf1, test3=lf2)
        >>> ctx.tables()
        ['test1', 'test2', 'test3']

        Unregister one or more of the tables:

        >>> ctx.unregister(["test1", "test3"]).tables()
        ['test2']
        >>> ctx.unregister("test2").tables()
        []
        )r&   strr=   rn   )rF   rm   nms      r,   rn   zSQLContext.unregister4  s<    p eS!GE 	&BJJ!!"%	&r.   c                H    t        | j                  j                               S )u)  
        Return a list of the registered table names.

        Notes
        -----
        The :meth:`tables` method will return the same values as the
        "SHOW TABLES" SQL statement, but as a list instead of a frame.

        Executing as SQL:

        >>> frame_data = pl.DataFrame({"hello": ["world"]})
        >>> ctx = pl.SQLContext(hello_world=frame_data)
        >>> ctx.execute("SHOW TABLES", eager=True)
        shape: (1, 1)
        ┌─────────────┐
        │ name        │
        │ ---         │
        │ str         │
        ╞═════════════╡
        │ hello_world │
        └─────────────┘

        Calling the method:

        >>> ctx.tables()
        ['hello_world']

        Examples
        --------
        >>> df1 = pl.DataFrame({"hello": ["world"]})
        >>> df2 = pl.DataFrame({"foo": ["bar", "baz"]})
        >>> ctx = pl.SQLContext(hello_data=df1, foo_bar=df2)
        >>> ctx.tables()
        ['foo_bar', 'hello_data']
        )sortedr=   
get_tablesrj   s    r,   ri   zSQLContext.tablesr  s    H djj++-..r.   ).)rF   SQLContext[LazyFrame]rG   /Mapping[str, CompatibleFrameType | None] | Noner@   
bool | intrA   Literal[False]rH   CompatibleFrameType | NonereturnNone)rF   SQLContext[DataFrame]rG   r   r@   r   rA   Literal[True]rH   r   r   r   )rF   r   rG   r   r@   r   rA   boolrH   r   r   r   rC   )
rG   r   r@   r   rA   r   rH   r   r   r   )rZ   r   rA   r   r   r   )rZ   r   rA   r   r   r   )rZ   r   rA   r   r   zDataFrame | LazyFrame)r   zSQLContext[FrameType])rp   ztype[BaseException] | Nonerq   zBaseException | Nonerr   zTracebackType | Noner   r   )r   r   )rF   r   rZ   r   rA   r   r   r   )rF   r   rZ   r   rA   r   r   r   )rF   r   rZ   r   rA   r   r   r   )rF   r   rZ   r   rA   r   r   r   )rF   r   rZ   r   rA   r   r   r   )rF   r   rZ   r   rA   r   r   r   )rZ   r   rA   zbool | Noner   zLazyFrame | DataFrame)rV   r   r3   r   r   r"   )r   
int | Noner:   r   r   r"   )rG   r   rH   r   r   r"   )rm   zstr | Collection[str]r   r"   )r   z	list[str])__name__
__module____qualname____doc____annotations__r   rI   r   classmethodr[   rk   rs   rz   rc   r   r@   rU   rn   ri   rD   r.   r,   r$   r$   [   sg    !!''  CF (+ %#? %	
  3 
   CF (+	#? %	
  3 
   CF (+	#? %	
  3 
  !!2GYO CGA' (-A'?A' %	A'
 A' 3A' 
A' PA'F 49#1	   R  RU  U*/8989#'89	89 89t
,
 &
 %	

 

"E BE#,/;?	  #,/;I	  #,/;H	  BE#,/;?	  #,/;I	  #,/;H	  25$$$/$	$ $
 37RJRJ$/RJ	RJh!H #31>B31317;31	31n CG+?+ 3+ 
	+Z<|$/r.   )r+   r   r   r   )r+   r   r   r   )r:   r   r6   r   r7   z4str | Collection[str] | Callable[[str], bool] | Noner   zdict[str, Any])?
__future__r   
contextlibtypingr   r   r   polars._dependenciesr   r   r	   r'   r
   r(   polars._typingr   polars._utils.deprecationr   polars._utils.pycapsuler   polars._utils.unstabler   polars._utils.variousr   r   polars._utils.wrapr   polars.convertr   r   polars.dataframer   polars.lazyframer   polars.seriesr   suppressImportErrorpolars._plrr   syscollections.abcr   r   r   typesr   r   r   r   r   version_infor"   typing_extensionsr)   r*   r#   r   __all__r-   r5   r;   r$   rD   r.   r,   <module>r      sO   "   G - . $ A 0 9 H ' 2 & &  Z% )() ==#55
7"* 	
	
	 ,,	 ))C.		
 ((	 ..	   ., !BF	PP P @	P
 P{/# {/G) )s   <D66D?