U
    ¾mœd`Ë  ã                   @   sh  d dl Z d dlZd dlZd dlmZm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 ejddgdd„ d	�d
d„ ƒZejdejde
jd�g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)ÚNumExprClobberingErrorÚUndefinedVariableError)Ú	DataFrameÚIndexÚ
MultiIndexÚSeriesÚ
date_range)ÚNUMEXPR_INSTALLEDÚpythonÚpandasc                 C   s   | S ©N© ©Úxr   r   ú[/home/sam/Atlas/atlas_env/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   Únumexpr)Zmarksc                 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                   @   sV   e Zd Zejdd„ ƒZejdd„ ƒZej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ƒS )NÚAé   é   é   ©r   ©Úselfr   r   r   Údf*   s    zTestCompat.dfc                 C   s   ||j dk S )Nr   ©r    ©r&   r'   r   r   r   Ú	expected1.   s    zTestCompat.expected1c                 C   s
   |j d S ©Nr!   r(   r)   r   r   r   Ú	expected22   s    zTestCompat.expected2c                 C   s4   |  d¡}t ||¡ | d¡}tj||dd� d S )NúA>0úA+1F©Zcheck_names©ÚqueryÚtmÚassert_frame_equalÚevalÚassert_series_equal©r&   r'   r*   r,   Úresultr   r   r   Útest_query_default6   s    

zTestCompat.test_query_defaultc                 C   s<   |j dd d�}t ||¡ |jdd d�}tj||dd� d S )Nr-   ©r   r.   Fr/   r0   r6   r   r   r   Útest_query_None>   s    zTestCompat.test_query_Nonec                 C   s<   |j ddd�}t ||¡ |jddd�}tj||dd� d S )Nr-   r
   r9   r.   Fr/   r0   r6   r   r   r   Útest_query_pythonD   s    zTestCompat.test_query_pythonc              	   C   s–   t r>|jddd�}t ||¡ |jddd�}t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   r9   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	   r1   r2   r3   r4   r5   r   ÚraisesÚImportError)r&   r'   r*   r,   r7   Úmsgr   r   r   Útest_query_numexprJ   s    ÿzTestCompat.test_query_numexprN)Ú__name__Ú
__module__Ú__qualname__r   Úfixturer'   r*   r,   r8   r:   r;   rA   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ršt||ƒ|ƒ}	t
 |	|¡ n"|dkr¼t||ƒ|ƒ}	t
 |	|¡ d S )Nr!   Úabcd©ÚindexÚcolumnsr"   r   éÿÿÿÿ©rX   zbase z dfzm )rI   rO   )rL   rR   )r   ÚrangeÚlistÚilocZmeanÚnpZtileÚvaluesZreshaper4   r2   r3   Úgetattr)
r&   Zop_strÚopZroprG   r'   ÚmÚbaseÚexpectedr7   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    i¨a  r   é   r!   é   )	r   r^   ÚrandomÚrandnÚnanr]   Úisnanr2   r3   )r&   r'   rd   r7   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 evaluatedr<   c                 S   s
   | j dkS )Nrn   )rp   r   r   r   r   r   “   r   z6TestDataFrameEval.test_query_non_str.<locals>.<lambda>éo   ©r   r   r>   Ú
ValueErrorr1   ©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 stringr<   Ú rr   rt   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"   ÚabrZ   rm   r!   rn   úa + b©Ú	resolvers)r   r^   rh   ri   r\   r4   Ú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 )
Nrx   r"   ry   rZ   Úcz	a + b * cr{   rm   rn   )r   r^   rh   ri   r\   r4   r2   r5   )r&   r'   r   r7   rd   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   r4   r2   r3   )r&   r'   Úresrd   r   r   r   Útest_eval_object_dtype_binop³   s    
z.TestDataFrameEval.test_eval_object_dtype_binopN)rB   rC   rD   r   ÚmarkÚparametrizere   rl   ru   rw   r€   r‚   r‡   r   r   r   r   rF   \   s    üþ		rF   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Úgreenrx   ©ÚsizeÚeggsÚhamÚcolorZfood)Únamesr"   ©rW   ©rW   Ú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   r^   rh   Úchoicer   Úfrom_arraysr   ri   r   rW   Úget_level_valuesr_   r1   r2   r3   Úisin©r&   r   r   rm   rn   rW   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Œ   rx   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Œ   rx   r�   Zratingr"   r“   zrating == 1r–   r”   r!   zrating != 1r    r   r¡   )r   r^   rh   r˜   Úaranger   r™   r’   r   ri   r1   r   rW   rš   r_   r2   r3   )
r&   r   r   rm   rn   rW   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€| 	|| ¡s¤t
‚qZt|tƒrœt  ||| ¡ qZt
d
ƒ‚qZd S )Nrx   r#   r"   Úspamr�   )Zr_idx_nlevelsZr_idx_namesc                 S   s   |   |¡}| ¡ }| |_|S r   )rš   Ú	to_seriesrW   )ÚmiÚlevelZlevel_valuesÚsr   r   r   r¦   k  s    
z]TestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolvers.<locals>.to_series)rW   rX   r¥   r�   ZC0z object must be a Series or Index)r2   ZmakeCustomDataframeZ_get_index_resolversrX   r¦   rW   ÚitemsÚ
isinstancer   Úis_r}   r   r5   )r&   r'   r|   r¦   Z
col_seriesrd   ÚkÚvr   r   r   Ú)test_query_multiindex_get_index_resolverse  s*       ÿ


û

zJTestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolversN)rB   rC   rD   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ej d1d2ej gd3ej!gg¡d4d5„ ƒZ"d6d7„ Z#d8d9„ Z$d:S );Ú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 )Nrf   r#   ú1/1/2012©ÚperiodsÚdates1ú1/1/2013Údates2ú1/1/2014Údates3z"@df.dates1 < 20130101 < @df.dates3r±   Ú20130101)r   r   r   r   r^   rh   ri   r   r1   r¹   r½   r2   r3   ©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 )Nrf   r#   r¶   r·   r¹   rº   r»   r¼   r½   údates1 < 20130101 < dates3r±   r¾   ©r   r   r   r^   rh   ri   r   r1   r¹   r½   r2   r3   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 )Nrx   r#   r¶   r·   r¹   rº   r»   r¼   r½   ç      à?rÂ   r±   r¾   ©r   r   r   r^   rh   ri   r   r~   ÚNaTÚlocÚrandr1   r¹   r½   r2   r3   ©r&   r   r   rG   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 )Nrx   r#   r¶   r·   r¹   r¼   r½   T©ZinplaceZdropúindex < 20130101 < dates3r±   r¾   ©r   r   r   r^   rh   ri   r   Ú	set_indexr}   r1   rW   r½   r2   r3   ©r&   r   r   rG   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¡ƒ dti¡}td|d�|d< td|d�|d< t	j
|jd	< |jdd
d
d�}|d ksvt‚|jd||d�}||jdk d|jk @  }t ||¡ d S )Nrx   r#   r   r¶   r·   r¹   r¼   r½   ©r   r   TrÌ   rÍ   r±   r¾   ©r   r   r   r^   rh   ri   ÚastypeÚobjectr   r~   rÇ   r]   rÏ   r}   r1   rW   r½   r2   r3   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 )Nrx   r¶   r·   r¹   r¼   r½   rÅ   TrÌ   rÂ   r±   r¾   )r   r   r   r   r~   rÇ   rÈ   r^   rh   rÉ   rÏ   r}   r1   rW   r¦   r½   r2   r3   )	r&   r   r   rG   Ú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 )Nrx   r¶   r·   )ÚdatesZnondatezdates == nondater–   r   zdates != nondatez=Invalid comparison between dtype=datetime64\[ns\] and ndarray)ú<ú>ú<=ú>=r<   zdates z nondate)r   r   r   r   r^   r£   r1   Úlenr}   r2   r3   r   r>   Ú	TypeError)r&   r   r   rG   r'   r7   r@   ra   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 )Nrx   r#   é   rH   é   )ÚirI   Úrzinvalid syntaxr<   zi - +r±   )r   r   r   r[   r   r>   ÚSyntaxErrorr1   )r&   r   r   r'   r@   r   r   r   Útest_query_syntax_errorì  s
     z7TestDataFrameQueryNumExprPandas.test_query_syntax_errorc              	   C   sæ   | 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td	d
�� |jd||d� W 5 Q R X tjtdd
�� |jd||d� W 5 Q R X d S )Né   r"   ry   rZ   )r!   r"   za > br±   z@a > bú!local variable 'c' is not definedr<   z@a > b > @czname 'c' is not definedz
@a > b > c)r   r   r   r   r^   rh   ri   r\   r1   rm   rn   r2   r3   r   r>   r   )r&   r   r   r'   rm   rn   r†   rd   r   r   r   Útest_query_scopeó  s"     ÿz0TestDataFrameQueryNumExprPandas.test_query_scopec              	   C   sd   | j | j }}d }}ttjj||dfd�tdƒd�}tjt	dd�� |j
d||d	� W 5 Q R X d S )
Nrx   r#   r�   ÚabcrZ   zname 'sin' is not definedr<   úsin > 5r±   )r   r   r   r^   rh   Úrandintr\   r   r>   r   r1   )r&   r   r   rG   rb   r'   r   r   r   Útest_query_doesnt_pickup_local  s
     z>TestDataFrameQueryNumExprPandas.test_query_doesnt_pickup_localc              	   C   sp   | j | j }}d }}ttjj||dfd�tdƒd�}d|j_d}t	j
t|d�� |jd	||d
� W 5 Q R X d S )Nrx   r#   r�   rë   rZ   ÚsinzVariables in expression.+r<   rì   r±   )r   r   r   r^   rh   rí   r\   rW   r•   r   r>   r   r1   )r&   r   r   rG   rb   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 )
Nrx   r#   rm   rn   r�   rZ   úa < br±   za + b > b * c)r   r   r   r^   rh   ri   r2   r3   r1   rm   rn   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 )Nrx   ©rx   r#   r�   Zblob©r•   rm   rn   r�   rV   z(blob < 5) & (a < b)r±   rf   zblob < b)r   r   r   r^   rh   rí   r   r[   r1   rW   rm   rn   r2   r3   r¿   r   r   r   Útest_query_index_with_name,  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 )Nrx   rô   r�   rm   rn   r�   rV   z	index < br±   z	index < 5rf   )r   r   r   r^   rh   rí   r[   r1   rW   rn   r2   r3   r¿   r   r   r   Útest_query_index_without_name<  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 )
Nrf   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   r^   rh   ri   r1   r2   r3   r~   r4   )r&   r   r   r'   Údf2rd   r7   r   r   r   Útest_nested_scopeN  s(      ÿ$z1TestDataFrameQueryNumExprPandas.test_nested_scopec              	   C   sD   t tj dd¡ƒ}tjtdd�� |jd| j| j	d� W 5 Q R X d S )Nrf   r#   úname 'df' is not definedr<   zdf > 0r±   )
r   r^   rh   ri   r   r>   r   r1   r   r   r)   r   r   r   Ú*test_nested_raises_on_local_self_referenceh  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 )	Néd   rx   Z
abcdefghijrZ   r!   za < @br±   rñ   )r   r   r   r   r^   rh   ri   r\   rm   r1   r2   r3   rn   )r&   r   r   r'   rn   Úexpectr7   r   r   r   Útest_local_syntaxo  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ý   rZ   z!a < b < c and a not in b not in cr±   )r   r   r   r\   r   r^   rh   ri   rß   r1   rm   rn   r�   r›   r2   r3   )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�   rm   rõ   rx   rn   ©rm   rn   r!   z
b - 1 in ar±   z@b - 1 in a)r   r   r   r   r^   rh   rí   r   rÈ   rn   r›   r1   r2   r3   )r&   r   r   rm   rn   r'   rd   r7   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!   rm   rn   z@cz	a == "@c"r±   )r   r   r   r   r1   rm   r2   r3   )r&   r   r   r�   r'   r7   rd   r   r   r   Útest_at_inside_string™  s    z5TestDataFrameQueryNumExprPandas.test_at_inside_stringc              	   C   s^   | j | j }}t|ƒ ttj dd¡tdƒd�}tj	t
dd�� |jd||d� W 5 Q R X d S )	Nrx   r"   ry   rZ   ré   r<   za == @cr±   )r   r   r   r   r^   rh   rÉ   r\   r   r>   r   r1   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   )rW   rn   rW   z	index > 5r±   rf   zilevel_0 > 5r  rm   za > 5)r^   Zr_r   rh   ri   rŽ   rW   r•   r1   r   r   r2   r3   rÈ   rm   )r&   rG   rm   r'   r7   rd   r   r   r   Ú:test_index_resolvers_come_after_columns_with_the_same_name¬  s&    zZTestDataFrameQueryNumExprPandas.test_index_resolvers_come_after_columns_with_the_same_namezop, fú==ú!=c                 C   sz   d}t tj |¡tj |¡dœƒ}tj|jd d d…df< d|› d�}|||jtjƒ }|j|| j| j	d�}t
 ||¡ d S )Nrx   r  r"   r   úa z infr±   )r   r^   rh   rÉ   ÚinfrÈ   rm   r1   r   r   r2   r3   )r&   ra   ÚfrG   r'   Úqrd   r7   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1drx   Útime)ÚstartÚfreqr¸   Útzr•   r“   z"2018-01-03 00:00:00+00" < time)r   r   r1   r2   r3   Zreset_index)r&   Ztz_aware_fixturer  Zdf_indexrd   r'   r7   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 )Nrx   r"   r  rm   Úintr   za.astype('int') == 0r±   rÅ   za.notnull())r   r^   rh   rÉ   rÕ   r1   r   r   r2   r3   Úwhererj   ri   Znotnull)r&   rG   r'   rd   r7   r   r   r   Útest_method_calls_in_queryÞ  s"    "  ÿ"
þÿz:TestDataFrameQueryNumExprPandas.test_method_calls_in_queryN)%rB   rC   rD   Ú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‰   ÚoperatorÚeqÚner  r  r  r   r   r   r   r°   ‚  s<   


		

	r°   c                       sX   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
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 )Nrf   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 )Nrx   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 )Nrx   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¡ƒ dti¡}td|d�|d< td|d�|d< t	j
|jd	< |jdd
d
d�}|d ksvt‚|jd||d�}||jdk d|jk @  }t ||¡ d S )Nrx   r#   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 )Nrx   r#   r¶   r·   r¹   r¼   r½   rÅ   TrÌ   ú"'BoolOp' nodes are not implementedr<   rÍ   r±   )r   r   r   r^   rh   ri   r   r~   rÇ   rÈ   rÉ   rÏ   r}   r   r>   ÚNotImplementedErrorr1   )r&   r   r   rG   r'   rÑ   r@   r   r   r   rÙ   4  s    zITestDataFrameQueryNumExprPython.test_date_index_query_with_NaT_duplicatesc           	   	   C   s  | j }| j}d}tjd||d�}|dks,t‚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
t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!   zx + 1r±   r"   rf   r#   z5The '@' prefix is only supported by the pandas parserr<   rø   rû   z(df>0) & (df2>0)r   zdf[(df > 0) & (df2 > 0)]z+df[(df > 0) & (df2 > 0) & (df[df > 0] > 0)])r   r   r~   r4   r}   r   r^   rh   ri   r   r>   ræ   r1   r   r2   r3   )	r&   r   r   r   r7   r'   rù   r@   rd   r   r   r   rú   A  s,    $  ÿz1TestDataFrameQueryNumExprPython.test_nested_scopec              	   C   sn   t dddgdddgdœƒ}d}tjt|d	�� | d
¡ W 5 Q R X d}tjt|d	�� | d¡ W 5 Q R X d S )Nr!   r"   r#   rH   rf   é   )ÚminÚmaxzMVariables in expression \"\(min\) == \(1\)\" overlap with builtins: \('min'\)r<   zmin == 1zMVariables in expression \"\(max\) == \(1\)\" overlap with builtins: \('max'\)zmax == 1)r   r   r>   r   r1   )r&   r'   Zregex_to_matchr   r   r   Ú+test_query_numexpr_with_min_and_max_columns^  s    ÿÿzKTestDataFrameQueryNumExprPython.test_query_numexpr_with_min_and_max_columns)rB   rC   rD   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´   p  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 ©
Nrx   r#   r�   rë   rZ   rï   rf   rì   r±   ©r   r   r   r^   rh   rí   r\   rW   r•   r1   r2   r3   ©r&   r   r   rG   rb   r'   rd   r7   r   r   r   rð   v  s     z1TestDataFrameQueryPythonPandas.test_query_builtin©rB   rC   rD   r  r´   rð   r)  r   r   r  r   r*  o  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                   @   s‚   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	j
 ddejgdejgdejgdejgg¡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räd}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 q�n´|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 )Nrx   r!   rn   rZ   Ú
aabbccddeeÚstringsrm   r   z"a"r"   rY   ©r	  r
  ú$'(Not)?In' nodes are not implementedú r<   )r   r   Z
local_dictz"a" == stringsr±   zstrings == "a"zstrings != "a"z"a" != strings)r   r^   rh   ri   r   r\   r2  Úzipr   r>   r$  r1   r2   r3   r›   ©r&   r   r   r'   rþ   ÚcolÚlstÚlhsÚrhsr  r  Zopsr@   ra   Ú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râd}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 q–n†|jd||d�}t ||¡ |jd||d�}t ||¡ ||j ddg¡  }|jd||d�}t ||¡ |jd||d�}t ||¡ d S )Nrx   r!   rn   rZ   r1  r2  rm   r   z
["a", "b"]r"   rY   r3  r4  r5  r<   r±   zstrings == ["a", "b"]z["a", "b"] == stringszstrings != ["a", "b"]z["a", "b"] != strings)r   r^   rh   ri   r   r\   r2  r›   r6  r   r>   r$  r1   r2   r3   r7  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Úaabbccddeeffrf   é   r�   é	   ©rm   rn   r�   rØ   r   za in br–   za in b and c < dr4  r<   r#  )r   r\   r^   rh   rí   r1   rm   r›   rn   r2   r3   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 )Nr?  r@  rf   rA  r�   rB  rC  za == br–   za != b)
r   r\   r^   rh   rí   r1   rm   rn   r2   r3   )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 r5  r   )Ú.0rG   Zactr   r   r   Ú
<listcomp>  s      zLTestDataFrameQueryStrings.test_query_with_nested_strings.<locals>.<listcomp>r!   rH   r"   z2014-01-01 0:00:01Z30sr%  )r  r¸   z2014-02-01 1:00:01é   )ÚidÚeventÚ	timestampz"page 1 load"z'"page 1 load"' in eventr–   )r   r[   r   r   r^   r£   ÚrepeatÚappendrL  r1   r2   r3   )	r&   r   r   ÚeventsZstamps1Zstamps2r'   rd   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 )
Nrm   rn   ztest & testr!   r"   r#   r  za == "test & test"r–   )r   r   r1   rm   r2   r3   )r&   r   r   r'   r†   rÀ   r   r   r   Ú(test_query_with_nested_special_character  s
    zBTestDataFrameQueryStrings.test_query_with_nested_special_characterzop, funcrÛ   rÜ   rÝ   rÞ   c           
      C   sl   t tj tdƒd¡ƒ}t t |j¡ƒ}t||dœƒ}|jd|› d�||d�}|||j	dƒ }	t
 ||	¡ d S )NZabcderè   )ÚXr„   zX z "d"r±   rØ   )r   r^   rh   r˜   r\   r£   rŽ   r   r1   rS  r2   r3   )
r&   r   r   ra   Úfuncrm   rn   r'   r†   rd   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�   rZ   z	bid & askr±   )r^   rh   rí   rß   rÕ   Úboolr   r1   rV  rW  r2   r3   )r&   r   r   rX   Údatar'   r†   rd   r   r   r   Ú"test_query_single_element_booleans8  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 USgÍÌÌÌÌl[@g®Gázn[@gš™™™™éf@g33333ëf@)ÚSymbolZPricezSymbol == @symbr–   )r   r   r[  r1   r2   r3   )r&   r   r   r'   ÚeZsymbrå   r   r   r   Ú!test_query_string_scalar_variable@  s    

þÿz;TestDataFrameQueryStrings.test_query_string_scalar_variableN)rB   rC   rD   r=  r>  rD  rE  rQ  rR  r   rˆ   r‰   r  ÚltÚgtÚleÚgerU  rZ  r]  r   r   r   r   r0  ”  s"   )#üþ	
	r0  c                   @   sH   e Zd Zej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�S )Nrx   r#   rë   rZ   )r   r^   rh   ri   r\   r%   r   r   r   ÚframeO  s    z TestDataFrameEvalWithFrame.framec                 C   s,   |j d||d�}|j|j }t ||¡ d S )Nrz   r±   ©r4   rm   rn   r2   r5   ©r&   rc  r   r   r†   rþ   r   r   r   Útest_simple_exprS  s    z+TestDataFrameEvalWithFrame.test_simple_exprc                 C   s6   |j d||d�}|j|jdk  |j }t ||¡ d S )Nza[a < 1] + br±   r!   rd  re  r   r   r   Útest_bool_arith_exprX  s    z/TestDataFrameEvalWithFrame.test_bool_arith_exprra   rI   rL   rO   rR   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 '.+'r<   r  z br±   )r   r   r>   rà   r4   )r&   r   r   ra   r'   r@   r   r   r   Ú%test_invalid_type_for_operator_raises]  s    z@TestDataFrameEvalWithFrame.test_invalid_type_for_operator_raisesN)rB   rC   rD   r   rE   rc  rf  rg  rˆ   r‰   rh  r   r   r   r   rb  N  s   
rb  c                   @   s,  e Zd Zej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-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zej  d5d6d7d8g¡d9d:„ ƒZ!ej  d;d<d=g¡ej  d5d6d7d8g¡d>d?„ ƒƒZ"d@S )AÚ!TestDataFrameQueryBacktickQuotingc                 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#   rH   rf   r%  rJ  é   rB  rx   é   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)õ     &^ :!â‚¬$?(} >    <++*''  rv   ú Aú  zit'szthat'su   â˜ºzfoo#barr!   Nr$   r%   r   r   r   r'   g  s2    êÿz$TestDataFrameQueryBacktickQuoting.dfc                 C   s*   |  d¡}|d|d k  }t ||¡ d S )Nz	1 < `B B`r!   rl  ©r1   r2   r3   ©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!   rl  rH   rm  ry  rz  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    rl  ©r4   r2   r5   rz  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`rl  rm  r}  rz  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` + Aro  r    r}  rz  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`ro  rm  r}  rz  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    rp  r}  rz  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    ro  r}  rz  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` - Arq  rr  r    r}  rz  r   r   r   Útest_special_characters±  s    
z9TestDataFrameQueryBacktickQuoting.test_special_charactersc                 C   s*   |  d¡}|d |d  }t ||¡ d S )Nz	A + `1e1`r    rs  r}  rz  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    rt  r}  rz  r   r   r   Útest_keyword»  s    
z.TestDataFrameQueryBacktickQuoting.test_keywordc                 C   s*   |  d¡}||d dk }t ||¡ d S )Nz`A` > 2r    r"   ry  rz  r   r   r   Útest_unneeded_quotingÀ  s    
z7TestDataFrameQueryBacktickQuoting.test_unneeded_quotingc                 C   s*   |  d¡}||d dk }t ||¡ d S )Nz`A (x)` > 2ru  r"   ry  rz  r   r   r   Útest_parenthesisÅ  s    
z2TestDataFrameQueryBacktickQuoting.test_parenthesisc                 C   s*   |  d¡}||d dk }t ||¡ d S )Nz`` > 5rv   rf   ry  rz  r   r   r   Útest_empty_stringÊ  s    
z3TestDataFrameQueryBacktickQuoting.test_empty_stringc                 C   s*   |  d¡}||d dk }t ||¡ d S )Nz
`C  C` > 5rn  rf   ry  rz  r   r   r   Útest_multiple_spacesÏ  s    
z6TestDataFrameQueryBacktickQuoting.test_multiple_spacesc                 C   s*   |  d¡}|d |d  }t ||¡ d S )Nz` A` + `  `rw  rx  r}  rz  r   r   r   Útest_start_with_spacesÔ  s    
z8TestDataFrameQueryBacktickQuoting.test_start_with_spacesc                 C   s*   |  d¡}||d dk }t ||¡ d S )Nu"   `  &^ :!â‚¬$?(} >    <++*''  ` > 4rv  rH   ry  rz  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'r<   z	@pd.thing)r   r>   ÚAttributeErrorr4   )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 )Nú6(Could not convert ).*( to a valid Python identifier.)r<   z`it's` > `that's`©r   r>   ræ   r1   rt   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�  r<   u	   `â˜º` > 4r‘  rt   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 backticksr<   z`foo#bar` > 4r‘  rt   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 r+   r   )Ú_r   r   r   rT  ú  s    zNTestDataFrameQueryBacktickQuoting.test_call_non_named_expression.<locals>.funcz@func()z"Only named functions are supportedr<   z@funcs[0]()z@funcs[0].__call__()N)r4   r   r>   rà   )r&   r'   rT  Úfuncsr   r   r   Útest_call_non_named_expressionò  s    
z@TestDataFrameQueryBacktickQuoting.test_call_non_named_expressionc              	   C   s~   t ddgddggddg|d�}tr&tnd }t |¡� | d¡}W 5 Q R X t dddgdddggddd	g|d�}t ||¡ d S )
Nr!   r"   r#   rH   rm   rn   ©rX   Údtypez	c = b - ar�   ©r   r	   ÚRuntimeWarningr2   Úassert_produces_warningr4   r3   )r&   Úany_numeric_ea_and_arrow_dtyper'   Úwarningr7   rd   r   r   r   Útest_ea_dtypes  s      ÿýz0TestDataFrameQueryBacktickQuoting.test_ea_dtypesc              	   C   s~   t ddgddggddgdd�}tr&tnd }t |¡� | d	¡}W 5 Q R X t dddgdddggddd
gdd�}t ||¡ d S )Nr!   r"   r#   rH   rm   rn   ZFloat64r˜  z	c = b - 1r�   rš  )r&   r'   rž  r7   rd   r   r   r   Útest_ea_dtypes_and_scalar  s      ÿz;TestDataFrameQueryBacktickQuoting.test_ea_dtypes_and_scalarc                 C   sr   t ddgddggddg|d�}| d¡}t tddg|d	�tddg|d	�tddg|d
 jd	�dœƒ}t ||¡ d S )Nr!   r"   r#   rH   rm   rn   r˜  z	c = 2 - 1©r™  r�   )rm   rn   r�   )r   r4   r   r™  r2   r3   )r&   r�  r'   r7   rd   r   r   r   Ú#test_ea_dtypes_and_scalar_operation!  s      ÿ
ýÿzETestDataFrameQueryBacktickQuoting.test_ea_dtypes_and_scalar_operationr™  Zint64ÚInt64úint64[pyarrow]c              	   C   sŽ   |dkrt  d¡ tdtddg|d�iƒ}dh}|dkr@tr@tnd }t |¡� | d¡}W 5 Q R X tdtdg|dgd	�iƒ}t 	||¡ d S )
Nr¤  Úpyarrowrm   r!   r"   r¡  r£  z	a in @ref©r™  rW   )
r   Úimportorskipr   r   r	   r›  r2   rœ  r1   r3   )r&   r™  r'   Úrefrž  r7   rd   r   r   r   Útest_query_ea_dtypes0  s    
z6TestDataFrameQueryBacktickQuoting.test_query_ea_dtypesr   r
   r   c              	   C   sÈ   |dkrt nd }|dkr&ts&t d¡ |dkr8t d¡ ttdddgdd�tdddg|d�d	œƒ}t |¡� |j	d
|d�}W 5 Q R X ttddgdddgd�tddg|ddgd�d	œƒ}t 
||¡ d S )Nr   znumexpr not installedr¤  r¥  r!   r"   r£  r¡  ro   zA == Br9   r   r¦  )r›  r	   r   r   r§  r   r   r2   rœ  r1   r3   )r&   r™  r   rž  r'   r7   rd   r   r   r   Ú!test_query_ea_equality_comparison=  s     

$ÿþÿzCTestDataFrameQueryBacktickQuoting.test_query_ea_equality_comparisonN)#rB   rC   rD   r   rE   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   r   r   r   ri  f  s@   
!
ri  )'r  Únumpyr^   r   Zpandas.errorsr   r   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsÚtdr   r~   r   r   r   r   r   Zpandas._testingZ_testingr2   Zpandas.core.computation.checkr	   rE   r   r   Zskip_if_no_ner   r   r   rF   rŠ   r°   r  r*  r/  r0  rb  ri  r   r   r   r   Ú<module>   s@   
 ÿ
3_ H  r{ ;