
    IR-e:                     r    d Z ddlmZ ddlmZ ddlmZ erddlmZ  G d d          Z	 G 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                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	Zd
 Zd	S )Nodekeyvaluec                 "    || _         || _        d S Nr	   )selfr
   r   s      2lib/python3.11/site-packages/astropy/table/soco.py__init__zNode.__init__   s    


    c                 p    |j         t          u r| j        | j        f|j        |j        fk     S | j        |k     S r   	__class__r   r
   r   r   others     r   __lt__zNode.__lt__   9    ?d""Hdj)UY,DDDx%r   c                 p    |j         t          u r| j        | j        f|j        |j        fk    S | j        |k    S r   r   r   s     r   __le__zNode.__le__   9    ?d""Hdj)ei-EEEx5  r   c                 p    |j         t          u r| j        | j        f|j        |j        fk    S | j        |k    S r   r   r   s     r   __eq__zNode.__eq__"   r   r   c                 p    |j         t          u r| j        | j        f|j        |j        fk    S | j        |k    S r   r   r   s     r   __ne__zNode.__ne__'   r   r   c                 p    |j         t          u r| j        | j        f|j        |j        fk    S | j        |k    S r   r   r   s     r   __gt__zNode.__gt__,   r   r   c                 p    |j         t          u r| j        | j        f|j        |j        fk    S | j        |k    S r   r   r   s     r   __ge__zNode.__ge__1   r   r   Nc                 (    d| j         d| j        dS )NzNode(, )r	   r   s    r   __repr__zNode.__repr__8   s    4tx44TZ4444r   )__name__
__module____qualname__	__slots__r   r   r   r   r   r!   r#   __hash__r(    r   r   r   r      s         I       
! ! !
! ! !
! ! !
     
! ! !
 H5 5 5 5 5r   r   c                   `    e Zd ZdZddZd Zd ZddZd Zd	 Z	d
 Z
d Zd ZddZd Z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           	          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   data	row_indexunique	node_keyss        r   r   zSCEngine.__init__L   sW    # 	OMNNNt$$	 s9i/H/H!I!IJJr   c                     | j         r|| j        v rd|d}t          |          | j                            t	          ||                     dS )z(
        Add a key, value pair.
        z
duplicate z in unique indexN)r7   r6   
ValueErroraddr   )r   r
   r   messages       r   r>   zSCEngine.addT   s\     < 	&SDK//:3:::GW%%%S%(()))))r   c                 L    d | j                             ||          D             S )z;
        Find rows corresponding to the given key.
        c                     g | ]	}|j         
S r.   r   .0nodes     r   
<listcomp>z!SCEngine.find.<locals>.<listcomp>a   s    DDDt
DDDr   r6   irange)r   r
   s     r   findzSCEngine.find]   s+     EDt{'9'9#s'C'CDDDDr   Nc                 0   |?t          ||          }	 | j                            |           n# t          $ r Y dS w xY wdS t	          | j                            ||                    }|D ]}| j                            |           t          |          S )z1
        Remove data from the given key.
        NFT)r   r6   remover=   listrH   bool)r   r
   r8   itemitemss        r   rK   zSCEngine.removec   s     T??D""4((((   uu4T[''S1122 	% 	%DKt$$$$E{{s   / 
==c                 P    | j         D ]}|j        |k    r|xj        dz  c_        dS )z;
        Decrement rows larger than the given row.
           Nr6   r   r   rowrE   s      r   
shift_leftzSCEngine.shift_lefts   s<     K 	  	 DzC

a

	  	 r   c                 P    | j         D ]}|j        |k    r|xj        dz  c_        dS )zH
        Increment rows greater than or equal to the given row.
        rQ   NrR   rS   s      r   shift_rightzSCEngine.shift_right{   s<     K 	  	 DzS  

a

	  	 r   c                     t                      }| j        D ]A}|j        |v r&||j                                     |j                   1|j        g||j        <   B|                                S )z4
        Return a list of key, data tuples.
        )r   r6   r
   appendr   rO   )r   resultrE   s      r   rO   zSCEngine.items   sl     K 	0 	0Dx6!!tx ''
3333$(J<tx  ||~~r   c                 H    t          | j                  D ]\  }}||_        dS )z6
        Make row order align with key order.
        N)	enumerater6   r   )r   indexrE   s      r   sortzSCEngine.sort   s4     %T[11 	 	KE4DJJ	 	r   c                 $    d | j         D             S )z?
        Return a list of rows in order sorted by key.
        c                     g | ]	}|j         
S r.   rB   rC   s     r   rF   z(SCEngine.sorted_data.<locals>.<listcomp>   s    333t
333r   )r6   r'   s    r   sorted_datazSCEngine.sorted_data   s     43t{3333r   TTc                 R    | j                             |||          }d |D             S )z7
        Return row values in the given range.
        c                     g | ]	}|j         
S r.   rB   rC   s     r   rF   z"SCEngine.range.<locals>.<listcomp>   s    000t
000r   rG   )r   lowerupperboundsiterators        r   rangezSCEngine.range   s1     ;%%eUF;;00x0000r   c                     fd| j         D             }|D ]}|j                 |_        | j                                          | j                             |           dS )z:
        Replace rows with the values in row_map.
        c                 &    g | ]}|j         v |S r.   rB   )rD   rE   row_maps     r   rF   z)SCEngine.replace_rows.<locals>.<listcomp>   s%    GGG$w1F1F1F1F1Fr   N)r6   r   clearupdate)r   rl   nodesrE   s    `  r   replace_rowszSCEngine.replace_rows   sp     HGGG$+GGG 	- 	-D ,DJJ5!!!!!r   c                     t          | j                  dk    r>t          | j        d d                   dgz   t          | j        dd                    z   }n| j        }d                    d |D                       }d| j        j         d| d	S )
N      z...r%   c              3   4   K   | ]}t          |          V  d S r   )strrC   s     r   	<genexpr>z$SCEngine.__repr__.<locals>.<genexpr>   s(      ::Dc$ii::::::r   <z nodes=>)lenr6   rL   joinr   r)   )r   ro   	nodes_strs      r   r(   zSCEngine.__repr__   s    t{aRaR))UG3d4;rss;K6L6LLEEKEII::E:::::	?4>*??9????r   )Fr   )rb   )r)   r*   r+   __doc__r   r>   rI   rK   rU   rW   rO   r^   ra   ri   rp   r(   r.   r   r   r0   r0   <   s            * * *E E E              
 
 
  4 4 41 1 1 1" " "@ @ @ @ @r   r0   N)r}   collectionsr   	itertoolsr   "astropy.utils.compat.optional_depsr   sortedcontainersr   r   r0   r.   r   r   <module>r      s    
 $ # # # # #       C C C C C C ,++++++(5 (5 (5 (5 (5 (5 (5 (5Vw@ w@ w@ w@ w@ w@ w@ w@ w@ w@r   