
    afs%                         d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZmZ d dlmZmZmZ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gZ G d de          Z G d de          ZdS )    )NoneType)OpClass)ValidationError)DEFAULT_DB_ALIASNotSupportedError)Expressions	StatementTable)BaseConstraint
DeferrableFQ)ExistsExpressionList)IndexExpression)PostgresOperatorLookup)QueryExclusionConstraintc                       e Zd ZdZdS )ExclusionConstraintExpressionz!%(expressions)s WITH %(operator)sN)__name__
__module____qualname__template     U/var/www/html/env/lib/python3.11/site-packages/django/contrib/postgres/constraints.pyr   r      s        2HHHr   r   c                   |     e Zd ZdZddddddd fd
Zd Zd Zd Zd Zd	 Z	d
 Z
 fdZ fdZd ZdefdZ xZS )r   zdCONSTRAINT %(name)s EXCLUDE USING %(index_type)s (%(expressions)s)%(include)s%(where)s%(deferrable)sN)
index_type	condition
deferrableincludeviolation_error_codeviolation_error_messagec                   |r%|                                 dvrt          d          |st          d          t          d |D                       st          d          t          |t          t
          f          st          d          t          |t          t          f          st          d          t          |t          t          t          f          st          d          || _	        |pd	| _
        || _        || _        |rt          |          nd
| _        t                                          |||           d S )N>   gistspgistz;Exclusion constraints only support GiST or SP-GiST indexes.zFAt least one expression is required to define an exclusion constraint.c              3   t   K   | ]3}t          |t          t          f          ot          |          d k    V  4dS )   N)
isinstancelisttuplelen).0exprs     r   	<genexpr>z/ExclusionConstraint.__init__.<locals>.<genexpr>/   sP       
 
CGJtdE]++>D		Q
 
 
 
 
 
r   z+The expressions must be a list of 2-tuples.z3ExclusionConstraint.condition must be a Q instance.z=ExclusionConstraint.deferrable must be a Deferrable instance.z4ExclusionConstraint.include must be a list or tuple.GISTr   )namer#   r$   )lower
ValueErrorallr*   r   r   r   r+   r,   expressionsr   r    r!   r"   super__init__)
selfr2   r6   r   r    r!   r"   r#   r$   	__class__s
            r   r8   zExclusionConstraint.__init__   s     	***,,4FFFM    	    
 
KV
 
 
 
 
 	L JKKK)h]33 	TRSSS*x&<== 	O   'HdE#:;; 	USTTT&$."$)08uW~~~b!5$; 	 	
 	
 	
 	
 	
r   c                 @   g }t          | j                  D ]l\  }\  }}t          |t                    rt	          |          }t          ||          }|                    |j                   |                    |           mt          | 
                    |          S )N)operator)	enumerater6   r*   strr   r   set_wrapper_classes
connectionappendr   resolve_expression)r9   schema_editorqueryr6   idx
expressionr<   s          r   _get_expressionsz$ExclusionConstraint._get_expressionsF   s    +4T5E+F+F 	+ 	+'C'*h*c** +z]]
6zHUUUJ**=+CDDDz****{+>>uEEEr   c                     | j         d S |                    | j                   }|                    |j                  \  }}|t	          fd|D                       z  S )Nc              3   B   K   | ]}                     |          V  d S N)quote_value)r.   prC   s     r   r0   z9ExclusionConstraint._get_condition_sql.<locals>.<genexpr>U   s1      HHA=44Q77HHHHHHr   )r    build_whereas_sqlr@   r,   )r9   compilerrC   rD   wheresqlparamss     `    r   _get_condition_sqlz&ExclusionConstraint._get_condition_sqlP   sg    >!4!!$.11ll8]-EFFVUHHHHHHHHHHHr   c                    t          d          }|                    |j                  }|                     ||          }j        j        }|                     |||          }fd| j        D             }t          | j	        t          ||j                  |                    | j                  | j        t          ||||j                  |rd|z  nd|                    |          |                    | j                            S )NF)
alias_cols)r@   c                 N    g | ]!}j                             |          j        "S r   )_meta	get_fieldcolumn)r.   
field_namemodels     r   
<listcomp>z6ExclusionConstraint.constraint_sql.<locals>.<listcomp>]   s9     
 
 
9CEK!!*--4
 
 
r   z WHERE (%s) )tabler2   r   r6   rP   r"   r!   )r   get_compilerr@   rG   rW   db_tablerS   r"   r	   r   r
   
quote_namer2   r   r   rK   _index_include_sql_deferrable_constraint_sqlr!   )	r9   r[   rC   rD   rO   r6   r^   r    r"   s	    `       r   constraint_sqlz"ExclusionConstraint.constraint_sqlW   s'   e...%%1I%JJ++M5AA$++HmUKK	
 
 
 
GK|
 
 
 M}788))$)44#{Hm.G  09@-)++b!44UGDD$??PP
 
 
 	
r   c                     |                      |           t          dt          |j        j        |j                  |                     ||                    S )Nz(ALTER TABLE %(table)s ADD %(constraint)s)r^   
constraint)check_supportedr	   r
   rW   r`   ra   rd   r9   r[   rC   s      r   
create_sqlzExclusionConstraint.create_sqlm   sX    ]+++6,m.FGG**5-@@
 
 
 	
r   c                 j    |                     |j        ||                    | j                            S rJ   )_delete_constraint_sqlsql_delete_checkra   r2   rh   s      r   
remove_sqlzExclusionConstraint.remove_sqlu   s6    33*$$TY//
 
 	
r   c                     | j         r=| j                                        dk    r"|j        j        j        st          d          d S d S d S )Nr'   zMCovering exclusion constraints using an SP-GiST index require PostgreSQL 14+.)r"   r   r3   r@   features supports_covering_spgist_indexesr   )r9   rC   s     r   rg   z#ExclusionConstraint.check_supported|   se    L	%%''833!,5V 4 $*  	 	3333r   c                    t                                                      \  }}}| j        |d<   | j        
| j        |d<   | j                                        dk    r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   |||fS )Nr6   r    r&   r   r!   r"   )r7   deconstructr6   r    r   r3   r!   r"   )r9   pathargskwargsr:   s       r   rr   zExclusionConstraint.deconstruct   s    "WW0022dF $ 0}>%"&.F;?  ""f,,#'?F< ? 	3#'?F< < 	- $F9T6!!r   c                 p   t          || j                  r| j        |j        k    oo| j        |j        k    o_| j        |j        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j	        |j	        k    S t                                          |          S rJ   )r*   r:   r2   r   r6   r    r!   r"   r#   r$   r7   __eq__)r9   otherr:   s     r   rw   zExclusionConstraint.__eq__   s    eT^,, 
		UZ' ROu'77R$(99R Neo5R Ou'77	R
 LEM1R -1KKR 0E4QQ	 ww~~e$$$r   c                    d| j         j        dt          | j                  dt          | j                  dt          | j                  | j        dn	d| j        z  | j        dn	d| j        z  | j        sdndt          | j                  z  | j	        dn	d	| j	        z  | j
        | j
        | j        k    rdn	d
| j
        z  dS )N<z: index_type=z expressions=z name=r]   z condition=%sz deferrable=%rz include=%sz violation_error_code=%rz violation_error_message=%r>)r:   r   reprr   r6   r2   r    r!   r"   r#   r$   default_violation_error_message)r9   s    r   __repr__zExclusionConstraint.__repr__   s     N'''!!!!!""""OOO.(BBo.NN/)BB/?$//QQlJBBT\8J8J(JJ ,4 /$2KKL /7/43WWW  3T5QQR R
 	
r   c                 $   |j                             |          }|                    |j        |          }d |                                D             }g }t          | j                  D ]*\  }	\  }
}t          |
t                    rt          |
          }
|r[t          |
t                    r|
j
        |v r d S n9|
                                D ]$}t          |t                    r|j
        |v r  d S %|
                    |          }t          |
t                    r|
                                d         }
t          |t                    r|                                d         }t          |
|          }||_        |                    |           , |j        | }|                    |j                  }|j        j        s||                    |          }| j        s>|                                r(t3          |                                 | j                  d S | j        t9          |                    | j                            z                      ||          r(t3          |                                 | j                  d S )N)metaexcludec                 4    i | ]\  }}t          |          |S r   )r   )r.   fieldvalues      r   
<dictcomp>z0ExclusionConstraint.validate.<locals>.<dictcomp>   s$    TTTLE5%%TTTr   r   )lhsrhs)pk)code)using)_default_managerr   _get_field_value_maprW   itemsr=   r6   r*   r>   r   r2   flattenreplace_expressionsr   get_source_expressionsr   postgres_operatorrA   filter_get_pk_val_stateaddingr   r    existsr   get_violation_error_messager#   r   check)r9   r[   instancer   r   querysetreplacement_mapreplacementslookupsrE   rF   r<   r/   rhs_expressionlookupmodel_class_pks                   r   validatezExclusionConstraint.validate   s   )//66"77g 8 
 
 UTO<Q<Q<S<STTT+4T5E+F+F 	# 	#'C'*h*c** +z]]
 #j!,, #!'11 2 !+ 2 2 4 4 # #%dA.. #493G3G"FFF';;LIIN *g.. D'>>@@C
.'22 L!/!F!F!H!H!K+
OOOF'/F$NN6"""""8?G,!--ek::% 	;.*D''>'::H~ 	   %4466T=V    
 (G(G!H!HHOOu P    &4466T=V    r   )r   r   r   r   r8   rG   rS   rd   ri   rm   rg   rr   rw   r~   r   r   __classcell__)r:   s   @r   r   r      s       	>  ! $*
 *
 *
 *
 *
 *
 *
XF F FI I I
 
 
,
 
 

 
 
	 	 	" " " " "% % % % %
 
 
, 15<L + + + + + + + +r   N)typesr   django.contrib.postgres.indexesr   django.core.exceptionsr   	django.dbr   r   !django.db.backends.ddl_referencesr   r	   r
   django.db.modelsr   r   r   r   django.db.models.expressionsr   r   django.db.models.indexesr   django.db.models.lookupsr   django.db.models.sqlr   __all__r   r   r   r   r   <module>r      sS         3 3 3 3 3 3 2 2 2 2 2 2 9 9 9 9 9 9 9 9 K K K K K K K K K K = = = = = = = = = = = = ? ? ? ? ? ? ? ? 4 4 4 4 4 4 ; ; ; ; ; ; & & & & & & 
!3 3 3 3 3O 3 3 3O O O O O. O O O O Or   