U
     5i'                     @   s   d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
 dddgZG d	d
 d
ZG dd deZG dd deZG dd deZdS )    )Enum)ExpressionListF)IndexExpression)Q)QueryCheckConstraint
DeferrableUniqueConstraintc                   @   sH   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )BaseConstraintc                 C   s
   || _ d S N)name)selfr    r   @/tmp/pip-unpacked-wheel-gcyiijx6/django/db/models/constraints.py__init__   s    zBaseConstraint.__init__c                 C   s   dS )NFr   r   r   r   r   contains_expressions   s    z#BaseConstraint.contains_expressionsc                 C   s   t dd S Nz.This method must be implemented by a subclass.NotImplementedErrorr   modelschema_editorr   r   r   constraint_sql   s    zBaseConstraint.constraint_sqlc                 C   s   t dd S r   r   r   r   r   r   
create_sql   s    zBaseConstraint.create_sqlc                 C   s   t dd S r   r   r   r   r   r   
remove_sql   s    zBaseConstraint.remove_sqlc                 C   s0   d| j j| j jf }|dd}|dd| jifS )Nz%s.%szdjango.db.models.constraintszdjango.db.modelsr   r   )	__class__
__module____name__replacer   )r   pathr   r   r   deconstruct   s    zBaseConstraint.deconstructc                 C   s   |   \}}}| j||S r   )r"   r   )r   _argskwargsr   r   r   clone!   s    zBaseConstraint.cloneN)r   r   __qualname__r   propertyr   r   r   r   r"   r&   r   r   r   r   r      s   
r   c                       s\   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z fddZ	 fddZ
  ZS )r   c                   s*   || _ t|ddstdt | d S )NZconditionalFzACheckConstraint.check must be a Q instance or boolean expression.)checkgetattr	TypeErrorsuperr   )r   r)   r   r   r   r   r   '   s    zCheckConstraint.__init__c                    sR   t |dd}|| j}|j jd}|| j\}}|t fdd|D  S )NFr   
alias_cols
connectionc                 3   s   | ]}  |V  qd S r   Zquote_value.0pr   r   r   	<genexpr>5   s     z1CheckConstraint._get_check_sql.<locals>.<genexpr>)r   build_wherer)   get_compilerr1   as_sqltupler   r   r   querywherecompilerZsqlparamsr   r6   r   _get_check_sql0   s
    zCheckConstraint._get_check_sqlc                 C   s   |  ||}|| j|S r   )rA   Z
_check_sqlr   r   r   r   r)   r   r   r   r   7   s    zCheckConstraint.constraint_sqlc                 C   s   |  ||}||| j|S r   )rA   Z_create_check_sqlr   rB   r   r   r   r   ;   s    zCheckConstraint.create_sqlc                 C   s   | || jS r   )Z_delete_check_sqlr   r   r   r   r   r   ?   s    zCheckConstraint.remove_sqlc                 C   s   d| j j| jt| jf S )Nz<%s: check=%s name=%s>)r   r'   r)   reprr   r   r   r   r   __repr__B   s
    zCheckConstraint.__repr__c                    s.   t |tr"| j|jko | j|jkS t |S r   )
isinstancer   r   r)   r,   __eq__r   otherr-   r   r   rF   I   s    
zCheckConstraint.__eq__c                    s$   t   \}}}| j|d< |||fS )Nr)   )r,   r"   r)   r   r!   r$   r%   r-   r   r   r"   N   s    
zCheckConstraint.deconstruct)r   r   r'   r   rA   r   r   r   rD   rF   r"   __classcell__r   r   r-   r   r   &   s   	c                   @   s   e Zd ZdZdZdd ZdS )r	   deferredZ	immediatec                 C   s   | j j d| j S )N.)r   r'   _name_r   r   r   r   rD   Y   s    zDeferrable.__repr__N)r   r   r'   ZDEFERREDZ	IMMEDIATErD   r   r   r   r   r	   T   s   c                       s   e Zd Zddddddd fdd
Zedd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Z fddZ fddZ  ZS )r
   r   N)fieldsr   	condition
deferrableinclude	opclassesc                   sR  |st d|s|st d|r,|r,t dt|td tfsFt d|rV|rVt d|rf|rft d|rv|rvt d|r|rt d|r|rt d	t|td tfst d
t|td ttfst dt|ttfst d|rt|t|krt dt|| _|| _	|| _
|r"t|nd| _|| _tdd |D | _t | d S )Nz"A unique constraint must be named.zKAt least one field or expression is required to define a unique constraint.z?UniqueConstraint.fields and expressions are mutually exclusive.z0UniqueConstraint.condition must be a Q instance.z4UniqueConstraint with conditions cannot be deferred.z8UniqueConstraint with include fields cannot be deferred.z3UniqueConstraint with opclasses cannot be deferred.z5UniqueConstraint with expressions cannot be deferred.zrUniqueConstraint.opclasses cannot be used with expressions. Use django.contrib.postgres.indexes.OpClass() instead.z:UniqueConstraint.deferrable must be a Deferrable instance.z1UniqueConstraint.include must be a list or tuple.z3UniqueConstraint.opclasses must be a list or tuple.z]UniqueConstraint.fields and UniqueConstraint.opclasses must have the same number of elements.r   c                 s   s$   | ]}t |trt|n|V  qd S r   )rE   strr   )r4   
expressionr   r   r   r7      s   z,UniqueConstraint.__init__.<locals>.<genexpr>)
ValueErrorrE   typer   r	   listr;   lenrN   rO   rP   rQ   rR   expressionsr,   r   )r   rN   r   rO   rP   rQ   rR   rY   r-   r   r   r   ^   sj    


zUniqueConstraint.__init__c                 C   s
   t | jS r   )boolrY   r   r   r   r   r      s    z%UniqueConstraint.contains_expressionsc                    s`   | j d krd S t|dd}|| j }|j jd}|| j\}}|t fdd|D  S )NFr.   r0   c                 3   s   | ]}  |V  qd S r   r2   r3   r6   r   r   r7      s     z6UniqueConstraint._get_condition_sql.<locals>.<genexpr>)rO   r   r8   r9   r1   r:   r;   r<   r   r6   r   _get_condition_sql   s    
z#UniqueConstraint._get_condition_sqlc                 C   sN   | j s
d S g }| j D ]"}t|}||j || qt| t|ddS )NF)r/   )rY   r   Zset_wrapper_classesr1   appendr   Zresolve_expressionr   )r   r   r   Zindex_expressionsrT   Zindex_expressionr   r   r   _get_index_expressions   s    

z'UniqueConstraint._get_index_expressionsc              
      s`    fdd| j D } fdd| jD }|  |}|  |}|j || j|| j|| j|dS )Nc                    s   g | ]} j |qS r   _meta	get_fieldr4   
field_namer   r   r   
<listcomp>   s     z3UniqueConstraint.constraint_sql.<locals>.<listcomp>c                    s   g | ]} j |jqS r   r_   r`   columnra   rc   r   r   rd      s     rO   rP   rQ   rR   rY   )rN   rQ   r[   r]   Z_unique_sqlr   rP   rR   r   r   r   rN   rQ   rO   rY   r   rc   r   r      s         zUniqueConstraint.constraint_sqlc              
      s`    fdd| j D } fdd| jD }|  |}|  |}|j || j|| j|| j|dS )Nc                    s   g | ]} j |qS r   r^   ra   rc   r   r   rd      s     z/UniqueConstraint.create_sql.<locals>.<listcomp>c                    s   g | ]} j |jqS r   re   ra   rc   r   r   rd      s     rg   )rN   rQ   r[   r]   Z_create_unique_sqlr   rP   rR   rh   r   rc   r   r      s         zUniqueConstraint.create_sqlc              	      sJ   |   |} fdd| jD }|  |}|j | j|| j|| j|dS )Nc                    s   g | ]} j |jqS r   re   ra   rc   r   r   rd      s     z/UniqueConstraint.remove_sql.<locals>.<listcomp>rg   )r[   rQ   r]   Z_delete_unique_sqlr   rP   rR   )r   r   r   rO   rQ   rY   r   rc   r   r      s         zUniqueConstraint.remove_sqlc                 C   s   d| j j| jsdndt| j | js(dndt| j dt| j | jd krNdnd| j | jd krddnd| j | jsvdndt| j | j	sdnd	t| j	 f S )
Nz<%s:%s%s%s%s%s%s%s> z
 fields=%sz expressions=%sz name=%sz condition=%sz deferrable=%rz include=%sz opclasses=%s)
r   r'   rN   rC   rY   r   rO   rP   rQ   rR   r   r   r   r   rD      s    zUniqueConstraint.__repr__c                    sj   t |tr^| j|jko\| j|jko\| j|jko\| j|jko\| j|jko\| j|jko\| j|jkS t	 
|S r   )rE   r
   r   rN   rO   rP   rQ   rR   rY   r,   rF   rG   r-   r   r   rF      s    






	zUniqueConstraint.__eq__c                    sl   t   \}}}| jr | j|d< | jr0| j|d< | jr@| j|d< | jrP| j|d< | jr`| j|d< || j|fS )NrN   rO   rP   rQ   rR   )r,   r"   rN   rO   rP   rQ   rR   rY   rI   r-   r   r   r"      s    




zUniqueConstraint.deconstruct)r   r   r'   r   r(   r   r[   r]   r   r   r   rD   rF   r"   rJ   r   r   r-   r   r
   ]   s"   D
		N)enumr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.indexesr   Zdjango.db.models.query_utilsr   Zdjango.db.models.sql.queryr   __all__r   r   r	   r
   r   r   r   r   <module>   s   
.	