a
    =Â×_•®  ã                   @   sö  d Z ddlZddlZddlZddlZddlZddlZddl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mZmZmZmZmZmZmZmZmZ d	Zd
Zeejee	d d Z e!e e d ¡ƒd Z"de" Z#dZ$ej%e&fej'e!fej(e!fej)e!fej*e!fej+e!fej,e!fej-e!fej.e!fej/e0fej1e0fej2e3fej4e3fej+e!fej1e0fej(e!fde" ej5fdœZ6eeeeeeeeeeedœZ7e8edƒr´ej9e0fe6d< e:dd„ e6 ;¡ D ƒƒZ<e:dd„ e6 ;¡ D ƒƒZ=e>g d¢ƒZ?e @e:dd„ eAe ƒD ƒƒ¡ZBd«dd„ZCd¬dd„ZDd­dd„ZEeEdd ƒZFeEd!d"ed#ZGi ZHd$d%„ ZIG d&d'„ d'ejJƒZKG d(d)„ d)ejLeƒZMG d*d+„ d+ƒZNG d,d-„ d-ƒZOg d.¢ZPe>g d/¢ƒZQed0 ZRed1 d0 ZSd2ZTg d3¢ZUG d4d5„ d5eMƒZVd®d6d7„ZWd¯d9d:„ZXdaYe6D ]*ZZePD ]Z[eUD ]Z\eXeZe[e\ƒ qüqôqìd;D ],ZZe7D ] Z]ePD ]Z[eXeZe[e]d< q,q$qd=Z^d>Z_G d?d@„ d@ƒZ`G dAdB„ dBƒZadCdDgZbe>dDgƒZcdEgZddFdG„ ZeG dHdI„ dIƒZfG dJdK„ dKƒZgG dLdM„ dMƒZhG dNdO„ dOƒZiG dPdQ„ dQƒZjG dRdS„ dSƒZkG dTdU„ dUƒZlg dV¢Zmg dW¢Zne>dXdDgƒZog dY¢Zpe>g dZ¢ƒZqd[d\„ ZreeerfD ]DZsesƒ D ]6\ZtZuZvewd]d„ euD ƒƒZxeyetexevƒZze{d^et ƒ q:q0G d_d`„ d`eMƒZ|da}G dadb„ dbeNe|ƒZ~G dcdd„ ddeOe|ƒZG dedf„ dfeNe|ƒZ€G dgdh„ dhe€ƒZG didj„ dje€ƒZ‚G dkdl„ dle€ƒZƒG dmdn„ dne€ƒZ„G dodp„ dpe€ƒZ…G dqdr„ dre€ƒZ†G dsdt„ dte€ƒZ‡G dudv„ dve€ƒZˆG dwdx„ dxe€ƒZ‰G dydz„ dze€ƒZŠG d{d|„ d|e€ƒZ‹G d}d~„ d~e€ƒZŒG dd€„ d€e€ƒZG dd‚„ d‚e€ƒZŽG dƒd„„ d„e€ƒZG d…d†„ d†e€ƒZG d‡dˆ„ dˆe€ƒZ‘G d‰dŠ„ dŠe€ƒZ’G d‹dŒ„ dŒe€ƒZ“G ddŽ„ dŽe€ƒZ”G dd„ de€ƒZ•G d‘d’„ d’e€ƒZ–G d“d”„ d”e€ƒZ—G d•d–„ d–e€ƒZ˜G d—d˜„ d˜e€ƒZ™G d™dš„ dše€ƒZšG d›dœ„ dœe€ƒZ›G ddž„ dže€ƒZœG dŸd „ d e€ƒZG d¡d¢„ d¢e€ƒZžG d£d¤„ d¤e€ƒZŸG d¥d¦„ d¦e€ƒZ d§d¨„ Z¡e¢d©kròe £ej¤¡ e ¥¡  ej¦d¨dª dS )°z$Test module for queries on datasets.é    N)ÚSizeType)Úcommon)Úunittest)ÚverbosePrint)ÚPyTablesTestCase)Úlog10ÚexpÚlogÚabsÚsqrtÚsinÚcosÚtanÚarcsinÚarccosÚarctané2   )é   r   ©Údtypeé   z%%0%dd)i,  é<   é   é   zS%s)ÚboolÚint8Úuint8Úint16Úuint16Úint32Úuint32Úint64Úuint64Úfloat32Úfloat64Ú	complex64Ú
complex128Ztime32Ztime64ÚenumÚstring)r   r	   r   r
   r   r   r   r   r   r   r   Úfloat16c                 c   s   | ]\}}||d  fV  qdS )r   N© ©Ú.0Útype_Úinfor*   r*   ú8lib/python3.9/site-packages/tables/tests/test_queries.pyÚ	<genexpr>_   s   ÿr0   c                 c   s   | ]\}}||d  fV  qdS )r   Nr*   r+   r*   r*   r/   r0   b   s   ÿ)r   r   r   r#   r%   c                 c   s   | ]}d | |fV  qdS )zn%dNr*   )r,   Úir*   r*   r/   r0   i   ó    r*   c                 C   s¦   t j}ttt ¡ ƒƒD ]†\}}|s,|tv r,q|d }d| }|dkrntj 	t
| ¡}tjttdƒ|||d}n&t
| }	t |	|f¡}
tjj|
|d}|| |< q|}|S )z«Append a ``Col`` of each PyTables data type to the `classdict`.

    A column of a certain TYPE gets called ``c_TYPE``.  The number of
    added columns is returned.

    r   úc_%sr'   r   ©ÚshapeÚpos)r6   )r   ÚheavyÚ	enumerateÚsortedÚ	type_infoÚkeysÚheavy_typesÚtablesZAtomZfrom_sctypeÚsctype_from_typeZEnumColr'   Únumpyr   ZColZ
from_dtype)Ú	classdictr5   r7   Zityper-   ÚcolposÚcolnameÚbaseÚcolÚsctyper   Zncolsr*   r*   r/   Úappend_columnso   s    
rF   c                 C   s(   i }t ||d ||d< t| tjf|ƒS )zÈReturn a nested column description with all PyTables data types.

    A column of a certain TYPE gets called ``c_TYPE``.  The nested
    column will be placed in the position indicated by `pos`.

    ©r5   Z_v_pos)rF   Útyper=   ÚIsDescription)Ú	classnamer6   r5   r@   r*   r*   r/   Únested_descriptionˆ   s    rK   c                 C   sx   i }t ||ƒ}t|||d}||d< |d7 }tj||d}||d< |d7 }tj||d}||d< |d7 }t| tjf|ƒS )aè  Return a table description for testing queries.

    The description consists of all PyTables data types, both in the
    top level and in the ``c_nested`` nested column.  A column of a
    certain TYPE gets called ``c_TYPE``.  An extra integer column
    ``c_extra`` is also provided.  If a `shape` is given, it will be
    used for all columns.  Finally, an extra indexed column
    ``c_idxextra`` is added as well in order to provide some basic
    tests for multi-index queries.

    rG   Úc_nestedr   r4   Úc_extraÚ
c_idxextra)rF   rK   r=   ZIntColrH   rI   )rJ   Z
nclassnamer5   r@   rA   ZndescrZextracolZidxextracolr*   r*   r/   Útable_description•   s    
rO   ÚTableDescriptionZNestedDescriptionÚMDTableDescriptionZMDNestedDescriptionrG   c                 C   sj  t  ||f¡}|dur,|  |¡ |  ¡  dS tj}ttj|t	dƒ}| j
d }}t|ƒD ]ð}t ||| ¡ |¡}	t ¡ D ]°\}
}|s|
tv rqzd|
 }d| }|
dkr¶|	td k}nD|
dkrìd	d
„ t||| ƒD ƒ}tj||d |¡}ntj|	|d}| ||< ||< |	td  |d< |	td  |d< qz| ¡  |d7 }|tkrXd}qX|  ¡  |  ¡ }|t ||f< dS )a[  Fill the given `table` with `nrows` rows of data.

    Values in the i-th row (where 0 <= i < `row_period`) for a
    multidimensional field with M elements span from i to i + M-1.  For
    subsequent rows, values repeat cyclically.

    The same goes for the ``c_extra`` column, but values range from
    -`row_period`/2 to +`row_period`/2.

    Nr   r   r3   úc_nested/%sr   r   r(   c                 S   s   g | ]}t | ‘qS r*   )Ú
str_format)r,   Úxr*   r*   r/   Ú
<listcomp>â   r2   zfill_table.<locals>.<listcomp>rM   rN   r   )Ú
table_dataÚgetÚappendÚflushr   r7   Úintr?   Úprodr   ÚrowÚrangeZarangeZreshaper>   Úitemsr<   Ú
row_periodÚarrayZasarrayÚread)Útabler5   ÚnrowsZtdatar7   Úsizer\   ÚvalueÚnrowÚdatar-   rE   rB   ÚncolnameZcoldataZsdatar*   r*   r/   Ú
fill_tableÂ   s>    
ri   c                   @   s   e Zd ZdS )ÚSilentlySkipTestN)Ú__name__Ú
__module__Ú__qualname__r*   r*   r*   r/   rj   ô   s   rj   c                       sD   e Zd ZdZdZdZe d¡Ze d¡Z	dd„ Z
‡ fdd	„Z‡  ZS )
ÚBaseTableQueryTestCasea4  Base test case for querying tables.

    Sub-classes must define the following attributes:

    ``tableDescription``
        The description of the table to be created.
    ``shape``
        The shape of data fields in the table.
    ``nrows``
        The number of data rows to be generated for the table.

    Sub-classes may redefine the following attributes:

    ``indexed``
        Whether columns shall be indexed, if possible.  Default is not
        to index them.
    ``optlevel``
        The level of optimisation of column indexes.  Default is 0.

    Fr   z\bcan not be indexed\bz \bdoes not have a boolean type\bc              
   C   s²   | j s
d S zL| j}td||f ƒ |||fD ]&}| jj| }|j| j| jtdd q,W nV ty” } z&| j	 
t|ƒ¡r~tdƒ‚‚ W Y d }~n"d }~0  ty¬   tdƒ‚Y n0 d S )Nz$* Indexing ``%s`` columns. Type: %s.T)ÚkindÚoptlevelÚ_blocksizesZ	_testmodez(Columns of this type can not be indexed.z3Indexing columns of this type is not supported yet.)Úindexedro   Úvprintrb   ÚcolinstancesÚcreate_indexrp   Úsmall_blocksizesÚ	TypeErrorÚcolNotIndexable_reÚsearchÚstrrj   ÚNotImplementedError)ÚselfrB   rh   Zextracolnamero   ÚacolnameZacolumnÚter*   r*   r/   Úcreate_indexes  s*    þÿÿz%BaseTableQueryTestCase.create_indexesc                    s>   t t| ƒ ¡  | jjdd| j| jd| _t| j| j	| jƒ d S )Nú/Útest)Zexpectedrows)
Úsuperrn   ÚsetUpÚh5fileÚcreate_tableÚtableDescriptionrc   rb   ri   r5   ©r|   ©Ú	__class__r*   r/   rƒ   +  s
    ÿzBaseTableQueryTestCase.setUp)rk   rl   rm   Ú__doc__rr   rp   ÚreÚcompilerx   ÚcondNotBoolean_rer   rƒ   Ú__classcell__r*   r*   rˆ   r/   rn   ú   s   

rn   c                   @   s   e Zd ZeZdZdS )ÚScalarTableMixinr*   N)rk   rl   rm   rP   r†   r5   r*   r*   r*   r/   r   2  s   r   c                   @   s   e Zd ZeZeZdS )ÚMDTableMixinN)rk   rl   rm   rQ   r†   Úmd_shaper5   r*   r*   r*   r/   r   7  s   r   )
Nú~ú<ú<=z==z!=ú>=ú>)r“   r”   ©r–   r•   )r’   r”   r•   r–   r—   é   é   gš™™™™™é?)Ú z& ((c_extra + 1) < 0)z| (c_idxextra > 0)z*| ((c_idxextra > 0) | ((c_extra + 1) > 0))c                   @   s   e Zd ZdZdZdZdS )ÚTableDataTestCasea  Base test case for querying table data.

    Automatically created test method names have the format
    ``test_XNNNN``, where ``NNNN`` is the zero-padded test number and
    ``X`` indicates whether the test belongs to the light (``l``) or
    heavy (``h``) set.

    z
test_l%04dz
test_h%04dN)rk   rl   rm   rŠ   Ú_testfmt_lightÚ_testfmt_heavyr*   r*   r*   r/   r›   T  s   r›   c                    s&  t |  ‰ttttdœ‰ˆ ¡ D ],\}}| dkr6t| }t|  |ƒ}|ˆ|< qd|  ‰ dˆ  ‰|sfˆ ‰n‚|dkrxdˆ  ‰np|dkr |d u r dˆ |tˆd	 ƒf ‰nHt|t	ƒrÄd
|d ˆ ˆ |d f ‰n$|d urÜd|ˆ |f ‰ndˆ |f ‰|rødˆ|f ‰dd„ }|‡ ‡‡‡‡fdd„ƒ}dˆ |_
|S )N)ÚboundZlboundZrboundÚ
func_boundr(   r3   rR   r’   z~(%s)r“   z%s %s %srž   z(lbound %s %s) & (%s %s rbound)r   r   z%s(%s) %s func_boundz%s %s boundz(%s) %sc                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc              
      s–   |   ¡  z|z$ˆ | g|¢R i |¤ŽW W t d¡ S  tyv } z0|jrP|jd }nd}t d| ¡ W Y d }~n
d }~0 0 W t d¡ nt d¡ 0 d S )Nrš   r   z	<skipped>z
Skipped test: %s)Z_verboseHeaderr   r   rj   Úargs)r|   r    ÚkwargsZseÚmsg©Ú	oldmethodr*   r/   Ú	newmethod…  s    
ø&z=create_test_method.<locals>.ignore_skipped.<locals>.newmethod)Ú	functoolsÚwraps)r¤   r¥   r*   r£   r/   Úignore_skipped„  s    z*create_test_method.<locals>.ignore_skippedc                    sD  t dˆ ƒ ˆ}dD ]\}}| ||¡}qt|ddƒ}| j‰|  ˆˆd¡ tdˆjd dd	‰d
\}}ˆˆfD ]Î‰ g g ˆ ¡   }}}ˆjf i ˆ¤ŽD ]ª}	|	ˆ  |ˆ< |	d |d< |	d |d< zFt	 
¡ * t	 ddt¡ t|t|ƒ}
W d   ƒ n1 sú0    Y  W n ty"   tdƒ‚Y n0 |
r˜| |	j¡ | |	ˆ  ¡ q˜t |¡}tj|ˆd}| ¡  t dt|ƒˆ f ƒ |d u rŒ|}|}n(|  t ||k¡¡ |  t ||k¡¡ ˆ ¡ }ˆjˆ  |ˆ< ˆjd |d< ˆjd |d< zJˆ ˆ|¡}‡‡‡‡fdd„tdƒD ƒ}‡ ‡‡‡‡fdd„tdƒD ƒ}W n\ tyr } z(| j t|ƒ¡r\tdƒ‚‚ W Y d }~n$d }~0  tyŒ   tdƒ‚Y n0 |D ]}| ¡  q’t dt|d ƒˆ f dd t dddgt |ƒ  ƒ |  t |d |k¡¡ |  t |d |k¡¡ |  t |d |d k¡¡ |  t |d |d k¡¡ qnd S )Nz* Condition is ``%s``.))ú&Úand)ú|Úor)r’   Únotz<string>ÚevalrN   r   r   r™   )ÚstartÚstopÚstep)NNrM   Úignorez)invalid value encountered in arc(cos|sin)z/The Python type does not support the operation.r   z)* %d rows selected by Python from ``%s``.c                    s$   g | ]}ˆj ˆ ˆfd diˆ¤Ž‘qS )ÚsortT)Zget_where_list©r,   Ú_)ÚcondÚcondvarsrb   Útable_slicer*   r/   rU   Ì  s   þÿz;create_test_method.<locals>.test_method.<locals>.<listcomp>r   c                    s$   g | ]}ˆj ˆˆfd ˆ iˆ¤Ž‘qS )Zfield)Z
read_wherer´   )r}   r¶   r·   rb   r¸   r*   r/   rU   Ï  s   þÿzThe condition is not boolean.z1The PyTables type does not support the operation.z** %d rows selected by PyTables from ``%s``r   T)Znonlz(indexing: %s).ZnoZyes)!rs   ÚreplacerŒ   rb   r   Údictrc   ÚcopyZiterrowsÚwarningsÚcatch_warningsÚfilterwarningsÚRuntimeWarningr®   Ú	func_inforw   rj   rX   rf   r?   r`   r³   ÚlenZ
assertTrueÚallrt   Úwill_query_use_indexingr]   r   ry   rz   r{   r   )r|   ZpycondZptopZpyopZrownosZfvaluesZpyrownosZ	pyfvaluesZpyvarsr\   Z
isvalidrowZptvarsZisidxqZptrownosZ	ptfvaluesr~   Zptfvals©rB   r¶   r·   rh   rE   )r}   rb   r¸   r/   Útest_method”  s’    
ý.ÿ


ÿ
þý
ÿ
ÿÿz'create_test_method.<locals>.test_methodzTesting ``%s``.)r>   Úright_boundÚ
left_boundrŸ   r^   rS   Únxtype_from_typeÚreprÚ
isinstanceÚtuplerŠ   )r-   ÚopÚ	extracondÚfuncZbnameZbvaluer¨   rÅ   r*   rÄ   r/   Úcreate_test_methoda  sB    ý


ÿQ
rÏ   rš   c                 C   sn   | t v p|tv }|r tj}d}n
tj}d}t| |||ƒ}|t |_| j|t 7  _t	t|j|ƒ td7 ad S )Nz [#H%d]z [#L%d]r   )
r<   Úheavy_operatorsr›   r   rœ   rÏ   Útestnrk   rŠ   Úsetattr)r-   rÌ   rÍ   rÎ   r7   ZtestfmtZnumfmtZtmethodr*   r*   r/   Úadd_test_methodê  s    
rÓ   )r#   r$   )rÎ   é€   é   c                   @   s>   e Zd Zed Zee  k r$ek s*n J ‚ee dks:J ‚dS )ÚSmallNITableMixinr   r   N)rk   rl   rm   r_   rc   ÚNX_BLOCK_SIZE2ÚNX_BLOCK_SIZE1r*   r*   r*   r/   rÖ     s   rÖ   c                   @   sD   e Zd Zed Zeee ks J ‚ee dks0J ‚ee dks@J ‚dS )ÚBigNITableMixinr™   r   N)rk   rl   rm   r_   rc   rØ   r×   r*   r*   r*   r/   rÙ     s   rÙ   ÚSmallÚBigZScalarc                  c   s\   t D ]R} | tv }tD ]@}d| d |d f }d|  d| df}t|d}|||fV  qqd S )Nz%s%sTDTestCaser   z%sNITableMixinz%sTableMixinr›   )r7   )Útable_sizesÚheavy_table_sizesÚtable_ndimsrº   )rd   r7   ÚndimrJ   Ú
cbasenamesr@   r*   r*   r/   Úniclassdata(  s    ÿ
rá   c                   @   s   e Zd ZdZdS )ÚUltraLightITableMixinZ
ultralightN©rk   rl   rm   ro   r*   r*   r*   r/   râ   4  s   râ   c                   @   s   e Zd ZdZdS )ÚLightITableMixinZlightNrã   r*   r*   r*   r/   rä   8  s   rä   c                   @   s   e Zd ZdZdS )ÚMediumITableMixinZmediumNrã   r*   r*   r*   r/   rå   <  s   rå   c                   @   s   e Zd ZdZdS )ÚFullITableMixinZfullNrã   r*   r*   r*   r/   ræ   @  s   ræ   c                   @   s   e Zd ZdZdS )ÚSmallSTableMixinr   N©rk   rl   rm   rc   r*   r*   r*   r/   rç   F  s   rç   c                   @   s   e Zd ZdZdS )ÚMediumSTableMixinéd   Nrè   r*   r*   r*   r/   ré   J  s   ré   c                   @   s   e Zd ZdZdS )ÚBigSTableMixiniô  Nrè   r*   r*   r*   r/   rë   N  s   rë   )Z
UltraLightZLightÚMediumZFull)rÚ   rì   rÛ   rì   )r   r   r™   é   é	   )r   r   rí   rî   c                  c   sv   t D ]l} tD ]b}tD ]X}|tv p&|tv }d|d | d |f }d| d|  ddf}t||dd}|||fV  qqqd S )	Nz%sI%sO%dTDTestCaser   z%sSTableMixinz%sITableMixinr   r›   T)r7   rp   rr   )ÚckindsÚitable_sizesÚitable_optvaluesÚheavy_itable_optvaluesÚheavy_itable_sizesrº   )Zckindrd   rp   r7   rJ   rà   r@   r*   r*   r/   Ú
iclassdatab  s     ÿÿýrô   c                 c   s   | ]}t |ƒV  qd S )N)r®   )r,   Zcbaser*   r*   r/   r0   u  r2   z%s = class_c                   @   s   e Zd ZeZdS )ÚBaseTableUsageTestCaseN)rk   rl   rm   r_   rc   r*   r*   r*   r/   rõ   |  s   rõ   c                   @   sp   e Zd 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d„ Zdd„ Zdd„ ZdS )ÚScalarTableUsageTestCasezlTest case for query usage on scalar tables.

    This also tests for most usage errors and situations.

    c                 C   s   |   t| jjd¡ dS )zUsing an empty condition.rš   N©ÚassertRaisesÚSyntaxErrorrb   Úwherer‡   r*   r*   r/   Útest_empty_conditionŠ  s    z-ScalarTableUsageTestCase.test_empty_conditionc                 C   s   |   t| jjd¡ dS )z&Using a condition with a syntax error.zfoo barNr÷   r‡   r*   r*   r/   Útest_syntax_error  s    z*ScalarTableUsageTestCase.test_syntax_errorc                 C   s@   |   t| jjd¡ |   t| jjddi i¡ |   t| jjd¡ dS )z-Using a condition with an unsupported object.z[]Úobjzc_bool < []N©rø   rw   rb   rú   r‡   r*   r*   r/   Útest_unsupported_object”  s    z0ScalarTableUsageTestCase.test_unsupported_objectc                 C   s:   |   t| jjd¡ |   t| jjd¡ |   t| jjd¡ dS )z*Using a condition with unsupported syntax.z	c_bool[0]zc_bool()zc_bool.__init__N)rø   rw   rb   rú   Ú	NameErrorr‡   r*   r*   r/   Útest_unsupported_syntax›  s    z0ScalarTableUsageTestCase.test_unsupported_syntaxc                 C   s   |   t| jjd¡ dS )z0Using a condition with no participating columns.ÚTrueN)rø   Ú
ValueErrorrb   rú   r‡   r*   r*   r/   Útest_no_column¢  s    z'ScalarTableUsageTestCase.test_no_columnc                 C   s:   | j  dd| j¡}|  t| jjd| jjj|jjdœ¡ dS )z1Using a condition with a column from other table.r€   Úotherzc_int32_a + c_int32_b > 0)Z	c_int32_aZ	c_int32_bN)	r„   r…   r†   rø   r  rb   rú   ÚcolsÚc_int32)r|   Ztable2r*   r*   r/   Útest_foreign_column§  s    ÿþz,ScalarTableUsageTestCase.test_foreign_columnc                 C   s,   t }|  || jjd¡ |  || jjd¡ dS )z7Using a condition with unsupported operations on types.zc_complex128 > 0jzc_string + b"a" > b"abc"N)r{   rø   rb   rú   )r|   ZNIEr*   r*   r/   Útest_unsupported_op°  s    z,ScalarTableUsageTestCase.test_unsupported_opc                 C   s   |   t| jjd¡ dS )zUsing a non-boolean condition.r  Nrþ   r‡   r*   r*   r/   Útest_not_boolean·  s    z)ScalarTableUsageTestCase.test_not_booleanc                 C   s   |   t| jjd¡ dS )z&Using a condition with nested columns.rL   Nrþ   r‡   r*   r*   r/   Útest_nested_col¼  s    z(ScalarTableUsageTestCase.test_nested_colc                    sL   ˆ   tˆ jjd¡ ˆ   tˆ jjddˆ jjji¡ ‡ fdd„}ˆ   t|¡ dS )z*Using implicit column names in conditions.r  Úc_boolc                     s$   ˆ j jj} ˆ  | ¡ ˆ j  d¡ d S )Nr  )rb   r  r  ÚassertIsNotNonerú   )r  r‡   r*   r/   Úwhere_with_localsË  s    

zEScalarTableUsageTestCase.test_implicit_col.<locals>.where_with_localsN)rø   rw   rb   rú   r  r  )r|   r  r*   r‡   r/   Útest_implicit_colÁ  s    ÿz*ScalarTableUsageTestCase.test_implicit_colc                    sL   ˆ   tˆ jjdddi¡ ‡ fdd„}ˆ   t|¡ ‡ fdd„}ˆ   t|¡ dS )	z(Using condition variables in conditions.úc_string > boundrž   r   c                     s&   d} ˆ   | t¡ ˆ j dddi¡ d S )NÚfoor  rž   r   )ÚassertIsInstancerz   rb   rú   )rž   r‡   r*   r/   r  Ø  s    zGScalarTableUsageTestCase.test_condition_vars.<locals>.where_with_localsc                      s2   da ˆ  t t¡ zˆ j dddi¡ W b nb 0 d S )Nr  zc_string > _gvarÚ_gvarr   )r  r  rz   rb   rú   r*   r‡   r*   r/   Úwhere_with_globalsß  s
    zHScalarTableUsageTestCase.test_condition_vars.<locals>.where_with_globalsN©rø   r{   rb   rú   )r|   r  r  r*   r‡   r/   Útest_condition_varsÑ  s    ÿ	z,ScalarTableUsageTestCase.test_condition_varsc                    sd   ˆ   tˆ jjd¡ ˆ   tˆ jjddˆ jjji¡ ‡ fdd„}ˆ   t|¡ ‡ fdd„}ˆ   t|¡ dS )z*Looking up different scopes for variables.rD   c                     s$   ˆ j jj} ˆ  | ¡ ˆ j  d¡ d S )NrD   )rb   r  r  r  rú   )rD   r‡   r*   r/   Úwhere_whith_localsõ  s    

z@ScalarTableUsageTestCase.test_scopes.<locals>.where_whith_localsc                      s0   ˆ j jjaˆ  t¡ zˆ j  d¡ W bnb0 d S )Nr  )rb   r  r  r  r  rú   r*   r‡   r*   r/   r  ü  s
    

z@ScalarTableUsageTestCase.test_scopes.<locals>.where_with_globalsN)rø   r   rb   rú   rw   r  r  )r|   r  r  r*   r‡   r/   Útest_scopesê  s    ÿ
z$ScalarTableUsageTestCase.test_scopesN)rk   rl   rm   rŠ   rû   rü   rÿ   r  r  r  r	  r
  r  r  r  r  r*   r*   r*   r/   rö   ƒ  s   	rö   c                   @   s   e Zd ZdZdd„ ZdS )ÚMDTableUsageTestCasez5Test case for query usage on multidimensional tables.c                 C   s   |   t| jjd¡ dS )z.Using a condition on a multidimensional table.r  Nr  r‡   r*   r*   r/   r     s    zMDTableUsageTestCase.testN)rk   rl   rm   rŠ   r   r*   r*   r*   r/   r  	  s   r  c                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚIndexedTableUsagez¢Test case for query usage on indexed tables.

    Indexing could be used in more cases, but it is expected to kick in
    at least in the cases tested here.

    r   Tc                    sŠ   t t| ƒ ¡  | jjjjtd | jjjjtd | jj	| _	| jj
| _| jj| _tƒ }| jD ]}|d }||vr\| |¡ q\t|ƒ| _d S )N)rq   r   )r‚   r  rƒ   rb   r  r  ru   rv   r  rÃ   Z_compile_conditionÚcompileConditionZ_required_expr_varsÚrequiredExprVarsÚsetÚidx_exprÚaddÚ	frozensetÚusable_idxs)r|   r!  ÚexprZidxvarrˆ   r*   r/   rƒ     s    



zIndexedTableUsage.setUpc              	   C   s¦   | j D ]š}|  |i ¡}|  || jd||| jf ¡ |  |d ¡}|  ||¡}|j}|  || jd||| jf ¡ |j}|  || j	d||| j	f ¡ t
d||jf ƒ qd S )NzW
Query with condition: ``%s``
Computed usable indexes are: ``%s``
and should be: ``%s``zg
Wrong index expression in condition:
``%s``
Compiled index expression is:
``%s``
and should be:
``%s``zh
Wrong index operations in condition:
``%s``
Computed index operations are:
``%s``
and should be:
``%s``zE* Query with condition ``%s`` will use variables ``%s`` for indexing.)Ú
conditionsrÃ   ZassertEqualr!  r  r  Zindex_expressionsr  Zstring_expressionÚstr_exprrs   Zindex_variables)r|   Z	conditionZc_usable_idxsr·   ZcompiledZ
c_idx_exprZ
c_str_exprr*   r*   r/   r   +  s0    


ýÿ

ýÿ

ýÿþzIndexedTableUsage.test)	rk   rl   rm   rŠ   rc   rr   rƒ   r   rŽ   r*   r*   rˆ   r/   r    s
   r  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage1)z(c_int32 > 0)z(c_int32 > 0) & (c_extra > 0)z+(c_int32 > 0) & ((~c_bool) | (c_extra > 0))z/(c_int32 > 0) & ((c_extra < 3) & (c_extra > 0))©r  )Úgt©r   Úe0N©rk   rl   rm   r#  r  r$  r*   r*   r*   r/   r%  F  s   r%  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage2)z(c_int32 > 0) & (c_int32 < 5)z-(c_int32 > 0) & (c_int32 < 5) & (c_extra > 0)zB(c_int32 > 0) & (c_int32 < 5) & ((c_bool == True) | (c_extra > 0))zB(c_int32 > 0) & (c_int32 < 5) & ((c_extra > 0) | (c_bool == True))©r  )r'  Últ)r   r   r)  Nr*  r*   r*   r*   r/   r+  Q  s   r+  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage3)z(c_bool == True)z (c_bool == True) & (c_extra > 0)z (c_extra > 0) & (c_bool == True)z2((c_extra > 0) & (c_extra < 4)) & (c_bool == True)z2(c_bool == True) & ((c_extra > 0) & (c_extra < 4))©r  ©Úeq)Tr)  Nr*  r*   r*   r*   r/   r.  \  s   r.  c                   @   s    e Zd ZddgZddgZdZdS )ÚIndexedTableUsage4z2((c_int32 > 0) & (c_bool == True)) & (c_extra > 0)zD((c_int32 > 0) & (c_bool == True)) & ((c_extra > 0) & (c_extra < 4))r&  r/  ú	(e0 & e1)Nr*  r*   r*   r*   r/   r2  h  s   þÿr2  c                   @   s    e Zd ZddgZddgZdZdS )ÚIndexedTableUsage5z1(c_int32 >= 1) & (c_int32 < 2) & (c_bool == True)zA(c_int32 >= 1) & (c_int32 < 2) & (c_bool == True) & (c_extra > 0)©r  )Úger-  )r   r   r/  r3  Nr*  r*   r*   r*   r/   r4  t  s   þÿr4  c                   @   s    e Zd ZddgZg d¢ZdZdS )ÚIndexedTableUsage6z>(c_int32 >= 1) & (c_int32 < 2) & (c_int32 > 0) & (c_int32 < 5)zN(c_int32 >= 1) & (c_int32 < 2) & (c_int32 > 0) & (c_int32 < 5) & (c_extra > 0))r5  r&  ©r  )r-  ©r   z((e0 & e1) & e2)Nr*  r*   r*   r*   r/   r7  €  s
   þr7  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage7)z@(c_int32 >= 1) & (c_int32 < 2) & ((c_int32 > 0) & (c_int32 < 5))zB((c_int32 >= 1) & (c_int32 < 2)) & ((c_int32 > 0) & (c_int32 < 5))zR((c_int32 >= 1) & (c_int32 < 2)) & ((c_int32 > 0) & (c_int32 < 5)) & (c_extra > 0)r5  r,  r3  Nr*  r*   r*   r*   r/   r:    s
   ÿr:  c                   @   s   e Zd ZdgZdgZdZdS )ÚIndexedTableUsage8z/(c_extra > 0) & ((c_int32 > 0) & (c_int32 < 5))r,  r)  Nr*  r*   r*   r*   r/   r;  š  s   ÿr;  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage9)z-(c_extra > 0) & (c_int32 > 0) & (c_int32 < 5)z/((c_extra > 0) & (c_int32 > 0)) & (c_int32 < 5)z=(c_extra > 0) & (c_int32 > 0) & (c_int32 < 5) & (c_extra > 3)r&  r8  r3  Nr*  r*   r*   r*   r/   r<  £  s
   ÿr<  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage10)z0(c_int32 < 5) & (c_extra > 0) & (c_bool == True)z&(c_int32 < 5) & (c_extra > 2) & c_boolz@(c_int32 < 5) & (c_bool == True) & (c_extra > 0) & (c_extra < 4)z@(c_int32 < 5) & (c_extra > 0) & (c_bool == True) & (c_extra < 4)r8  r/  r3  Nr*  r*   r*   r*   r/   r=  ®  s
   ÿr=  c                   @   s    e Zd ZdZg d¢Zg ZdZdS )ÚIndexedTableUsage11z1Complex operations are not eligible for indexing.)zsin(c_int32) > 0z(c_int32 * 2.4) > 0z(c_int32 + c_int32) > 0zc_int32**2 > 0rš   N)rk   rl   rm   rŠ   r#  r  r$  r*   r*   r*   r/   r>  º  s   r>  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage12)ú~c_boolú	~(c_bool)z~c_bool & (c_extra > 0)z~(c_bool) & (c_extra > 0)©r  r0  )Fr)  Nr*  r*   r*   r*   r/   r?  Ç  s   r?  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage13)z~(c_bool == True)z~((c_bool == True))ú!~(c_bool == True) & (c_extra > 0)z#~((c_bool == True)) & (c_extra > 0)rB  r)  Nr*  r*   r*   r*   r/   rC  Ò  s   rC  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage14)z~(c_int32 > 0)z ~((c_int32 > 0)) & (c_extra > 0)z,~(c_int32 > 0) & ((~c_bool) | (c_extra > 0))z0~(c_int32 > 0) & ((c_extra < 3) & (c_extra > 0))©r  )Úler(  r)  Nr*  r*   r*   r*   r/   rE  Ý  s   rE  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage15)z(~(c_int32 > 0) | ~c_bool)z,(~(c_int32 > 0) | ~(c_bool)) & (c_extra > 0)zF(~(c_int32 > 0) | ~(c_bool == True)) & ((c_extra > 0) & (c_extra < 4))rF  rB  z	(e0 | e1)Nr*  r*   r*   r*   r/   rH  è  s
   ÿrH  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage16©z!(~(c_int32 > 0) & ~(c_int32 < 2))z1(~(c_int32 > 0) & ~(c_int32 < 2)) & (c_extra > 0)zC(~(c_int32 > 0) & ~(c_int32 < 2)) & ((c_extra > 0) & (c_extra < 4))rF  ©r  )r6  )r   r3  Nr*  r*   r*   r*   r/   rI  õ  s
   ÿrI  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage17rJ  rF  rK  r3  Nr*  r*   r*   r*   r/   rL    s
   ÿrL  c                   @   s   e Zd Zg d¢Zg ZdZdS )ÚIndexedTableUsage18)z~((c_int32 > 0) & (c_bool))z+~((c_int32 > 0) & (c_bool)) & (c_extra > 0)z=~((c_int32 > 0) & (c_bool)) & ((c_extra > 0) & (c_extra < 4))rš   Nr*  r*   r*   r*   r/   rM    s   rM  c                   @   s   e Zd ZdgZdgZdZdS )ÚIndexedTableUsage19zA~((c_int32 > 0) & (c_bool)) & ((c_bool == False) & (c_extra < 4))rB  r)  Nr*  r*   r*   r*   r/   rN    s   ÿrN  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage20)z((c_int32 > 0) & ~(c_bool))z+((c_int32 > 0) & ~(c_bool)) & (c_extra > 0)zE((c_int32 > 0) & ~(c_bool == True)) & ((c_extra > 0) & (c_extra < 4))r&  rB  r3  Nr*  r*   r*   r*   r/   rO  &  s
   þrO  c                   @   s    e Zd Zg d¢ZddgZdZdS )ÚIndexedTableUsage21)z(~(c_int32 > 0) & (c_bool))z+(~(c_int32 > 0) & (c_bool)) & (c_extra > 0)zE(~(c_int32 > 0) & (c_bool == True)) & ((c_extra > 0) & (c_extra < 4))rF  r/  r3  Nr*  r*   r*   r*   r/   rP  3  s
   ÿrP  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage22)z5~((c_int32 >= 1) & (c_int32 < 2)) & ~(c_bool == True)rD  zG~((c_int32 >= 1) & (c_int32 < 2)) & (~(c_bool == True) & (c_extra > 0))rB  r)  Nr*  r*   r*   r*   r/   rQ  @  s   rQ  c                   @   s   e Zd Zg d¢Zg ZdZdS )ÚIndexedTableUsage23)zc_int32 != 1úc_bool != Falsez~(c_int32 != 1)z~(c_bool != False)z(c_int32 != 1) & (c_extra != 2)rš   Nr*  r*   r*   r*   r/   rR  L  s   rR  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage24)r  zc_bool == TruezTrue == c_boolz
~(~c_bool)z~~c_boolz
~~~~c_boolz~(~c_bool) & (c_extra != 2)r/  r)  Nr*  r*   r*   r*   r/   rT  X  s   	rT  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage25)r@  zc_bool == FalsezFalse == c_boolrA  z~((c_bool))z	~~~c_boolz~~(~c_bool) & (c_extra != 2)rB  r)  Nr*  r*   r*   r*   r/   rU  g  s   
ÿrU  c                   @   s   e Zd Zg d¢Zg ZdZdS )ÚIndexedTableUsage26)zc_bool != TruezTrue != c_boolrS  zFalse != c_boolrš   Nr*  r*   r*   r*   r/   rV  w  s   rV  c                   @   s    e Zd ZddgZg d¢ZdZdS )ÚIndexedTableUsage27z((c_int32 == 3) | c_bool | (c_int32 == 5)zF(((c_int32 == 3) | (c_bool == True)) | (c_int32 == 5)) & (c_extra > 0)©©r  r0  )r™   r/  ©r  r0  r9  z((e0 | e1) | e2)Nr*  r*   r*   r*   r/   rW  ‚  s
   þrW  c                   @   s    e Zd ZddgZg d¢ZdZdS )ÚIndexedTableUsage28z*((c_int32 == 3) | c_bool) & (c_int32 == 5)zF(((c_int32 == 3) | (c_bool == True)) & (c_int32 == 5)) & (c_extra > 0)rX  ú((e0 | e1) & e2)Nr*  r*   r*   r*   r/   r[    s
   þr[  c                   @   s    e Zd ZddgZg d¢ZdZdS )ÚIndexedTableUsage29z2(c_int32 == 3) | ((c_int32 == 4) & (c_int32 == 5))zD((c_int32 == 3) | ((c_int32 == 4) & (c_int32 == 5))) & (c_extra > 0))©r  r0  )r˜   rZ  rY  z((e0 & e1) | e2)Nr*  r*   r*   r*   r/   r]  ž  s
   þr]  c                   @   s    e Zd ZddgZg d¢ZdZdS )ÚIndexedTableUsage30z2((c_int32 == 3) | (c_int32 == 4)) & (c_int32 == 5)zB((c_int32 == 3) | (c_int32 == 4)) & (c_int32 == 5) & (c_extra > 0))rY  r^  rZ  r\  Nr*  r*   r*   r*   r/   r_  ¬  s
   þr_  c                   @   s   e Zd Zg d¢ZdgZdZdS )ÚIndexedTableUsage31)z2(c_extra > 0) & ((c_extra < 4) & (c_bool == True))z2(c_extra > 0) & ((c_bool == True) & (c_extra < 5))z2((c_int32 > 0) | (c_extra > 0)) & (c_bool == True)r/  r)  Nr*  r*   r*   r*   r/   r`  º  s   ÿr`  c                   @   s   e Zd ZdgZg ZdZdS )ÚIndexedTableUsage32z@(c_int32 < 5) & (c_extra > 0) & (c_bool == True) | (c_extra < 4)rš   Nr*  r*   r*   r*   r/   ra  Æ  s   ÿra  c            
      C   s¨  t  ¡ } tg}| t¡ tj}|r(d}nd}d}t|ƒD ]h}|D ]>}|ƒ D ]2}t|d ƒ}|sf|jsLt j	||d}	|  
|	¡ qLqB|  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t¡¡ |  
t  	t ¡¡ |  
t  	t!¡¡ |  
t  	t"¡¡ |  
t  	t#¡¡ |  
t  	t$¡¡ |  
t  	t%¡¡ |  
t  	t&¡¡ |  
t  	t'¡¡ |  
t  	t(¡¡ |  
t  	t)¡¡ |  
t  	t*¡¡ |  
t  	t+¡¡ |  
t  	t,¡¡ q8| S )zCReturn a test suite consisting of all the test cases in the module.r   Ztest_lr   r   )Úprefix)-r   Z	TestSuiterá   rX   rô   r   r7   r]   r®   Z	makeSuiteZaddTeströ   r  r%  r+  r.  r2  r4  r7  r:  r;  r<  r=  r>  r?  rC  rE  rH  rI  rL  rM  rN  rO  rP  rQ  rR  rT  rU  rV  rW  r[  r]  r_  r`  ra  )
Z	testSuiteZ
cdatafuncsr7   Z
autoprefixZniterr1   Ú	cdatafuncZcdataÚclass_Zsuite_r*   r*   r/   ÚsuiteÐ  sd    


re  Ú__main__)ZdefaultTest)r*   )r*   )r*   )N)rš   N)§rŠ   r‹   ÚsysÚtypesr¼   r¦   r?   r=   Ztables.utilsr   Ztables.testsr   Ztables.tests.commonr   r   rs   r   ZTestCaser   r   r	   r
   r   r   r   r   r   r   r   r_   r‘   r[   Z
_maxnvaluerZ   Z_strlenrS   rv   Zbool_r   r   r   r   r   r   r    r!   r"   r#   Úfloatr$   r%   Úcomplexr&   Zstring_r:   rÀ   Úhasattrr)   rº   r^   r>   rÈ   r   r<   ÚEnumr]   r'   rF   rK   rO   rP   rQ   rV   ri   ZSkipTestrj   ZTempFileMixinrn   r   r   Z	operatorsrÐ   rÇ   rÆ   rŸ   Zextra_conditionsr›   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ô   rc  Zcnamerà   ZcdictrË   ZcbasesrH   rd  Úexecrõ   r  rö   r  r  r%  r+  r.  r2  r4  r7  r:  r;  r<  r=  r>  r?  rC  rE  rH  rI  rL  rM  rN  rO  rP  rQ  rR  rT  rU  rV  rW  r[  r]  r_  r`  ra  re  rk   Z
parse_argvÚargvZprint_versionsÚmainr*   r*   r*   r/   Ú<module>   s6  4ïý
ÿÿ


ÿÿ28	
 



 
3	

?
