
    h2                         S r SSKrSSKJr  SSKJrJr  SSKJrJ	r	  SSK
Jr  SSKJr  SSKJr  SS	KJr  S
rSrSr " S S\R*                  5      r " S S5      r " S S5      r " S S5      rg)zG
Code to manage the creation and SQL rendering of 'where' constraints.
    N)reduce)EmptyResultSetFullResultSetCaseWhen)Mod)Exact)tree)cached_propertyANDORXORc                      \ rS rSrSr\rSrSrSS jr	S r
S rS rS	 rS
 rS rS rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS r\S 5       r\S 5       r S r!S r"S r#S r$Sr%g) 	WhereNode   a  
An SQL WHERE clause.

The class is tied to the Query class that created it (in order to create
the correct SQL).

A child is usually an expression producing boolean values. Most likely the
expression is a Lookup instance.

However, a child could also be any class with as_sql() and either
relabeled_clone() method or relabel_aliases() and clone() methods and
contains_aggregate attribute.
FTc                    U R                   (       d  U R                  (       d  U SS4$ XR                  -  nU=(       a    U R                  [        :H  =(       d;    U(       + =(       a    U R                  [
        :H  =(       d    U R                  [        :H  nU(       a'  U R                   (       a  U R                  (       d  SU S4$ / n/ n/ nU R                   H  n[        US5      (       aT  UR                  X25      u  pnU	b  UR                  U	5        U
b  UR                  U
5        Ub  UR                  U5        Mf  Mh  UR                  (       a  UR                  U5        M  UR                   (       a  UR                  U5        M  UR                  U5        M     U(       a3  U(       a,  U(       a  U(       a  U(       d  SSU 4$ U(       a  [        S5      eU(       a&  U R                  XPR                  U R                  5      OSnU(       a&  U R                  X`R                  U R                  5      OSnU(       a&  U R                  XpR                  U R                  5      OSnXU4$ )z
Return three possibly None nodes: one for those parts of self that
should be included in the WHERE clause, one for those parts of self
that must be included in the HAVING clause, and one for those parts
that refer to window functions.
Nsplit_having_qualifyzzHeterogeneous disjunctive predicates against window functions are not implemented when performing conditional aggregation.)contains_aggregatecontains_over_clausenegated	connectorr   r   r   childrenhasattrr   appendNotImplementedErrorcreate)selfr   must_group_by
in_negatedmust_remain_connectedwhere_partshaving_partsqualify_partsc
where_parthaving_partqualify_part
where_nodehaving_nodequalify_nodes                  L/var/www/html/env/lib/python3.13/site-packages/django/db/models/sql/where.pyr   WhereNode.split_having_qualify(   s    &&t/H/Ht##||+
 1DNNc1 %74>>R#7%~~$ 	 "''-- t##Aq011898N8N95
 )&&z2* ''4+!((6 ,''$$Q'%%##A&""1%! " !] ;}T4''
 *O   KK^^T\\B 	  KKnndllC 	  KK~~t||D 	
 44    c                    / n/ nU R                   [        :X  a  [        U R                  5      SpeOS[        U R                  5      peU R                   [        :X  a  UR
                  R                  (       d  U R                  U R                  [        5      n[        [        R                  S U R                   5       5      n[        U R                  5      S:  a  [        US5      n[        SU5      n	U R                  Xy/[        U R                  5      R                  X5      $ U R                   H  n
 UR!                  U
5      u  pU(       a#  UR#                  U5        UR%                  U5        OUS-  n US:X  a  U R                  (       a  [(        e[&        eUS:X  d  Mr  U R                  (       a  [&        e[(        e   SU R                   -  nUR+                  U5      nU(       d  [(        eU R                  (       a  SU-  nX4$ [        U5      S:  d  U R,                  (       a  SU-  nX4$ ! [&         a    US-  n N[(         a    US-  n Nf = f)z
Return the SQL version of the where clause and the value to be
substituted in. Return '', [] if this node matches everything,
None, [] if this node is empty, and raise EmptyResultSet if this
node can't match anything.
   c              3   F   #    U  H  n[        [        US S9SS9v   M     g7f)r0   )thenr   )defaultNr   ).0r%   s     r,   	<genexpr>#WhereNode.as_sql.<locals>.<genexpr>   s     I=ad11oq1=s   !   r   z %s zNOT (%s)(%s))r   r   lenr   r   featuressupports_logical_xor	__class__r   r   operatoraddr	   r
   r   as_sqlcompiler   extendr   r   joinresolved)r   compiler
connectionresultresult_paramsfull_neededempty_neededlhsrhs_sumrhschildsqlparamsconn
sql_strings                  r,   r?   WhereNode.as_sqlt   s    >>S (+DMM(:A()3t}}+=>>S )<)<)Q)Q ..3CI4==IG 4==!A%gq/7#C>>3*c4<<@GG  ]]E%&..u5 MM#&!((01$K q <<''((a<<((''7 #8 &YYv&
<< $j0J (( [1_*,J((I " "!  !q !s   2H--I>IIc                 n    / nU R                    H"  nUR                  UR                  5       5        M$     U$ N)r   rA   get_group_by_cols)r   colsrM   s      r,   rU   WhereNode.get_group_by_cols   s/    ]]EKK//12 #r.   c                      U R                   S S  $ rT   r   r   s    r,   get_source_expressions WhereNode.get_source_expressions   s    }}Qr.   c                 X    [        U5      [        U R                  5      :X  d   eXl        g rT   )r9   r   )r   r   s     r,   set_source_expressions WhereNode.set_source_expressions   s"    8}DMM 2222 r.   c                     U(       d  U $ [        U R                  5       HZ  u  p#[        US5      (       a  UR                  U5        M)  [        US5      (       d  M<  UR	                  U5      U R                  U'   M\     g)z~
Relabel the alias values of any children. 'change_map' is a dictionary
mapping old (current) alias values to the new values.
relabel_aliasesrelabeled_cloneN)	enumerater   r   ra   rb   )r   
change_mapposrM   s       r,   ra   WhereNode.relabel_aliases   sd    
 K#DMM2JCu/00%%j1 122%*%:%::%Fc" 3r.   c                     U R                  U R                  U R                  S9nU R                   H?  n[	        US5      (       a  UR                  5       nUR                  R                  U5        MA     U$ )Nr   r   clone)r   r   r   r   r   ri   r   )r   ri   rM   s      r,   ri   WhereNode.clone   s[    dnndllK]]Eug&&NN!!%( # r.   c                 H    U R                  5       nUR                  U5        U$ rT   )ri   ra   )r   rd   ri   s      r,   rb   WhereNode.relabeled_clone   s     

j)r.   c                    U(       d  U $ UR                  U 5      =n(       a  U$ U R                  U R                  U R                  S9nU R                   H-  nUR                  R                  UR                  U5      5        M/     U$ )Nrh   )getr   r   r   r   r   replace_expressions)r   replacementsreplacementri   rM   s        r,   ro   WhereNode.replace_expressions   sp    K&**400;0dnndllK]]ENN!!%";";L"IJ #r.   c                 d    [        5       nU R                   H  nXR                  5       -  nM     U$ rT   )setr   get_refs)r   refsrM   s      r,   ru   WhereNode.get_refs   s+    u]]ENN$$D #r.   c                    ^  [        U[        R                  5      (       a  [        U 4S jUR                   5       5      $ UR
                  $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frT   _contains_aggregater4   r%   clss     r,   r5   0WhereNode._contains_aggregate.<locals>.<genexpr>   s     H<as..q11<   !)
isinstancer   Nodeanyr   r   r}   objs   ` r,   r{   WhereNode._contains_aggregate   s5    c499%%H3<<HHH%%%r.   c                 $    U R                  U 5      $ rT   rz   rZ   s    r,   r   WhereNode.contains_aggregate   s    ''--r.   c                    ^  [        U[        R                  5      (       a  [        U 4S jUR                   5       5      $ UR
                  $ )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frT   _contains_over_clauser|   s     r,   r5   2WhereNode._contains_over_clause.<locals>.<genexpr>  s     J\s0033\r   )r   r   r   r   r   r   r   s   ` r,   r   WhereNode._contains_over_clause   s5    c499%%JS\\JJJ'''r.   c                 $    U R                  U 5      $ rT   r   rZ   s    r,   r   WhereNode.contains_over_clause  s    ))$//r.   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  oR                   v   M     g 7frT   )
is_summary)r4   rM   s     r,   r5   'WhereNode.is_summary.<locals>.<genexpr>  s     ?##s   )r   r   rZ   s    r,   r   WhereNode.is_summary
  s    ????r.   c                 T    [        U S5      (       a  U R                  " U/UQ70 UD6n U $ )Nresolve_expression)r   r   )exprqueryargskwargss       r,   _resolve_leafWhereNode._resolve_leaf  s/    4-..**5B4B6BDr.   c                 V   [        US5      (       a)  UR                   H  nU R                  " XR/UQ70 UD6  M     [        US5      (       a&  U R                  " UR                  U/UQ70 UD6Ul        [        US5      (       a'  U R                  " UR
                  U/UQ70 UD6Ul        g g )Nr   rJ   rL   )r   r   _resolve_noder   rJ   rL   )r}   noder   r   r   rM   s         r,   r   WhereNode._resolve_node  s    4$$!!%@@@ '4((5J4J6JDH4((5J4J6JDH  r.   c                 `    U R                  5       nUR                  " U/UQ70 UD6  SUl        U$ )NT)ri   r   rC   )r   r   r   ri   s       r,   r   WhereNode.resolve_expression  s1    

E3D3F3r.   c                     SSK Jn  U" 5       $ )Nr   )BooleanField)django.db.modelsr   )r   r   s     r,   output_fieldWhereNode.output_field$  s    1~r.   c                     U R                   $ rT   )r   rZ   s    r,   _output_field_or_noneWhereNode._output_field_or_none*  s       r.   c                 ^    UR                   R                  R                  (       d  SU S3nX#4$ )Nz
CASE WHEN z THEN 1 ELSE 0 END)rE   r:   &supports_boolean_expr_in_select_clause)r   rD   rN   rO   s       r,   select_formatWhereNode.select_format.  s0     ""++RRse#56C{r.   c                 8    U R                   R                  U5      $ rT   )r   get_db_converters)r   rE   s     r,   r   WhereNode.get_db_converters6  s      22:>>r.   c                 8    U R                   R                  U5      $ rT   )r   
get_lookup)r   lookups     r,   r   WhereNode.get_lookup9  s      ++F33r.   c              #      #    U R                    H6  n[        U[        5      (       a  UR                  5        S h  vN   M2  Uv   M8     g  N7frT   )r   r   r   leaves)r   rM   s     r,   r   WhereNode.leaves<  s7     ]]E%++ <<>))	 #)s   8AA
ArY   N)FF)&__name__
__module____qualname____firstlineno____doc__r   r3   rC   conditionalr   r?   rU   r[   r^   ra   ri   rb   ro   ru   classmethodr{   r   r   r   r   propertyr   staticmethodr   r   r   r   r   r   r   r   r   __static_attributes__ r.   r,   r   r      s     GHKJ5XH)T !G
 & &
 . . ( (
 0 0 @ @  
 K K  
 ! !?4r.   r   c                   *    \ rS rSrSrSrSrSS jrSrg)NothingNodeiD  zA node that matches nothing.FNc                     [         erT   )r   )r   rD   rE   s      r,   r?   NothingNode.as_sqlJ  s    r.   r   NN)	r   r   r   r   r   r   r   r?   r   r   r.   r,   r   r   D  s    & r.   r   c                   ,    \ rS rSrSrSrS rSS jrSrg)
ExtraWhereiN  Fc                     Xl         X l        g rT   )sqlsrO   )r   r   rO   s      r,   __init__ExtraWhere.__init__S  s    	r.   Nc                     U R                    Vs/ s H  nSU-  PM
     nnSR                  U5      [        U R                  =(       d    S5      4$ s  snf )Nr8   z AND r   )r   rB   listrO   )r   rD   rE   rN   r   s        r,   r?   ExtraWhere.as_sqlW  sE    (,		2		2||D!4(9r#::: 3s   A)rO   r   r   	r   r   r   r   r   r   r   r?   r   r   r.   r,   r   r   N  s     ;r.   r   c                   (    \ rS rSrSrSrS rS rSrg)SubqueryConstrainti\  Fc                 R    Xl         X l        X0l        UR                  SS9  X@l        g )NT)clear_default)aliascolumnstargetsclear_orderingquery_object)r   r   r   r   r   s        r,   r   SubqueryConstraint.__init__b  s(    
##$#7(r.   c                     U R                   nUR                  U R                  5        UR                  US9nUR	                  U R
                  U R                  U5      $ )N)rE   )r   
set_valuesr   get_compileras_subquery_conditionr   r   )r   rD   rE   r   query_compilers        r,   r?   SubqueryConstraint.as_sqli  sO    !!&++z+B33DJJhWWr.   )r   r   r   r   Nr   r   r.   r,   r   r   \  s      )Xr.   r   )r   r=   	functoolsr   django.core.exceptionsr   r   django.db.models.expressionsr   r   django.db.models.functionsr	   django.db.models.lookupsr
   django.utilsr   django.utils.functionalr   r   r   r   r   r   r   r   r   r   r.   r,   <module>r      sh      @ 3 * *  3 	l		 l^	 ; ;X Xr.   