o
    5c-M                     @  s  d Z ddlmZ ddl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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ryddl*m+Z+ G dd dej,Z-G dd dej.Z.G dd de.Z/G dd dej0Z0G dd de0Z1G dd de1Z2G dd de0Z3G d d! d!e3Z4G d"d# d#ej5Z5G d$d% d%e Z6d&d' Z7G d(d) d)ej8Z9G d*d+ d+Z:d0d.d/Z;dS )1z1 manage PyTables query interface via Expressions     )annotationsN)partial)TYPE_CHECKINGAny)	Timedelta	Timestamp)npt)UndefinedVariableError)is_list_like)expropsscope)ensure_decoded)BaseExprVisitor)is_term)extract_array)Index)pprint_thingpprint_thing_encoded)DeepChainMapc                      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__ V/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/computation/pytables.pyr"   0   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namer/   sideencodingklassr&   r&   r'   r5   >   s   

zTerm.__new__r   r   c                   s   t  j||||d d S N)r8   r9   )r!   r"   )r#   r7   r/   r8   r9   r$   r&   r'   r"   E      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)r8   r7   r/   r   	NameErrorreprresolver	   r#   r&   r&   r'   _resolve_nameH   s   

zTerm._resolve_namec                 C     | j S r0   )_valuerB   r&   r&   r'   valueW      z
Term.valueNNr/   r   r   r   )
r(   r)   r*   r,   r5   r"   rC   propertyrF   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 )r3   Nr/   r   r   r   c                   s.   t |tsJ t|t j||||d d S r;   )r1   r   typer!   r"   )r#   rF   r/   r8   r9   r$   r&   r'   r"   ]   s   zConstant.__init__c                 C  rD   r0   )_namerB   r&   r&   r'   rC   a   s   zConstant._resolve_namerH   rI   )r(   r)   r*   r"   rC   r-   r&   r&   r$   r'   r3   \   s    r3   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 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# Z  ZS )(BinOp   r2   opr   r   z
str | None	conditionr   r   c                   s&   t  ||| || _|| _d | _d S r0   )r!   r"   r   r9   rP   )r#   rO   lhsrhsr   r9   r$   r&   r'   r"   m   s   
zBinOp.__init__c                 C     d S r0   r&   rB   r&   r&   r'   _disallow_scalar_only_bool_opss      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   r9   )	r1   ConditionBinOpJointConditionBinOpFilterBinOpJointFilterBinOprO   r   r9   evaluate)r=   rightkr:   r#   r&   r'   prw   s2   







zBinOp.prune.<locals>.pr)rQ   rR   r   rF   prune)r#   r:   r^   r=   r[   resr&   r]   r'   r_   v   s   zBinOp.prunec                 C  s&   t |s|g}t|tjr| }|S )zinplace conform rhs)r
   r1   npndarrayravel)r#   rR   r&   r&   r'   conform   s
   zBinOp.conformboolc                 C  s   | j | jv S )z$return True if this is a valid field)rQ   r   rB   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   getrQ   rB   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   rg   rQ   rB   r&   r&   r'   rj         z
BinOp.kindc                 C  ri   )zthe meta of my fieldmetaNrk   rB   r&   r&   r'   rn      rm   z
BinOp.metac                 C  ri   )zthe metadata of my fieldmetadataNrk   rB   r&   r&   r'   ro      rm   zBinOp.metadatac                 C  s(   | | j}d| j d| j d| dS )z2create and return the op string for this TermValue( ))tostringr9   rQ   rO   )r#   vvalr&   r&   r'   generate   s   zBinOp.generate	TermValuec                   s   fdd}t  j}t  j}|dks|dkr<t|ttfr#||}t |}t|}|jdur5|d}t	||j
|S |dksD|dkr^t|trOt|j
}nt|d	d
j
}t	t|||S |dkr}t jdd}||vrpd}n|j|dd}t	||dS |dkrtt|}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)r9   )r9   r   r   )rF   rB   r&   r'   	stringify   s   
z&BinOp.convert_value.<locals>.stringify
datetime64datetimeNUTCtimedelta64	timedeltas)unitcategoryT)extract_numpyr=   )r8   integerfloatre   )	falsefnonnone0z[]z{} stringzCannot compare z	 of type z to z column)r   rj   rn   r1   r   r   r   tz
tz_convertrw   rF   r2   r   r   ro   searchsortedstriplowerre   	TypeErrorrK   )r#   rt   rx   rj   rn   ro   resultr&   rB   r'   convert_value   sH   






 zBinOp.convert_valuec                 C  rS   r0   r&   rB   r&   r&   r'   convert_values  rU   zBinOp.convert_values)rO   r2   r   r   r   r   r   re   r   r2   )r   rw   )r(   r)   r*   _max_selectorsr,   r"   rT   r_   rd   rJ   rf   rh   rj   rn   ro   rv   r   r   r-   r&   r&   r$   r'   rM   e   s,   
 *




?rM   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 )rX   Nztuple[Any, Any, Index] | Nonefilterr   r2   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   rB   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_oprB   r&   r&   r'   r     s   

zFilterBinOp.invertc                 C  s   | j gS )zreturn the actual filter format)r   rB   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 [)rf   
ValueErrorrd   rR   listrh   rO   lenr   r   rQ   r   r   r   )r#   rR   values	filter_opr&   r&   r'   rZ   "  s"   

zFilterBinOp.evaluateFr   re   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 r0   isinaxisvalsr&   r&   r'   <lambda>D  s    z0FilterBinOp.generate_filter_op.<locals>.<lambda>c                 S  s
   |  |S r0   r   r   r&   r&   r'   r   F  s   
 )rO   )r#   r   r&   r&   r'   r   B  s   zFilterBinOp.generate_filter_opr   )F)r   re   )
r(   r)   r*   r   r,   r   r   r   rZ   r   r&   r&   r&   r'   rX     s   
 

 rX   c                   @  s   e Zd Zdd Zdd ZdS )rY   c                 C     t d)Nz unable to collapse Joint FiltersNotImplementedErrorrB   r&   r&   r'   r   J  s   zJointFilterBinOp.formatc                 C  s   | S r0   r&   rB   r&   r&   r'   rZ   M  rU   zJointFilterBinOp.evaluateN)r(   r)   r*   r   rZ   r&   r&   r&   r'   rY   I  s    rY   c                   @  s.   e Zd ZdddZdd Zdd Zd	d
 ZdS )rV   r   r2   c                 C  s   t d| j dS )Nz[Condition : [z]])r   rP   rB   r&   r&   r'   r   R  s   zConditionBinOp.__repr__c                 C  r   )zinvert the conditionz6cannot use an invert condition when passing to numexprr   rB   r&   r&   r'   r   U  s   zConditionBinOp.invertc                 C  rD   )zreturn the actual ne format)rP   rB   r&   r&   r'   r   ^  rG   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   .0rt   rB   r&   r'   
<listcomp>l      z+ConditionBinOp.evaluate.<locals>.<listcomp>r   c                   r   r&   )rv   r   rB   r&   r'   r   s  r   rp   z | rr   r   )rf   r   rh   rd   rR   rO   r   r   joinrP   rv   )r#   rR   r   vsr&   rB   r'   rZ   b  s   
zConditionBinOp.evaluateNr   )r(   r)   r*   r   r   r   rZ   r&   r&   r&   r'   rV   Q  s
    
	rV   c                   @     e Zd Zdd ZdS )rW   c                 C  s(   d| j j d| j d| jj d| _| S )Nrp   rq   rr   )rQ   rP   rO   rR   rB   r&   r&   r'   rZ     s   $zJointConditionBinOp.evaluateN)r(   r)   r*   rZ   r&   r&   r&   r'   rW         rW   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)
rO   r   operandr_   
issubclassrV   rP   rX   r   r   )r#   r:   r   r&   r&   r'   r_     s"   

zUnaryOp.pruneN)r(   r)   r*   r_   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 r0   )r   rM   )nodebin_opkwargsr&   r'   r     s    z.PyTablesExprVisitor.__init__.<locals>.<lambda>)r!   r"   
binary_opsbinary_op_nodes_mapsetattr)r#   r/   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)r1   rO   astNotInvertr   visitr   USub
const_typerF   r/   UAddr   r#   r   r   r&   r&   r'   visit_UnaryOp  s   z!PyTablesExprVisitor.visit_UnaryOpc                 K  s   |  |jjS r0   )r   rF   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targetsrF   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   rF   sliceAttributeErrorr1   r.   r   r/   r   r   r@   )r#   r   r   rF   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 )attrrF   rK   ctxr   Loadr   r   	term_typerl   r/   r1   Nameidr   r(   )r#   r   r   r   rF   r   resolvedr&   r&   r'   visit_Attribute  s$   



z#PyTablesExprVisitor.visit_Attributec                 C  s   t |tjr
t S |S r0   )r1   r   Inr   )r#   rO   r&   r&   r'   translate_In  r<   z PyTablesExprVisitor.translate_Inc                 C  s   |  |j|j||fS r0   )r   rO   )r#   r   r=   r[   r&   r&   r'   _rewrite_membership_op  s   z*PyTablesExprVisitor._rewrite_membership_op)r   r   )r(   r)   r*   r3   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)r1   PyTablesExprr2   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   r/   r2   r   Nr   r   r   scope_levelr   r   r   c           	      C  s  t |}|| _d | _d | _d | _d | _d }t|tr"|jj	}|j
}n3t|rSt|}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 )rp   rr   r&   )r   r   r&   r&   r'   r   G  s    z)PyTablesExpr.__init__.<locals>.<listcomp>r   )r    pytables)r   r   r   r9   )r   r9   rP   r   termsr   r1   r   r/   r   r   r
   r   	enumerater   comflattenr   r2   r   updater   parse)	r#   wherer   r9   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 r0   )r   r   r   rB   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   r_   rV   rP   r   r   r   rX   r   )r#   r   r&   r&   r'   rZ   _  s*   zPyTablesExpr.evaluate)NNr   )r   r   r   r   r   r   r   )r(   r)   r*   __doc__r,   r"   r   rZ   r&   r&   r&   r'   r     s   
 
2r   c                   @  s$   e Zd ZdZdddZddd	Zd
S )rw   z<hold a term value the we use to construct a condition/filterrj   r2   r   r   c                 C  s(   t |ts	J ||| _|| _|| _d S r0   )r1   r2   rF   	convertedrj   )r#   rF   r   rj   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   )rj   r2   r   r@   )r#   r9   r&   r&   r'   rs   |  s   




zTermValue.tostringN)rj   r2   r   r   r   )r(   r)   r*   r   r"   rs   r&   r&   r&   r'   rw   s  s    
rw   r   re   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 r0   r&   )r   rO   r~   r&   r'   	<genexpr>  s    z#maybe_expression.<locals>.<genexpr>)r1   r2   r   r   	unary_opsany)r~   r   r&   r   r'   maybe_expression  s   
r  r   )<r   
__future__r   r   	functoolsr   typingr   r   numpyra   pandas._libs.tslibsr   r   pandas._typingr   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.compat.chainmapr   Scoper   r.   r3   rM   rX   rY   rV   rW   r   r   r   Exprr   rw   r  r&   r&   r&   r'   <module>   sF    !	 (=.Tk