o
    8Di*9                     @  s   d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZ G dd dZG dd	 d	ZG d
d deZG dd deZG dd deZG dd deZG dd deZdS )    )annotationsN)aliasexp)name_sequence)join_conditionc                   @  s<   e Zd ZdddZeddd	ZedddZdddZdS )Plan
expressionexp.ExpressionreturnNonec                 C  s"   |  | _t| j| _i | _d S N)copyr   Stepfrom_expressionroot_dag)selfr    r   H/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/planner.py__init__   s   

zPlan.__init__t.Dict[Step, t.Set[Step]]c                 C  s\   | j s+i }| jh}|r(| }t ||< |jD ]}|| | || q|s|| _ | j S r   )r   r   popsetdependenciesadd)r   dagnodesnodedepr   r   r   r      s   

zPlan.dagt.Iterator[Step]c                 C  s   dd | j  D S )Nc                 s  s    | ]	\}}|s|V  qd S r   r   ).0r   depsr   r   r   	<genexpr>%   s    zPlan.leaves.<locals>.<genexpr>)r   itemsr   r   r   r   leaves#   s   zPlan.leavesstrc                 C  s   dt | j S )Nz
Plan
----
)reprr   r$   r   r   r   __repr__'   s   zPlan.__repr__N)r   r	   r
   r   )r
   r   )r
   r   r
   r&   )__name__
__module____qualname__r   propertyr   r%   r(   r   r   r   r   r      s    
r   c                   @  sn   e Zd Ze	dd ddZd!d
dZd"ddZd#ddZd$d%ddZe	d#ddZ
e	d#ddZd&ddZdS )'r   Nr   r	   ctest.Optional[t.Dict[str, Step]]r
   c                   s  |pi }|  }|jd}|r*| }|jD ]}t|j||j_	|j	< q|jd}t
|tjr@|r@t|j|nt
|tjrMt||nt |jd}|rmt||}j	|_	j	|_| |g }i i  td fdd}	 fdd}
|jD ]}|tjr|tj|jj	d	d
 |	| q|| q|jd}|r|j_|jd}|s rkt }j	|_j	|_	|jd}|r|	tj|jdd	d
rtjdj	d	d
|_n|j|_|
| dd t|r|jng D |_i }|j D ]\}}|||< t
|tj r|||j	< q|D ]}|! D ]}||}|r9|"t|j	 q%q|jrc|j! D ]}||pS||j	}|ra|"t|j	 qF| |nd}|jd}|r|rt
trt|jD ]$\}}|	tj|jd| d	d
r|j"tjd| j	d	d
 q|
| t# }j	|_	|j|_$| ||_%t
|tjr|jdrt }j	|_j	|_	fdd|p|jD |_| ||jd}|rt&|'d_(S )a[  
        Builds a DAG of Steps from a SQL expression so that it's easier to execute in an engine.
        Note: the expression's tables and subqueries must be aliased for this method to work. For
        example, given the following expression:

        SELECT
          x.a,
          SUM(x.b)
        FROM x AS x
        JOIN y AS y
          ON x.a = y.a
        GROUP BY x.a

        the following DAG is produced (the expression IDs might differ per execution):

        - Aggregate: x (4347984624)
            Context:
              Aggregations:
                - SUM(x.b)
              Group:
                - x.a
            Projections:
              - x.a
              - "x".""
            Dependencies:
            - Join: x (4347985296)
              Context:
                y:
                On: x.a = y.a
              Projections:
              Dependencies:
              - Scan: x (4347983136)
                Context:
                  Source: x AS x
                Projections:
              - Scan: y (4343416624)
                Context:
                  Source: y AS y
                Projections:

        Args:
            expression: the expression to build the DAG from.
            ctes: a dictionary that maps CTEs to their corresponding Step DAG by name.

        Returns:
            A Step DAG corresponding to `expression`.
        withfromjoins_a_c                   st   t | tj}|rd  | < |D ]%}| D ]}t|tjrq|vr( |< |tj| dd qqt	|S )NTquoted)
tuplefind_allr   AggFuncunnest_operands
isinstanceColumnreplacecolumnbool)r   	agg_funcsaggoperand)aggregationsnext_operand_nameoperandsr   r   extract_agg_operands   s   
z2Step.from_expression.<locals>.extract_agg_operandsc                   s&   t dd  D | _t | _d S )Nc                 s  s    | ]
\}}t ||V  qd S r   )r   )r    rA   alias_r   r   r   r"      s    zAStep.from_expression.<locals>.set_ops_and_aggs.<locals>.<genexpr>)r6   r#   rD   listrB   step)rB   rD   r   r   set_ops_and_aggs   s   z.Step.from_expression.<locals>.set_ops_and_aggsTr4   wheregrouphaving_hc                 S  s   i | ]
\}}d | |qS )_gr   )r    ier   r   r   
<dictcomp>   s    z(Step.from_expression.<locals>.<dictcomp>Norder_o_distinctc                   s"   i | ]}|j tj|j  jd qS ))coltable)alias_or_namer   r=   name)r    rQ   rH   r   r   rR      s    limitr   ))unnestargsgetr   expressionsr   r   thisr   rY   r:   r   SelectScanSetOperationJoin
from_joinssource_nameadd_dependencyr   findr8   appendr=   rX   	condition	AggregatesourcerF   	enumeraterL   r#   r;   walkr<   SortkeyprojectionsinttextrZ   )clsr   r.   with_ctefrom_r2   joinrp   rE   rJ   rQ   rK   rL   	aggregaterM   intermediatekv
projectionr   rY   rS   rP   orderedsortrU   rZ   r   )rB   rC   rD   rI   r   r   ,   s   3







 



zStep.from_expressionr   c                 C  s.   d | _ t | _t | _g | _tj| _d | _d S r   )	rY   r   r   
dependentsrp   mathinfrZ   ri   r$   r   r   r   r      s   
zStep.__init__
dependencyc                 C  s   | j | |j|  d S r   )r   r   r   )r   r   r   r   r   rf      s   zStep.add_dependencyr&   c                 C  s   |   S r   )to_sr$   r   r   r   r(      s   zStep.__repr__r   levelrq   c                 C  s   d| }| d}|  | d}|r| dg| }| d| j g|| d}| jD ]}|| d|   q.| jrM|| d| j   | jtjur^|| d| j  | j	r{|| d	 | j	D ]}|d|
|d
   qld|S )Nz  z    zContext:z- zProjections:  - zCondition: zLimit: zDependencies:   
)_to_sidrp   rh   sqlri   rZ   r   r   r   r   rw   )r   r   indentnestedcontextlinesr   r   r   r   r   r     s,   



z	Step.to_sc                 C     | j jS r   )	__class__r*   r$   r   r   r   	type_name!     zStep.type_namec                 C  s4   | j }|r
d| nd}| j d| dt|  dS )N  :z ())rY   r   r   )r   rY   r   r   r   r   %  s   zStep.id_indentt.List[str]c                 C  s   g S r   r   )r   r   r   r   r   r   +  s   z
Step._to_sr   r   r	   r.   r/   r
   r   r
   r   )r   r   r
   r   r)   )r   )r   rq   r
   r&   )r   r&   r
   r   )r*   r+   r,   classmethodr   r   rf   r(   r   r-   r   r   r   r   r   r   r   r   +   s     
G

r   c                      s:   e Zd Ze	dddd	Zd fddZdddZ  ZS )ra   Nr   r	   r.   r/   r
   r   c                 C  sf   |}|j }t|tjr|j}t||}||_|S t }||_||_	|r1|j|v r1|
||j  |S r   )rX   r:   r   Subqueryr_   r   r   rY   ra   rk   rf   )rs   r   r.   rW   rF   rI   r   r   r   r   0  s   zScan.from_expressionr   c                      t    d | _d S r   )superr   rk   r$   r   r   r   r   E     

zScan.__init__r   r&   r   c                 C  s&   | d| j r| j   gS d gS )NSource: z-static-)rk   r   )r   r   r   r   r   r   I  s   &z
Scan._to_sr   r   r   r   r&   r
   r   )r*   r+   r,   r   r   r   r   __classcell__r   r   r   r   ra   /  s    ra   c                      s:   e Zd Ze	ddddZd fd
dZdddZ  ZS )rc   Nr2   t.Iterable[exp.Join]r.   r/   r
   c                 C  sN   t  }|D ]}t|\}}}|j|||d|j|j< |t|j| q|S )N)sidejoin_key
source_keyri   )	rc   r   r   r2   rX   rf   ra   r   r_   )rs   r2   r.   rI   rw   r   r   ri   r   r   r   rd   N  s   zJoin.from_joinsr   c                   s   t    d | _i | _d S r   )r   r   re   r2   r$   r   r   r   r   a  s   

zJoin.__init__r   r&   r   c              
   C  s   | d| j p| j g}| j D ]F\}}|| | d|d p!d  ddd tt|	dp3g D }|rD|| d	|  |	d
rW|| d|d
 
   q|S )Nr   z: r   INNERz, c                 s  s    | ]}t |V  qd S r   )r&   )r    ro   r   r   r   r"   j  s    zJoin._to_s.<locals>.<genexpr>r   zKey: ri   zOn: )re   rY   r2   r#   rh   rw   tcastrG   r]   r   )r   r   r   rY   rw   r   r   r   r   r   f  s    &
z
Join._to_sr   )r2   r   r.   r/   r
   rc   r   r   )r*   r+   r,   r   rd   r   r   r   r   r   r   r   rc   M  s    rc   c                      (   e Zd Zd
 fddZddd	Z  ZS )rj   r
   r   c                   s&   t    g | _d| _i | _d | _d S )Nr   )r   r   rB   rD   rL   rk   r$   r   r   r   r   s  s
   

zAggregate.__init__r   r&   r   c                 C  s   | dg}| j D ]}|| d|   q	| jr7|| d | j D ]}|| d|   q(| jrO|| d || d| j   | jrl|| d | jD ]}|| d|   q]|S )NzAggregations:r   zGroup:zHaving:z	Operands:)rB   rh   r   rL   valuesri   rD   r   r   r   r   r   r   r   r   z  s   

zAggregate._to_sr   r   r*   r+   r,   r   r   r   r   r   r   r   rj   r  s    rj   c                      r   )rn   r
   r   c                   r   r   )r   r   ro   r$   r   r   r   r     r   zSort.__init__r   r&   r   c                 C  s4   | dg}| j D ]}|| d|   q	|S )NzKey:r   )ro   rh   r   r   r   r   r   r     s   
z
Sort._to_sr   r   r   r   r   r   r   rn     s    rn   c                      sL   e Zd Z	dd fddZe	ddddZdddZed ddZ  Z	S )!rb   Fopt.Type[exp.Expression]left
str | NonerightrU   r>   r
   r   c                   s&   t    || _|| _|| _|| _d S r   )r   r   r   r   r   rU   )r   r   r   r   rU   r   r   r   r     s
   

zSetOperation.__init__Nr   r	   r.   r/   c                 C  s   t |tjsJ t|j|}|jpd|_t|j|}|jp d|_| |j|j|jt	|j
dd}|| || |j
d}|rMt|d|_|S )Nr   r   rU   )r   r   r   rU   rZ   r   )r:   r   rb   r   r   r   rY   r   r   r>   r\   r]   rf   rq   rr   rZ   )rs   r   r.   r   r   rI   rZ   r   r   r   r     s"   

zSetOperation.from_expressionr   r&   r   c                 C  s$   g }| j r|| d| j   |S )Nz
Distinct: )rU   rh   )r   r   r   r   r   r   r     s   zSetOperation._to_sc                 C  r   r   )r   r*   r$   r   r   r   r     r   zSetOperation.type_name)F)
r   r   r   r   r   r   rU   r>   r
   r   r   )r   r	   r.   r/   r
   rb   r   r)   )
r*   r+   r,   r   r   r   r   r-   r   r   r   r   r   r   rb     s    
rb   )
__future__r   r   typingr   sqlglotr   r   sqlglot.helperr   !sqlglot.optimizer.eliminate_joinsr   r   r   ra   rc   rj   rn   rb   r   r   r   r   <module>   s       %