o
    8DiA                     @   s   d dl Z d dlZd dlZd dlZd dlmZ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mZ d dlmZmZ G d	d
 d
Zdd Zdd Zdd ZdejdefddZdejdej defddZ!G dd de
Z"dS )    N)exp	generatorplannertokens)Dialectinline_array_sql)ExecuteError)Context)ENV)	RowReaderTable)
csv_reader
subclassesc                   @   s   e Zd Z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dd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZdS )%PythonExecutorNc                 C   s2   t  jddd| _i t|pi | _|pi | _d S )NTF)identifycomments)Pythonr   r
   envtables)selfr   r    r   P/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/executor/python.py__init__   s   zPythonExecutor.__init__c              
      s  t  t |j}i  |r| }z|  fdd|jD }t|tjr-| || |< n>t|tj	r<| 
|| |< n/t|tjrK| || |< n t|tjrZ| || |< nt|tjri| || |< nt| |jD ]}t fdd|jD r|| qs|jD ]}tfdd|jD r | qW n ty } ztd|j d| |d }~ww |s|j} | j|j S )Nc                    s*   i | ]} | j  D ]\}}||qqS r   )r   items).0depnametablecontextsr   r   
<dictcomp>   s    z*PythonExecutor.execute.<locals>.<dictcomp>c                 3       | ]}| v V  qd S Nr   r   dr   r   r   	<genexpr>5       z)PythonExecutor.execute.<locals>.<genexpr>c                 3   r!   r"   r   r#   )finishedr   r   r%   9   r&   zStep 'z
' failed: )setleavespopcontextdependencies
isinstancer   Scanscan	Aggregate	aggregateJoinjoinSortsortSetOperationset_operationNotImplementedErroradd
dependentsall	Exceptionr   idrootr   r   )r   planqueuenoder+   r   er>   r   )r   r'   r   execute   sN   






$zPythonExecutor.executec                 C   s$   |sdS | j |}t||dddS )zOConvert a SQL expression into literal Python code and compile it into bytecode.Neval   )optimize)r   generatecompile)r   
expressionsqlr   r   r   rG   A   s   zPythonExecutor.generatec                    s    |st  S t  fdd|D S )zCConvert an array of SQL expressions into tuple of Python byte code.c                 3       | ]}  |V  qd S r"   )rG   r   rI   r   r   r   r%   M       z0PythonExecutor.generate_tuple.<locals>.<genexpr>)tupler   expressionsr   rM   r   generate_tupleI   s   zPythonExecutor.generate_tuplec                 C   s   t || jdS )N)r   )r	   r   )r   r   r   r   r   r+   O   s   zPythonExecutor.contextc                 C   s   t dd |D S )Nc                 s   s&    | ]}t |tjr|jn|V  qd S r"   )r-   r   
Expressionalias_or_namerL   r   r   r   r%   S   s
    
z'PythonExecutor.table.<locals>.<genexpr>)r   rP   r   r   r   r   R   s   zPythonExecutor.tablec                 C   s   |j }|rt|tjr|jp|j}|d u r|  \}}n;||v r7|js1|js1| 	|j|j
| iS ||}n t|j tjrPt|j jtjrP| |}t|}n| |\}}| 	|j| |||iS r"   )sourcer-   r   rS   r   aliasstaticprojections	conditionr+   r   
table_iterr   thisReadCSVscan_csvnext
scan_table_project_and_filter)r   stepr+   rU   rZ   r   r   r   r/   X   s   

zPythonExecutor.scanc                 C   s   |  |jr|jn|j}| |j}| |j}|D ]%}t||jkr& |S |r.||s.q|r9|	|
| q|	|j q|S r"   )r   rX   columnsrG   rY   rR   lenlimitrD   append
eval_tuplerow)r   r+   ra   rZ   sinkrY   rX   readerr   r   r   r`   l   s   
z"PythonExecutor._project_and_filterc                 C   s   |  i tdgfS )Nr   )r+   r   rM   r   r   r   rW      s   zPythonExecutor.staticc                 C   s,   | j |j}| |jj|i}|t|fS r"   )r   findrU   r+   rT   iter)r   ra   r   r+   r   r   r   r_      s   zPythonExecutor.scan_tablec                 c   s    |j j}|j j}t|Y}t|}t|}| ||i}|V  g }|D ]9}	|sI|	D ]}
z|tt	
|
 W q* ttfyH   |t Y q*w |tdd t||	D  |jjV  q$W d    d S 1 siw   Y  d S )Nc                 s   s0    | ]\}}|t ur|d krdn||V  qdS ) N)str)r   tvr   r   r   r%      s   . z*PythonExecutor.scan_csv.<locals>.<genexpr>)rU   rV   r[   r   r^   r   r+   re   typeastliteral_eval
ValueErrorSyntaxErrorrm   set_rowrO   zipr   ri   )r   ra   rV   rU   ri   rb   r   r+   typesrg   ro   r   r   r   r]      s.   
"zPythonExecutor.scan_csvc                    sL  |j }|j| }| ||i}|tdt|ji}|j D ]W\}}|j| tdd |	 D }	t|	tj|	 ||< | |i}
|
drR| |||
n| |||
| fdd| D }| |d }|ru|| q|js~|js~|S | ||dd t|D  |jr| |j iS |  fd	d|j D S )
Nr   c                 s   s    | ]}|j V  qd S r"   )stopr   rr   r   r   r%      s    z&PythonExecutor.join.<locals>.<genexpr>
source_keyc                    s"   i | ]\}}|t  j j|qS r   )r   rb   rows)r   r   column_ranger   r   r   r       s    z'PythonExecutor.join.<locals>.<dictcomp>rY   c                 s   s    | ]\}}|V  qd S r"   r   )r   ri   _r   r   r   r%      r&   c                    s$   i | ]\}}|t |j j|jqS r   )r   rb   r|   r}   )r   r   r   rh   r   r   r       s    )source_namer   r+   rangerc   rb   joinsr   maxvaluesget	hash_joinnested_loop_joinrG   filterrY   rX   r`   rk   r   )r   ra   r+   rU   source_tablesource_contextcolumn_rangesr   r3   startjoin_contextrY   r   )rh   r   r   r3      sF   





zPythonExecutor.joinc                 C   sB   t |j|j }|D ]\}}|D ]\}}||j|j  qq
|S r"   )r   rb   re   rg   )r   _joinr   r   r   reader_ar   reader_br   r   r   r      s   zPythonExecutor.nested_loop_joinc                 C   s  |  |d }|  |d }|ddk}|ddk}tdd }|D ]\}	}
||
| d |	j q%|D ]\}	}
||
| d	 |	j q9t|j|j }d
t	|rZ|jn|j g}|
 D ]#\}}|ro|pm|}n|ru|pt|}t||D ]\}}|||  q{qd|S )Nr{   join_keysideLEFTRIGHTc                   S   s   g g fS r"   r   r   r   r   r   <lambda>   s    z*PythonExecutor.hash_join.<locals>.<lambda>r      r"   )rR   r   collectionsdefaultdictrf   re   rg   r   rb   rc   r   	itertoolsproduct)r   r3   r   r   r{   r   leftrightresultsri   ctxr   nullsa_groupb_groupa_rowb_rowr   r   r   r      s(   
zPythonExecutor.hash_joinc                    s0  |  |j }|  |j |  |j}|rmt| |jj}D ]\}}||	| q!t
tjj|jD ]\}\}	}
|	|
 jj|< q8tj}j|j  tjjjt||t|j }| d |ij| d d}d}tj}| t|j|j  fdd}|rt|D ]H}| 	|}d u r|n|d7 }|krĈ||d  |  ||d }tj|jkr n||d kr߈||d  |  qn|jdkr|sdd 	  | |jifddjD |js|jr| |S S )Nr   r   c                      s       d S r"   )re   rf   r   aggregationsr+   groupr   r   r   add_row  s   z)PythonExecutor.aggregate.<locals>.add_rowrE   c                       i | ]}| qS r   r   )r   r   r~   r   r   r    /      z,PythonExecutor.aggregate.<locals>.<dictcomp>)rR   r   r   r   operandsr   r   rb   re   rf   	enumeraterv   r|   rc   add_columnsr   r+   r   r5   list	set_index	set_rangerd   r   rX   rY   r/   )r   ra   r+   group_byr   operand_tableri   r   iabwidthr   endlengthr   keyr   r   r   r1      sj    




$zPythonExecutor.aggregatec           	         s   |  |j}dd |jD }tj|  |  D ]\}}|j||  q| d ifddj	D }|
|  |j t|jsW|jjd|j |j_t| fdd|jjD d}| |j|iS )Nc                 S   s   g | ]}|j qS r   )rT   r   pr   r   r   
<listcomp>7  r   z'PythonExecutor.sort.<locals>.<listcomp>c                    r   r   r   )r   r   r   r   r   r    @  r   z'PythonExecutor.sort.<locals>.<dictcomp>r   c                    s"   g | ]}|t jt   qS r   )rc   rb   ry   )all_columnsr+   r   r   r   J     " )r|   )rR   rX   r   rb   r   re   rg   rf   r+   r   r5   r   mathisinfrd   r|   r   r   )	r   ra   r+   rX   projection_columnsri   r   sort_ctxoutputr   )r   r+   rh   r   r5   5  s(   
zPythonExecutor.sortc                 C   s   |j |j }|j |j }| |j}t|jtjr(t	t
|jt
|j|_n6t|jtjr>t	t
|jt
|j|_n t|jtjrW|jrWt	t
|jt
|j|_n|j|j |_t|jsm|jd|j |_| |j|iS )Nr   )r   r   r   r   rb   
issubclassopr   	Intersectr   r(   r|   intersectionExcept
differenceUniondistinctunionr   r   rd   r+   r   )r   ra   r+   r   r   rh   r   r   r   r7   N  s   zPythonExecutor.set_operation)NN)__name__
__module____qualname__r   rC   rG   rR   r+   r   r/   r`   rW   r_   r]   r3   r   r   r1   r5   r7   r   r   r   r   r      s$    
,/	Cr   c                 C   sL   |  |d}|jdrdnd}|jdrdnd}d| d| d| dS )	Nr[   descTrueFalsenulls_firstzORDERED(, )rJ   argsr   )r   rI   r[   r   r   r   r   r   _ordered_pyc  s   r   c              
   C   s   zSt |j }t|dkr*|d }t|t s| |j|W S | j|jg|R  W S t|tjrI|j	rIt
jdd |D }| j|jg|R  W S | j|jg|R  W S  tyi } z
tdt| |d }~ww )Nr   r   c                 s   s$    | ]}t |tr|n|gV  qd S r"   )r-   r   )r   xr   r   r   r%   u  s   " z_rename.<locals>.<genexpr>zCould not rename )r   r   r   rc   r-   funcr   r   Funcis_var_len_argsr   chainfrom_iterabler<   repr)r   rB   r   r   exr   r   r   _renamej  s   
r   c                 C   sz   |  |d}|  |dpd}t|jd D ]%}|  |d}|  |d}|r-| d| dn|}| d| d	| d}q|S )
Nr[   defaultNoneifstruez = (r   z if z else ()rJ   reversedr   )r   rI   r[   r   rB   r   rY   r   r   r   	_case_sql}  s   r   rB   returnc                    sL   dd |j D  | fddtj}d| j |dd d| |d	 S )
Nc                 S   s   h | ]}|j  qS r   )r   lower)r   rB   r   r   r   	<setcomp>  s    z_lambda_sql.<locals>.<setcomp>c                    s*   t | tjr| j  v rt| jS | S r"   )r-   r   
Identifierr   r   var)nnamesr   r   r     s   *z_lambda_sql.<locals>.<lambda>zlambda Tflatz: r[   )rQ   	transform	assert_isr   LambdarJ   r   rB   r   r   r   _lambda_sql  s   
"r   r   c                 C   sV   |  |d}|jdr|d7 }d|  |d d| d}|jdr)d	| d}|S )
NrI   safez or NonezDIV(r[   r   r   typedzint(r   )r   rB   denominatorrJ   r   r   r   _div_sql  s   r   c                   @   s0   e Zd ZG dd dejZG dd dejZdS )r   c                   @   s   e Zd ZdgZdS )zPython.Tokenizer\N)r   r   r   STRING_ESCAPESr   r   r   r   	Tokenizer  s    
r   c                   @   sD  e Zd Zi dd eej ejD dd ejD i ejeej	dd ej
eejdd ejeejdd ejdd ejd	d ejd
d ejdd ejeejdd ejdd ejdd ejdd ejdd ejdd ejdd ejdd ejeej dd ej!dd ej"dd ej#e$ej%dd iZ&dS )zPython.Generatorc                 C      i | ]}|t qS r   r   r   klassr   r   r   r      r   zPython.Generator.<dictcomp>c                 C   r   r   r   r   r   r   r   r      r   c                 C   s   |  |jS r"   rJ   r[   r   r   r   r   r         zPython.Generator.<lambda>c                 C      |  |dS )Nandbinaryr   r   r   r   r     r  c                 C   s   |j rdS dS )Nr   r   r[   r   r   r   r   r         c                 C   s    d|  |j d|jd  dS )NzCAST(z, exp.DataType.Type.tor   )rJ   r[   r   r   r   r   r   r     s     c                 C   s&   d|  |dpd  d|  |j dS )Nzscope[r   z][]r  r   r   r   r   r        &c                 C   s$   | j |jdr
dndg|jR  S )Nr   
SAFECONCATCONCAT)r   r   r   rQ   r   r   r   r   r     s
    c                 C   s   d|  |d dS )Nzset(r[   r   rJ   r   r   r   r   r         c                 C   s    d|j   d| |d dS )Nz	EXTRACT('z', rI   r   )r   r   rJ   r   r   r   r   r     s    c                 C   s"   |  |d d| j|dd dS )Nr[   z in {Tr   })rJ   rQ   r   r   r   r   r     s   "c                 C   s"   d|  |j d|  |j dS )Nz	INTERVAL(z, 'z'))rJ   r[   unitr   r   r   r   r     r   c                 C   s&   t |jtjr| |dS | |dS )Nz==is)r-   r[   r   Literalr  r   r   r   r   r     r  c                 C   s   | j |j|j|jg|jR  S r"   )r   r   r[   rI   rQ   r   r   r   r   r     s    c                    s*   dd  fdd|jdd  D  dS )N[,c                 3   rK   r"   r  r   rM   r   r   r%     rN   z,Python.Generator.<lambda>.<locals>.<genexpr>r   r  )r3   rQ   r   r   rM   r   r     s   * c                 C   s   d|  |j dS N'r  r   r   r   r   r     r  c                 C   s   d|j  dS r  r  r   r   r   r   r     r	  c                 C   s   d|  |j S )Nznot r  r   r   r   r   r     r   c                  G      dS )Nr   r   r   r   r   r   r         c                 C   r  )Norr  r   r   r   r   r     r  c                  G   r  )N1r   r  r   r   r   r     r  N)'r   r   r   r   r   BinaryALL_FUNCTIONSCaser   AliasArrayr   AndBetweenr   BooleanCastColumnConcatDistinctDivr   ExtractInIntervalIsJSONExtractJSONPathJSONPathKeyJSONPathSubscriptr   r   NotNullOrOrderedr   Star
TRANSFORMSr   r   r   r   	Generator  sb    



	
















r9  N)r   r   r   r   r   r   r9  r   r   r   r   r     s    r   )#rq   r   r   r   sqlglotr   r   r   r   sqlglot.dialects.dialectr   r   sqlglot.errorsr   sqlglot.executor.contextr	   sqlglot.executor.envr
   sqlglot.executor.tabler   r   sqlglot.helperr   r   r   r   r   r   r   rm   r   r9  r*  r   r   r   r   r   r   <module>   s(      V