
    hhK                     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     WD:\Anime\Ugyen\janka_web_project\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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                Z   > [         TU ]  / UQ[        UR                  5       5      QUUS9  g )N)children	connectornegated)super__init__sorteditems)selfr   r    argskwargs	__class__s        r   r&   
Q.__init__4   s3    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)r)   otherconnobjs       r   _combine
Q._combine;   su    5-/58E""::<E1--99;kkDk)
r.   c                 8    U R                  XR                  5      $ r   )r:   r   r)   r7   s     r   __or__Q.__or__H   s    }}UGG,,r.   c                 8    U R                  XR                  5      $ r   )r:   r   r=   s     r   __and__	Q.__and__K       }}UHH--r.   c                 8    U R                  XR                  5      $ r   )r:   r   r=   s     r   __xor__	Q.__xor__N   rC   r.   c                 F    U R                  5       nUR                  5         U$ r   )r3   negate)r)   r9   s     r   
__invert__Q.__invert__Q   s    iik


r.   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)r)   queryrL   reuserO   for_saveclausejoinss           r   resolve_expressionQ.resolve_expressionV   s@    
 #" % 
 	E"r.   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$      exactisnullT)r5   r#   r$   r"   r4   tupler   rsplitr	   Freplace_expressions
get_lookupget_transformappend)r)   replacementsclonechildchild_replacementlhsrhspathlookupfieldfield_replacementlookup_classtransform_classs                r   r`   Q.replace_expressionsf   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 r.   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.
rZ   flattenN)r"   r4   r]   hasattrrr   )r)   rf   s     r   rr   	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)SINGLENrW   F)selectrZ   _checkT)output_field)usingz.Got a database error calling check() on %r: %s)django.db.modelsrv   rw   django.db.models.functionsrx   django.db.models.sqlry   django.db.models.sql.constantsrz   r(   rs   add_annotationr   featuressupports_comparing_boolean_expradd_qr   get_compilerin_atomic_blockr
   atomicr   execute_sqlr   loggerwarning)r)   againstr~   rv   rw   rx   ry   rz   rR   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    )
r,   
__module____name__
startswithreplacer]   r"   r#   defaultr$   )r)   rj   r*   r+   s       r   deconstructQ.deconstruct   s    ..33T^^5L5LM??9::<< >@RSDT]]#>>T\\)#'>>F< <<!%F:6!!r.   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   r(   r4   r]   r   rc   )r)   rj   r*   r+   identityrf   argr   s           r   r   
Q.identity   sv    !--/F*6<<>*E%''"
%e,-&  Xr.   c                 j    [        U[        5      (       d  [        $ UR                  U R                  :H  $ r   )r4   r   NotImplementedr   r=   s     r   __eq__Q.__eq__   s(    %##!!~~..r.   c                 ,    [        U R                  5      $ r   )hashr   )r)   s    r   __hash__
Q.__hash__   s    DMM""r.   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   )rR   rZ   )r   rR   get_children_from_qsplitr   )r)   rR   rf   s      r   referenced_base_fieldsQ.referenced_base_fields   sE     	/ 8=7P7PQU7V
7VeKK
A&q)7V
 	
 
s   "? )NTNFF)r   r   __qualname____firstlineno____doc__r   r   r   r   r0   r&   r:   r>   rA   rE   rI   rW   r`   rr   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r,   s   @r   r   r   '   s     C	B
CGK)- 
 
-.. SX %N $4 "H
" 
 
/
# 

 

r.   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   rl   )r)   rl   s     r   r&   DeferredAttribute.__init__   s    
r.   Nc                 0   Uc  U $ UR                   nU R                  R                  nXC;  ag  U R                  U5      nUcO  UR	                  5       (       d&  U R                  R
                  (       a  [        S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.
z4Cannot read a generated field from an unsaved model.)fields)__dict__rl   attname_check_parent_chain
_is_pk_set	generatedAttributeErrorrefresh_from_db)r)   instancer   data
field_namevals         r   __get__DeferredAttribute.__get__   s    
 K  ZZ''
! **84C{**,,1E1E(N  (((=  $'Z r.   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_linkrl   modelprimary_keyr1   r   )r)   r   opts
link_fields       r   r   %DeferredAttribute._check_parent_chain  sS     ~~++DJJ,<,<=
::!!djjJ&>8%7%788r.   r   r   )	r   r   r   r   r   r&   r   r   r   r   r.   r   r   r      s    
 .
r.   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)r)   r   r   s      r   r&   !class_or_instance_method.__init__"  s    (.r.   c                     Uc!  [         R                  " U R                  U5      $ [         R                  " U R                  U5      $ r   )	functoolspartialr   r   )r)   r   owners      r   r    class_or_instance_method.__get__&  s:    $$T%6%6>>  !5!5x@@r.   r   N)r   r   r   r   r   r&   r   r   r   r.   r   r   r     s    
/Ar.   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	)RegisterLookupMixini,  c                 B    U R                  5       R                  US 5      $ r   )get_lookupsget)r)   lookup_names     r   _get_lookupRegisterLookupMixin._get_lookup-  s    !%%k488r.   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_lookups0  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   r1   )r)   r   r   s      r   get_instance_lookups(RegisterLookupMixin.get_instance_lookups7  s=    ..0&t-?FFF8m8'788r.   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   rs   r}   ra   
issubclass)r)   r   r   founds       r   ra   RegisterLookupMixin.get_lookup@  sU    3  -=WT>::$$//<<Z%>%>r.   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   rs   r}   rb   r   )r)   r   r   r   s       r   rb   !RegisterLookupMixin.get_transformJ  sU    6  -=WT>::$$22;??Z%A%Ar.   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_dictsT  s(     %AMM! !r.   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_lookups_  s"    "3H&&224 (r.   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   rk   r   s      r   register_class_lookup)RegisterLookupMixin.register_class_lookupd  sF     ,,K#,,. "C)/+&'')r.   c                 n    Uc  UR                   nSU R                  ;  a  0 U l        XR                  U'   U$ r   )r   r   r   r)   rk   r   s      r   register_instance_lookup,RegisterLookupMixin.register_instance_lookupm  s:     ,,KT]]2$&D!-3k*r.   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_lookupz  s/    
  ,,Kk*'')r.   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!!+.r.   )r   r   )r   r   r   r   r   r   cacher   r   r   r   classmethodra   rb   staticmethodr   r  r  r  register_lookupr  r  _unregister_lookupr   r   r.   r   r   r   ,  s    9 __. . ++<>RSK#$56   5 5 /7O ((=>*/ 2 "=  ++CDr.   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_fieldr1   nullr   r   r   r   object_name)rl   
restricted	requestedselect_masks       r   select_related_descendr$    s      u!!=%88 ::~ zz" u/U[[&&2231UZZL AL L
 	
 r.   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.
rZ   r   N)Nr   )rangelenr   joinr   )lookup_partsannotationsnlevel_n_lookups       r   refs_expressionr-    sX     1c,'!+,#a):;??>**!#333 - r.   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&=&==)(((	
r.   r   F)r1   r   r   )r   target_optsrl   r   s   `   r   check_rel_lookup_compatibilityr4    s<    
   }e,Iu{{7H7H1Ir.   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.)
ValueErrorrelation_namealiasr4   r   r8  resolved_condition)r)   r;  r8  s      r   r&   FilteredRelation.__init__  sF    =>>*
)Q''IJJ #"&r.   c                     [        XR                  5      (       d  [        $ U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )r4   r,   r   r;  r<  r8  r=   s     r   r   FilteredRelation.__eq__  sZ    %00!!%"5"55 2

ekk)2%//1	
r.   c                     [        U R                  U R                  S9nU R                  Ul        U R                  =nb  UR                  5       Ul        U$ )Nr7  )r6  r;  r8  r<  r=  re   )r)   re   r=  s      r   re   FilteredRelation.clone  sK     !3!3t~~Njj"&"9"99F'9'?'?'AE$r.   c                 x    U R                  5       nUR                  =n(       a  UR                  U5      Ul        U$ r   )re   r=  relabeled_clone)r)   
change_mapre   r=  s       r   rD   FilteredRelation.relabeled_clone  s7    

!&!9!999'9'I'I*'UE$r.   c                 p    U R                  5       nUR                  U R                  USSSS9S   Ul        U$ )NTF)	can_reuserL   rM   update_join_typesr   )re   build_filterr8  r=  )r)   rR   rS   r*   r+   re   s         r   rW   #FilteredRelation.resolve_expression	  sI    

#(#5#5NN# $6 $
 $  r.   c                 8    UR                  U R                  5      $ r   )compiler=  )r)   r   r   s      r   as_sqlFilteredRelation.as_sql  s     7 788r.   )r<  r8  r;  r=  N)r   r   r   r   r   r   r&   r   re   rD  rW   rN  r   r   r.   r   r6  r6    s(    A343 '
	9r.   r6  )%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$  r-  r4  r6  r   r.   r   <module>r[     s       " " - W W 1  3 /			-	.
 M(E
		 E
P* *ZA A dE dEN#L
:29 29r.   