3
vΕΟ^j  γ               @   s   d 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dS )z~
Helpers to manipulate deferred DDL statements that might need to be adjusted or
discarded within when executing a migration.
c               @   s@   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S )Ϊ	Referencez0Base class that defines the reference interface.c             C   s   dS )zU
        Return whether or not this instance references the specified table.
        F© )ΪselfΪtabler   r   ϊE/usr/lib/python3.6/site-packages/django/db/backends/ddl_references.pyΪreferences_table
   s    zReference.references_tablec             C   s   dS )zV
        Return whether or not this instance references the specified column.
        Fr   )r   r   Ϊcolumnr   r   r   Ϊreferences_column   s    zReference.references_columnc             C   s   dS )zI
        Rename all references to the old_name to the new_table.
        Nr   )r   Ϊ	old_tableΪ	new_tabler   r   r   Ϊrename_table_references   s    z!Reference.rename_table_referencesc             C   s   dS )zL
        Rename all references to the old_column to the new_column.
        Nr   )r   r   Ϊ
old_columnΪ
new_columnr   r   r   Ϊrename_column_references   s    z"Reference.rename_column_referencesc             C   s   d| j jt| f S )Nz<%s %r>)Ϊ	__class__Ϊ__name__Ϊstr)r   r   r   r   Ϊ__repr__"   s    zReference.__repr__c             C   s   t dd S )Nz>Subclasses must define how they should be converted to string.)ΪNotImplementedError)r   r   r   r   Ϊ__str__%   s    zReference.__str__N)
r   Ϊ
__module__Ϊ__qualname__Ϊ__doc__r   r   r   r   r   r   r   r   r   r   r      s   r   c               @   s0   e Zd Z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   s   || _ || _d S )N)r   Ϊ
quote_name)r   r   r   r   r   r   Ϊ__init__,   s    zTable.__init__c             C   s
   | j |kS )N)r   )r   r   r   r   r   r   0   s    zTable.references_tablec             C   s   | j |kr|| _ d S )N)r   )r   r	   r
   r   r   r   r   3   s    
zTable.rename_table_referencesc             C   s   | j | jS )N)r   r   )r   r   r   r   r   7   s    zTable.__str__N)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d Zdd ZdS )	ΪTableColumnsz9Base class for references to multiple columns of a table.c             C   s   || _ || _d S )N)r   Ϊcolumns)r   r   r   r   r   r   r   >   s    zTableColumns.__init__c             C   s   | j |ko|| jkS )N)r   r   )r   r   r   r   r   r   r   B   s    zTableColumns.references_columnc             C   s8   | j |kr4x(t| jD ]\}}||kr|| j|< qW d S )N)r   Ϊ	enumerater   )r   r   r   r   Ϊindexr   r   r   r   r   E   s    
z%TableColumns.rename_column_referencesN)r   r   r   r   r   r   r   r   r   r   r   r   ;   s   r   c                   s,   e Zd ZdZf f fdd	Zdd Z  ZS )ΪColumnsz(Hold a reference to one or many columns.c                s   || _ || _t j|| d S )N)r   Ϊcol_suffixesΪsuperr   )r   r   r   r   r    )r   r   r   r   O   s    zColumns.__init__c                s*   fdd dj  fddtjD S )Nc                s4   y j |  j|  S  tk
r.    j | S X d S )N)r   r    Ϊ
IndexError)r   Ϊidx)r   r   r   Ϊcol_strU   s    z Columns.__str__.<locals>.col_strz, c             3   s   | ]\}} ||V  qd S )Nr   )Ϊ.0r#   r   )r$   r   r   ϊ	<genexpr>[   s    z"Columns.__str__.<locals>.<genexpr>)Ϊjoinr   r   )r   r   )r$   r   r   r   T   s    zColumns.__str__)r   r   r   r   r   r   Ϊ__classcell__r   r   )r   r   r   L   s   r   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                s   || _ || _t j|| d S )N)ΪsuffixΪcreate_index_namer!   r   )r   r   r   r*   r+   )r   r   r   r   a   s    zIndexName.__init__c             C   s   | j | j| j| jS )N)r+   r   r   r*   )r   r   r   r   r   f   s    zIndexName.__str__)r   r   r   r   r   r   r(   r   r   )r   r   r)   ^   s   r)   c                   s*   e Zd Zf f f fdd	Zdd Z  ZS )ΪIndexColumnsc                s   || _ t j|||| d S )N)Ϊ	opclassesr!   r   )r   r   r   r   r    r-   )r   r   r   r   k   s    zIndexColumns.__init__c                s*   fdd dj  fddtjD S )Nc                sH   dj  j|  j| }ydj | j| }W n tk
rB   Y nX |S )Nz{} {})Ϊformatr   r-   r    r"   )r   r#   Ϊcol)r   r   r   r$   p   s    z%IndexColumns.__str__.<locals>.col_strz, c             3   s   | ]\}} ||V  qd S )Nr   )r%   r#   r   )r$   r   r   r&   z   s    z'IndexColumns.__str__.<locals>.<genexpr>)r'   r   r   )r   r   )r$   r   r   r   o   s    
zIndexColumns.__str__)r   r   r   r   r   r(   r   r   )r   r   r,   j   s   r,   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 j|| d S )N)r   Ϊto_referenceΪsuffix_templateΪcreate_fk_namer!   r   )r   Z
from_tableZfrom_columnsΪto_tableZ
to_columnsr2   r3   )r   r   r   r      s    zForeignKeyName.__init__c                s   t  j|p| jj|S )N)r!   r   r1   )r   r   )r   r   r   r      s    zForeignKeyName.references_tablec                s   t  j||p| jj||S )N)r!   r   r1   )r   r   r   )r   r   r   r      s    z ForeignKeyName.references_columnc                s    t  j|| | jj|| d S )N)r!   r   r1   )r   r	   r
   )r   r   r   r      s    z&ForeignKeyName.rename_table_referencesc                s$   t  j||| | jj||| d S )N)r!   r   r1   )r   r   r   r   )r   r   r   r      s    z'ForeignKeyName.rename_column_referencesc             C   s.   | j | jj| jjd d }| j| j| j|S )Nι    )r4   Ϊ	to_column)r2   r1   r   r   r3   )r   r*   r   r   r   r      s    zForeignKeyName.__str__)r   r   r   r   r   r   r   r   r   r   r(   r   r   )r   r   r0   }   s   r0   c               @   s@   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S )Ϊ	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   s   || _ || _d S )N)ΪtemplateΪparts)r   r8   r9   r   r   r   r   §   s    zStatement.__init__c                s   t  fdd| jj D S )Nc             3   s"   | ]}t |d o|j V  qdS )r   N)Ϊhasattrr   )r%   Ϊpart)r   r   r   r&   ­   s   z-Statement.references_table.<locals>.<genexpr>)Ϊanyr9   Ϊvalues)r   r   r   )r   r   r   «   s    
zStatement.references_tablec                s   t  fdd| jj D S )Nc             3   s$   | ]}t |d o|j V  qdS )r   N)r:   r   )r%   r;   )r   r   r   r   r&   ³   s   z.Statement.references_column.<locals>.<genexpr>)r<   r9   r=   )r   r   r   r   )r   r   r   r   ±   s    zStatement.references_columnc             C   s.   x(| j j D ]}t|dr|j|| qW d S )Nr   )r9   r=   r:   r   )r   r	   r
   r;   r   r   r   r   ·   s    
z!Statement.rename_table_referencesc             C   s0   x*| j j D ]}t|dr|j||| qW d S )Nr   )r9   r=   r:   r   )r   r   r   r   r;   r   r   r   r   Ό   s    
z"Statement.rename_column_referencesc             C   s   | j | j S )N)r8   r9   )r   r   r   r   r   Α   s    zStatement.__str__N)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7      s   r7   N)	r   r   r   r   r   r)   r,   r0   r7   r   r   r   r   Ϊ<module>   s   ""