
    Evg=&                         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)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     `/var/www/pixelcanvas.ch/venv/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
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__)
selfr1   r5   r   r   r    r!   r"   r#   	__class__s
            r   r7   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)	enumerater5   r)   strr   r   set_wrapper_classes
connectionappendr   resolve_expression)r8   schema_editorqueryr5   idx
expressionr;   s          r   _get_expressionsz$ExclusionConstraint._get_expressionsE   s    +4T5E+F+F 	+ 	+'C'*h*c** +z]]
6zHUUUJ**=+CDDDz****{+>>uEEEr   c                     t                      }| j        D ]Q\  }}t          |t                    rt	          |          }|                    |                    |                     R|                     ||          S N)setr5   r)   r=   r   update_get_expr_references_check_references)r8   modelr?   
referencesr.   _s         r   _checkzExclusionConstraint._checkO   s{    UU
' 	@ 	@GD!$$$ wwe88>>????%%eZ888r   c                     | j         d S |                    | j                   }|                    |j                  \  }}|t	          fd|D                       z  S )Nc              3   B   K   | ]}                     |          V  d S rH   )quote_value)r-   prB   s     r   r/   z9ExclusionConstraint._get_condition_sql.<locals>.<genexpr>\   s1      HHA=44Q77HHHHHHr   )r   build_whereas_sqlr?   r+   )r8   compilerrB   rC   wheresqlparamss     `    r   _get_condition_sqlz&ExclusionConstraint._get_condition_sqlW   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_namerM   s     r   
<listcomp>z6ExclusionConstraint.constraint_sql.<locals>.<listcomp>d   s9     
 
 
9CEK!!*--4
 
 
r   z WHERE (%s) )tabler1   r   r5   rX   r!   r    )r   get_compilerr?   rF   r_   db_tabler[   r!   r   r   r	   
quote_namer1   r   r   rS   _index_include_sql_deferrable_constraint_sqlr    )	r8   rM   rB   rC   rW   r5   re   r   r!   s	    `       r   constraint_sqlz"ExclusionConstraint.constraint_sql^   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)re   
constraint)check_supportedr   r	   r_   rg   rh   rk   r8   rM   rB   s      r   
create_sqlzExclusionConstraint.create_sqlt   sX    ]+++6,m.FGG**5-@@
 
 
 	
r   c                 j    |                     |j        ||                    | j                            S rH   )_delete_constraint_sqlsql_delete_checkrh   r1   ro   s      r   
remove_sqlzExclusionConstraint.remove_sql|   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   r2   r?   features supports_covering_spgist_indexesr   )r8   rB   s     r   rn   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 )Nr5   r   r%   r   r    r!   )r6   deconstructr5   r   r   r2   r    r!   )r8   pathargskwargsr9   s       r   ry   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 rH   )r)   r9   r1   r   r5   r   r    r!   r"   r#   r6   __eq__)r8   otherr9   s     r   r~   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=rd   z condition=%sz deferrable=%rz include=%sz violation_error_code=%rz violation_error_message=%r>)r9   r   reprr   r5   r1   r   r    r!   r"   r#   default_violation_error_message)r8   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          |
d          r|
                                }
t          |d          r|                                }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   get_expression_for_validation)lhsrhs)pk)code)using)_default_managerr   _get_field_expression_mapr_   itemsr<   r5   r)   r=   r   r1   flattenreplace_expressionshasattrr   r   postgres_operatorr@   filter_get_pk_val_stateaddingr   r   existsr   get_violation_error_messager"   r   check)r8   rM   instancer   r   querysetreplacement_mapreplacementslookupsrD   rE   r;   r.   rhs_expressionlookupmodel_class_pks                   r   validatezExclusionConstraint.validate   s   )//66"<<g = 
 
 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z#BCC H'EEGG
~'FGG P!/!M!M!O!O+
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   r7   rF   rP   r[   rk   rp   rt   rn   ry   r~   r   r   r   __classcell__)r9   s   @r   r   r      s-       	>  ! $*
 *
 *
 *
 *
 *
 *
XF F F9 9 9I I I
 
 
,
 
 

 
 
	 	 	" " " " "% % % % %
 
 
, 15<L ) ) ) ) ) ) ) )r   N)typesr   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      sA         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U U U U U. U U U U Ur   