
    MȂiM                     X   S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  \R0                  " S5      r\" SS5      rS r " S S\R8                  5      r " S S5      r " S S5      r " S S5      r S r!S r"S r# " S S5      r$g)z
Various data structures used in query construction.

Factored out from django.db.models.query to avoid making the main module very
large and/or so that they can be used by other modules without getting into
circular import difficulties.
    N)
namedtuple)nullcontext)
FieldError)DEFAULT_DB_ALIASDatabaseErrorconnectionsmodelstransaction)
LOOKUP_SEP)tree)cached_property)make_hashabledjango.db.modelsPathInfozGfrom_opts to_opts target_fields join_field m2m direct filtered_relationc              #   l   #    U v   U R                  5        H  n[        U5       S h  vN   M     g  N	7fN)__subclasses__
subclassesclssubclasss     MD:\sksbv-state-backend\venv\Lib\site-packages\django/db/models/query_utils.pyr   r   !   s.     
I&&(h''' )'s   &42
4c                      ^  \ rS rSrSrSrSrSr\rSr	S\\\4r
SSS	.U 4S
 jjrS rS rS rS rS r SS jrS rS r\4S jrS r\S 5       rS rS r\S 5       rSrU =r$ )Q'   zY
Encapsulate filters as objects that can then be combined logically (using
`&` and `|`).
ANDORXORTNF)
_connector_negatedc                   > XR                   ;  a4  SR                  S U R                   SS   5       5      n[        SU S35      e[        TU ]  / UQ[        UR                  5       5      QUUS9  g )Nz, c              3   &   #    U H  o< v   M
     g 7fr    ).0conns     r   	<genexpr>Q.__init__.<locals>.<genexpr>7   s     'T@S(@Ss      z_connector must be one of z
, or None.)children	connectornegated)
connectorsjoin
ValueErrorsuper__init__sorteditems)selfr   r    argskwargsconnector_reprs	__class__s         r   r0   
Q.__init__5   st    __,"ii'TPQPR@S'TTO9/9J*UVV5t5fV\\^45  	 	
    c                 $   [        USS5      SL a  [        U5      eU (       d  UR                  5       $ U(       d%  [        U[        5      (       a  U R                  5       $ U R                  US9nUR                  X5        UR                  X5        U$ )NconditionalF)r*   )getattr	TypeErrorcopy
isinstancer   createadd)r3   otherr%   objs       r   _combine
Q._combine?   su    5-/58E""::<E1--99;kkDk)
r9   c                 8    U R                  XR                  5      $ r   )rD   r   r3   rB   s     r   __or__Q.__or__L   s    }}UGG,,r9   c                 8    U R                  XR                  5      $ r   )rD   r   rG   s     r   __and__	Q.__and__O       }}UHH--r9   c                 8    U R                  XR                  5      $ r   )rD   r   rG   s     r   __xor__	Q.__xor__R   rM   r9   c                 F    U R                  5       nUR                  5         U$ r   )r>   negate)r3   rC   s     r   
__invert__Q.__invert__U   s    iik


r9   c           	      T    UR                  U UUSSUS9u  pgUR                  U5        U$ )NF)allow_joins
split_subqcheck_filterable	summarize)_add_qpromote_joins)r3   queryrV   reuserY   for_saveclausejoinss           r   resolve_expressionQ.resolve_expressionZ   s@    
 #" % 
 	E"r9   c                    U(       d  U $ U R                  U R                  U R                  S9nU R                   GH  nUn[	        U[
        5      (       a  Uu  pV[        U;   a  UR                  [        S5      u  pxOUnS n[        R                  " U5      n	U	R                  U5      =n
U	Lap  Uc  SnU
R                  U5      =nc0  U
R                  U5      =n b  U" U
5      n
SnU
R                  U5      nUc  US:X  a  U
R                  S5      nSnUb  U" X5      nOUR                  U5      nUR                  R                  U5        GM     U$ )N)r*   r+   r(   exactisnullT)r@   r*   r+   r)   r?   tupler   rsplitr	   Freplace_expressions
get_lookupget_transformappend)r3   replacementsclonechildchild_replacementlhsrhspathlookupfieldfield_replacementlookup_classtransform_classs                r   ri   Q.replace_expressionsj   s]   KdnndllK]]E %%'' $#&::j!#<LD&D!F).)B)B<)PP% ~!((9(D(DV(LLU/@/N/Nv/VVO!%& 1@@Q0R-%,F+<+G+G+OL{v'8'8'C'CH'M"#/,89J,P)$)$=$=l$K!NN!!"34A #B r9   c              #      #    U v   U R                    HL  n[        U[        5      (       a  US   n[        US5      (       a  UR	                  5        Sh  vN   MH  Uv   MN     g N7f)zO
Recursively yield this Q object and all subexpressions, in depth-first
order.
r(   flattenN)r)   r?   rf   hasattrr{   )r3   ro   s     r   r{   	Q.flatten   sV     
 
]]E%''aui(( ==?** #
 +s   AA&A$A&c           
         SSK JnJn  SSKJn  SSKJn  SSKJn  U" S5      nUR                  5        H.  u  p[        U
S5      (       d  U" U
5      n
UR                  XSS	9  M0     UR                  U" S
5      S5        [        U   nUR                  R                  (       a&  UR                  [!        U" U SU" 5       S95      5        OUR                  U 5        UR#                  US9nUR$                  (       a  [&        R(                  " US9O	[+        5       n U   UR-                  U5      SLsSSS5        $ ! , (       d  f       g= f! [.         a   n[0        R3                  SX5         SnAgSnAff = f)zd
Do a database query to check if the expressions of the Q instance
matches against the expressions.
r   )BooleanFieldValue)Coalesce)Query)SINGLENra   F)selectr(   _checkT)output_field)usingz.Got a database error calling check() on %r: %s)django.db.modelsr   r   django.db.models.functionsr   django.db.models.sqlr   django.db.models.sql.constantsr   r2   r|   add_annotationr   featuressupports_comparing_boolean_expradd_qr   get_compilerin_atomic_blockr
   atomicr   execute_sqlr   loggerwarning)r3   againstr   r   r   r   r   r   r\   namevalue
connectioncompilercontext_manageres                  r   checkQ.check   s*    	97.9d"==?KD5"677e  U ; + 	U1Xx0 '
>>KK(4LNKLMKK%%E%2 )) U+ 	
	 ++F34? ! 	NNKTU	s6   E D6,	E 6
E E E 
E1E,,E1c                 h   U R                   R                  < SU R                   R                  < 3nUR                  S5      (       a  UR	                  SS5      n[        U R                  5      n0 nU R                  U R                  :w  a  U R                  US'   U R                  (       a  SUS'   XU4$ )N.zdjango.db.models.query_utilsr   r   Tr    )
r7   
__module____name__
startswithreplacerf   r)   r*   defaultr+   )r3   rs   r4   r5   s       r   deconstructQ.deconstruct   s    ..33T^^5L5LM??9::<< >@RSDT]]#>>T\\)#'>>F< <<!%F:6!!r9   c                    U R                  5       u  pnU/UR                  5       QnU HL  n[        U[        5      (       a#  Uu  pg[	        U5      nUR                  Xg45        M;  UR                  U5        MN     [        U5      $ r   )r   r2   r?   rf   r   rl   )r3   rs   r4   r5   identityro   argr   s           r   r   
Q.identity   sv    !--/F*6<<>*E%''"
%e,-&  Xr9   c                 j    [        U[        5      (       d  [        $ UR                  U R                  :H  $ r   )r?   r   NotImplementedr   rG   s     r   __eq__Q.__eq__   s(    %##!!~~..r9   c                 ,    [        U R                  5      $ r   )hashr   )r3   s    r   __hash__
Q.__hash__   s    DMM""r9   c                     SSK Jn  UR                  U 5       Vs1 sH  o"R                  [        S5      S   iM     sn$ s  snf )zv
Retrieve all base fields referenced directly or through F expressions
excluding any fields referenced through joins.
r   )r\   r(   )r   r\   get_children_from_qsplitr   )r3   r\   ro   s      r   referenced_base_fieldsQ.referenced_base_fields   sE     	/ 8=7P7PQU7V
7VeKK
A&q)7V
 	
 
s   !>r#   )NTNFF)r   r   __qualname____firstlineno____doc__r   r   r   r   r;   r,   r0   rD   rH   rK   rO   rS   ra   ri   r{   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r7   s   @r   r   r   '   s     C	B
CGKR%J)- 
 
-.. SX %N $4 "H
" 
 
/
# 

 

r9   r   c                   .    \ rS rSrSrS rSS jrS rSrg)	DeferredAttribute   zx
A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.
c                     Xl         g r   ru   )r3   ru   s     r   r0   DeferredAttribute.__init__   s    
r9   Nc                    Uc  U $ UR                   nU R                  R                  nXC;  aQ  U R                  U5      nUc9  UR	                  5       (       d  [        SU< S35      eUR                  U/S9  X4   $ XSU'   X4   $ )z`
Retrieve and caches the value from the datastore on the first lookup.
Return the cached value.
zCannot retrieve deferred field z from an unsaved model.)fields)__dict__ru   attname_check_parent_chain
_is_pk_setAttributeErrorrefresh_from_db)r3   instancer   data
field_namevals         r   __get__DeferredAttribute.__get__   s    
 K  ZZ''
! **84C{**,,(9* H1 1  (((=  $'Z r9   c                     UR                   nUR                  U R                  R                  5      nU R                  R                  (       a%  U R                  U:w  a  [        XR                  5      $ g)z
Check if the field value can be fetched from a parent field already
loaded in the instance. This can be done if the to-be fetched
field is a primary key field.
N)_metaget_ancestor_linkru   modelprimary_keyr<   r   )r3   r   opts
link_fields       r   r   %DeferredAttribute._check_parent_chain  sS     ~~++DJJ,<,<=
::!!djjJ&>8%7%788r9   r   r   )	r   r   r   r   r   r0   r   r   r   r#   r9   r   r   r      s    
 0
r9   r   c                   $    \ rS rSrSrS rS rSrg)class_or_instance_methodi!  z
Hook used in RegisterLookupMixin to return partial functions depending on
the caller type (instance or class of models.Field).
c                     Xl         X l        g r   class_methodinstance_method)r3   r   r   s      r   r0   !class_or_instance_method.__init__'  s    (.r9   c                     Uc!  [         R                  " U R                  U5      $ [         R                  " U R                  U5      $ r   )	functoolspartialr   r   )r3   r   owners      r   r    class_or_instance_method.__get__+  s:    $$T%6%6>>  !5!5x@@r9   r   N)r   r   r   r   r   r0   r   r   r#   r9   r   r   r   !  s    
/Ar9   r   c                       \ rS rSrS r\R                  S 5       rS r\	" \\5      r
\" \5      rS rS r\S 5       r\S 5       rSS
 jrSS jr\	" \\5      r\" \5      rSS jrSS jr\	" \\5      r\" \5      rSrg	)RegisterLookupMixini1  c                 B    U R                  5       R                  US 5      $ r   )get_lookupsget)r3   lookup_names     r   _get_lookupRegisterLookupMixin._get_lookup2  s    !%%k488r9   c                     [         R                  " U 5       Vs/ sH  oR                  R                  S0 5      PM      nnU R	                  U5      $ s  snf Nclass_lookups)inspectgetmror   r   merge_dicts)r   parentr   s      r   get_class_lookups%RegisterLookupMixin.get_class_lookups5  sR     DK>>RUCV
CVOO4CV 	 
 }--
s   $Ac                 Z    U R                  5       n[        U SS 5      =n(       a  0 UEUE$ U$ Ninstance_lookups)r   r<   )r3   r   r   s      r   get_instance_lookups(RegisterLookupMixin.get_instance_lookups<  s=    ..0&t-?FFF8m8'788r9   c                     SSK Jn  U R                  U5      nUc,  [        U S5      (       a  U R                  R                  U5      $ Ub  [        X25      (       d  g U$ )Nr   )Lookupr   )django.db.models.lookupsr   r   r|   r   rj   
issubclass)r3   r   r   founds       r   rj   RegisterLookupMixin.get_lookupE  sU    3  -=WT>::$$//<<Z%>%>r9   c                     SSK Jn  U R                  U5      nUc,  [        U S5      (       a  U R                  R                  U5      $ Ub  [        X25      (       d  g U$ )Nr   )	Transformr   )r   r  r   r|   r   rk   r   )r3   r   r  r   s       r   rk   !RegisterLookupMixin.get_transformO  sU    6  -=WT>::$$22;??Z%A%Ar9   c                 P    0 n[        U 5       H  nUR                  U5        M     U$ )z
Merge dicts in reverse to preference the order of the original list.
e.g., merge_dicts([a, b]) will preference the keys in 'a' over those in
'b'.
)reversedupdate)dictsmergedds      r   r   RegisterLookupMixin.merge_dictsY  s(     %AMM! !r9   c                 \    [        U 5       H  nUR                  R                  5         M     g r   )r   r   cache_clearr   s     r   _clear_cached_class_lookups/RegisterLookupMixin._clear_cached_class_lookupse  s"    "3H&&224 (r9   Nc                     Uc  UR                   nSU R                  ;  a  0 U l        XR                  U'   U R                  5         U$ r   )r   r   r   r  r   rt   r   s      r   register_class_lookup)RegisterLookupMixin.register_class_lookupj  sF     ,,K#,,. "C)/+&'')r9   c                 n    Uc  UR                   nSU R                  ;  a  0 U l        XR                  U'   U$ r   )r   r   r   r3   rt   r   s      r   register_instance_lookup,RegisterLookupMixin.register_instance_lookups  s:     ,,KT]]2$&D!-3k*r9   c                 \    Uc  UR                   nU R                  U	 U R                  5         g)zV
Remove given lookup from cls lookups. For use in tests only as it's
not thread-safe.
N)r   r   r  r  s      r   _unregister_class_lookup,RegisterLookupMixin._unregister_class_lookup  s/    
  ,,Kk*'')r9   c                 <    Uc  UR                   nU R                  U	 g)z[
Remove given lookup from instance lookups. For use in tests only as
it's not thread-safe.
N)r   r   r  s      r   _unregister_instance_lookup/RegisterLookupMixin._unregister_instance_lookup  s#    
  ,,K!!+.r9   )r   r   )r   r   r   r   r   r   cacher   r   r   r   classmethodrj   rk   staticmethodr   r  r  r  register_lookupr  r  _unregister_lookupr   r#   r9   r   r   r   1  s    9 __. . ++<>RSK#$56 	 	 5 5 /7O ((=>*/ 2 "=  ++CDr9   r   c                 @   U R                   (       d  g[        U R                   SS5      (       a  gU(       d  U R                  (       + $ U R                  U;  a  gU(       a?  X;  a:  [	        SU R
                  R                  R                   SU R                   S35      eg)a  
Return whether `field` should be used to descend deeper for
`select_related()` purposes.

Arguments:
 * `field` - the field to be checked. Can be either a `Field` or
   `ForeignObjectRel` instance.
 * `restricted` - a boolean field, indicating if the field list has been
   manually restricted using a select_related() clause.
 * `requested` - the select_related() dictionary.
 * `select_mask` - the dictionary of selected fields.
Fparent_linkzField r   zM cannot be both deferred and traversed using select_related at the same time.T)remote_fieldr<   nullr   r   r   r   object_name)ru   
restricted	requestedselect_masks       r   select_related_descendr+    s      u!!=%88 ::~ zz" u/U[[&&2231UZZL AL L
 	
 r9   c                     [        S[        U 5      S-   5       H:  n[        R                  " U SU 5      nUR	                  U5      (       d  M4  X0US 4s  $    g)z
Check if the lookup_parts contains references to the given annotations set.
Because the LOOKUP_SEP is contained in the default annotation names, check
each prefix of the lookup_parts for a match.
r(   r   N)Nr#   )rangelenr   r-   r   )lookup_partsannotationsnlevel_n_lookups       r   refs_expressionr3    sX     1c,'!+,#a):;??>**!#333 - r9   c                    ^  U 4S jnU" U5      =(       d0    [        USS5      =(       a    U" UR                  R                  5      $ )z
Check that self.model is compatible with target_opts. Compatibility
is OK if:
  1) model and opts match (where proxy inheritance is removed)
  2) model is parent of opts' model or the other way around
c                    > TR                   R                  U R                  :H  =(       d9    U R                  TR                   R                  ;   =(       d    TU R                  ;   $ r   )r   concrete_modelall_parents)r   r   s    r   r   -check_rel_lookup_compatibility.<locals>.check  sP    KK&&$*=*== )""ekk&=&==)(((	
r9   r   F)r<   r   r   )r   target_optsru   r   s   `   r   check_rel_lookup_compatibilityr:    s<    
   }e,Iu{{7H7H1Ir9   c                   N    \ rS rSrSr\" 5       S.S jrS rS rS r	S r
S	 rS
rg)FilteredRelationi  z7Specify custom filtering in the ON clause of SQL joins.	conditionc                    U(       d  [        S5      eXl        S U l        [        U[        5      (       d  [        S5      eX l        S U l        g )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)r.   relation_namealiasr?   r   r>  resolved_condition)r3   r@  r>  s      r   r0   FilteredRelation.__init__  sF    =>>*
)Q''IJJ #"&r9   c                     [        XR                  5      (       d  [        $ U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )r?   r7   r   r@  rA  r>  rG   s     r   r   FilteredRelation.__eq__  sZ    %00!!%"5"55 2

ekk)2%//1	
r9   c                     [        U R                  U R                  S9nU R                  Ul        U R                  =nb  UR                  5       Ul        U$ )Nr=  )r<  r@  r>  rA  rB  rn   )r3   rn   rB  s      r   rn   FilteredRelation.clone  sK     !3!3t~~Njj"&"9"99F'9'?'?'AE$r9   c                 x    U R                  5       nUR                  =n(       a  UR                  U5      Ul        U$ r   )rn   rB  relabeled_clone)r3   
change_maprn   rB  s       r   rI   FilteredRelation.relabeled_clone	  s7    

!&!9!999'9'I'I*'UE$r9   c                 p    U R                  5       nUR                  U R                  USSSS9S   Ul        U$ )NTF)	can_reuserV   rW   update_join_typesr   )rn   build_filterr>  rB  )r3   r\   r]   r4   r5   rn   s         r   ra   #FilteredRelation.resolve_expression  sI    

#(#5#5NN# $6 $
 $  r9   c                 8    UR                  U R                  5      $ r   )compilerB  )r3   r   r   s      r   as_sqlFilteredRelation.as_sql  s     7 788r9   )rA  r>  r@  rB  N)r   r   r   r   r   r   r0   r   rn   rI  ra   rS  r   r#   r9   r   r<  r<    s(    A343 '
	9r9   r<  )%r   r   r   loggingcollectionsr   
contextlibr   django.core.exceptionsr   	django.dbr   r   r   r	   r
   django.db.models.constantsr   django.utilsr   django.utils.functionalr   django.utils.hashabler   	getLoggerr   r   r   Noder   r   r   r   r+  r3  r:  r<  r#   r9   r   <module>r`     s       " " - W W 1  3 /			-	.
 M(I
		 I
X+ +\A A eE eEP#L
:29 29r9   