B
    q\                 @   sl   d Z ddlmZ ddlmZ yddlmZ dZW n ek
rH   dZY nX G dd de	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)
SortedListTFc               @   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 )N)r   r   )selfr   r    r	   1lib/python3.7/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 )N)	__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 )N)r   r   r   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 )N)r   r   r   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 )N)r   r   r   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 )N)r   r   r   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 )N)r   r   r   r   )r   r   r	   r	   r
   __ge__2   s    
zNode.__ge__Nc             C   s   d | j| jS )NzNode({0!r}, {1!r}))formatr   r   )r   r	   r	   r
   __repr__9   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 ) SCEngineal  
    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 (defaults to False)
        Whether the values of the index must be unique
    Fc             C   s*   t t|}tttt||| _|| _d S )N)maptupler   r   r   zip_nodes_unique)r   dataZ	row_indexuniqueZ	node_keysr	   r	   r
   r   K   s    
zSCEngine.__init__c             C   s8   | j r"|| jkr"d|}t|| jt|| dS )z(
        Add a key, value pair.
        z duplicate {0:!r} in unique indexN)r    r   r   
ValueErroraddr   )r   r   r   messager	   r	   r
   r$   P   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>]   s    z!SCEngine.find.<locals>.<listcomp>)r   irange)r   r   r	   r	   r
   findY   s    zSCEngine.findNc             C   sp   |dk	r<t ||}y| j| W n tk
r6   dS X dS t| j||}x|D ]}| j| qTW t|S )z1
        Remove data from the given key.
        NFT)r   r   remover#   listr)   bool)r   r   r!   itemitemsr	   r	   r
   r+   _   s    

zSCEngine.removec             C   s,   x&| j D ]}|j|kr| jd8  _qW dS )z;
        Decrement rows larger than the given row.
           N)r   r   )r   rowr'   r	   r	   r
   
shift_lefto   s    
zSCEngine.shift_leftc             C   s,   x&| j D ]}|j|kr| jd7  _qW dS )zH
        Increment rows greater than or equal to the given row.
        r0   N)r   r   )r   r1   r'   r	   r	   r
   shift_rightw   s    
zSCEngine.shift_rightc             C   sJ   t  }x:| jD ]0}|j|kr0||j |j q|jg||j< qW | S )z4
        Return a list of key, data tuples.
        )r   r   r   appendr   r/   )r   resultr'   r	   r	   r
   r/      s    
zSCEngine.itemsc             C   s"   xt | jD ]\}}||_qW dS )z6
        Make row order align with key order.
        N)	enumerater   r   )r   indexr'   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	   r
   r(      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	   r
   r(      s    z"SCEngine.range.<locals>.<listcomp>)r   r)   )r   lowerupperZboundsiteratorr	   r	   r
   range   s    zSCEngine.rangec                sH    fdd| j D }x|D ]} |j |_qW | j   | j | dS )z:
        Replace rows with the values in row_map.
        c                s   g | ]}|j  kr|qS r	   )r   )r&   r'   )row_mapr	   r
   r(      s    z)SCEngine.replace_rows.<locals>.<listcomp>N)r   r   clearupdate)r   r?   Znodesr'   r	   )r?   r
   replace_rows   s
    

zSCEngine.replace_rowsc             C   s   d t| jS )Nz{0!r})r   r,   r   )r   r	   r	   r
   r      s    zSCEngine.__repr__)F)N)r:   )r   r   r   __doc__r   r$   r*   r+   r2   r3   r/   r8   r9   r>   rB   r   r	   r	   r	   r
   r   =   s   
	


r   N)rC   collectionsr   	itertoolsr   Zsortedcontainersr   ZHAS_SOCOImportErrorobjectr   r   r	   r	   r	   r
   <module>   s   
+