
    h*"                         d Z ddlmZ ddlmZ ddlmZ dZdZ G d dej                        Z
 G d	 d
      Z G d d      Z G d d      Zy)zG
Code to manage the creation and SQL rendering of 'where' constraints.
    EmptyResultSet)tree)cached_propertyANDORc                       e Zd ZdZeZdZdZddZd Z	ddZ
d Zd	 Zd
 Zd Zd Zd Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zy)	WhereNodea  
    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                    | j                   s| dfS || j                  z  }|xr | j                  t        k(  xs | xr | j                  t        k(  }|r| j                   rd| fS g }g }| j
                  D ]y  }t        |d      r<|j                  |      \  }}||j                  |       |9|j                  |       K|j                   r|j                  |       i|j                  |       { |r'| j                  || j                  | j                        nd}	|r'| j                  || j                  | j                        nd}
|
|	fS )z
        Return two possibly None nodes: one for those parts of self that
        should be included in the WHERE clause and one for those parts of
        self that must be included in the HAVING clause.
        Nsplit_having)
contains_aggregatenegated	connectorr   r   childrenhasattrr   append	__class__)selfr   
in_negatedmay_need_splitwhere_partshaving_partsc
where_parthaving_parthaving_node
where_nodes              ]/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/models/sql/where.pyr   zWhereNode.split_having    s@    &&:t||+
 1DNNc1 6^4" 4 	 d55: 
	&Aq.)*+..*D'
K)&&z2* ''4%%##A&""1%
	& Uadnn\4>>4<<PfjR]T^^KNcg
;&&    c                    g }g }| j                   t        k(  rt        | j                        d}}ndt        | j                        }}| j                  D ]|  }	 |j	                  |      \  }}	|r#|j                  |       |j                  |	       n|dz  }	 |dk(  r| j                  rdg fc S t        |dk(  sf| j                  rt        dg fc S  d| j                   z  }
|
j                  |      }|r4| j                  r	d|z  }||fS t        |      dkD  s| j                  rd|z  }||fS # t        $ r |dz  }Y w xY w)a  
        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.
           r    z %s zNOT (%s)(%s))r   r   lenr   compiler   extendr   r   joinresolved)r   compiler
connectionresultresult_paramsfull_neededempty_neededchildsqlparamsconn
sql_strings               r   as_sqlzWhereNode.as_sqlA   sV    >>S (+DMM(:AK()3t}}+=K]] 	"E	%&..u5V MM#&!((01$K q <<r6M((a<<((r6M3	"4 &YYv&
|| (*4
 =(( VqDMM#j0
=((C " "!"s   D,,D=<D=Nc                 j    g }| j                   D ]!  }|j                  |j                                # |S N)r   r&   get_group_by_cols)r   aliascolsr/   s       r   r7   zWhereNode.get_group_by_colsu   s4    ]] 	3EKK//12	3r   c                      | j                   d d  S r6   )r   r   s    r   get_source_expressionsz WhereNode.get_source_expressions{   s    }}Qr   c                 X    t        |      t        | j                        k(  sJ || _        y r6   )r$   r   )r   r   s     r   set_source_expressionsz WhereNode.set_source_expressions~   s$    8}DMM 2222 r   c                     t        | j                        D ]N  \  }}t        |d      r|j                  |       $t        |d      s1|j	                  |      | j                  |<   P y)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   r@   rA   )r   
change_mapposr/   s       r   r@   zWhereNode.relabel_aliases   s_    
 $DMM2 	GJCu/0%%j1 12%*%:%::%Fc"	Gr   c                 .   | j                   j                  g | j                  | j                        }| j                  D ]S  }t        |d      r*|j                  j                  |j                                9|j                  j                  |       U |S )z
        Create a clone of the tree. Must only be called on root nodes (nodes
        with empty subtree_parents). Childs must be either (Constraint, lookup,
        value) tuples, or objects supporting .clone().
        )r   r   r   clone)r   _new_instancer   r   r   r   r   rF   )r   rF   r/   s      r   rF   zWhereNode.clone   s{     ,,4>>4<< - I]] 	-Eug&%%ekkm4%%e,		-
 r   c                 H    | j                         }|j                  |       |S r6   )rF   r@   )r   rC   rF   s      r   rA   zWhereNode.relabeled_clone   s     

j)r   c                 "    | j                         S r6   )rF   r;   s    r   copyzWhereNode.copy   s    zz|r   c                      t        |t        j                        rt         fd|j                  D              S |j
                  S )Nc              3   @   K   | ]  }j                  |        y wr6   _contains_aggregate.0r   clss     r   	<genexpr>z0WhereNode._contains_aggregate.<locals>.<genexpr>   s     Has..q1H   )
isinstancer   Nodeanyr   r   rQ   objs   ` r   rN   zWhereNode._contains_aggregate   s2    c499%H3<<HHH%%%r   c                 $    | j                  |       S r6   rM   r;   s    r   r   zWhereNode.contains_aggregate   s    ''--r   c                      t        |t        j                        rt         fd|j                  D              S |j
                  S )Nc              3   @   K   | ]  }j                  |        y wr6   _contains_over_clauserO   s     r   rR   z2WhereNode._contains_over_clause.<locals>.<genexpr>   s     Js003JrS   )rT   r   rU   rV   r   contains_over_clauserW   s   ` r   r]   zWhereNode._contains_over_clause   s2    c499%JS\\JJJ'''r   c                 $    | j                  |       S r6   r\   r;   s    r   r^   zWhereNode.contains_over_clause   s    ))$//r   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wr6   )
is_summary)rP   r/   s     r   rR   z'WhereNode.is_summary.<locals>.<genexpr>   s     ?5##?s   )rV   r   r;   s    r   rb   zWhereNode.is_summary   s    ????r   c                 J    t        | d      r | j                  |g|i |} | S )Nresolve_expression)r   rd   )exprqueryargskwargss       r   _resolve_leafzWhereNode._resolve_leaf   s.    4-.*4**5B4B6BDr   c                 6   t        |d      r(|j                  D ]  } | j                  ||g|i |  t        |d      r& | j                  |j                  |g|i ||_        t        |d      r' | j                  |j
                  |g|i ||_        y y )Nr   lhsrhs)r   r   _resolve_noderi   rk   rl   )rQ   noderf   rg   rh   r/   s         r   rm   zWhereNode._resolve_node   s    4$ A!!!%@@@A4(s((5J4J6JDH4(s((5J4J6JDH  r   c                 `    | j                         } |j                  |g|i | d|_        |S )NT)rF   rm   r(   )r   rg   rh   rF   s       r   rd   zWhereNode.resolve_expression   s3    

E3D3F3r   )Fr6   )__name__
__module____qualname____doc__r   defaultr(   conditionalr   r4   r7   r<   r>   r@   rF   rA   rJ   classmethodrN   r   r   r]   r^   propertyrb   staticmethodri   rm   rd    r   r   r
   r
      s     GHK'B2)h !
G
 & &
 . . ( (
 0 0 @ @  
 K Kr   r
   c                       e Zd ZdZdZddZy)NothingNodezA node that matches nothing.FNc                     t         r6   r   )r   r)   r*   s      r   r4   zNothingNode.as_sql   s    r   NN)rp   rq   rr   rs   r   r4   ry   r   r   r{   r{      s    &r   r{   c                       e Zd ZdZd ZddZy)
ExtraWhereFc                      || _         || _        y r6   )sqlsr1   )r   r   r1   s      r   __init__zExtraWhere.__init__   s    	r   Nc                     | j                   D cg c]  }d|z  	 }}dj                  |      t        | j                  xs d      fS c c}w )Nr#   z AND ry   )r   r'   listr1   )r   r)   r*   r0   r   s        r   r4   zExtraWhere.as_sql   sD    (,		222||D!4(9r#::: 3s   Ar}   rp   rq   rr   r   r   r4   ry   r   r   r   r      s    ;r   r   c                       e Zd ZdZd Zd Zy)SubqueryConstraintFc                 <    || _         || _        || _        || _        y r6   )r8   columnstargetsquery_object)r   r8   r   r   r   s        r   r   zSubqueryConstraint.__init__   s    
(r   c                     | j                   }|j                  | j                         |j                  |      }|j	                  | j
                  | j                  |      S )N)r*   )r   
set_valuesr   get_compileras_subquery_conditionr8   r   )r   r)   r*   rf   query_compilers        r   r4   zSubqueryConstraint.as_sql   sO    !!&++z+B33DJJhWWr   Nr   ry   r   r   r   r      s     )Xr   r   N)rs   django.core.exceptionsr   django.utilsr   django.utils.functionalr   r   r   rU   r
   r{   r   r   ry   r   r   <module>r      sT    2  3 	C		 CL 
; 
;X Xr   