o
    ҷh^N                     @  s  d Z ddlm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ZddlmZmZ ddlmZ dd	lmZ ddlm  mZ dd
lmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* e
r{ddl+m,Z, G dd dej-Z.G dd dej/Z/G dd de/Z0G dd dej1Z1G dd de1Z2G dd de2Z3G dd de1Z4G d d! d!e4Z5G d"d# d#ej6Z6G d$d% d%e!Z7d&d' Z8G d(d) d)ej9Z:G d*d+ d+Z;d0d.d/Z<dS )1z1 manage PyTables query interface via Expressions     )annotationsN)DecimalInvalidOperation)partial)TYPE_CHECKINGAny)	Timedelta	Timestamp)UndefinedVariableError)is_list_like)expropsscope)ensure_decoded)BaseExprVisitor)is_term)extract_array)Index)pprint_thingpprint_thing_encoded)nptc                      s4   e Zd ZU dZded< 			dd fd
dZ  ZS )PyTablesScope)
queryablesdict[str, Any]r   Nlevelintdict[str, Any] | NonereturnNonec                   s$   t  j|d ||d |pi | _d S )N   )global_dict
local_dict)super__init__r   )selfr   r    r!   r   	__class__ S/var/www/html/venv/lib/python3.10/site-packages/pandas/core/computation/pytables.pyr#   3   s   zPyTablesScope.__init__)NNN)r   r   r   r   r   r   )__name__
__module____qualname__	__slots____annotations__r#   __classcell__r'   r'   r%   r(   r   .   s   
 r   c                      sH   e Zd ZU ded< dddZdd fdd	Zd
d Zedd Z  Z	S )Termr   envNc                 C  s   t |tr| }nt}t|S N)
isinstancestrConstantobject__new__)clsnamer0   sideencodingklassr'   r'   r(   r6   A   s   

zTerm.__new__r   r   c                   s   t  j||||d d S N)r9   r:   )r"   r#   r$   r8   r0   r9   r:   r%   r'   r(   r#   H      zTerm.__init__c                 C  sb   | j dkr| j| jjvrtdt| j d| jS z
| jj| jddW S  ty0   | j Y S w )Nleftzname z is not definedF)is_local)r9   r8   r0   r   	NameErrorreprresolver
   r$   r'   r'   r(   _resolve_nameK   s   

zTerm._resolve_namec                 C     | j S r1   )_valuerD   r'   r'   r(   valueZ      z
Term.valueNNr0   r   r   r   )
r)   r*   r+   r-   r6   r#   rE   propertyrH   r.   r'   r'   r%   r(   r/   >   s   
 
r/   c                      s(   e Zd Zd
d fddZdd	 Z  ZS )r4   Nr0   r   r   r   c                   s.   t |tsJ t|t j||||d d S r<   )r2   r   typer"   r#   r=   r%   r'   r(   r#   `   s   zConstant.__init__c                 C  rF   r1   )_namerD   r'   r'   r(   rE   d   s   zConstant._resolve_namerJ   rK   )r)   r*   r+   r#   rE   r.   r'   r'   r%   r(   r4   _   s    r4   c                      s   e Zd ZU dZded< ded< ded< d$ fd
dZd%ddZdd Zdd Ze	d&ddZ
e	d&ddZe	dd Ze	dd Ze	dd Zd'ddZd(d d!Zd%d"d#Z  ZS ))BinOp   r3   opr   r   z
str | None	conditionr   r   c                   s&   t  ||| || _|| _d | _d S r1   )r"   r#   r   r:   rR   )r$   rQ   lhsrhsr   r:   r%   r'   r(   r#   o   s   
zBinOp.__init__c                 C     d S r1   r'   rD   r'   r'   r(   _disallow_scalar_only_bool_opsu      z$BinOp._disallow_scalar_only_bool_opsc                   s    fdd}j j}}t|rt|r||j|j}|S t|s2t|r2|| |j}|S t|rEt|sE||j| }|S t|sXt|sX|| | }|S )Nc                   s   | du r|S |du r| S  }t | tr*t |trt}n*t | |r"| S t ||r)|S nt | trEt |tr7t}nt | |r>| S t ||rE|S |j| |jjd S )z5create and return a new specialized BinOp from myselfN)r   r:   )	r2   ConditionBinOpJointConditionBinOpFilterBinOpJointFilterBinOprQ   r   r:   evaluate)r?   rightkr;   r$   r'   r(   pry   s2   







zBinOp.prune.<locals>.pr)rS   rT   r   rH   prune)r$   r;   r`   r?   r]   resr'   r_   r(   ra   x   s   zBinOp.prunec                 C  s&   t |s|g}t|tjr| }|S )zinplace conform rhs)r   r2   npndarrayravel)r$   rT   r'   r'   r(   conform   s
   zBinOp.conformboolc                 C  s   | j | jv S )z$return True if this is a valid field)rS   r   rD   r'   r'   r(   is_valid   s   zBinOp.is_validc                 C  s   | j | jduS )zx
        return True if this is a valid column name for generation (e.g. an
        actual column in the table)
        N)r   getrS   rD   r'   r'   r(   is_in_table   s   zBinOp.is_in_tablec                 C     t | j| jddS )zthe kind of my fieldkindNgetattrr   ri   rS   rD   r'   r'   r(   rl         z
BinOp.kindc                 C  rk   )zthe meta of my fieldmetaNrm   rD   r'   r'   r(   rp      ro   z
BinOp.metac                 C  rk   )zthe metadata of my fieldmetadataNrm   rD   r'   r'   r(   rq      ro   zBinOp.metadatac                 C  s(   | | j}d| j d| j d| dS )z2create and return the op string for this TermValue( ))tostringr:   rS   rQ   )r$   vvalr'   r'   r(   generate   s   zBinOp.generate	TermValuec                   s   fdd}t  j}t  j}|dv r;t|ttfr||}t |}t|d}|jdur4|	d}t
||j|S |dv r]t|trIt|}nt|dd	}|dj}t
t|||S |d
kr|t jdd}||vrod}n|j|dd}t
||dS |dkrzt|}W n ty   t| Y n	w t|jdd}t
|||S |dkrt|}t
|||S |dkrt|tr|  dv}nt|}t
|||S t|trt
|||dS td| dt| d| d)zn
        convert the expression that is in the term to something that is
        accepted by pytables
        c                   s     j d urt|  j dS t| S )N)r:   )r:   r   r   )rH   rD   r'   r(   	stringify   s   
z&BinOp.convert_value.<locals>.stringify)
datetime64datetimensNUTC)timedelta64	timedeltas)unitcategoryT)extract_numpyr?   )r9   integerROUND_HALF_EVEN)roundingfloatrg   )	falsefnonnone0z[]z{} stringzCannot compare z	 of type z to z column)r   rl   rp   r2   r   r   r	   as_unittz
tz_convertry   rG   r3   r   r   rq   searchsortedr   r   to_integral_exactstriplowerrg   	TypeErrorrM   )r$   rv   rz   rl   rp   rq   resultv_decr'   rD   r(   convert_value   sT   







 zBinOp.convert_valuec                 C  rU   r1   r'   rD   r'   r'   r(   convert_values  rW   zBinOp.convert_values)rQ   r3   r   r   r   r   r   r   r   rg   r   r3   )r   ry   )r)   r*   r+   _max_selectorsr-   r#   rV   ra   rf   rL   rh   rj   rl   rp   rq   rx   r   r   r.   r'   r'   r%   r(   rO   h   s,   
 
*




GrO   c                   @  sH   e Zd ZU dZded< dddZdd	 Zd
d Zdd ZddddZ	dS )rZ   Nztuple[Any, Any, Index] | Nonefilterr   r3   c                 C  s0   | j d u rdS td| j d  d| j d  dS )NzFilter: Not Initializedz[Filter : [r   z] -> [r   ])r   r   rD   r'   r'   r(   __repr__  s   
"zFilterBinOp.__repr__c                 C  s.   | j dur| j d | jdd| j d f| _ | S )zinvert the filterNr   T)invert   )r   generate_filter_oprD   r'   r'   r(   r     s   

zFilterBinOp.invertc                 C  s   | j gS )zreturn the actual filter format)r   rD   r'   r'   r(   format(  s   zFilterBinOp.formatc                 C  s   | j std|  d| | j}t|}| jr5| jdv r3t|| jkr3| 	 }| j
|t|f| _| S d S | jdv rI| 	 }| j
|t|f| _| S td|  d)Nquery term is not valid [r   ==!=z7passing a filterable condition to a non-table indexer [)rh   
ValueErrorrf   rT   listrj   rQ   lenr   r   rS   r   r   r   )r$   rT   values	filter_opr'   r'   r(   r\   ,  s"   

zFilterBinOp.evaluateFr   rg   c                 C  s,   | j dkr|r| j dkr|rdd S dd S )Nr   r   c                 S  s   |  | S r1   isinaxisvalsr'   r'   r(   <lambda>J  s    z0FilterBinOp.generate_filter_op.<locals>.<lambda>c                 S  s
   |  |S r1   r   r   r'   r'   r(   r   L  s   
 )rQ   )r$   r   r'   r'   r(   r   H  s   zFilterBinOp.generate_filter_opr   )F)r   rg   )
r)   r*   r+   r   r-   r   r   r   r\   r   r'   r'   r'   r(   rZ     s   
 

rZ   c                   @  s   e Zd Zdd Zdd ZdS )r[   c                 C     t d)Nz unable to collapse Joint FiltersNotImplementedErrorrD   r'   r'   r(   r   P  s   zJointFilterBinOp.formatc                 C  s   | S r1   r'   rD   r'   r'   r(   r\   S  rW   zJointFilterBinOp.evaluateN)r)   r*   r+   r   r\   r'   r'   r'   r(   r[   O  s    r[   c                   @  s.   e Zd ZdddZdd Zdd Zd	d
 ZdS )rX   r   r3   c                 C  s   t d| j dS )Nz[Condition : [z]])r   rR   rD   r'   r'   r(   r   X  s   zConditionBinOp.__repr__c                 C  r   )zinvert the conditionz6cannot use an invert condition when passing to numexprr   rD   r'   r'   r(   r   [  s   zConditionBinOp.invertc                 C  rF   )zreturn the actual ne format)rR   rD   r'   r'   r(   r   d  rI   zConditionBinOp.formatc                   s    j std  d jsd S   j} fdd|D } jdv rBt| jkr@ fdd|D }dd| d	 _	 S d S  
|d
  _	 S )Nr   r   c                      g | ]}  |qS r'   )r   .0rv   rD   r'   r(   
<listcomp>q      z+ConditionBinOp.evaluate.<locals>.<listcomp>r   c                   r   r'   )rx   r   rD   r'   r(   r   w  r   rr   z | rt   r   )rh   r   rj   rf   rT   rQ   r   r   joinrR   rx   )r$   rT   r   vsr'   rD   r(   r\   h  s   
zConditionBinOp.evaluateNr   )r)   r*   r+   r   r   r   r\   r'   r'   r'   r(   rX   W  s
    
	rX   c                   @     e Zd Zdd ZdS )rY   c                 C  s(   d| j j d| j d| jj d| _| S )Nrr   rs   rt   )rS   rR   rQ   rT   rD   r'   r'   r(   r\     s   $zJointConditionBinOp.evaluateN)r)   r*   r+   r\   r'   r'   r'   r(   rY         rY   c                   @  r   )UnaryOpc                 C  sh   | j dkr	td| j}||}|d ur2t|tr|jd us.t|ts2t|tr2|jd ur2|	 S d S )N~z$UnaryOp only support invert type ops)
rQ   r   operandra   
issubclassrX   rR   rZ   r   r   )r$   r;   r   r'   r'   r(   ra     s   



zUnaryOp.pruneN)r)   r*   r+   ra   r'   r'   r'   r(   r     r   r   c                      s^   e Zd ZeZeZd fddZdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Z  ZS )PyTablesExprVisitorr   r   c                   sH   t  ||| | jD ]}| j| }t| d| |f fdd	 qd S )Nvisit_c                   s   t t|fi  S r1   )r   rO   )nodebin_opkwargsr'   r(   r     s    z.PyTablesExprVisitor.__init__.<locals>.<lambda>)r"   r#   
binary_opsbinary_op_nodes_mapsetattr)r$   r0   engineparserr   r   bin_noder%   r   r(   r#     s   

zPyTablesExprVisitor.__init__c                 K  sh   t |jtjtjfrtd| |jS t |jtjr'| 	| |jj
 | jS t |jtjr2tdd S )Nr   zUnary addition not supported)r2   rQ   astNotInvertr   visitr   USub
const_typerH   r0   UAddr   r$   r   r   r'   r'   r(   visit_UnaryOp  s   z!PyTablesExprVisitor.visit_UnaryOpc                 K  s   |  |jjS r1   )r   rH   r   r'   r'   r(   visit_Index  s   zPyTablesExprVisitor.visit_Indexc                 K  s*   t jt  g|jd |jgd}| |S )Nr   )r   r?   comparators)r   CompareEqtargetsrH   r   )r$   r   r   cmprr'   r'   r(   visit_Assign  s   
z PyTablesExprVisitor.visit_Assignc              
   K  s   |  |j}|  |j}z|j}W n	 ty   Y nw t|tr#|j}z
| || | jW S  tyH } zt	dt
| dt
| |d }~ww )Nzcannot subscript z with )r   rH   sliceAttributeErrorr2   r/   r   r0   r   r   rB   )r$   r   r   rH   slobjerrr'   r'   r(   visit_Subscript  s&   

z#PyTablesExprVisitor.visit_Subscriptc                 K  s   |j }|j}t|j}|tjkrH| |}z|j}W n	 ty#   Y nw z| t	||| j
W S  tyG   t|tjrE|j|krE| Y S Y nw td|j )NzInvalid Attribute context )attrrH   rM   ctxr   Loadr   r   	term_typern   r0   r2   Nameidr   r)   )r$   r   r   r   rH   r   resolvedr'   r'   r(   visit_Attribute  s$   



z#PyTablesExprVisitor.visit_Attributec                 C  s   t |tjr
t S |S r1   )r2   r   Inr   )r$   rQ   r'   r'   r(   translate_In  r>   z PyTablesExprVisitor.translate_Inc                 C  s   |  |j|j||fS r1   )r   rQ   )r$   r   r?   r]   r'   r'   r(   _rewrite_membership_op  s   z*PyTablesExprVisitor._rewrite_membership_opr   )r)   r*   r+   r4   r   r/   r   r#   r   r   r   r   r   r   r   r.   r'   r'   r%   r(   r     s    
r   c                 C  s"   t | ttfst| std| S )a  
    Validate that the where statement is of the right type.

    The type may either be String, Expr, or list-like of Exprs.

    Parameters
    ----------
    w : String term expression, Expr, or list-like of Exprs.

    Returns
    -------
    where : The original where clause if the check was successful.

    Raises
    ------
    TypeError : An invalid data type was passed in for w (e.g. dict).
    zLwhere must be passed as a string, PyTablesExpr, or list-like of PyTablesExpr)r2   PyTablesExprr3   r   r   )wr'   r'   r(   _validate_where  s
   r   c                   @  sN   e Zd ZU dZded< ded< ded< 				ddddZdddZdd ZdS )r   a  
    Hold a pytables-like expression, comprised of possibly multiple 'terms'.

    Parameters
    ----------
    where : string term expression, PyTablesExpr, or list-like of PyTablesExprs
    queryables : a "kinds" map (dict of column name -> kind), or None if column
        is non-indexable
    encoding : an encoding that will encode the query terms

    Returns
    -------
    a PyTablesExpr object

    Examples
    --------
    'index>=date'
    "columns=['A', 'D']"
    'columns=A'
    'columns==A'
    "~(columns=['A','B'])"
    'index>df.index[3] & string="bar"'
    '(index>df.index[3] & index<=df.index[6]) | string="bar"'
    "ts>=Timestamp('2012-02-01')"
    "major_axis>=20130101"
    zPyTablesExprVisitor | None_visitorr   r0   r3   r   Nr   r   r   scope_levelr   r   r   c           	      C  s  t |}|| _d | _d | _d | _d | _d }t|tr"|jj	}|j
}n1t|rQt|}t|D ]\}}t|tr<|jj	}q.t |||< q.ddd t|D }n|}|| _
t|d |d| _|d urt| j
tr| jj| t| j|dd|d| _|  | _d S d S d S )Nz & c                 S  s   g | ]}d | dqS )rr   rt   r'   )r   r   r'   r'   r(   r   G  s    z)PyTablesExpr.__init__.<locals>.<listcomp>r   )r!   pytables)r   r   r   r:   )r   r:   rR   r   termsr   r2   r   r0   r   r   r   r   	enumerater   comflattenr   r3   r   updater   parse)	r$   wherer   r:   r   r!   _whereidxr   r'   r'   r(   r#   *  s>   


zPyTablesExpr.__init__c                 C  s   | j d ur
t| j S t| jS r1   )r   r   r   rD   r'   r'   r(   r   Z  s   


zPyTablesExpr.__repr__c              
   C  s   z	| j t| _W n ty" } ztd| j d|  d|d}~ww z	| j t| _W n tyE } ztd| j d|  d|d}~ww | j| jfS )z2create and return the numexpr condition and filterzcannot process expression [z], [z] is not a valid conditionNz] is not a valid filter)	r   ra   rX   rR   r   r   r   rZ   r   )r$   r   r'   r'   r(   r\   _  s*   zPyTablesExpr.evaluate)NNr   )r   r   r   r   r   r   r   )r)   r*   r+   __doc__r-   r#   r   r\   r'   r'   r'   r(   r   
  s   
 
0r   c                   @  s$   e Zd ZdZdddZddd	Zd
S )ry   z<hold a term value the we use to construct a condition/filterrl   r3   r   r   c                 C  s(   t |ts	J ||| _|| _|| _d S r1   )r2   r3   rH   	convertedrl   )r$   rH   r  rl   r'   r'   r(   r#   v  s   
zTermValue.__init__c                 C  sH   | j dkr|durt| jS d| j dS | j dkrt| jS t| jS )z6quote the string if not encoded else encode and returnr   N"r   )rl   r3   r  rB   )r$   r:   r'   r'   r(   ru   |  s   




zTermValue.tostringN)rl   r3   r   r   r   )r)   r*   r+   r  r#   ru   r'   r'   r'   r(   ry   s  s    
ry   r   rg   c                   s4   t  tsdS tjtj d }t fdd|D S )z7loose checking if s is a pytables-acceptable expressionF)=c                 3  s    | ]}| v V  qd S r1   r'   )r   rQ   r   r'   r(   	<genexpr>  s    z#maybe_expression.<locals>.<genexpr>)r2   r3   r   r   	unary_opsany)r   
operationsr'   r  r(   maybe_expression  s   
r  r   )=r  
__future__r   r   decimalr   r   	functoolsr   typingr   r   numpyrc   pandas._libs.tslibsr   r	   pandas.errorsr
   pandas.core.dtypes.commonr   pandas.core.commoncorecommonr   pandas.core.computationr   r   r   _scopepandas.core.computation.commonr   pandas.core.computation.exprr   pandas.core.computation.opsr   pandas.core.constructionr   pandas.core.indexes.baser   pandas.io.formats.printingr   r   pandas._typingr   Scoper   r/   r4   rO   rZ   r[   rX   rY   r   r   r   Exprr   ry   r  r'   r'   r'   r(   <module>   sF    !	 /9,Si