U
    e»{j:  ã                   @   sX   d Z ddlmZ ddlmZ ddlmZ er8ddlmZ G dd„ dƒZ	G dd	„ d	ƒZ
d
S )zc
The SCEngine class uses the ``sortedcontainers`` package to implement an
Index engine for Tables.
é    )ÚOrderedDict)Ústarmap)ÚHAS_SORTEDCONTAINERS)Ú
SortedListc                   @   sT   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Zdd„ ZdS )ÚNode©ÚkeyÚvaluec                 C   s   || _ || _d S ©Nr   )Úselfr   r	   © r   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/table/soco.pyÚ__init__   s    zNode.__init__c                 C   s,   |j tkr"| j| jf|j|jfk S | j|k S r
   ©Ú	__class__r   r   r	   ©r   Úotherr   r   r   Ú__lt__   s    
zNode.__lt__c                 C   s,   |j tkr"| j| jf|j|jfkS | j|kS r
   r   r   r   r   r   Ú__le__   s    
zNode.__le__c                 C   s,   |j tkr"| j| jf|j|jfkS | j|kS r
   r   r   r   r   r   Ú__eq__"   s    
zNode.__eq__c                 C   s,   |j tkr"| j| jf|j|jfkS | j|kS r
   r   r   r   r   r   Ú__ne__'   s    
zNode.__ne__c                 C   s,   |j tkr"| j| jf|j|jfkS | j|kS r
   r   r   r   r   r   Ú__gt__,   s    
zNode.__gt__c                 C   s,   |j tkr"| j| jf|j|jfkS | j|kS r
   r   r   r   r   r   Ú__ge__1   s    
zNode.__ge__Nc                 C   s   d| j ›d| j›d�S )NzNode(ú, ú)r   ©r   r   r   r   Ú__repr__8   s    zNode.__repr__)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r   r   r   Ú__hash__r   r   r   r   r   r      s   r   c                   @   sv   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„Zdd„ Zdd„ Zd	S ) ÚSCEngineat  
    Fast tree-based implementation for indexing, using the
    ``sortedcontainers`` package.

    Parameters
    ----------
    data : Table
        Sorted columns of the original table
    row_index : Column object
        Row numbers corresponding to data columns
    unique : bool
        Whether the values of the index must be unique.
        Defaults to False.
    Fc                 C   s6   t stdƒ‚tt|ƒ}tttt||ƒƒƒ| _|| _	d S )Nz-sortedcontainers is needed for using SCEngine)
r   ÚImportErrorÚmapÚtupler   r   r   ÚzipÚ_nodesÚ_unique)r   ÚdataZ	row_indexÚuniqueZ	node_keysr   r   r   r   L   s
    
zSCEngine.__init__c                 C   s:   | j r$|| jkr$d|›d�}t|ƒ‚| j t||ƒ¡ dS )z(
        Add a key, value pair.
        z
duplicate z in unique indexN)r(   r'   Ú
ValueErrorÚaddr   )r   r   r	   Úmessager   r   r   r,   T   s    zSCEngine.addc                 C   s   dd„ | j  ||¡D ƒS )z;
        Find rows corresponding to the given key.
        c                 S   s   g | ]
}|j ‘qS r   ©r	   ©Ú.0Únoder   r   r   Ú
<listcomp>a   s     z!SCEngine.find.<locals>.<listcomp>©r'   Úirange)r   r   r   r   r   Úfind]   s    zSCEngine.findNc                 C   sn   |dk	r>t ||ƒ}z| j |¡ W n tk
r8   Y dS X dS t| j ||¡ƒ}|D ]}| j |¡ qTt|ƒS )z1
        Remove data from the given key.
        NFT)r   r'   Úremover+   Úlistr4   Úbool)r   r   r)   ÚitemÚitemsr   r   r   r6   c   s    
zSCEngine.removec                 C   s(   | j D ]}|j|kr| jd8  _qdS )z;
        Decrement rows larger than the given row.
        é   N©r'   r	   ©r   Úrowr1   r   r   r   Ú
shift_lefts   s    

zSCEngine.shift_leftc                 C   s(   | j D ]}|j|kr| jd7  _qdS )zH
        Increment rows greater than or equal to the given row.
        r;   Nr<   r=   r   r   r   Úshift_right{   s    

zSCEngine.shift_rightc                 C   sF   t ƒ }| jD ]0}|j|kr.||j  |j¡ q|jg||j< q| ¡ S )z4
        Return a list of key, data tuples.
        )r   r'   r   Úappendr	   r:   )r   Úresultr1   r   r   r   r:   ƒ   s    

zSCEngine.itemsc                 C   s   t | jƒD ]\}}||_q
dS )z6
        Make row order align with key order.
        N)Ú	enumerater'   r	   )r   Úindexr1   r   r   r   Úsort�   s    zSCEngine.sortc                 C   s   dd„ | j D ƒS )z?
        Return a list of rows in order sorted by key.
        c                 S   s   g | ]
}|j ‘qS r   r.   r/   r   r   r   r2   š   s     z(SCEngine.sorted_data.<locals>.<listcomp>)r'   r   r   r   r   Úsorted_data–   s    zSCEngine.sorted_data©TTc                 C   s   | j  |||¡}dd„ |D ƒS )z7
        Return row values in the given range.
        c                 S   s   g | ]
}|j ‘qS r   r.   r/   r   r   r   r2   ¡   s     z"SCEngine.range.<locals>.<listcomp>r3   )r   ÚlowerÚupperZboundsÚiteratorr   r   r   Úrangeœ   s    zSCEngine.rangec                    sD   ‡ fdd„| j D ƒ}|D ]}ˆ |j |_q| j  ¡  | j  |¡ dS )z:
        Replace rows with the values in row_map.
        c                    s   g | ]}|j ˆ kr|‘qS r   r.   r/   ©Úrow_mapr   r   r2   §   s     
 z)SCEngine.replace_rows.<locals>.<listcomp>N)r'   r	   ÚclearÚupdate)r   rM   Únodesr1   r   rL   r   Úreplace_rows£   s
    
zSCEngine.replace_rowsc                 C   sj   t | jƒdkr:t| jd d… ƒdg t| jdd … ƒ }n| j}d dd„ |D ƒ¡}d| jj› d	|› d
�S )Né   é   z...éýÿÿÿr   c                 s   s   | ]}t |ƒV  qd S r
   )Ústrr/   r   r   r   Ú	<genexpr>²   s     z$SCEngine.__repr__.<locals>.<genexpr>ú<z nodes=ú>)Úlenr'   r7   Újoinr   r   )r   rP   Z	nodes_strr   r   r   r   ­   s
    ,zSCEngine.__repr__)F)N)rG   )r   r   r   Ú__doc__r   r,   r5   r6   r?   r@   r:   rE   rF   rK   rQ   r   r   r   r   r   r"   <   s   
	


r"   N)r[   Úcollectionsr   Ú	itertoolsr   Z"astropy.utils.compat.optional_depsr   Zsortedcontainersr   r   r"   r   r   r   r   Ú<module>   s   +