U
    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rd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:d,d-d.d/Z;dS )0z1 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                      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__ D/tmp/pip-unpacked-wheel-g7fro6k3/pandas/core/computation/pytables.pyr"   0   s    zPyTablesScope.__init__)NNN)__name__
__module____qualname__	__slots____annotations__r"   __classcell__r&   r&   r$   r'   r   +   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namer/   sideencodingklassr&   r&   r'   r5   >   s    
zTerm.__new__r   r/   r   c                   s   t  j||||d d S N)r8   r9   )r!   r"   )r#   r7   r/   r8   r9   r$   r&   r'   r"   E   s    zTerm.__init__c                 C  sh   | j dkr4| j| jjkr.tdt| j d| jS z| jj| jddW S  tk
rb   | j Y S X d S )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  s   | j S r0   )_valuerB   r&   r&   r'   valueW   s    z
Term.value)NN)NN)
r(   r)   r*   r,   r5   r"   rC   propertyrE   r-   r&   r&   r$   r'   r.   ;   s   

r.   c                      s.   e Zd Zd	ddd fddZdd Z  ZS )
r3   Nr   r   r;   c                   s.   t |tstt|t j||||d d S r<   )r1   r   AssertionErrortyper!   r"   )r#   rE   r/   r8   r9   r$   r&   r'   r"   ]   s    zConstant.__init__c                 C  s   | j S r0   )_namerB   r&   r&   r'   rC   a   s    zConstant._resolve_name)NN)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ddd	 fd
dZ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$ Z  ZS )%BinOp   r2   opr   r   z
str | None	conditionr   )rL   r   r   c                   s&   t  ||| || _|| _d | _d S r0   )r!   r"   r   r9   rM   )r#   rL   lhsrhsr   r9   r$   r&   r'   r"   m   s    zBinOp.__init__c                 C  s   d S r0   r&   rB   r&   r&   r'   _disallow_scalar_only_bool_opss   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kr|S |dk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   r9   )	r1   ConditionBinOpJointConditionBinOpFilterBinOpJointFilterBinOprL   r   r9   evaluate)r=   rightkr:   r#   r&   r'   prw   s4    







    zBinOp.prune.<locals>.pr)rN   rO   r   rE   prune)r#   r:   rY   r=   rV   resr&   rX   r'   rZ   v   s    zBinOp.prunec                 C  s&   t |s|g}t|tjr"| }|S )zinplace conform rhs)r
   r1   npZndarrayZravel)r#   rO   r&   r&   r'   conform   s
    zBinOp.conformboolr   c                 C  s   | j | jkS )z$return True if this is a valid field)rN   r   rB   r&   r&   r'   is_valid   s    zBinOp.is_validc                 C  s   | j | jdk	S )zx
        return True if this is a valid column name for generation (e.g. an
        actual column in the table)
        N)r   getrN   rB   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   ra   rN   rB   r&   r&   r'   rc      s    z
BinOp.kindc                 C  s   t | j| jddS )zthe meta of my fieldmetaNrd   rB   r&   r&   r'   rf      s    z
BinOp.metac                 C  s   t | j| jddS )zthe metadata of my fieldmetadataNrd   rB   r&   r&   r'   rg      s    zBinOp.metadatac                 C  s(   | | j}d| j d| j d| dS )z2create and return the op string for this TermValue( ))tostringr9   rN   rL   )r#   vvalr&   r&   r'   generate   s    zBinOp.generate	TermValuec                   s   fdd}t  j}t  j}|dks0|dkrxt|ttfrF||}t |}t|}|jdk	rj|d}t	||j
|S |dks|dkrt|trt|j
}nt|d	d
j
}t	t|||S |dk rt jdd}||krd}n|j|dd}t	||dS |dkrtt|}t	|||S |dkr<t|}t	|||S |dkrxt|trd|  dk}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 k	rt|  j dS t| S )N)r9   )r9   r   r   )rE   rB   r&   r'   	stringify   s    
z&BinOp.convert_value.<locals>.stringifyZ
datetime64datetimeNUTCZtimedelta64	timedeltas)unitcategoryT)Zextract_numpyr=   )r8   integerfloatr^   )	falsefnonnone0z[]z{} stringzCannot compare z	 of type z to z column)r   rc   rf   r1   r   ry   r   tzZ
tz_convertro   rE   r2   r   r   rg   Zsearchsortedstriplowerr^   	TypeErrorrH   )r#   rl   rp   rc   rf   rg   resultr&   rB   r'   convert_value   sH    








zBinOp.convert_valuec                 C  s   d S r0   r&   rB   r&   r&   r'   convert_values  s    zBinOp.convert_values)r(   r)   r*   _max_selectorsr,   r"   rP   rZ   r]   rF   r`   rb   rc   rf   rg   rn   r   r   r-   r&   r&   r$   r'   rJ   e   s*   
*


?rJ   c                   @  sP   e Zd ZU dZded< ddddZdd	 Zd
d Zdd ZdddddZ	dS )rS   Nztuple[Any, Any, Index] | Nonefilterr2   r_   c                 C  s0   | j d k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k	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rj| jdkrft|| jkrf| 	 }| j
|t|f| _| S d S | jdk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 [)r`   
ValueErrorr]   rO   listrb   rL   lenr   r   rN   r   r   r   )r#   rO   valuesZ	filter_opr&   r&   r'   rU   "  s"    

zFilterBinOp.evaluateFr^   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 r0   isinZaxisvalsr&   r&   r'   <lambda>D      z0FilterBinOp.generate_filter_op.<locals>.<lambda>c                 S  s
   |  |S r0   r   r   r&   r&   r'   r   F  r   )rL   )r#   r   r&   r&   r'   r   B  s    zFilterBinOp.generate_filter_op)F)
r(   r)   r*   r   r,   r   r   r   rU   r   r&   r&   r&   r'   rS     s   

 rS   c                   @  s   e Zd Zdd Zdd ZdS )rT   c                 C  s   t dd S )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'   rU   M  s    zJointFilterBinOp.evaluateN)r(   r)   r*   r   rU   r&   r&   r&   r'   rT   I  s   rT   c                   @  s2   e Zd ZddddZdd Zdd Zd	d
 ZdS )rQ   r2   r_   c                 C  s   t d| j dS )Nz[Condition : [z]])r   rM   rB   r&   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   rB   r&   r&   r'   r   U  s    zConditionBinOp.invertc                 C  s   | j S )zreturn the actual ne format)rM   rB   r&   r&   r'   r   ^  s    zConditionBinOp.formatc                   s    j std  d js d S   j} fdd|D } jdk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   .0rl   rB   r&   r'   
<listcomp>l  s     z+ConditionBinOp.evaluate.<locals>.<listcomp>r   c                   s   g | ]}  |qS r&   )rn   r   rB   r&   r'   r   s  s     rh   z | rj   r   )r`   r   rb   r]   rO   rL   r   r   joinrM   rn   )r#   rO   r   vsr&   rB   r'   rU   b  s    
zConditionBinOp.evaluateN)r(   r)   r*   r   r   r   rU   r&   r&   r&   r'   rQ   Q  s   	rQ   c                   @  s   e Zd Zdd ZdS )rR   c                 C  s(   d| j j d| j d| jj d| _| S )Nrh   ri   rj   )rN   rM   rL   rO   rB   r&   r&   r'   rU     s    $zJointConditionBinOp.evaluateN)r(   r)   r*   rU   r&   r&   r&   r'   rR     s   rR   c                   @  s   e Zd Zdd ZdS )UnaryOpc                 C  sh   | j dkrtd| j}||}|d k	rdt|tr>|jd k	s\t|tsdt|trd|jd k	rd|	 S d S )N~z$UnaryOp only support invert type ops)
rL   r   operandrZ   
issubclassrQ   rM   rS   r   r   )r#   r:   r   r&   r&   r'   rZ     s"    

zUnaryOp.pruneN)r(   r)   r*   rZ   r&   r&   r&   r'   r     s   r   c                      sb   e Zd ZeZeZd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 )NZvisit_c                   s   t t|f S r0   )r   rJ   )nodebin_opkwargsr&   r'   r     r   z.PyTablesExprVisitor.__init__.<locals>.<lambda>)r!   r"   
binary_opsZbinary_op_nodes_mapsetattr)r#   r/   engineparserr   r   Z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rN| 	| |jj
 | jS t |jtjrdtdd S )Nr   zUnary addition not supported)r1   rL   astZNotZInvertr   visitr   ZUSub
const_typerE   r/   ZUAddr   r#   r   r   r&   r&   r'   visit_UnaryOp  s    z!PyTablesExprVisitor.visit_UnaryOpc                 K  s   |  |jjS r0   )r   rE   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=   Zcomparators)r   ZCompareEqtargetsrE   r   )r#   r   r   Zcmprr&   r&   r'   visit_Assign  s      z PyTablesExprVisitor.visit_Assignc              
   K  s   |  |j}|  |j}z
|j}W n tk
r6   Y nX t|trH|j}z| || | jW S  tk
r } z"t	dt
| dt
| |W 5 d }~X Y nX d S )Nzcannot subscript z with )r   rE   sliceAttributeErrorr1   r.   r   r/   r   r   r@   )r#   r   r   rE   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k
rH   Y nX z| t	||| j
W S  tk
r   t|tjr|j|kr| Y S Y nX td|j d S )NzInvalid Attribute context )attrrE   rH   ctxr   Loadr   r   	term_typere   r/   r1   Nameidr   r(   )r#   r   r   r   rE   r   Zresolvedr&   r&   r'   visit_Attribute  s    



z#PyTablesExprVisitor.visit_Attributec                 C  s   t |tjrt S |S r0   )r1   r   ZInr   )r#   rL   r&   r&   r'   translate_In  s    z PyTablesExprVisitor.translate_Inc                 C  s   |  |j|j||fS r0   )r   rL   )r#   r   r=   rV   r&   r&   r'   _rewrite_membership_op  s    z*PyTablesExprVisitor._rewrite_membership_op)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                   @  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   r/   r2   r   Nr   r   r   r   )r   scope_levelr   c           	      C  s  t |}|| _d | _d | _d | _d | _d }t|trD|jj	}|j
}nft|rt|}t|D ],\}}t|trx|jj	}q\t |}|||< q\ddd t|D }n|}|| _
t|d |d| _|d k	rt| j
tr| jj| t| j|dd|d| _|  | _d S )Nz & c                 S  s   g | ]}d | dqS )rh   rj   r&   )r   r   r&   r&   r'   r   G  s     z)PyTablesExpr.__init__.<locals>.<listcomp>r   )r    Zpytables)r   r   r   r9   )r   r9   rM   r   termsr   r1   r   r/   r   r   r
   r   	enumerater   comflattenr   r2   r   updater   parse)	r#   wherer   r9   r   r    Z_whereidxr   r&   r&   r'   r"   (  s>    



zPyTablesExpr.__init__r_   c                 C  s   | j d k	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k
rN } ztd| j d|  d|W 5 d}~X Y nX z| j t| _W n< tk
r } ztd| j d|  d|W 5 d}~X Y nX | 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   rZ   rQ   rM   r   r   r   rS   r   )r#   r   r&   r&   r'   rU   _  s"    zPyTablesExpr.evaluate)NNr   )r(   r)   r*   __doc__r,   r"   r   rU   r&   r&   r&   r'   r     s   
   2r   c                   @  s.   e Zd ZdZdddddZdddd	Zd
S )ro   z<hold a term value the we use to construct a condition/filterr2   r   )rc   r   c                 C  s(   t |tst||| _|| _|| _d S r0   )r1   r2   rG   rE   	convertedrc   )r#   rE   r   rc   r&   r&   r'   r"   v  s    zTermValue.__init__r_   c                 C  sH   | j dkr*|dk	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"ry   )rc   r2   r   r@   )r#   r9   r&   r&   r'   rk   |  s    



zTermValue.tostringN)r(   r)   r*   r   r"   rk   r&   r&   r&   r'   ro   s  s   ro   r^   r_   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   | ]}| kV  qd S r0   r&   )r   rL   rt   r&   r'   	<genexpr>  s     z#maybe_expression.<locals>.<genexpr>)r1   r2   r   r   Z	unary_opsany)rt   r   r&   r   r'   maybe_expression  s    
r   )<r   
__future__r   r   	functoolsr   typingr   r   Znumpyr\   Zpandas._libs.tslibsr   r   Zpandas._typingr   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.compat.chainmapr   ZScoper   r.   r3   rJ   rS   rT   rQ   rR   r   r   r   ZExprr   ro   r   r&   r&   r&   r'   <module>   sD   !	 (=.Tk