o
    8Di                     @  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mZ d dlmZmZ d dlmZ d dlmZ ejrAd d	lmZ 				
	ddddZdS )    )annotationsN)aliasexp)DialectType)
csv_readername_sequence)Scopetraverse_scope)Schema)Dialect)EF
expressionr   db t.Optional[str | exp.Identifier]catalogschemat.Optional[Schema]infer_csv_schemasbooldialectr   returnc              
     sx  t d}rtj|dnd rtj |dnd t|}d% fdd	}s+ r]t| tjs]| jd
p:t	 }dd |j
D }	| jdd dD ]}
t|
tjr\|
j|	vr\||
 qKt| D ]}t|j|jD ]i}t|tjr| }t|tjr|jdd}|jtdj| dd |jd| |jds| }|dtjt|d |d| |jd}|r|d js|d dtjt| d qli }|j ! D ]!\}}t|tjr|jd}|js|r|d j|kr|j}t||p
|jp
| ddd t|j|d"dd |j#D < |rN|d }|jsB|j$r2|jn| }|dtjt|d t|j |j%t&rNq|| |r|rt|jtj'rt(|j }t)|}t)|}|j*|dd t+||D dd W d   n	1 sw   Y  qt|t&r|j,r|j-}|jdptjt| d}|d| |js|d t|  t|tj.r|j/s|0|}|d!| q| D ]"}
t|
tjr|
jst|
j1tj2tj3frt|
|
jddd qq|j/D ]5}|j4r7|d"d"d |j#dd# D }|r7tj5d$d D ]	}||d q%|d|  qqa| S )&a  
    Rewrite sqlglot AST to have fully qualified tables. Join constructs such as
    (t1 JOIN t2) AS t will be expanded into (SELECT * FROM t1 AS t1, t2 AS t2) AS t.

    Examples:
        >>> import sqlglot
        >>> expression = sqlglot.parse_one("SELECT 1 FROM tbl")
        >>> qualify_tables(expression, db="db").sql()
        'SELECT 1 FROM db.tbl AS tbl'
        >>>
        >>> expression = sqlglot.parse_one("SELECT 1 FROM (t1 JOIN t2) AS t")
        >>> qualify_tables(expression).sql()
        'SELECT 1 FROM (SELECT * FROM t1 AS t1, t2 AS t2) AS t'

    Args:
        expression: Expression to qualify
        db: Database name
        catalog: Catalog name
        schema: A schema to populate
        infer_csv_schemas: Whether to scan READ_CSV calls in order to infer the CSVs' schemas.
        dialect: The dialect to parse catalog and schema into.

    Returns:
        The qualified expression.
    _q_)r   Ntable	exp.Tabler   Nonec                   sn   t | jtjr/r| jds| d   r1| jds3| jdr5| d   d S d S d S d S d S )Nr   r   )
isinstancethisr   
Identifierargsgetsetcopy)r   r   r    Y/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/optimizer/qualify_tables.py_qualify7   s   z qualify_tables.<locals>._qualifywithc                 S  s   h | ]}|j qS r#   )alias_or_name).0cter#   r#   r$   	<setcomp>@   s    z!qualify_tables.<locals>.<setcomp>c                 S  s   t | tjS N)r   r   Query)nr#   r#   r$   <lambda>B   s    z qualify_tables.<locals>.<lambda>)prunejoins*F)r!   r   )r   pivotsr   T)r!   r   .c                 s      | ]}|j V  qd S r+   namer(   pr#   r#   r$   	<genexpr>e       z!qualify_tables.<locals>.<genexpr>c                 S  s   i | ]
\}}|t |jqS r#   )type__name__)r(   kvr#   r#   r$   
<dictcomp>{   s    z"qualify_tables.<locals>.<dictcomp>)match_depthr   columnsc                 s  r4   r+   r5   r7   r#   r#   r$   r9      r:      )r   r   r   r   )6r   r   parse_identifierr   get_or_raiser   r,   r   r   WithexpressionswalkTabler6   r	   	itertoolschainctesderived_tablesSubqueryunnestpopr   replaceselectfrom_r!   r    
TableAliasto_identifierrename_sourcer   sourcesitemsjoinpartsunpivotr'   r   ReadCSVr   next	add_tablezipis_udtfr   ValuesrA   generate_values_aliasesparentFromJoinr   COLUMN_PARTS)r   r   r   r   r   r   next_alias_namer%   with_	cte_namesnodescopederived_tableunnestedr0   alias_r2   table_aliasesr6   sourcepivotpivot_aliasreaderheaderrA   udtftable_aliascolumn_aliasescolumnr8   r#   r"   r$   qualify_tables   s   !
   



	$
ry   )NNNFN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
__future__r   rJ   typingtsqlglotr   r   sqlglot.dialects.dialectr   sqlglot.helperr   r   sqlglot.optimizer.scoper   r	   sqlglot.schemar
   r   TYPE_CHECKINGsqlglot._typingr   ry   r#   r#   r#   r$   <module>   s"    