B
    ™i‚\S°  ã               @   sj  d Z ddlm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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j0e&fej1e&fej2e&fej3e&fej4e5fej6e5fej7e8fej9e8fej0e&fej6e5fej-e&fde' ej:fdœZ;eeeeeeeeee e!dœZ<e=edƒrÔej>e5fe;d< e?dd„ e @e;¡D ƒƒZAe?dd„ e @e;¡D ƒƒZBeCdddddgƒZDe	 Ee?dd„ ee%ƒD ƒƒ¡ZFd»dd „ZGd¼d!d"„ZHd½d#d$„ZIeId%d&ƒZJeId'd(e#d)ZKi ZLd*d+„ ZMG d,d-„ d-ejNƒZOG d.d/„ d/ejPeƒZQG d0d1„ d1ƒZRG d2d3„ d3ƒZSdd4d5d6d7d8d9d:d;d<g
ZTeCd4d6d9d:d<gƒZUe"d= ZVe"d> d= ZWd?ZXd@dAdBdCgZYG dDdE„ dEeQƒZZd¾dFdG„Z[d¿dHdI„Z\da]x:e;D ]2Z^x*eTD ]"Z_xeYD ]Z`e\e^e_e`ƒ qFW q<W q2W x<dJD ]4Z^x,e<D ]$ZaxeTD ]Z_e\e^e_eadK q‚W qxW qnW dLZbdMZcG dNdO„ dOƒZdG dPdQ„ dQƒZedRdSgZfeCdSgƒZgdTgZhdUdV„ ZiG dWdX„ dXƒZjG dYdZ„ dZƒZkG d[d\„ d\ƒZlG d]d^„ d^ƒZmG d_d`„ d`ƒZnG dadb„ dbƒZoG dcdd„ ddƒZpdedfdgdhgZqdRdgdSgZreCdgdSgƒZsddd>didjgZteCdddidjgƒZudkdl„ ZvxTeievgD ]HZwx@ewƒ D ]6\ZxZyZze{dmd„ eyD ƒƒZ|e}exe|ezƒZ~ednex ƒ qªW qžW G dodp„ dpeQƒZ€daG dqdr„ dreRe€ƒZ‚G dsdt„ dteSe€ƒZƒG dudv„ dveRe€ƒ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„ƒZ‰G dd‚„ d‚e„ƒZŠG dƒd„„ d„e„ƒZ‹G d…d†„ d†e„ƒZŒG d‡dˆ„ dˆe„ƒZG d‰dŠ„ dŠe„ƒZŽG d‹dŒ„ dŒe„ƒZG ddŽ„ dŽe„ƒZG 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„ƒZ™G d¡d¢„ d¢e„ƒZšG d£d¤„ d¤e„ƒZ›G d¥d¦„ 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 G d¯d°„ d°e„ƒZ¡G d±d²„ d²e„ƒZ¢G d³d´„ d´e„ƒZ£G dµd¶„ d¶e„ƒZ¤d·d¸„ Z¥e¦d¹krfe §ej¨¡ e ©¡  ejªd¸dº dS )Àz$Test module for queries on datasets.é    )Úabsolute_importN)ÚSizeType)Úcommon)Úunittest)ÚverbosePrint)ÚPyTablesTestCase)Úrange)Ú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.7/site-packages/tables/tests/test_queries.pyú	<genexpr>b   s   r0   c             c   s   | ]\}}||d  fV  qdS )r   Nr+   )r,   r-   r.   r+   r+   r/   r0   e   s   r   r   r   r$   r&   c             c   s   | ]}d | |fV  qdS )zn%dNr+   )r,   Úir+   r+   r/   r0   l   s    r+   c             C   s¬   t j}xœttt t¡ƒƒD ]†\}}|s0|tkr0q|d }d| }|dkrrtj	 
t| ¡}tjttdƒ|||d}n&t| }	t |	|f¡}
tjj|
|d}|| |< qW |}|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   zc_%sr(   r   )ÚshapeÚpos)r3   )r   ÚheavyÚ	enumerateÚsortedÚsixZiterkeysÚ	type_infoÚheavy_typesÚtablesZAtomZfrom_sctypeÚsctype_from_typeZEnumColr(   Únumpyr   ZColZ
from_dtype)Ú	classdictr2   r4   Zityper-   ÚcolposÚcolnameÚbaseÚcolÚsctyper   Zncolsr+   r+   r/   Úappend_columnsr   s    rC   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`.

    )r2   Z_v_pos)rC   Útyper:   ÚIsDescription)Ú	classnamer3   r2   r=   r+   r+   r/   Únested_description‹   s    rG   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.

    )r2   Úc_nestedr   )r2   r3   Úc_extraÚ
c_idxextra)rC   rG   r:   ZIntColrD   rE   )rF   Z
nclassnamer2   r=   r>   ZndescrZextracolZidxextracolr+   r+   r/   Útable_description˜   s    
rK   ÚTableDescriptionZNestedDescriptionÚMDTableDescriptionZMDNestedDescription)r2   c             C   sv  t  ||f¡}|dk	r,|  |¡ |  ¡  dS tj}ttj|t	dƒ}| j
d }}xt|ƒD ]ö}t ||| ¡ |¡}	x¾t t¡D ]°\}
}|s˜|
tkr˜q‚d|
 }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< q‚W | ¡  |d7 }|tkr\d}q\W |  ¡  |  ¡ }|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.

    N)r   r   zc_%szc_nested/%sr   r   r)   c             S   s   g | ]}t | ‘qS r+   )Ú
str_format)r,   Úxr+   r+   r/   ú
<listcomp>å   s    zfill_table.<locals>.<listcomp>rI   rJ   r   )Ú
table_dataÚgetÚappendÚflushr   r4   Úintr<   Úprodr   Úrowr   ZarangeZreshaper7   Ú	iteritemsr;   r9   Ú
row_periodÚarrayZasarrayÚread)Útabler2   ÚnrowsZtdatar4   ÚsizerW   ÚvalueÚnrowÚdatar-   rB   r?   ÚncolnameZcoldataZsdatar+   r+   r/   Ú
fill_tableÅ   s>    
rc   c               @   s   e Zd ZdS )ÚSilentlySkipTestN)Ú__name__Ú
__module__Ú__qualname__r+   r+   r+   r/   rd   ÷   s   rd   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 yP| j}td||f ƒ x4|||gD ]&}| jj| }|j| j| jtdd q.W W nV tk
r– } z| j	 
t|ƒ¡r„tdƒ‚‚ W d d }~X Y n tk
r°   tdƒ‚Y nX 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.)Úindexedri   Úvprintr\   ÚcolinstancesÚcreate_indexrj   Úsmall_blocksizesÚ	TypeErrorÚcolNotIndexable_reÚsearchÚstrrd   ÚNotImplementedError)Úselfr?   rb   Zextracolnameri   Ú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)
Úsuperrh   ÚsetUpÚh5fileÚcreate_tableÚtableDescriptionr]   r\   rc   r2   )rv   )Ú	__class__r+   r/   r}   .  s    zBaseTableQueryTestCase.setUp)re   rf   rg   Ú__doc__rl   rj   ÚreÚcompilerr   ÚcondNotBoolean_rery   r}   Ú__classcell__r+   r+   )r   r/   rh   ý   s   

rh   c               @   s   e Zd ZeZdZdS )ÚScalarTableMixinr+   N)re   rf   rg   rL   r€   r2   r+   r+   r+   r/   r‡   5  s   r‡   c               @   s   e Zd ZeZeZdS )ÚMDTableMixinN)re   rf   rg   rM   r€   Úmd_shaper2   r+   r+   r+   r/   rˆ   :  s   rˆ   ú~ú<z<=z==z!=z>=ú>)r‹   z<=)rŒ   z>=é   é   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)re   rf   rg   r‚   Ú_testfmt_lightÚ_testfmt_heavyr+   r+   r+   r/   r   W  s   r   c                s,  t |  ‰ttttdœ‰x:t ˆ¡D ],\}}| dkr:t| }t|  |ƒ}|ˆ|< q"W d|  ‰ dˆ  ‰|slˆ ‰n‚|dkr~dˆ  ‰np|dkr¦|d kr¦dˆ |tˆd	 ƒf ‰nHt	|t
ƒrÊd
|d ˆ ˆ |d f ‰n$|d k	râd|ˆ |f ‰ndˆ |f ‰|rþdˆ|f ‰dd„ }|‡ ‡‡‡‡fdd„ƒ}dˆ |_|S )N)ÚboundZlboundZrboundÚ
func_boundr)   zc_%szc_nested/%srŠ   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          
      sv   |   ¡  z\yˆ | f|ž|ŽS  tk
r` } z(|jr>|jd }nd}t d| ¡ W d d }~X Y nX W d t d¡ X d S )Nr   z	<skipped>z
Skipped test: %sr   )Z_verboseHeaderrd   Úargsr   r   )rv   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                s@  t dˆ ƒ ˆ}xdD ]\}}| ||¡}qW t|ddƒ}| j‰|  ˆˆd¡ tdˆjd dd	‰d
\}}xÎˆˆgD ]À‰ g g ˆ ¡   }}}x¨ˆjf ˆŽD ]˜}	|	ˆ  |ˆ< |	d |d< |	d |d< y2t	 
¡   t	 ddt¡ t|t|ƒ}
W d Q R X W n tk
r   tdƒ‚Y nX |
rž| |	j¡ | |	ˆ  ¡ qžW t |¡}tj|ˆd}| ¡  t dt|ƒˆ f ƒ |d kr‚|}|}n(|  t ||k¡¡ |  t ||k¡¡ ˆ ¡ }ˆjˆ  |ˆ< ˆjd |d< ˆjd |d< yJˆ ˆ|¡}‡‡‡‡fdd„tdƒD ƒ}‡ ‡‡‡‡fdd„tdƒD ƒ}W n\ tk
rf } z | j t|ƒ¡rTtdƒ‚‚ W d d }~X Y n tk
r‚   tdƒ‚Y nX x|D ]}| ¡  qŠW 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¡¡ qvW d S )Nz* Condition is ``%s``.))ú&Úand)ú|Úor)rŠ   Únotz<string>ÚevalrJ   r   r   rŽ   )ÚstartÚstopÚstep)NNrI   Ú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Úcondvarsr\   Útable_slicer+   r/   rP   Ï  s   z;create_test_method.<locals>.test_method.<locals>.<listcomp>r   c                s$   g | ]}ˆj ˆˆfd ˆ iˆ—Ž‘qS )Zfield)Z
read_where)r,   r¨   )rw   r©   rª   r\   r«   r+   r/   rP   Ó  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)!rm   Úreplacer„   r\   ry   Údictr]   ÚcopyZiterrowsÚwarningsÚcatch_warningsÚfilterwarningsÚRuntimeWarningr¢   Ú	func_inforq   rd   rS   r`   r<   rZ   r§   ÚlenÚ
assertTrueÚallrn   Úwill_query_use_indexingr   r…   rs   rt   ru   r   )rv   ZpycondZptopZpyopZrownosZfvaluesZpyrownosZ	pyfvaluesZpyvarsrW   Z
isvalidrowZptvarsZisidxqZptrownosZ	ptfvaluesrx   Zptfvals)r?   r©   rª   rb   rB   )rw   r\   r«   r/   Útest_method—  s€    



z'create_test_method.<locals>.test_methodzTesting ``%s``.)r;   Úright_boundÚ
left_boundr”   r7   rX   rN   Únxtype_from_typeÚreprÚ
isinstanceÚtupler‚   )r-   ÚopÚ	extracondÚfuncZbnameZbvaluerœ   r¸   r+   )r?   r©   rª   rb   rB   r/   Úcreate_test_methodd  s<    

R
rÂ   c       	      C   s   | t kp|tk}|r tj}d}n
tj}d}t| |||ƒ}|t |_| j|t 7  _t	j
d dk rrt |d t¡}n|}tt|j|ƒ td7 ad S )Nz [#H%d]z [#L%d]r   rŽ   r   )r9   Úheavy_operatorsr   r’   r‘   rÂ   Útestnre   r‚   ÚsysÚversion_infoÚtypesÚ
MethodTypeÚsetattr)	r-   r¿   rÀ   rÁ   r4   ZtestfmtZnumfmtZtmethodZimethodr+   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 t‚ee dks:t‚dS )ÚSmallNITableMixinr   r   N)re   rf   rg   rY   r]   ÚNX_BLOCK_SIZE2ÚNX_BLOCK_SIZE1ÚAssertionErrorr+   r+   r+   r/   rÍ     s   rÍ   c               @   sD   e Zd Zed Zeee ks t‚ee dks0t‚ee dks@t‚dS )ÚBigNITableMixinrŽ   r   N)re   rf   rg   rY   r]   rÏ   rÎ   rÐ   r+   r+   r+   r/   rÑ     s   rÑ   ZSmallZBigZScalarc              c   sd   x^t D ]V} | tk}xHtD ]@}d| d |d f }d|  d| df}t|d}|||fV  qW qW d S )Nz%s%sTDTestCaser   z%sNITableMixinz%sTableMixinr   )r4   )Útable_sizesÚheavy_table_sizesÚtable_ndimsr­   )r^   r4   ÚndimrF   Ú
cbasenamesr=   r+   r+   r/   Úniclassdata/  s    


r×   c               @   s   e Zd ZdZdS )ÚUltraLightITableMixinZ
ultralightN)re   rf   rg   ri   r+   r+   r+   r/   rØ   ;  s   rØ   c               @   s   e Zd ZdZdS )ÚLightITableMixinZlightN)re   rf   rg   ri   r+   r+   r+   r/   rÙ   ?  s   rÙ   c               @   s   e Zd ZdZdS )ÚMediumITableMixinZmediumN)re   rf   rg   ri   r+   r+   r+   r/   rÚ   C  s   rÚ   c               @   s   e Zd ZdZdS )ÚFullITableMixinZfullN)re   rf   rg   ri   r+   r+   r+   r/   rÛ   G  s   rÛ   c               @   s   e Zd ZdZdS )ÚSmallSTableMixinr   N)re   rf   rg   r]   r+   r+   r+   r/   rÜ   M  s   rÜ   c               @   s   e Zd ZdZdS )ÚMediumSTableMixinéd   N)re   rf   rg   r]   r+   r+   r+   r/   rÝ   Q  s   rÝ   c               @   s   e Zd ZdZdS )ÚBigSTableMixiniô  N)re   rf   rg   r]   r+   r+   r+   r/   rß   U  s   rß   Z
UltraLightZLightZMediumZFullé   é	   c              c   s‚   x|t D ]t} xntD ]f}x`tD ]X}|tkp,|tk}d|d | d |f }d| d|  ddf}t||dd}|||fV  qW qW qW d S )	Nz%sI%sO%dTDTestCaser   z%sSTableMixinz%sITableMixinr‡   r   T)r4   rj   rl   )ÚckindsÚitable_sizesÚitable_optvaluesÚheavy_itable_optvaluesÚheavy_itable_sizesr­   )Zckindr^   rj   r4   rF   rÖ   r=   r+   r+   r/   Ú
iclassdatai  s    


rç   c             c   s   | ]}t |ƒV  qd S )N)r¢   )r,   Zcbaser+   r+   r/   r0   |  s    z%s = class_c               @   s   e Zd ZeZdS )ÚBaseTableUsageTestCaseN)re   rf   rg   rY   r]   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ÚSyntaxErrorr\   Úwhere)rv   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 barN)rê   rë   r\   rì   )rv   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ê   rq   r\   rì   )rv   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ê   rq   r\   rì   Ú	NameError)rv   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ê   Ú
ValueErrorr\   rì   )rv   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.rz   Úotherzc_int32_a + c_int32_b > 0)Z	c_int32_aZ	c_int32_bN)	r~   r   r€   rê   rô   r\   rì   ÚcolsÚc_int32)rv   Ztable2r+   r+   r/   Útest_foreign_column®  s
    z,ScalarTableUsageTestCase.test_foreign_columnc             C   sN   t }|  || jjd¡ tjd dk r8|  || jjd¡ n|  || jjd¡ dS )z7Using a condition with unsupported operations on types.zc_complex128 > 0jr   rŽ   zc_string + "a" > "abc"zc_string + b"a" > b"abc"N)ru   rê   r\   rì   rÅ   rÆ   )rv   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ø   N)rê   rq   r\   rì   )rv   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.rH   N)rê   rq   r\   rì   )rv   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} ˆ  | d k	¡ ˆ j  d¡ d S )Nrø   )r\   r÷   rý   rµ   rì   )rø   )rv   r+   r/   Úwhere_with_localsÖ  s    
zEScalarTableUsageTestCase.test_implicit_col.<locals>.where_with_localsN)rê   rq   r\   rì   r÷   rø   )rv   rþ   r+   )rv   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.zc_string > boundr“   r   c                 s*   d} ˆ   t| tƒ¡ ˆ j dddi¡ d S )NÚfoozc_string > boundr“   r   )rµ   r½   rt   r\   rì   )r“   )rv   r+   r/   rþ   ã  s    zGScalarTableUsageTestCase.test_condition_vars.<locals>.where_with_localsc                  s4   da ˆ  tt tƒ¡ zˆ j dddi¡ W d b X d S )Nr   zc_string > _gvarÚ_gvarr   )r  rµ   r½   rt   r\   rì   r+   )rv   r+   r/   Úwhere_with_globalsê  s
    zHScalarTableUsageTestCase.test_condition_vars.<locals>.where_with_globalsN)rê   ru   r\   rì   )rv   rþ   r  r+   )rv   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.rA   c                 s(   ˆ j jj} ˆ  | d k	¡ ˆ j  d¡ d S )NrA   )r\   r÷   rø   rµ   rì   )rA   )rv   r+   r/   Úwhere_whith_locals   s    
z@ScalarTableUsageTestCase.test_scopes.<locals>.where_whith_localsc                  s2   ˆ j jjaˆ  td k	¡ zˆ j  d¡ W d bX d S )Nr  )r\   r÷   rø   r  rµ   rì   r+   )rv   r+   r/   r    s
    
z@ScalarTableUsageTestCase.test_scopes.<locals>.where_with_globalsN)rê   rñ   r\   rì   rq   r÷   rø   )rv   r  r  r+   )rv   r/   Útest_scopesõ  s    
z$ScalarTableUsageTestCase.test_scopesN)re   rf   rg   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ý   N)rê   ru   r\   rì   )rv   r+   r+   r/   r{     s    zMDTableUsageTestCase.testN)re   rf   rg   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ƒ }x(| jD ]}|d }||kr^| |¡ q^W t|ƒ| _d S )N)rk   r   )r|   r  r}   r\   r÷   rý   ro   rp   rø   r·   Z_compile_conditionÚcompileConditionZ_required_expr_varsÚrequiredExprVarsÚsetÚidx_exprÚaddÚ	frozensetÚusable_idxs)rv   r  ÚexprZidxvar)r   r+   r/   r}   (  s    


zIndexedTableUsage.setUpc          	   C   sª   x¤| j D ]š}|  |i ¡}|  || jd||| jf ¡ |  |d ¡}|  ||¡}|j}|  || jd||| jf ¡ |j}|  || j	d||| j	f ¡ t
d||jf ƒ qW 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_exprrm   Zindex_variables)rv   Z	conditionZc_usable_idxsrª   ZcompiledZ
c_idx_exprZ
c_str_exprr+   r+   r/   r{   6  s"    


zIndexedTableUsage.test)	re   rf   rg   r‚   r]   rl   r}   r{   r†   r+   r+   )r   r/   r    s
   r  c               @   s"   e Zd ZddddgZdgZdZdS )ÚIndexedTableUsage1z(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)re   rf   rg   r  r  r  r+   r+   r+   r/   r  Q  s   r  c               @   s"   e Zd ZddddgZdgZdZdS )ÚIndexedTableUsage2z(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  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  \  s   r  c               @   s$   e Zd ZdddddgZdgZdZdS )	ÚIndexedTableUsage3z(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  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  g  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  )r   )rý   )r  )Tz	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  s  s
   r  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ý   )r  )Tz	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r    s
   r  c               @   s"   e Zd ZddgZdddg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))rø   )r  r  )r   r   )rø   )r  )r   )rø   )r  )r   z((e0 & e1) & e2)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  ‹  s   r  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage7z@(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))rø   )r  r  )r   r   )rø   )r  r  )r   r   z	(e0 & e1)N)re   rf   rg   r  r  r  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  r  )r   r   r  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  ¥  s   r  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage9z-(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ø   )r  )r   )rø   )r  )r   z	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r  ®  s   r  c               @   s$   e Zd ZddddgZddgZdZdS )	ÚIndexedTableUsage10z0(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))rø   )r  )r   )rý   )r  )Tz	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r   ¹  s   r   c               @   s$   e Zd ZdZddddg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)re   rf   rg   r‚   r  r  r  r+   r+   r+   r/   r!  Å  s   r!  c               @   s"   e Zd ZddddgZdgZdZdS )ÚIndexedTableUsage12z~c_boolz	~(c_bool)z~c_bool & (c_extra > 0)z~(c_bool) & (c_extra > 0))rý   )r  )Fr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r"  Ò  s   r"  c               @   s"   e Zd ZddddgZdgZdZdS )ÚIndexedTableUsage13z~(c_bool == True)z~((c_bool == True))z!~(c_bool == True) & (c_extra > 0)z#~((c_bool == True)) & (c_extra > 0))rý   )r  )Fr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r#  Ý  s   r#  c               @   s"   e Zd ZddddgZdgZdZdS )ÚIndexedTableUsage14z~(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ø   )Úle)r   r  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r$  è  s   r$  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage15z(~(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)))rø   )r%  )r   )rý   )r  )Fz	(e0 | e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r&  ó  s   r&  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage16z!(~(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)))rø   )r%  )r   )rø   )r  )r   z	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r'     s   r'  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage17z!(~(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)))rø   )r%  )r   )rø   )r  )r   z	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r(    s   r(  c               @   s   e Zd ZdddgZg ZdZdS )ÚIndexedTableUsage18z~((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   N)re   rf   rg   r  r  r  r+   r+   r+   r/   r)    s
   r)  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)))rý   )r  )Fr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r*  '  s   r*  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage20z((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ø   )r  )r   )rý   )r  )Fz	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r+  1  s   r+  c               @   s"   e Zd ZdddgZddgZdZdS )ÚIndexedTableUsage21z(~(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ø   )r%  )r   )rý   )r  )Tz	(e0 & e1)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r,  >  s   r,  c               @   s    e Zd ZdddgZdgZdZdS )ÚIndexedTableUsage22z5~((c_int32 >= 1) & (c_int32 < 2)) & ~(c_bool == True)z!~(c_bool == True) & (c_extra > 0)zG~((c_int32 >= 1) & (c_int32 < 2)) & (~(c_bool == True) & (c_extra > 0)))rý   )r  )Fr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r-  K  s
   r-  c               @   s"   e Zd ZdddddgZg ZdZdS )ÚIndexedTableUsage23zc_int32 != 1zc_bool != Falsez~(c_int32 != 1)z~(c_bool != False)z(c_int32 != 1) & (c_extra != 2)r   N)re   rf   rg   r  r  r  r+   r+   r+   r/   r.  W  s   r.  c               @   s(   e Zd ZdddddddgZdgZd	Zd
S )ÚIndexedTableUsage24rý   zc_bool == TruezTrue == c_boolz
~(~c_bool)z~~c_boolz
~~~~c_boolz~(~c_bool) & (c_extra != 2))rý   )r  )Tr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r/  c  s   r/  c               @   s(   e Zd ZdddddddgZdgZd	Zd
S )ÚIndexedTableUsage25z~c_boolzc_bool == FalsezFalse == c_boolz	~(c_bool)z~((c_bool))z	~~~c_boolz~~(~c_bool) & (c_extra != 2))rý   )r  )Fr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r0  r  s   r0  c               @   s    e Zd ZddddgZg ZdZdS )ÚIndexedTableUsage26zc_bool != TruezTrue != c_boolzc_bool != FalsezFalse != c_boolr   N)re   rf   rg   r  r  r  r+   r+   r+   r/   r1  ‚  s   r1  c               @   s"   e Zd ZddgZdddg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ø   )r  )rŽ   )rý   )r  )T)rø   )r  )r   z((e0 | e1) | e2)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r2    s   r2  c               @   s"   e Zd ZddgZdddg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))rø   )r  )rŽ   )rý   )r  )T)rø   )r  )r   z((e0 | e1) & e2)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r3  ›  s   r3  c               @   s"   e Zd ZddgZdddg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ø   )r  )r   )rø   )r  )r   )rø   )r  )rŽ   z((e0 & e1) | e2)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r4  ©  s   r4  c               @   s"   e Zd ZddgZdddg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))rø   )r  )rŽ   )rø   )r  )r   )rø   )r  )r   z((e0 | e1) & e2)N)re   rf   rg   r  r  r  r+   r+   r+   r/   r5  ·  s   r5  c               @   s    e Zd ZdddgZdgZdZdS )ÚIndexedTableUsage31z2(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  )Tr  N)re   rf   rg   r  r  r  r+   r+   r+   r/   r6  Å  s
   r6  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   N)re   rf   rg   r  r  r  r+   r+   r+   r/   r7  Ñ  s   r7  c        
      C   s¶  t  ¡ } tg}| t¡ tj}|r(d}nd}d}x~t|ƒD ]p}xJ|D ]B}x<|ƒ D ]2}t|d ƒ}|sn|jsTt j	||d}	|  
|	¡ qTW qHW |  
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,¡¡ q<W | S )zCReturn a test suite consisting of all the test cases in the module.r{   Ztest_lr   r   )Úprefix)-r   Z	TestSuiter×   rS   rç   r   r4   r   r¢   Z	makeSuiteZaddTestré   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/  r0  r1  r2  r3  r4  r5  r6  r7  )
Z	testSuiteZ
cdatafuncsr4   Z
autoprefixZniterr1   Ú	cdatafuncZcdataÚclass_Zsuite_r+   r+   r/   ÚsuiteÛ  sd    


r;  Ú__main__)ZdefaultTest)r+   )r+   )r+   )N)r   N)«r‚   Z
__future__r   rƒ   rÅ   rÇ   r¯   rš   r<   r:   Ztables.utilsr   Ztables.testsr   Ztables.tests.commonr   r   rm   r   ZTestCaser7   Z	six.movesr   r	   r
   r   r   r   r   r   r   r   r   r   rY   r‰   rV   Z
_maxnvaluerU   Z_strlenrN   rp   Zbool_r   r   r   r   r   r    r!   r"   r#   r$   Úfloatr%   r&   Úcomplexr'   Zstring_r8   r³   Úhasattrr*   r­   rX   r;   r»   r  r9   ÚEnumr(   rC   rG   rK   rL   rM   rQ   rc   ZSkipTestrd   ZTempFileMixinrh   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ç   r9  ZcnamerÖ   Zcdictr¾   ZcbasesrD   r:  Úexecrè   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/  r0  r1  r2  r3  r4  r5  r6  r7  r;  re   Z
parse_argvÚargvZprint_versionsÚmainr+   r+   r+   r/   Ú<module>   s:  4



28
 

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