o
    {,h!                     @   s   d Z ddlmZ G dd d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 dd deZ
G dd deZdS )z~
Helpers to manipulate deferred DDL statements that might need to be adjusted or
discarded within when executing a migration.
    )deepcopyc                   @   H   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S )	Referencez0Base class that defines the reference interface.c                 C      dS )zU
        Return whether or not this instance references the specified table.
        F selftabler   r   W/var/www/html/rh/venv/lib/python3.10/site-packages/django/db/backends/ddl_references.pyreferences_table      zReference.references_tablec                 C   r   )zV
        Return whether or not this instance references the specified column.
        Fr   r   r	   columnr   r   r
   references_column   r   zReference.references_columnc                 C   r   )zU
        Return whether or not this instance references the specified index.
        Fr   r   r	   indexr   r   r
   references_index   r   zReference.references_indexc                 C   r   )zI
        Rename all references to the old_name to the new_table.
        Nr   r   	old_table	new_tabler   r   r
   rename_table_references   r   z!Reference.rename_table_referencesc                 C   r   )zL
        Rename all references to the old_column to the new_column.
        Nr   r   r	   
old_column
new_columnr   r   r
   rename_column_references$   r   z"Reference.rename_column_referencesc                 C   s   d| j jt| f S )Nz<%s %r>)	__class____name__strr   r   r   r
   __repr__*      zReference.__repr__c                 C   s   t d)Nz>Subclasses must define how they should be converted to string.)NotImplementedErrorr   r   r   r
   __str__-   s   zReference.__str__N)r   
__module____qualname____doc__r   r   r   r   r   r   r"   r   r   r   r
   r   	   s    r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TablezHold a reference to a table.c                 C      || _ || _d S N)r	   
quote_name)r   r	   r)   r   r   r
   __init__6      
zTable.__init__c                 C   s
   | j |kS r(   r	   r   r   r   r
   r   :   s   
zTable.references_tablec                 C   s   |  |o
t| |kS r(   )r   r   r   r   r   r
   r   =   s   zTable.references_indexc                 C   s   | j |kr
|| _ d S d S r(   r,   r   r   r   r
   r   @   s   

zTable.rename_table_referencesc                 C   s   |  | jS r(   )r)   r	   r   r   r   r
   r"   D      zTable.__str__N)	r   r#   r$   r%   r*   r   r   r   r"   r   r   r   r
   r&   3   s    r&   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TableColumnsz9Base class for references to multiple columns of a table.c                 C   r'   r(   r	   columns)r   r	   r0   r   r   r
   r*   K   r+   zTableColumns.__init__c                 C   s   | j |ko	|| jv S r(   r/   r   r   r   r
   r   O   r    zTableColumns.references_columnc                 C   s8   | j |krt| jD ]\}}||kr|| j|< q
d S d S r(   )r	   	enumerater0   )r   r	   r   r   r   r   r   r   r
   r   R   s   

z%TableColumns.rename_column_referencesN)r   r#   r$   r%   r*   r   r   r   r   r   r
   r.   H   s
    r.   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )Columnsz(Hold a reference to one or many columns.r   c                       || _ || _t || d S r(   )r)   col_suffixessuperr*   )r   r	   r0   r)   r4   r   r   r
   r*   \      zColumns.__init__c                    *   fdd d  fddtjD S )Nc                    sF     | }z j| }|rd||}W |S W |S  ty"   Y |S w Nz{} {})r)   r4   format
IndexErrorr   idxcolsuffixr   r   r
   col_strb   s   

z Columns.__str__.<locals>.col_str, c                 3       | ]
\}} ||V  qd S r(   r   .0r=   r   r@   r   r
   	<genexpr>l       
z"Columns.__str__.<locals>.<genexpr>joinr1   r0   r   r   r@   r   r
   r"   a   s   
zColumns.__str__)r   r   r#   r$   r%   r*   r"   __classcell__r   r   r6   r
   r2   Y   s    r2   c                       s(   e Zd ZdZ fddZdd Z  ZS )	IndexNamez"Hold a reference to an index name.c                    r3   r(   )r?   create_index_namer5   r*   )r   r	   r0   r?   rN   r6   r   r
   r*   t   r7   zIndexName.__init__c                 C   s   |  | j| j| jS r(   )rN   r	   r0   r?   r   r   r   r
   r"   y   r    zIndexName.__str__rK   r   r   r6   r
   rM   q   s    rM   c                       s&   e Zd Zd fdd	Zdd Z  ZS )IndexColumnsr   c                    s   || _ t |||| d S r(   )	opclassesr5   r*   )r   r	   r0   r)   r4   rP   r6   r   r
   r*   ~   s   zIndexColumns.__init__c                    r8   )Nc                    sT   d  |  j| }z j| }|rd ||}W |S W |S  ty)   Y |S w r9   )r:   r)   rP   r4   r;   r<   r   r   r
   r@      s   
z%IndexColumns.__str__.<locals>.col_strrA   c                 3   rB   r(   r   rC   rE   r   r
   rF      rG   z'IndexColumns.__str__.<locals>.<genexpr>rH   r   r   rJ   r
   r"      s   zIndexColumns.__str__)r   r   )r   r#   r$   r*   r"   rL   r   r   r6   r
   rO   }   s    rO   c                       sX   e Zd ZdZ fddZ fddZ fddZ fdd	Z fd
dZdd Z	  Z
S )ForeignKeyNamez'Hold a reference to a foreign key name.c                    s*   t ||| _|| _|| _t || d S r(   )r.   to_referencesuffix_templatecreate_fk_namer5   r*   )r   
from_tablefrom_columnsto_table
to_columnsrS   rT   r6   r   r
   r*      s   	zForeignKeyName.__init__c                    s   t  |p| j|S r(   )r5   r   rR   r   r6   r   r
   r      s   zForeignKeyName.references_tablec                    s   t  ||p| j||S r(   )r5   r   rR   r   r6   r   r
   r      s
   z ForeignKeyName.references_columnc                    s    t  || | j|| d S r(   )r5   r   rR   r   r6   r   r
   r      s   z&ForeignKeyName.rename_table_referencesc                    s$   t  ||| | j||| d S r(   )r5   r   rR   r   r6   r   r
   r      s   z'ForeignKeyName.rename_column_referencesc                 C   s.   | j | jj| jjd d }| | j| j|S )Nr   )rW   	to_column)rS   rR   r	   r0   rT   )r   r?   r   r   r
   r"      s
   
zForeignKeyName.__str__)r   r#   r$   r%   r*   r   r   r   r   r"   rL   r   r   r6   r
   rQ      s    rQ   c                   @   r   )	Statementz
    Statement template and formatting parameters container.

    Allows keeping a reference to a statement without interpolating identifiers
    that might have to be adjusted if they're referencing a table or column
    that is removed
    c                 K   r'   r(   templateparts)r   r\   r]   r   r   r
   r*      r+   zStatement.__init__c                    s   t  fdd| j D S )Nc                 3   s$    | ]}t |d o| V  qdS )r   N)hasattrr   rD   partr,   r   r
   rF      s
    
z-Statement.references_table.<locals>.<genexpr>anyr]   valuesr   r   r,   r
   r      s   zStatement.references_tablec                       t  fdd| j D S )Nc                 3   &    | ]}t |d o| V  qdS )r   N)r^   r   r_   r   r	   r   r
   rF      
    
z.Statement.references_column.<locals>.<genexpr>ra   r   r   rf   r
   r         zStatement.references_columnc                    rd   )Nc                 3   re   )r   N)r^   r   r_   r   r	   r   r
   rF      rg   z-Statement.references_index.<locals>.<genexpr>ra   r   r   ri   r
   r      rh   zStatement.references_indexc                 C   s*   | j  D ]}t|dr||| qd S )Nr   )r]   rc   r^   r   )r   r   r   r`   r   r   r
   r      s
   
z!Statement.rename_table_referencesc                 C   s,   | j  D ]}t|dr|||| qd S )Nr   )r]   rc   r^   r   )r   r	   r   r   r`   r   r   r
   r      s
   
z"Statement.rename_column_referencesc                 C   s   | j | j S r(   r[   r   r   r   r
   r"      r-   zStatement.__str__N)r   r#   r$   r%   r*   r   r   r   r   r   r"   r   r   r   r
   rZ      s    rZ   c                       s8   e Zd Z fddZ fddZdd Zdd Z  ZS )	Expressionsc                    s@   || _ || _|| _dd | j j| jgD }t || d S )Nc                 S   s   g | ]}|j jqS r   )targetr   )rD   r>   r   r   r
   
<listcomp>   s    z(Expressions.__init__.<locals>.<listcomp>)compilerexpressionsquote_valuequery	_gen_colsr5   r*   )r   r	   rn   rm   ro   r0   r6   r   r
   r*      s   zExpressions.__init__c                    s2   | j |krd S | j||i| _t || d S r(   )r	   rn   relabeled_cloner5   r   r   r6   r   r
   r      s   
z#Expressions.rename_table_referencesc                 C   sb   | j |krd S t| j}g | _| jj|gD ]}|jj|kr#||j_| j	|jj q|| _d S r(   )
r	   r   rn   r0   rm   rp   rq   rk   r   append)r   r	   r   r   rn   r>   r   r   r
   r      s   


z$Expressions.rename_column_referencesc                 C   s*   | j | j\}}t| j|}|t| S r(   )rm   compilern   mapro   tuple)r   sqlparamsr   r   r
   r"     s   zExpressions.__str__)r   r#   r$   r*   r   r   r"   rL   r   r   r6   r
   rj      s
    
rj   N)r%   copyr   r   r&   r.   r2   rM   rO   rQ   rZ   rj   r   r   r   r
   <module>   s    *.-