a
    Of	Q                     @  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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
rddl,m-Z-m.Z. G dd dej/Z0G dd dej1Z1G dd de1Z2G dd dej3Z3G dd de3Z4G dd de4Z5G dd de3Z6G d d! d!e6Z7G d"d# d#ej8Z8G d$d% d%e"Z9d&d' Z:G d(d) d)ej;Z<G d*d+ d+Z=d,d-d.d/Z>dS )0z1 manage PyTables query interface via Expressions     )annotationsN)DecimalInvalidOperation)partial)TYPE_CHECKINGAnyClassVar)	Timedelta	Timestamp)UndefinedVariableError)is_list_like)expropsscope)ensure_decoded)BaseExprVisitor)is_term)extract_array)Index)pprint_thingpprint_thing_encoded)Selfnptc                      s6   e Zd ZU dZded< ddddd fd	d
Z  ZS )PyTablesScope)
queryablesdict[str, Any]r   Nintdict[str, Any] | NoneNone)levelr   returnc                   s$   t  j|d ||d |pi | _d S )N   )global_dict
local_dict)super__init__r   )selfr   r"   r#   r   	__class__ Y/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/core/computation/pytables.pyr%   7   s    zPyTablesScope.__init__)NNN)__name__
__module____qualname__	__slots____annotations__r%   __classcell__r)   r)   r'   r*   r   2   s   
   r   c                      sN   e Zd ZU ded< dddZdd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namer2   sideencodingklassr)   r)   r*   r8   E   s    
zTerm.__new__r   r2   r    c                   s   t  j||||d d S N)r;   r<   )r$   r%   r&   r:   r2   r;   r<   r'   r)   r*   r%   L   s    zTerm.__init__c                 C  sf   | j dkr4| j| jjvr.tdt| j d| jS z| jj| jddW S  ty`   | j Y S 0 d S )Nleftzname z is not definedF)is_local)r;   r:   r2   r   	NameErrorreprresolver   r&   r)   r)   r*   _resolve_nameO   s    
zTerm._resolve_namec                 C  s   | j S r3   )_valuerF   r)   r)   r*   value^   s    z
Term.value)NN)NN)
r+   r,   r-   r/   r8   r%   rG   propertyrI   r0   r)   r)   r'   r*   r1   B   s   

r1   c                      s.   e Zd Zd	ddd fddZdd Z  ZS )
r6   Nr   r   r>   c                   s.   t |tsJ t|t j||||d d S r?   )r4   r   typer$   r%   r@   r'   r)   r*   r%   d   s    zConstant.__init__c                 C  s   | j S r3   )_namerF   r)   r)   r*   rG   h   s    zConstant._resolve_name)NN)r+   r,   r-   r%   rG   r0   r)   r)   r'   r*   r6   c   s   r6   c                      s   e Zd ZU dZded< ded< ded< dddd	 fd
dZddddZdd Zdd Ze	ddddZ
e	ddddZe	dd Ze	dd Ze	dd ZddddZd dd!d"Zddd#d$Z  ZS )%BinOp   r5   opr   r   z
str | None	conditionr   )rO   r   r    c                   s&   t  ||| || _|| _d | _d S r3   )r$   r%   r   r<   rP   )r&   rO   lhsrhsr   r<   r'   r)   r*   r%   s   s    zBinOp.__init__r    c                 C  s   d S r3   r)   rF   r)   r)   r*   _disallow_scalar_only_bool_opsy   s    z$BinOp._disallow_scalar_only_bool_opsc                   s    fdd}j j }}t|r<t|r<||j|j}nnt|s`t|r`|| |j}nJt|rt|s||j| }n&t|st|s|| | }|S )Nc                   s   | du r|S |du r| S  }t | trTt |tr6t}qt | |rD| S t ||r|S n6t | trt |trnt}nt | |r|| S t ||r|S |j| |jjd S )z5create and return a new specialized BinOp from myselfN)r   r<   )	r4   ConditionBinOpJointConditionBinOpFilterBinOpJointFilterBinOprO   r   r<   evaluate)rA   rightkr=   r&   r)   r*   pr}   s,    







zBinOp.prune.<locals>.pr)rQ   rR   r   rI   prune)r&   r=   r]   rA   rZ   resr)   r\   r*   r^   |   s    zBinOp.prunec                 C  s&   t |s|g}t|tjr"| }|S )zinplace conform rhs)r   r4   npZndarrayZ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   rF   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   rF   r)   r)   r*   is_in_table   s    zBinOp.is_in_tablec                 C  s   t | j| jddS )zthe kind of my fieldkindNgetattrr   rd   rQ   rF   r)   r)   r*   rf      s    z
BinOp.kindc                 C  s   t | j| jddS )zthe meta of my fieldmetaNrg   rF   r)   r)   r*   ri      s    z
BinOp.metac                 C  s   t | j| jddS )zthe metadata of my fieldmetadataNrg   rF   r)   r)   r*   rj      s    zBinOp.metadatac                 C  s(   | | j}d| j d| j d| dS )z2create and return the op string for this TermValue( ))tostringr<   rQ   rO   )r&   vvalr)   r)   r*   generate   s    zBinOp.generate	TermValuec                   s   fdd}t  j}t  j}|dks6|r|drt|ttfrL||}t |}t|d}|j	durv|
d}t||j|S |dv rt|trt|}nt|d	d
}|dj}tt|||S |dkrt jdd}||vrd}n|j|dd}t||dS |dkrXzt|}W n ty:   t| Y n0 t|jdd}t|||S |dkrvt|}t|||S |dkrt|tr|  dv}nt|}t|||S t|trt|||dS td| dt| d| ddS )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   )rI   rF   r)   r*   	stringify   s    
z&BinOp.convert_value.<locals>.stringifydatetimeZ
datetime64nsNUTC)Ztimedelta64	timedeltas)unitcategoryT)Zextract_numpyrA   )r;   integerROUND_HALF_EVEN)roundingfloatrb   )	falsefnonnone0z[]z{} stringzCannot compare z	 of type z to z column)r   rf   ri   
startswithr4   r   r   r
   Zas_unittzZ
tz_convertrr   rH   r5   r	   r   rj   Zsearchsortedr   r   to_integral_exactstriplowerrb   	TypeErrorrK   )r&   ro   rs   rf   ri   rj   resultZv_decr)   rF   r*   convert_value   sR    









zBinOp.convert_valuec                 C  s   d S r3   r)   rF   r)   r)   r*   convert_values  s    zBinOp.convert_values)r+   r,   r-   _max_selectorsr/   r%   rT   r^   ra   rJ   rc   re   rf   ri   rj   rq   r   r   r0   r)   r)   r'   r*   rM   l   s*   
*


GrM   c                   @  s\   e Zd ZU dZded< ddddZddd	d
Zdd ZddddZdddddZ	dS )rW   Nztuple[Any, Any, Index] | Nonefilterr5   rS   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   rF   r)   r)   r*   __repr__  s    
zFilterBinOp.__repr__r   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_oprF   r)   r)   r*   r   "  s    

zFilterBinOp.invertc                 C  s   | j gS )zreturn the actual filter format)r   rF   r)   r)   r*   format,  s    zFilterBinOp.formatSelf | Nonec                 C  s   | j std|  d| | j}t|}| jrj| jdv rft|| jkrf| 	 }| j
|t|f| _| S d S | jdv r| 	 }| j
|t|f| _ntd|  d| S )Nquery term is not valid [r   ==!=z7passing a filterable condition to a non-table indexer [)rc   
ValueErrorra   rR   listre   rO   lenr   r   rQ   r   r   r   )r&   rR   valuesZ	filter_opr)   r)   r*   rY   1  s"    

zFilterBinOp.evaluateFrb   r   c                 C  s0   | j dkr|r| j dkr$|r$dd S dd S d S )Nr   r   c                 S  s   |  | S r3   isinZaxisvalsr)   r)   r*   <lambda>O      z0FilterBinOp.generate_filter_op.<locals>.<lambda>c                 S  s
   |  |S r3   r   r   r)   r)   r*   r   Q  r   )rO   )r&   r   r)   r)   r*   r   M  s    zFilterBinOp.generate_filter_op)F)
r+   r,   r-   r   r/   r   r   r   rY   r   r)   r)   r)   r*   rW     s   

rW   c                   @  s"   e Zd Zdd ZddddZdS )rX   c                 C  s   t dd S )Nz unable to collapse Joint FiltersNotImplementedErrorrF   r)   r)   r*   r   U  s    zJointFilterBinOp.formatr   rS   c                 C  s   | S r3   r)   rF   r)   r)   r*   rY   Y  s    zJointFilterBinOp.evaluateN)r+   r,   r-   r   rY   r)   r)   r)   r*   rX   T  s   rX   c                   @  s8   e Zd ZddddZdd Zdd Zd	dd
dZdS )rU   r5   rS   c                 C  s   t d| j dS )Nz[Condition : [z]])r   rP   rF   r)   r)   r*   r   ^  s    zConditionBinOp.__repr__c                 C  s   t ddS )zinvert the conditionz6cannot use an invert condition when passing to numexprNr   rF   r)   r)   r*   r   a  s    zConditionBinOp.invertc                 C  s   | j S )zreturn the actual ne format)rP   rF   r)   r)   r*   r   j  s    zConditionBinOp.formatr   c                   s    j std  d js d S   j} fdd|D } jdv rt| jkr~ fdd|D }dd| d	 _	qd S n 
|d
  _	 S )Nr   r   c                   s   g | ]}  |qS r)   )r   .0ro   rF   r)   r*   
<listcomp>x  r   z+ConditionBinOp.evaluate.<locals>.<listcomp>r   c                   s   g | ]}  |qS r)   )rq   r   rF   r)   r*   r   ~  r   rk   z | rm   r   )rc   r   re   ra   rR   rO   r   r   joinrP   rq   )r&   rR   r   vsr)   rF   r*   rY   o  s    
zConditionBinOp.evaluateN)r+   r,   r-   r   r   r   rY   r)   r)   r)   r*   rU   ]  s   	rU   c                   @  s   e Zd ZddddZdS )rV   r   rS   c                 C  s(   d| j j d| j d| jj d| _| S )Nrk   rl   rm   )rQ   rP   rO   rR   rF   r)   r)   r*   rY     s    $zJointConditionBinOp.evaluateN)r+   r,   r-   rY   r)   r)   r)   r*   rV     s   rV   c                   @  s   e Zd Zdd ZdS )UnaryOpc                 C  sh   | j dkrtd| j}||}|d urdt|tr>|jd us\t|tsdt|trd|jd urd|	 S d S )N~z$UnaryOp only support invert type ops)
rO   r   operandr^   
issubclassrU   rP   rW   r   r   )r&   r=   r   r)   r)   r*   r^     s"    

zUnaryOp.pruneN)r+   r,   r-   r^   r)   r)   r)   r*   r     s   r   c                      s   e Zd ZU eZded< eZded< dd fddZd	dd
dZ	dd Z
dd ZddddZdd Zdd Zdd Z  ZS )PyTablesExprVisitorzClassVar[type[ops.Term]]
const_typezClassVar[type[Term]]	term_typer   rS   c                   sH   t  ||| | jD ],}| j| }t| d| |f fdd	 qd S )Nvisit_c                   s   t t|fi  S r3   )r   rM   )nodebin_opkwargsr)   r*   r     r   z.PyTablesExprVisitor.__init__.<locals>.<lambda>)r$   r%   
binary_opsZbinary_op_nodes_mapsetattr)r&   r2   engineparserr   r   Zbin_noder'   r   r*   r%     s    

zPyTablesExprVisitor.__init__zops.Term | UnaryOp | Nonec                 K  sh   t |jtjtjfr&td| |jS t |jtjrN| 	| |jj
 | jS t |jtjrdtdd S )Nr   zUnary addition not supported)r4   rO   astNotInvertr   visitr   USubr   rI   r2   UAddr   r&   r   r   r)   r)   r*   visit_UnaryOp  s    z!PyTablesExprVisitor.visit_UnaryOpc                 K  s   |  |jjS r3   )r   rI   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   rA   comparators)r   CompareEqtargetsrI   r   )r&   r   r   Zcmprr)   r)   r*   visit_Assign  s    z PyTablesExprVisitor.visit_Assignzops.Termc              
   K  s   |  |j}|  |j}z
|j}W n ty4   Y n0 t|trF|j}z| || | jW S  ty } z*t	dt
| dt
| |W Y d }~n
d }~0 0 d S )Nzcannot subscript z with )r   rI   sliceAttributeErrorr4   r1   r   r2   r   r   rD   )r&   r   r   rI   Zslobjerrr)   r)   r*   visit_Subscript  s     

z#PyTablesExprVisitor.visit_Subscriptc                 K  s   |j }|j}t|j}|tjkr| |}z
|j}W n tyF   Y n0 z| t	||| j
W S  ty   t|tjr|j|kr| Y S Y n0 td|j d S )NzInvalid Attribute context )attrrI   rK   ctxr   Loadr   r   r   rh   r2   r4   Nameidr   r+   )r&   r   r   r   rI   r   Zresolvedr)   r)   r*   visit_Attribute  s    



z#PyTablesExprVisitor.visit_Attributec                 C  s   t |tjrt S |S r3   )r4   r   Inr   )r&   rO   r)   r)   r*   translate_In  s    z PyTablesExprVisitor.translate_Inc                 C  s   |  |j|j||fS r3   )r   rO   )r&   r   rA   rZ   r)   r)   r*   _rewrite_membership_op  s    z*PyTablesExprVisitor._rewrite_membership_op)r+   r,   r-   r6   r   r/   r1   r   r%   r   r   r   r   r   r   r   r0   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)r4   PyTablesExprr5   r   r   )wr)   r)   r*   _validate_where  s
    r   c                   @  sT   e Zd ZU dZded< ded< ded< dd
dddddZd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   r2   r5   r   Nr   r   r   r   )r   scope_levelr    c           	      C  s  t |}|| _d | _d | _d | _d | _d }t|trD|jj	}|j
}nbt|rt|}t|D ](\}}t|trx|jj	}q\t |||< q\ddd t|D }n|}|| _
t|d |d| _|d urt| j
tr| jj| t| j|dd|d| _|  | _d S )Nz & c                 S  s   g | ]}d | dqS )rk   rm   r)   )r   r   r)   r)   r*   r   Q  r   z)PyTablesExpr.__init__.<locals>.<listcomp>r!   )r#   Zpytables)r   r   r   r<   )r   r<   rP   r   termsr   r4   r   r2   r   r   r   r   	enumerater   comflattenr   r5   r   updater   parse)	r&   wherer   r<   r   r#   Z_whereidxr   r)   r)   r*   r%   4  s<    


zPyTablesExpr.__init__rS   c                 C  s   | j d urt| j S t| jS r3   )r   r   r   rF   r)   r)   r*   r   d  s    

zPyTablesExpr.__repr__c              
   C  s   z| j t| _W n> tyP } z&td| j d|  d|W Y d}~n
d}~0 0 z| j t| _W n> ty } z&td| j d|  d|W Y d}~n
d}~0 0 | 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^   rU   rP   r   r   r   rW   r   )r&   r   r)   r)   r*   rY   i  s"    zPyTablesExpr.evaluate)NNr   )r+   r,   r-   __doc__r/   r%   r   rY   r)   r)   r)   r*   r     s   
   0r   c                   @  s.   e Zd ZdZdddddZdddd	Zd
S )rr   z<hold a term value the we use to construct a condition/filterr5   r   )rf   r    c                 C  s(   t |tsJ ||| _|| _|| _d S r3   )r4   r5   rI   	convertedrf   )r&   rI   r   rf   r)   r)   r*   r%     s    zTermValue.__init__rS   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   )rf   r5   r   rD   )r&   r<   r)   r)   r*   rn     s    



zTermValue.tostringN)r+   r,   r-   r   r%   rn   r)   r)   r)   r*   rr   }  s   rr   rb   rS   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 r3   r)   )r   rO   rx   r)   r*   	<genexpr>  r   z#maybe_expression.<locals>.<genexpr>)r4   r5   r   r   Z	unary_opsany)rx   
operationsr)   r   r*   maybe_expression  s    
r   )?r   
__future__r   r   decimalr   r   	functoolsr   typingr   r   r   numpyr`   Zpandas._libs.tslibsr	   r
   Zpandas.errorsr   Zpandas.core.dtypes.commonr   Zpandas.core.commoncorecommonr   Zpandas.core.computationr   r   r   Z_scopeZpandas.core.computation.commonr   Zpandas.core.computation.exprr   Zpandas.core.computation.opsr   Zpandas.core.constructionr   Zpandas.core.indexes.baser   Zpandas.io.formats.printingr   r   Zpandas._typingr   r   ZScoper   r1   r6   rM   rW   rX   rU   rV   r   r   r   Exprr   rr   r   r)   r)   r)   r*   <module>   sD   !	 /:	-Ui