o
    8Di                     @  s   d dl mZ d dl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jrMd d
lmZ d dlmZ d dlmZ e ZdddZ			d d!ddZdd ZdS )"    )annotationsN)defaultdict)aliasexp)Resolver)Scopetraverse_scope)ensure_schema)OptimizeError)seq_get)E)Schema)DialectTypeis_aggboolreturn	exp.Aliasc                 C  s&   t | rtjtjdddS ddS )N   )this1_)r   r   MaxLiteralnumber)r    r   _/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/optimizer/pushdown_projections.pydefault_selection   s   &r   T
expressionr   schemat.Optional[t.Dict | Schema]remove_unused_selectionsdialectr   c                   s  t ||d}i }tt}tt| D ]}||th ||d}|jjdr+th t	|jt
jr|j}|js|js|j\}	t|	jjtjjkr[|jj|d}
td|
 d ||	< tdd jjD ro |< n)tdd |	jjD s|jjd	r||	 |< n fd
dt|	jjD |< t	|jt
jr|rt| || |jjrqtt}|jD ]}|j}|j}|| | q|j D ]:\}\}}t	|trt|jjd}|j st	|t
j!rth}n||pt }|| "| |j#}|rt|||< qq| S )a.  
    Rewrite sqlglot AST to remove unused columns projections.

    Example:
        >>> import sqlglot
        >>> sql = "SELECT y.a AS a FROM (SELECT x.a AS a, x.b AS b FROM x) AS y"
        >>> expression = sqlglot.parse_one(sql)
        >>> pushdown_projections(expression).sql()
        'SELECT y.a AS a FROM (SELECT x.a AS a FROM x) AS y'

    Args:
        expression (sqlglot.Expression): expression to optimize
        remove_unused_selections (bool): remove selects that are unused
    Returns:
        sqlglot.Expression: optimized expression
    )r!   r   distinctz.Invalid set operation due to column mismatch: .c                 s      | ]}|j V  qd S Nis_star.0selectr   r   r   	<genexpr>O       z'pushdown_projections.<locals>.<genexpr>c                 s  r$   r%   r&   r(   r   r   r   r+   Q   r,   by_namec                   s0   h | ]\}}t  v s|j v rjj| jqS r   )
SELECT_ALLalias_or_namer   selects)r)   ir*   parent_selectionsrightr   r   	<setcomp>U   s    
z'pushdown_projections.<locals>.<setcomp>)$r	   r   setreversedr   getr.   r   args
isinstancer   SetOperationkindsideunion_scopeslenr0   sqlr
   any	enumerateSelect_remove_unused_selectionsr'   columnstablenameaddselected_sourcesitemsr   r   pivotsQueryTransformupdatealias_column_names)r   r   r    r!   source_column_alias_countreferenced_columnsscopealias_countset_opleft	scope_sqlr0   col
table_namecol_namerG   nodesourcer*   rE   column_aliasesr   r2   r   pushdown_projections   s`   






r\   c              	   C  s>  | j jd}|rdd |tjD }nt }g }d}d}d}	t|v }
| j jD ].}|j	}|
s;||v s;||v s;|dkrE|
| |d8 }n|jrJd}d}|	sV|tjrVd}	q(|rt| |}dd |D }t|D ]}||vr|
ttj|||d	|dd
 qi|s|
t|	 | j j|ddd |r|   d S d S )Norderc                 S  s   h | ]}|j s|jqS r   )rF   rG   )r)   cr   r   r   r5      s    z,_remove_unused_selections.<locals>.<setcomp>Fr   r   Tc                 S  s   h | ]}|j qS r   )r/   )r)   sr   r   r   r5      s    )rF   )copy)appendr`   )r   r9   r8   find_allr   Columnr6   r.   r0   r/   ra   r'   findAggFuncr   sortedr   column	get_tabler   r*   clear_cache)rQ   r3   r   rR   r]   
order_refsnew_selectionsremovedstarr   
select_all	selectionrG   resolvernamesr   r   r   rD   }   sF   


rD   )r   r   r   r   )NTN)
r   r   r   r   r    r   r!   r   r   r   )
__future__r   typingtcollectionsr   sqlglotr   r   !sqlglot.optimizer.qualify_columnsr   sqlglot.optimizer.scoper   r   sqlglot.schemar	   sqlglot.errorsr
   sqlglot.helperr   TYPE_CHECKINGsqlglot._typingr   r   sqlglot.dialects.dialectr   objectr.   r   r\   rD   r   r   r   r   <module>   s(    
b