U
    *if'                     @   s\  d dl Z d dlZd dlZd dlm  mZ d dlZ	d dlm
Z
mZmZmZmZ d dlmZ d dlmZ dZdejdejdfZejedd	 d
dd Zejedd	 d
dd Zdd ZG dd dZG dd dZG dd dZejG dd dZejG dd deZ G dd deZ!G dd de Z"G d d! d!Z#G d"d# d#Z$G d$d% d%Z%dS )&    N)	DataFrameIndex
MultiIndexSeries
date_range)NUMEXPR_INSTALLED)pythonpandasr   numexpr)Zmarksc                 C   s   | S N xr   r   U/home/mars/bis/venv/lib/python3.8/site-packages/pandas/tests/frame/test_query_eval.py<lambda>       r   )paramsZidsc                 C   s   | j S r   paramrequestr   r   r   parser   s    r   c                 C   s   | S r   r   r   r   r   r   r      r   c                 C   s   | j S r   r   r   r   r   r   engine   s    r   c                 C   s    | dkrt dt|   d S )Nr	   zcannot evaluate with parser )pytestskiprepr)r   r   r   r   skip_if_no_pandas_parser!   s    r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
TestCompatc                 C   s:   t ddddgi| _| j| jjdk | _| jjd | _d S )NA         r   )r   dfr   	expected1	expected2selfmethodr   r   r   setup_method'   s    zTestCompat.setup_methodc                 C   s>   | j }|d}t|| j |d}tj|| jdd d S )NA>0A+1FZcheck_namesr"   querytmassert_frame_equalr#   evalassert_series_equalr$   r&   r"   resultr   r   r   test_query_default,   s
    

zTestCompat.test_query_defaultc                 C   sF   | j }|jdd d}t|| j |jdd d}tj|| jdd d S )Nr)   r   r*   Fr+   r,   r2   r   r   r   test_query_None6   s
    zTestCompat.test_query_Nonec                 C   sF   | j }|jddd}t|| j |jddd}tj|| jdd d S )Nr)   r   r5   r*   Fr+   r,   r2   r   r   r   test_query_python>   s
    zTestCompat.test_query_pythonc              	   C   s   | j }trH|jddd}t|| j |jddd}tj|| jdd nTd}t	j
t|d |jddd W 5 Q R X t	j
t|d |jddd W 5 Q R X d S )	Nr)   r
   r5   r*   Fr+   z~'numexpr' is not installed or an unsupported version. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installedmatch)r"   r   r-   r.   r/   r#   r0   r1   r$   r   raisesImportError)r&   r"   r3   msgr   r   r   test_query_numexprF   s    zTestCompat.test_query_numexprN)__name__
__module____qualname__r(   r4   r6   r7   r=   r   r   r   r   r   &   s
   
r   c                   @   sl   e Zd Zejdddgejdddddgd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd ZdS )TestDataFrameEvaln   i  zop_str,op,rop)+__add____radd__)-__sub____rsub__)*__mul____rmul__)/__truediv____rtruediv__c           
      C   s   t dt|tdd}d|jd< | }t t|j||dtdd}t	d| d	}t	d
| d	}	t
|	| |dkrt|||}	t
|	| n"|dkrt|||}	t
|	| d S )Nr   abcdindexcolumnsr    r   rS   zbase z dfzm )rD   rJ   )rG   rM   )r   rangelistilocZmeannpZtilevaluesZreshaper0   r.   r/   getattr)
r&   Zop_stropZroprB   r"   mbaseexpectedr3   r   r   r   test_ops]   s     
 zTestDataFrameEval.test_opsc                 C   sd   t dtjdi}tj|jdd< dt|jdd  }dt| jdd }t|| d S )Nr   ia  r      r      )	r   rY   randomrandnnanrX   isnanr.   r/   )r&   r"   r_   r3   r   r   r   test_dataframe_sub_numexpr_path   s
    z1TestDataFrameEval.test_dataframe_sub_numexpr_pathc              	   C   sn   t dddgdddgd}d}tjt|d |d	d
  W 5 Q R X tjt|d |d W 5 Q R X d S )Nr   r    r!   ab)r   Bz%expr must be a string to be evaluatedr8   c                 S   s
   | j dkS )Nri   )rj   r   r   r   r   r      r   z6TestDataFrameEval.test_query_non_str.<locals>.<lambda>o   r   r   r:   
ValueErrorr-   r&   r"   r<   r   r   r   test_query_non_str   s    z$TestDataFrameEval.test_query_non_strc              	   C   s>   t ddddgi}d}tjt|d |d W 5 Q R X d S )Nr   r   r    r!   zexpr cannot be an empty stringr8    rl   rn   r   r   r   test_query_empty_string   s    z)TestDataFrameEval.test_query_empty_stringc                 C   sz   t tjddtdd}ddi}ddi}|jd||gd	|d |d  ksPttjd||gd	|d |d  ksvtd S )
N
   r    abrU   rh   r   ri   a + b	resolvers)r   rY   rc   rd   rW   r0   AssertionErrorpd)r&   r"   dict1Zdict2r   r   r   test_eval_resolvers_as_list   s
    &z-TestDataFrameEval.test_eval_resolvers_as_listc                 C   sZ   t tjddtdd}ddi}|jd|gd}|d |d	 |d   }t|| d S )
Nrr   r    rs   rU   cz	a + b * cru   rh   ri   )r   rY   rc   rd   rW   r0   r.   r1   )r&   r"   ry   r3   r_   r   r   r   test_eval_resolvers_combined   s
    z.TestDataFrameEval.test_eval_resolvers_combinedc                 C   s@   t dddgi}|d}t ddgddgd}t|| d S )Na1YNzc = ((a1 == 'Y') & True)TF)r}   r{   )r   r0   r.   r/   )r&   r"   resr_   r   r   r   test_eval_object_dtype_binop   s    
z.TestDataFrameEval.test_eval_object_dtype_binopN)r>   r?   r@   r   markparametrizer`   rg   ro   rq   rz   r|   r   r   r   r   r   rA   Z   s    		rA   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
 TestDataFrameQueryWithMultiIndexc                 C   s$  t | tjjddgdd}tjjddgdd}tj||gddgd	}ttjdd
|d}t|j	
dj|dd}|jd||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dg }
t||
 t|	|
 |jd||d}|jd||d}	||dg  }
t||
 t|	|
 |jd||d}|jd||d}	||dg }
t||
 t|	|
 |jd||d}|jd||d}	||dg  }
t||
 t|	|
 d S )Nredgreenrr   sizeeggshamcolorZfood)namesr    rR   rR   namezcolor == "red"r   r   z"red" == colorzcolor != "red"z"red" != colorzcolor == ["red"]z["red"] == colorzcolor != ["red"]z["red"] != colorz["red"] in colorz"red" in colorz["red"] not in colorz"red" not in colorr   rY   rc   choicer   from_arraysr   rd   r   rR   get_level_valuesrZ   r-   r.   r/   isinr&   r   r   rh   ri   rR   r"   indZres1Zres2expr   r   r    test_query_with_named_multiindex   sP      zATestDataFrameQueryWithMultiIndex.test_query_with_named_multiindexc                 C   s  t | tjjddgdd}tjjddgdd}t||g}ttjdd|d}t|j	
d	j|d}|jd
||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dg }
t||
 t|	|
 |jd||d}|jd||d}	||dg  }
t||
 t|	|
 |jd||d}|jd||d}	||dg }
t||
 t|	|
 |jd||d}|jd||d}	||dg  }
t||
 t|	|
 t|j	
dj|d}|jd||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dk }
t||
 t|	|
 |jd||d}|jd||d}	||dg }
t||
 t|	|
 |jd||d}|jd||d}	||dg  }
t||
 t|	|
 |jd ||d}|jd!||d}	||dg }
t||
 t|	|
 |jd"||d}|jd#||d}	||dg  }
t||
 t|	|
 d S )$Nr   r   rr   r   r   r   r    r   r   ilevel_0 == "red"r   z"red" == ilevel_0ilevel_0 != "red"z"red" != ilevel_0zilevel_0 == ["red"]z["red"] == ilevel_0zilevel_0 != ["red"]z["red"] != ilevel_0z["red"] in ilevel_0z"red" in ilevel_0z["red"] not in ilevel_0z"red" not in ilevel_0r   zilevel_1 == "eggs"z"eggs" == ilevel_1zilevel_1 != "eggs"z"eggs" != ilevel_1zilevel_1 == ["eggs"]z["eggs"] == ilevel_1zilevel_1 != ["eggs"]z["eggs"] != ilevel_1z["eggs"] in ilevel_1z"eggs" in ilevel_1z["eggs"] not in ilevel_1z"eggs" not in ilevel_1r   r   r   r   r   "test_query_with_unnamed_multiindex   s    zCTestDataFrameQueryWithMultiIndex.test_query_with_unnamed_multiindexc           
      C   sT  t | tjjddgdd}td}t||g}d dg|_ttj	dd|d}|j
d||d	}t|jdj|dd
}||dk }	t||	 |j
d||d	}t|jdj|dd
}||dk }	t||	 |j
d||d	}t|jdj|d}||dk }	t||	 |j
d||d	}t|jdj|d}||dk }	t||	 d S )Nr   r   rr   r   Zratingr    r   zrating == 1r   r   r   zrating != 1r   r   r   )r   rY   rc   r   aranger   r   r   r   rd   r-   r   rR   r   rZ   r.   r/   )
r&   r   r   rh   ri   rR   r"   r   r   r   r   r   r   *test_query_with_partially_named_multiindexF  s<    

    zKTestDataFrameQueryWithMultiIndex.test_query_with_partially_named_multiindexc                 C   s   t jdddddgd}| }dd }|j }|j|||jd||jd|d	}| D ]J\}}t|tr|	|| st
qZt|trt |||  qZt
d
qZd S )Nrr   r!   r    spamr   )Zr_idx_nlevelsZr_idx_namesc                 S   s   |  |}| }| |_|S r   )r   	to_seriesrR   )milevelZlevel_valuessr   r   r   r   k  s    
z]TestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolvers.<locals>.to_series)rR   rS   r   r   ZC0z object must be a Series or Index)r.   ZmakeCustomDataframeZ_get_index_resolversrS   r   rR   items
isinstancer   is_rw   r   r1   )r&   r"   rv   r   Z
col_seriesr_   kvr   r   r   )test_query_multiindex_get_index_resolverse  s*       




zJTestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolversN)r>   r?   r@   r   r   r   r   r   r   r   r   r      s   2Xr   c                   @   s   e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7S )8TestDataFrameQueryNumExprPandasc                 C   s   d| _ d| _d S )Nr
   r	   r   r   clsr   r   r   setup_class  s    z+TestDataFrameQueryNumExprPandas.setup_classc                 C   s   | ` | `d S r   r   r   r   r   r   teardown_class  s    z.TestDataFrameQueryNumExprPandas.teardown_classc                 C   s   | j | j }}t| ttjdd}tddd|d< tddd|d< tddd|d	< |jd
||d}||j	dk d|j
k @  }t|| d S )Nra   r!   1/1/2012periodsdates11/1/2013dates21/1/2014dates3z"@df.dates1 < 20130101 < @df.dates3r   20130101)r   r   r   r   rY   rc   rd   r   r-   r   r   r.   r/   r&   r   r   r"   r   expecr   r   r   %test_date_query_with_attribute_access  s      zETestDataFrameQueryNumExprPandas.test_date_query_with_attribute_accessc                 C   s   | j | j }}ttjdd}tddd|d< tddd|d< tddd|d	< |jd
||d}||jdk d|j	k @  }t
|| d S )Nra   r!   r   r   r   r   r   r   r   dates1 < 20130101 < dates3r   r   r   r   r   rY   rc   rd   r   r-   r   r   r.   r/   r   r   r   r   #test_date_query_no_attribute_access  s    zCTestDataFrameQueryNumExprPandas.test_date_query_no_attribute_accessc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< td|d|d	< tj|j	tj
|d
kdf< tj|j	tj
|d
kd	f< |jd||d}||jdk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   r   r         ?r   r   r   r   r   r   rY   rc   rd   r   rx   NaTlocrandr-   r   r   r.   r/   r&   r   r   rB   r"   r   r   r   r   r   test_date_query_with_NaT  s    z8TestDataFrameQueryNumExprPandas.test_date_query_with_NaTc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< |jdddd	}|d ks`t|j	d
||d}||j
dk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   TZinplaceZdropindex < 20130101 < dates3r   r   r   r   r   rY   rc   rd   r   	set_indexrw   r-   rR   r   r.   r/   r&   r   r   rB   r"   return_valuer   r   r   r   r   test_date_index_query  s    z5TestDataFrameQueryNumExprPandas.test_date_index_queryc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< tj|j	d< |j
dd	d	d
}|d kslt|jd||d}||jdk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   r   r   Tr   r   r   r   r   r   r   rY   rc   rd   r   rx   r   rX   r   rw   r-   rR   r   r.   r/   r   r   r   r   test_date_index_query_with_NaT  s    z>TestDataFrameQueryNumExprPandas.test_date_index_query_with_NaTc           	      C   s   | j | j }}d}i }td|d|d< td|d|d< t|}tj|jtj	|dkdf< |j
dddd	}|d ksvt|jd
||d}||j dk d|jk @  }t|| d S )Nrr   r   r   r   r   r   r   Tr   r   r   r   )r   r   r   r   rx   r   r   rY   rc   r   r   rw   r-   rR   r   r   r.   r/   )	r&   r   r   rB   dr"   r   r   r   r   r   r   )test_date_index_query_with_NaT_duplicates  s    zITestDataFrameQueryNumExprPandas.test_date_index_query_with_NaT_duplicatesc              
   C   s   | j | j }}d}ttd|dt|d}|jd||d}t|dksNt|jd||d}t	
|| d	}d
D ]6}tjt|d |jd| d||d W 5 Q R X qrd S )Nrr   r   r   )datesZnondatezdates == nondater   r   zdates != nondatez=Invalid comparison between dtype=datetime64\[ns\] and ndarray<>z<=z>=r8   zdates z nondate)r   r   r   r   rY   r   r-   lenrw   r.   r/   r   r:   	TypeError)r&   r   r   rB   r"   r3   r<   r\   r   r   r   test_date_query_with_non_date  s    z=TestDataFrameQueryNumExprPandas.test_date_query_with_non_datec              	   C   s`   | j | j }}ttdtddtddd}d}tjt|d |jd	||d
 W 5 Q R X d S )Nrr   r!      rC      )irD   rzinvalid syntaxr8   zi - +r   )r   r   r   rV   r   r:   SyntaxErrorr-   )r&   r   r   r"   r<   r   r   r   test_query_syntax_error  s
     z7TestDataFrameQueryNumExprPandas.test_query_syntax_errorc           	   	   C   s   ddl m} | j| j }}t| ttjddt	dd}d\}}|j
d||d	}||j|jk }t|| |j
d
||d	}|||jk }t|| tj|dd |j
d||d	 W 5 Q R X tj|dd |j
d||d	 W 5 Q R X d S )Nr   UndefinedVariableError   r    rs   rU   )r   r    za > br   z@a > b!local variable 'c' is not definedr8   z@a > b > @czname 'c' is not definedz
@a > b > c)pandas.core.computation.opsr   r   r   r   r   rY   rc   rd   rW   r-   rh   ri   r.   r/   r   r:   )	r&   r   r   r   r"   rh   ri   r   r_   r   r   r   test_query_scope  s$     z0TestDataFrameQueryNumExprPandas.test_query_scopec              	   C   sp   ddl m} | j| j }}d }}ttjj||dfdtdd}t	j
|dd	 |jd
||d W 5 Q R X d S )Nr   r   rr   r!   r   abcrU   zname 'sin' is not definedr8   sin > 5r   )r   r   r   r   r   rY   rc   randintrW   r   r:   r-   )r&   r   r   r   rB   r]   r"   r   r   r   test_query_doesnt_pickup_local  s     z>TestDataFrameQueryNumExprPandas.test_query_doesnt_pickup_localc              	   C   s|   ddl m} | j| j }}d }}ttjj||dfdtdd}d|j	_
d	}tj||d
 |jd||d W 5 Q R X d S )Nr   )NumExprClobberingErrorrr   r!   r   r   rU   sinzVariables in expression.+r8   r   r   )Zpandas.core.computation.enginesr   r   r   r   rY   rc   r   rW   rR   r   r   r:   r-   )r&   r   r   r   rB   r]   r"   r<   r   r   r   test_query_builtin  s     z2TestDataFrameQueryNumExprPandas.test_query_builtinc                 C   s   | j | j }}ttjdddddgd}t|jd||d||j	|j
k   t|jd	||d||j	|j
 |j
|j k  d S )
Nrr   r!   rh   ri   r{   rU   a < br   za + b > b * c)r   r   r   rY   rc   rd   r.   r/   r-   rh   ri   r{   )r&   r   r   r"   r   r   r   
test_query%  s     z*TestDataFrameQueryNumExprPandas.test_queryc                 C   s   | j | j }}ttjjdddttddddddgd	}|jd
||d}||j	dk |j
|jk @  }t|| |jd||d}||j	|jk  }t|| d S )Nrr   rr   r!   r   Zblobr   rh   ri   r{   rQ   z(blob < 5) & (a < b)r   ra   zblob < b)r   r   r   rY   rc   r   r   rV   r-   rR   rh   ri   r.   r/   r   r   r   r   test_query_index_with_name1  s    z:TestDataFrameQueryNumExprPandas.test_query_index_with_namec                 C   s   | j | j }}ttjjdddtddddgd}|jd||d	}||j|j	k  }t
|| |jd
||d	}||jdk  }t
|| d S )Nrr   r   r   rh   ri   r{   rQ   z	index < br   z	index < 5ra   )r   r   r   rY   rc   r   rV   r-   rR   ri   r.   r/   r   r   r   r   test_query_index_without_nameA  s    z=TestDataFrameQueryNumExprPandas.test_query_index_without_namec                 C   s   | j }| j}t| ttjdd}ttjdd}||dk|dk@  }|jd||d}t	|| t
jd||d}t	|| t
jd||d}||dk|dk@ ||dk dk@  }t	|| t
jd||d}|jd	||d}t	|| d S )
Nra   r!   r   z(@df > 0) & (@df2 > 0)r   zdf[df > 0 and df2 > 0]z)df[df > 0 and df2 > 0 and df[df > 0] > 0]zdf[(df>0) & (df2>0)](@df>0) & (@df2>0))r   r   r   r   rY   rc   rd   r-   r.   r/   rx   r0   )r&   r   r   r"   df2r_   r3   r   r   r   test_nested_scopeS  s(      $z1TestDataFrameQueryNumExprPandas.test_nested_scopec              	   C   sP   ddl m} ttjdd}tj|dd |jd| j	| j
d W 5 Q R X d S )	Nr   r   ra   r!   name 'df' is not definedr8   zdf > 0r   )r   r   r   rY   rc   rd   r   r:   r-   r   r   )r&   r   r"   r   r   r   *test_nested_raises_on_local_self_referencem  s    zJTestDataFrameQueryNumExprPandas.test_nested_raises_on_local_self_referencec                 C   s   t | j | j| j }}ttjddtdd}d}||j|k  }|j	d||d}t
|| ||j|jk  }|j	d||d}t
|| d S )	Nd   rr   Z
abcdefghijrU   r   za < @br   r   )r   r   r   r   rY   rc   rd   rW   rh   r-   r.   r/   ri   )r&   r   r   r"   ri   expectr3   r   r   r   test_local_syntaxv  s    
z1TestDataFrameQueryNumExprPandas.test_local_syntaxc                 C   s   t | j | j| j }}td}ttjdt||d}|j	d||d}|j
|jk |j|jk @ |j|j
 @ |j|j @ }|| }t|| d S )Nr   r   rU   z!a < b < c and a not in b not in cr   )r   r   r   rW   r   rY   rc   rd   r   r-   rh   ri   r{   r   r.   r/   )r&   r   r   colsr"   r   r   r   r   r   r   test_chained_cmp_and_in  s    
  8z7TestDataFrameQueryNumExprPandas.test_chained_cmp_and_inc                 C   s   | j | j }}t| ttjjddddd}ttjjddddd}t||d}|j|j	d	 
| }|jd
||d}t|| ttjjddddd}|j|d	 
| }|jd||d}t|| d S )Nr!      r   rh   r   rr   ri   rh   ri   r   z
b - 1 in ar   z@b - 1 in a)r   r   r   r   rY   rc   r   r   r   ri   r   r-   r.   r/   )r&   r   r   rh   ri   r"   r_   r3   r   r   r   test_local_variable_with_in  s    z;TestDataFrameQueryNumExprPandas.test_local_variable_with_inc                 C   s`   | j | j }}t| d}tdddddddgi}|jd||d}||jdk }t|| d S )Nr   rh   ri   z@cz	a == "@c"r   )r   r   r   r   r-   rh   r.   r/   )r&   r   r   r{   r"   r3   r_   r   r   r   test_at_inside_string  s    z5TestDataFrameQueryNumExprPandas.test_at_inside_stringc              	   C   sj   ddl m} | j| j }}t| ttjddt	dd}t
j|dd |jd	||d
 W 5 Q R X d S )Nr   r   rr   r    rs   rU   r   r8   za == @cr   )r   r   r   r   r   r   rY   rc   r   rW   r   r:   r-   )r&   r   r   r   r"   r   r   r   test_query_undefined_local  s     z:TestDataFrameQueryNumExprPandas.test_query_undefined_localc                 C   s:  d}t jddd }t|t j|jd}d|j_|jd| j	| j
d}||d dk }t|| t|t j|jd}|jd	| j	| j
d}|j|j|jdk  }t|| t|t j|jd
}d|j_|jd| j	| j
d}||jdk }t|| |jd| j	| j
d}|j|j|jdk  }t|| d S )Nr   r   e   )rR   ri   rR   z	index > 5r   ra   zilevel_0 > 5r   rh   za > 5)rY   Zr_r   rc   rd   r   rR   r   r-   r   r   r.   r/   r   rh   )r&   rB   rh   r"   r3   r_   r   r   r   :test_index_resolvers_come_after_columns_with_the_same_name  s&    zZTestDataFrameQueryNumExprPandas.test_index_resolvers_come_after_columns_with_the_same_namec           	      C   s   d}t tj|tj|d}tj|jd d ddf< tjtjd}|	 D ]F\}}d| d}|||j
tj }|j|| j| jd}t|| qNd S )	Nrr   r   r    r   z==z!=a z infr   )r   rY   rc   r   infr   operatoreqner   rh   r-   r   r   r.   r/   )	r&   rB   r"   r   r\   fqr_   r3   r   r   r   test_inf  s    z(TestDataFrameQueryNumExprPandas.test_infc                 C   sf   |}t ddd|dd}t|d}t|d}|d}t|| t|}| d}t|| d S )Nz
2019-01-01Z1drr   time)startfreqr   tzr   r   z"2018-01-03 00:00:00+00" < time)r   r   r-   r.   r/   Zreset_index)r&   Ztz_aware_fixturer  Zdf_indexr_   r"   r3   r   r   r   test_check_tz_aware_index_query  s        


z?TestDataFrameQueryNumExprPandas.test_check_tz_aware_index_queryc                 C   s   d}t dtj| tj|d}||d ddk }|jd| j| jd}t	|| t t
tj|d	k tjtj|tj|d}||d   }|jd
| j| jd}t	|| d S )Nrr   r    r   rh   intr   za.astype('int') == 0r   r   za.notnull())r   rY   rc   r   astyper-   r   r   r.   r/   wherere   rd   Znotnull)r&   rB   r"   r_   r3   r   r   r   test_method_calls_in_query  s"    "  "
z:TestDataFrameQueryNumExprPandas.test_method_calls_in_queryN)r>   r?   r@   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   r     s:   


		r   c                       sP   e Zd Ze fddZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )TestDataFrameQueryNumExprPythonc                    s   t    d| _d| _d S )Nr
   r   superr   r   r   r   	__class__r   r   r     s    
z+TestDataFrameQueryNumExprPython.setup_classc                 C   s   | j | j }}ttjdd}tddd|d< tddd|d< tddd|d	< |jd
||d}||jdk d|j	k @  }t
|| d S )Nra   r!   r   r   r   r   r   r   r   )(dates1 < 20130101) & (20130101 < dates3)r   r   r   r   r   r   r   r     s      zCTestDataFrameQueryNumExprPython.test_date_query_no_attribute_accessc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< td|d|d	< tj|j	tj
|d
kdf< tj|j	tj
|d
kd	f< |jd||d}||jdk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r     s      z8TestDataFrameQueryNumExprPython.test_date_query_with_NaTc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< |jdddd	}|d ks`t|j	d
||d}||j
dk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   Tr   ((index < 20130101) & (20130101 < dates3)r   r   r   r   r   r   r   r      s      z5TestDataFrameQueryNumExprPython.test_date_index_queryc                 C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< tj|j	d< |j
dd	d	d
}|d kslt|jd||d}||jdk d|jk @  }t|| d S )Nrr   r!   r   r   r   r   r   r   Tr   r  r   r   r   r   r   r   r   r   .  s      z>TestDataFrameQueryNumExprPython.test_date_index_query_with_NaTc              	   C   s   | j | j }}d}ttj|d}td|d|d< td|d|d< tj|j	tj
|dkdf< |jdd	d	d
}|d ks|td}tjt|d |jd||d W 5 Q R X d S )Nrr   r!   r   r   r   r   r   r   Tr   "'BoolOp' nodes are not implementedr8   r   r   )r   r   r   rY   rc   rd   r   rx   r   r   r   r   rw   r   r:   NotImplementedErrorr-   )r&   r   r   rB   r"   r   r<   r   r   r   r   =  s    zITestDataFrameQueryNumExprPython.test_date_index_query_with_NaT_duplicatesc           
   	   C   s(  ddl m} | j}| j}d}tjd||d}|dks8tttj	
dd}ttj	
dd}d	}tjt|d
 |jd||d W 5 Q R X tj|dd
 |jd||d W 5 Q R X ||dk|dk@  }	tjd||d}t|	| ||dk|dk@ ||dk dk@  }	tjd||d}t|	| d S )Nr   r   r   zx + 1r   r    ra   r!   z5The '@' prefix is only supported by the pandas parserr8   r   r   z(df>0) & (df2>0)zdf[(df > 0) & (df2 > 0)]z+df[(df > 0) & (df2 > 0) & (df[df > 0] > 0)])r   r   r   r   rx   r0   rw   r   rY   rc   rd   r   r:   r   r-   r.   r/   )
r&   r   r   r   r   r3   r"   r   r<   r_   r   r   r   r   J  s.    $  z1TestDataFrameQueryNumExprPython.test_nested_scope)r>   r?   r@   r  r   r   r   r   r   r   r   __classcell__r   r   r  r   r    s   r  c                       s(   e Zd Ze fddZdd Z  ZS )TestDataFrameQueryPythonPandasc                    s   t    d| _d| _d S )Nr   r	   r  r   r  r   r   r   k  s    
z*TestDataFrameQueryPythonPandas.setup_classc                 C   sl   | j | j }}d }}ttjj||dfdtdd}d|j_||jdk }|j	d||d	}t
|| d S 
Nrr   r!   r   r   rU   r   ra   r   r   r   r   r   rY   rc   r   rW   rR   r   r-   r.   r/   r&   r   r   rB   r]   r"   r_   r3   r   r   r   r   q  s     z1TestDataFrameQueryPythonPandas.test_query_builtinr>   r?   r@   r  r   r   r  r   r   r  r   r   j  s   r   c                       s(   e Zd Ze fddZdd Z  ZS )TestDataFrameQueryPythonPythonc                    s   t    d | _| _d S )Nr   r  r   r  r   r   r   ~  s    
z*TestDataFrameQueryPythonPython.setup_classc                 C   sl   | j | j }}d }}ttjj||dfdtdd}d|j_||jdk }|j	d||d	}t
|| d S r!  r"  r#  r   r   r   r     s     z1TestDataFrameQueryPythonPython.test_query_builtinr$  r   r   r  r   r%  }  s   r%  c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestDataFrameQueryStringsc              
   C   s  t tjdddgd}ttd|d< ||jdk }|dkrd}d	}|gd
 |gd
  }|d d d }d\}	}
d
|	g|
g  }d}t|||D ]P\}}}| d| d| }tj	t
|d |j|||d|jid W 5 Q R X qn|jd||d}t|| |jd||d}t|| t|||jdg  ||jdk }|jd||d}t|| |jd||d}t|| t|||jdg   d S )Nrr   r   ri   rU   
aabbccddeestringsrh   r	   z"a"r    rT   r  $'(Not)?In' nodes are not implemented r8   )r   r   Z
local_dictz"a" == stringsr   zstrings == "a"zstrings != "a"z"a" != strings)r   rY   rc   rd   r   rW   r(  zipr   r:   r  r-   r.   r/   r   r&   r   r   r"   r   collstlhsrhsr  r  opsr<   r\   exr   r   r   r   test_str_query_method  s>    z/TestDataFrameQueryStrings.test_str_query_methodc              
   C   sl  t tjdddgd}ttd|d< ||jddg }|dkrd}d	}|gd
 |gd
  }|d d d }d\}	}
d
|	g|
g  }d}t|||D ]H\}}}| d| d| }t	j
t|d |j|||d W 5 Q R X qn|jd||d}t|| |jd||d}t|| ||jddg  }|jd||d}t|| |jd||d}t|| d S )Nrr   r   ri   rU   r'  r(  rh   r	   z
["a", "b"]r    rT   r  r)  r*  r8   r   zstrings == ["a", "b"]z["a", "b"] == stringszstrings != ["a", "b"]z["a", "b"] != strings)r   rY   rc   rd   r   rW   r(  r   r+  r   r:   r  r-   r.   r/   r,  r   r   r   test_str_list_query_method  s0    z4TestDataFrameQueryStrings.test_str_list_query_methodc              	   C   s  t tdtdtjjdddtjjdddd}|dkr|jd	||d
}||j|j }t	
|| |jd||d
}||j|j|j|jk @  }t	
|| n\d}tjt|d |jd	||d
 W 5 Q R X d}tjt|d |jd||d
 W 5 Q R X d S )Naaaabbbbccccaabbccddeeffra      r   	   rh   ri   r{   r   r	   za in br   za in b and c < dr)  r8   r  )r   rW   rY   rc   r   r-   rh   r   ri   r.   r/   r{   r   r   r:   r  )r&   r   r   r"   r   r   r<   r   r   r   test_query_with_string_columns  s(    z8TestDataFrameQueryStrings.test_query_with_string_columnsc                 C   s   t tdtdtjjdddtjjdddd}|jd||d	}||j|jk }t	|| |jd
||d	}||j|jk }t	|| d S )Nr5  r6  ra   r7  r   r8  r9  za == br   za != b)
r   rW   rY   rc   r   r-   rh   ri   r.   r/   )r&   r   r   r"   r   r   r   r   r   test_object_array_eq_ne  s    z1TestDataFrameQueryStrings.test_object_array_eq_nec           	      C   s   t | dd tddD d }tdddd	}td
ddd	}ttddd|||d}||jdk }|j	d||d}t
|| d S )Nc                 S   s&   g | ]}d D ]}d| d| qqS ))loadexitzpage r*  r   ).0rB   Zactr   r   r   
<listcomp>	  s      zLTestDataFrameQueryStrings.test_query_with_nested_strings.<locals>.<listcomp>r   rC   r    z2014-01-01 0:00:01Z30s   )r  r   z2014-02-01 1:00:01   )idevent	timestampz"page 1 load"z'"page 1 load"' in eventr   )r   rV   r   r   rY   r   repeatappendrC  r-   r.   r/   )	r&   r   r   eventsZstamps1Zstamps2r"   r_   r   r   r   r   test_query_with_nested_strings  s"    z8TestDataFrameQueryStrings.test_query_with_nested_stringsc                 C   sP   t | tdddgdddgd}|jd||d	}||jdk }t|| d S )
Nrh   ri   ztest & testr   r    r!   r   za == "test & test"r   )r   r   r-   rh   r.   r/   )r&   r   r   r"   r   r   r   r   r   (test_query_with_nested_special_character  s
    zBTestDataFrameQueryStrings.test_query_with_nested_special_characterc                 C   s   t tjtdd}t t|j}t||d}tj	tj
tjtjd}| D ]<\}}|jd| d||d}	|||jd }
t|	|
 qRd S )	NZabcder   )Xr~   r   zX z "d"r   r   )r   rY   rc   r   rW   r   r   r   r  ltgtleger   r-   rJ  r.   r/   )r&   r   r   rh   ri   r"   r1  r\   funcr   r_   r   r   r   test_query_lex_compare_strings!  s    z8TestDataFrameQueryStrings.test_query_lex_compare_stringsc                 C   s^   d}t jjddt|fdt}t||d}|jd||d}||j|j	@  }t
|| d S )N)bidZbidsizeaskZasksizer    r   r   rU   z	bid & askr   )rY   rc   r   r   r  boolr   r-   rQ  rR  r.   r/   )r&   r   r   rS   datar"   r   r_   r   r   r   "test_query_single_element_booleans.  s    z<TestDataFrameQueryStrings.test_query_single_element_booleansc                 C   sX   t | tddddgddddgd}||jdk }d}|jd||d	}t|| d S )
NzBUD USzIBM USgl[@gGzn[@gf@g33333f@)SymbolZPricezSymbol == @symbr   )r   r   rV  r-   r.   r/   )r&   r   r   r"   eZsymbr   r   r   r   !test_query_string_scalar_variable6  s    

z;TestDataFrameQueryStrings.test_query_string_scalar_variableN)r>   r?   r@   r3  r4  r:  r;  rH  rI  rP  rU  rX  r   r   r   r   r&    s   )#r&  c                   @   sJ   e Zd Zdd Zdd Zdd Zdd Zej	d	d
dddgdd Z
dS )TestDataFrameEvalWithFramec                 C   s    t tjddtdd| _d S )Nrr   r!   r   rU   )r   rY   rc   rd   rW   framer%   r   r   r   r(   E  s    z'TestDataFrameEvalWithFrame.setup_methodc                 C   s   | ` d S r   )rZ  r%   r   r   r   teardown_methodH  s    z*TestDataFrameEvalWithFrame.teardown_methodc                 C   s2   | j jd||d}| j j| j j }t|| d S )Nrt   r   rZ  r0   rh   ri   r.   r1   r&   r   r   r   r   r   r   r   test_simple_exprK  s    z+TestDataFrameEvalWithFrame.test_simple_exprc                 C   s>   | j jd||d}| j j| j jdk  | j j }t|| d S )Nza[a < 1] + br   r   r\  r]  r   r   r   test_bool_arith_exprP  s    z/TestDataFrameEvalWithFrame.test_bool_arith_exprr\   rD   rG   rJ   rM   c              	   C   sP   t ddgddgd}d}tjt|d |jd| d	||d
 W 5 Q R X d S )Nr   r    r{   r   r   z3unsupported operand type\(s\) for .+: '.+' and '.+'r8   r  z br   )r   r   r:   r   r0   )r&   r   r   r\   r"   r<   r   r   r   %test_invalid_type_for_operator_raisesU  s    z@TestDataFrameEvalWithFrame.test_invalid_type_for_operator_raisesN)r>   r?   r@   r(   r[  r^  r_  r   r   r   r`  r   r   r   r   rY  D  s   rY  c                   @   s   e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1S )2!TestDataFrameQueryBacktickQuotingclass)scopec                 c   s   t dddgdddgdddgdddgdd	d
gdddgdddgddd
gdddgd
ddgdddgdddgdddgdddgd
ddgddd	gdddgdddgd	ddgdddgdddgddd	gdV  dS )z
        Yields a dataframe with strings that may or may not need escaping
        by backticks. The last two columns cannot be escaped by backticks
        and should raise a ValueError.
        r   r    r!   rC   ra   r@  rA     r8  rr      r  )r   B BC CC  CC_CD_D DE.EF-F1e1defA (x)zB(x)zB (x)     &^ :!€$?(} >    <++*''  rp    A  zit'szthat'su   ☺zfoo#barr   N)r   )r&   r   r   r   r"   _  s2    z$TestDataFrameQueryBacktickQuoting.dfc                 C   s*   | d}|d|d k  }t|| d S )Nz	1 < `B B`r   rf  r-   r.   r/   r&   r"   r   r   r   r   r   #test_single_backtick_variable_query  s    
zETestDataFrameQueryBacktickQuoting.test_single_backtick_variable_queryc                 C   s6   | d}|d|d k d|d k @  }t|| d S )Nz1 < `B B` and 4 < `C C`r   rf  rC   rg  rs  rt  r   r   r   !test_two_backtick_variables_query  s    
zCTestDataFrameQueryBacktickQuoting.test_two_backtick_variables_queryc                 C   s*   | d}|d |d  }t|| d S )Nz	A + `B B`r   rf  r0   r.   r1   rt  r   r   r   "test_single_backtick_variable_expr  s    
zDTestDataFrameQueryBacktickQuoting.test_single_backtick_variable_exprc                 C   s*   | d}|d |d  }t|| d S )Nz`B B` + `C C`rf  rg  rw  rt  r   r   r    test_two_backtick_variables_expr  s    
zBTestDataFrameQueryBacktickQuoting.test_two_backtick_variables_exprc                 C   s*   | d}|d |d  }t|| d S )Nz	`C_C` + Ari  r   rw  rt  r   r   r    test_already_underscore_variable  s    
zBTestDataFrameQueryBacktickQuoting.test_already_underscore_variablec                 C   s*   | d}|d |d  }t|| d S )NzC_C + `C C`ri  rg  rw  rt  r   r   r   test_same_name_but_underscores  s    
z@TestDataFrameQueryBacktickQuoting.test_same_name_but_underscoresc                 C   s*   | d}|d |d  }t|| d S )NzA + `D_D D`r   rj  rw  rt  r   r   r   !test_mixed_underscores_and_spaces  s    
zCTestDataFrameQueryBacktickQuoting.test_mixed_underscores_and_spacesc                 C   s*   | d}|d |d  }t|| d S )Nz	A + `C_C`r   ri  rw  rt  r   r   r   'test_backtick_quote_name_with_no_spaces  s    
zITestDataFrameQueryBacktickQuoting.test_backtick_quote_name_with_no_spacesc                 C   s2   | d}|d |d  |d  }t|| d S )Nz`E.E` + `F-F` - Ark  rl  r   rw  rt  r   r   r   test_special_characters  s    
z9TestDataFrameQueryBacktickQuoting.test_special_charactersc                 C   s*   | d}|d |d  }t|| d S )Nz	A + `1e1`r   rm  rw  rt  r   r   r   test_start_with_digit  s    
z7TestDataFrameQueryBacktickQuoting.test_start_with_digitc                 C   s*   | d}|d |d  }t|| d S )Nz	A + `def`r   rn  rw  rt  r   r   r   test_keyword  s    
z.TestDataFrameQueryBacktickQuoting.test_keywordc                 C   s*   | d}||d dk }t|| d S )Nz`A` > 2r   r    rs  rt  r   r   r   test_unneeded_quoting  s    
z7TestDataFrameQueryBacktickQuoting.test_unneeded_quotingc                 C   s*   | d}||d dk }t|| d S )Nz`A (x)` > 2ro  r    rs  rt  r   r   r   test_parenthesis  s    
z2TestDataFrameQueryBacktickQuoting.test_parenthesisc                 C   s*   | d}||d dk }t|| d S )Nz`` > 5rp   ra   rs  rt  r   r   r   test_empty_string  s    
z3TestDataFrameQueryBacktickQuoting.test_empty_stringc                 C   s*   | d}||d dk }t|| d S )Nz
`C  C` > 5rh  ra   rs  rt  r   r   r   test_multiple_spaces  s    
z6TestDataFrameQueryBacktickQuoting.test_multiple_spacesc                 C   s*   | d}|d |d  }t|| d S )Nz` A` + `  `rq  rr  rw  rt  r   r   r   test_start_with_spaces  s    
z8TestDataFrameQueryBacktickQuoting.test_start_with_spacesc                 C   s*   | d}||d dk }t|| d S )Nu"   `  &^ :!€$?(} >    <++*''  ` > 4rp  rC   rs  rt  r   r   r   test_lots_of_operators_string  s    
z?TestDataFrameQueryBacktickQuoting.test_lots_of_operators_stringc              	   C   s,   d}t jt|d |d W 5 Q R X d S )Nz(module 'pandas' has no attribute 'thing'r8   z	@pd.thing)r   r:   AttributeErrorr0   )r&   r"   messager   r   r   test_missing_attribute  s    z8TestDataFrameQueryBacktickQuoting.test_missing_attributec              	   C   s,   d}t jt|d |d W 5 Q R X d S )N6(Could not convert ).*( to a valid Python identifier.)r8   z`it's` > `that's`r   r:   r   r-   rn   r   r   r   test_failing_quote  s    z4TestDataFrameQueryBacktickQuoting.test_failing_quotec              	   C   s,   d}t jt|d |d W 5 Q R X d S )Nr  r8   u	   `☺` > 4r  rn   r   r   r   $test_failing_character_outside_range  s    zFTestDataFrameQueryBacktickQuoting.test_failing_character_outside_rangec              	   C   s,   d}t jt|d |d W 5 Q R X d S )NzFailed to parse backticksr8   z`foo#bar` > 4r  rn   r   r   r   test_failing_hashtag  s    z6TestDataFrameQueryBacktickQuoting.test_failing_hashtagc              	   C   sd   dd }|g}| d tjtdd | d W 5 Q R X tjtdd | d W 5 Q R X dS )	z
        Only attributes and variables ('named functions') can be called.
        .__call__() is not an allowed attribute because that would allow
        calling anything.
        https://github.com/pandas-dev/pandas/pull/32460
        c                  W   s   dS )Nr   r   )_r   r   r   rO    s    zNTestDataFrameQueryBacktickQuoting.test_call_non_named_expression.<locals>.funcz@func()z"Only named functions are supportedr8   z@funcs[0]()z@funcs[0].__call__()N)r0   r   r:   r   )r&   r"   rO  funcsr   r   r   test_call_non_named_expression  s    
z@TestDataFrameQueryBacktickQuoting.test_call_non_named_expressionN)r>   r?   r@   r   fixturer"   ru  rv  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   ra  ^  s0   

!ra  )&r  numpyrY   r   Zpandas.util._test_decoratorsutilZ_test_decoratorstdr	   rx   r   r   r   r   r   Zpandas._testingZ_testingr.   Zpandas.core.computation.checkr   ZPARSERSr   Zskip_if_no_neZENGINESr  r   r   r   r   rA   r   r   r  r   r%  r&  rY  ra  r   r   r   r   <module>   s<   

4a H  |l 6