o
    8Di:                     @  sH   d dl mZ d dlZd dlmZ ejrd dlmZm	Z	 G dd dZ
dS )    )annotationsN)ENV)Table	TableIterc                   @  s   e Zd ZdZd1d2d	d
Zdd Zdd Zed3ddZd4ddZ	ed5ddZ
dd Zd6ddZd7dd Zd7d!d"Zd8d$d%Zd9d(d)Zd:d,d-Zd;d/d0ZdS )<Contextaz  
    Execution context for sql expressions.

    Context is used to hold relevant data tables which can then be queried on with eval.

    References to columns can either be scalar or vectors. When set_row is used, column references
    evaluate to scalars while set_range evaluates to vectors. This allows convenient and efficient
    evaluation of aggregation functions.
    Ntablest.Dict[str, Table]envt.Optional[t.Dict]returnNonec                 C  sV   || _ d| _dd | j  D | _dd | D | _i t|p!i d| ji| _dS )z
        Args
            tables: representing the scope of the current execution context.
            env: dictionary of functions within the execution context.
        Nc                 S     i | ]\}}||j qS  )range_reader.0nametabler   r   Q/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlglot/executor/context.py
<dictcomp>       z$Context.__init__.<locals>.<dictcomp>c                 S  r   r   )readerr   r   r   r   r      r   scope)r   _tableitemsrange_readersrow_readersr   r	   )selfr   r	   r   r   r   __init__   s
    zContext.__init__c                 C  s   t || jS N)evalr	   )r   coder   r   r   r    "   s   zContext.evalc                   s   t  fdd|D S )Nc                 3  s    | ]}  |V  qd S r   )r    )r   r!   r   r   r   	<genexpr>&   s    z%Context.eval_tuple.<locals>.<genexpr>)tuple)r   codesr   r"   r   
eval_tuple%   s   zContext.eval_tupler   c                 C  sh   | j d u r1t| j d | _ | j D ]}| j j|jkr!tdt| j jt|jkr0tdq| j S )Nr   zColumns are different.zRows are different.)r   listr   valuescolumns	Exceptionlenrows)r   otherr   r   r   r   (   s   
zContext.tabler)   strc                 G  s   | j  D ]}|j|  qd S r   )r   r(   add_columns)r   r)   r   r   r   r   r/   5   s   zContext.add_columnst.Tuplec                 C  s   | j jS r   )r   r)   r"   r   r   r   r)   9   s   zContext.columnsc                 c  sJ    | j | jd< tt| jjD ]}| j D ]}|| }q|| fV  qd S Nr   )r   r	   ranger+   r   r,   r   r(   )r   ir   r   r   r   r   __iter__=   s   
zContext.__iter__r   r   c                 C  s   | j | jd< t| j| S r1   )r   r	   iterr   r   r   r   r   r   
table_iterD   s   zContext.table_iterc                   s.    fddD }j  D ]}||_qd S )Nc                   s    g | ]\}}  r|jqS r   )r    row)r   r   _	conditionr   r   r   
<listcomp>I   s     z"Context.filter.<locals>.<listcomp>)r   r(   r,   )r   r;   r,   r   r   r:   r   filterH   s   zContext.filterc                   s$   d fdd}j jj|d d S )Nr8   r0   r   c                   s"    |  tdd  D S )Nc                 s  s    | ]	}|d u |fV  qd S r   r   )r   tr   r   r   r#   Q   s    z1Context.sort.<locals>.sort_key.<locals>.<genexpr>)set_rowr$   r&   )r8   keyr   r   r   sort_keyO   s   
zContext.sort.<locals>.sort_key)rA   )r8   r0   r   r0   )r   r,   sort)r   rA   rB   r   r@   r   rC   N   s   zContext.sortr8   c                 C  s(   | j  D ]}||j_q| j| jd< d S r1   )r   r(   r   r8   r   r	   )r   r8   r   r   r   r   r?   U      
zContext.set_rowindexintc                 C  s(   | j  D ]}||  q| j| jd< d S r1   )r   r(   r   r	   )r   rE   r   r   r   r   	set_indexZ   rD   zContext.set_indexstartendc                 C  s.   | j D ]}t||| j| _q| j| jd< d S r1   )r   r2   r   r	   )r   rH   rI   r   r   r   r   	set_range_   s   
zContext.set_rangeboolc                 C  s
   || j v S r   )r   r6   r   r   r   __contains__d   s   
zContext.__contains__r   )r   r   r	   r
   r   r   )r   r   )r)   r.   r   r   )r   r0   )r   r.   r   r   )r   r   )r8   r0   r   r   )rE   rF   r   r   )rH   rF   rI   rF   r   r   )r   r.   r   rK   )__name__
__module____qualname____doc__r   r    r&   propertyr   r/   r)   r4   r7   r=   rC   r?   rG   rJ   rL   r   r   r   r   r      s$    







r   )
__future__r   typingr>   sqlglot.executor.envr   TYPE_CHECKINGsqlglot.executor.tabler   r   r   r   r   r   r   <module>   s    