
    hrC                     D   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	J
r
Jr  SSKJr  SSKJr  SSKJr  SS	KJr  \R(                  " S
5      r\" SS5      rS r " S S\R0                  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)
FieldError)DEFAULT_DB_ALIASDatabaseErrorconnections)
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     N/var/www/html/env/lib/python3.13/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\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__3   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   )r7   r   r&   r4   s     r   __or__Q.__or__G   s    }}UGG,,r+   c                 8    U R                  XR                  5      $ r   )r7   r   r:   s     r   __and__	Q.__and__J       }}UHH--r+   c                 8    U R                  XR                  5      $ r   )r7   r   r:   s     r   __xor__	Q.__xor__M   r@   r+   c                 F    U R                  5       nUR                  5         U$ r   )r0   negate)r&   r6   s     r   
__invert__Q.__invert__P   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&   queryrI   reuserL   for_saveclausejoinss           r   resolve_expressionQ.resolve_expressionU   s@    
 #" % 
 	E"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.
   flattenN)r   r1   tuplehasattrrX   )r&   childs     r   rX   	Q.flattene   sV     
 
]]E%''aui(( ==?** #
 +s   AA&A$A&c           
      L   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   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%                  U5      SL$ ! [&         a   n[(        R+                  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)SINGLENrT   F)selectrW   _checkT)output_field)usingz.Got a database error calling check() on %r: %s)django.db.modelsr^   r_   django.db.models.functionsr`   django.db.models.sqlra   django.db.models.sql.constantsrb   r%   rZ   add_annotationr   featuressupports_comparing_boolean_expradd_qr   get_compilerexecute_sqlr   loggerwarning)r&   againstrf   r^   r_   r`   ra   rb   rO   namevaluecompileres                r   checkQ.checkt   s     	97.9d"==?KD5"677e  U ; + 	U1Xx0u&&FFKK(4LNKLMKK%%E%2	''/t;; 	NNKTU	s   &C9 9
D#DD#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replacerY   r   r    defaultr!   )r&   pathr'   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%   r1   rY   r   append)r&   r   r'   r(   identityr[   argru   s           r   r   
Q.identity   sv    !--/F*6<<>*E%''"
%e,-&  Xr+   c                 j    [        U[        5      (       d  [        $ UR                  U R                  :H  $ r   )r1   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   )rO   rW   )ri   rO   get_children_from_qsplitr   )r&   rO   r[   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   r-   r#   r7   r;   r>   rB   rF   rT   rX   r   rx   r   r
   r   r   r   r   __static_attributes____classcell__)r)   s   @r   r   r   &   s     C	B
CGK)- 
 
-.. SX  $4 :
" 
 
/
# 

 

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   field)r&   r   s     r   r#   DeferredAttribute.__init__   s    
r+   Nc                     Uc  U $ UR                   nU R                  R                  nXC;  a_  U R                  U5      nUcG  UR                  c&  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__r   attname_check_parent_chainpk	generatedAttributeErrorrefresh_from_db)r&   instancer   data
field_namevals         r   __get__DeferredAttribute.__get__   s    
 K  ZZ''
! **84C{;;&4::+?+?(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_linkr   modelprimary_keyr.   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_method   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	)RegisterLookupMixin   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_lookups  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.   )r&   r   r   s      r   get_instance_lookups(RegisterLookupMixin.get_instance_lookups  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   )Lookupre   )django.db.models.lookupsr   r   rZ   re   
get_lookup
issubclass)r&   r   r   founds       r   r   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   )	Transformre   )r   r   r   rZ   re   get_transformr   )r&   r   r   r   s       r   r   !RegisterLookupMixin.get_transform  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_dicts%  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_lookups0  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   lookupr   s      r   register_class_lookup)RegisterLookupMixin.register_class_lookup5  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&   r   r   s      r   register_instance_lookup,RegisterLookupMixin.register_instance_lookup>  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_lookupK  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_lookupU  s#    
  ,,K!!+.r+   )r   r   )r}   r|   r   r   r   r   cacher   r   r   r   classmethodr   r   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_fieldr.   nullrt   r   r   r   object_name)r   
restricted	requestedselect_masks       r   select_related_descendr  d  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.
rW   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   rx   -check_rel_lookup_compatibility.<locals>.check  sP    KK&&$*=*== )""ekk&=&==)(((	
r+   r   F)r.   r   r   )r   target_optsr   rx   s   `   r   check_rel_lookup_compatibilityr     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aliasr1   r   r$  resolved_condition)r&   r'  r$  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   )r1   r)   r   r'  r(  r$  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$ )Nr#  )r"  r'  r$  r(  r)  clone)r&   r.  r)  s      r   r.  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   )r.  r)  relabeled_clone)r&   
change_mapr.  r)  s       r   r1   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_reuserI   rJ   update_join_typesr   )r.  build_filterr$  r)  )r&   rO   rP   r'   r(   r.  s         r   rT   #FilteredRelation.resolve_expression  sI    

#(#5#5NN# $6 $
 $  r+   c                 8    UR                  U R                  5      $ r   )compiler)  )r&   rv   
connections      r   as_sqlFilteredRelation.as_sql  s     7 788r+   )r(  r$  r'  r)  N)r}   r|   r   r   r   r   r#   r   r.  r1  rT   r<  r   r   r+   r   r"  r"    s(    A343 '
	9r+   r"  )!r   r   r   loggingcollectionsr   django.core.exceptionsr   	django.dbr   r   r   django.db.models.constantsr   django.utilsr	   django.utils.functionalr
   django.utils.hashabler   	getLoggerrq   r   r   Noder   r   r   r   r  r  r   r"  r   r+   r   <module>rH     s       " - B B 1  3 /			-	.
 M(W
		 W
t* *ZA A dE dEN#L
:29 29r+   