
     h(                         d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZ d	Zd
ZdZ G d dej                  Z G d d          Z G d d          Z G d d          ZdS )zG
Code to manage the creation and SQL rendering of 'where' constraints.
    N)reduceEmptyResultSetCaseWhen)Exact)tree)cached_propertyANDORXORc                   
   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d Zed             Zd Zd Zd ZdS )	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                 z   | j         s| dfS || j        z  }|r| j        t          k    p"| o| j        t          k    p| j        t
          k    }|r| j         rd| fS g }g }| j        D ]}t          |d          rG|                    |          \  }}||	                    |           ||	                    |           Y|j         r|	                    |           v|	                    |           |r!| 
                    || j        | j                  nd}	|r!| 
                    || 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   r   childrenhasattrr   append	__class__)selfr   
in_negatedmay_need_splitwhere_partshaving_partsc
where_parthaving_parthaving_node
where_nodes              V/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/django/db/models/sql/where.pyr   zWhereNode.split_having&   s    & 	:t|+
 1DNc1 %74>R#7%~$ 	
  	d5 	: 
	& 
	&Aq.)) 	&*+..*D*D'
K)&&z222* ''444% &##A&&&&""1%%%% DNN<FFF 	 DNN;EEE 	
 ;&&    c                    g }g }| j         t          k    rt          | j                  d}}ndt          | j                  }}| j         t          k    r|j        j        s|                     | j        t                    }t          t          j        d | j        D                       }t          d|          }	|                     ||	gt          | j                                      ||          S | j        D ]}
	 |                    |
          \  }}|r+|                    |           |                    |           n|dz  }n# t$          $ r |dz  }Y nw xY w|dk    r| j        rdg fc S t$          |dk    r| j        rt$          dg fc S d| j         z  }|                    |          }|r,| j        rd|z  }nt          |          dk    s| j        rd|z  }||fS )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.
           c              3   V   K   | ]$}t          t          |d           d          V  %dS )r'   )thenr   )defaultNr   ).0r   s     r$   	<genexpr>z#WhereNode.as_sql.<locals>.<genexpr>g   s9      IIad11oooq111IIIIIIr%   r    z %s zNOT (%s)(%s))r   r   lenr   r   featuressupports_logical_xorr   r   r   operatoraddr	   r   as_sqlcompiler   extendr   joinresolved)r   compiler
connectionresultresult_paramsfull_neededempty_neededlhsrhs_sumrhschildsqlparamsconn
sql_strings                  r$   r4   zWhereNode.as_sqlQ   s6    >S  (+DM(:(:AKK()3t}+=+=K>S  )<)Q 
 ..33CII4=III G 7##C>>3*c4<@@GG*   ] 	" 	"E	%&..u55V  %MM#&&&!((00001$KK " " " "!" q  < )r6MMM((a< "((r6MMM	  
 &YYv&&
 	1| 1 (*4

VqDM#j0
=((s   8EEENc                 l    g }| j         D ])}|                    |                                           *|S N)r   r6   get_group_by_cols)r   aliascolsrB   s       r$   rI   zWhereNode.get_group_by_cols   s>    ] 	3 	3EKK//112222r%   c                      | j         d d          S rH   )r   r   s    r$   get_source_expressionsz WhereNode.get_source_expressions   s    }QQQr%   c                 b    t          |          t          | j                  k    sJ || _        d S rH   )r/   r   )r   r   s     r$   set_source_expressionsz WhereNode.set_source_expressions   s.    8}}DM 2 22222 r%   c                     t          | j                  D ]X\  }}t          |d          r|                    |           +t          |d          r|                    |          | j        |<   YdS )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   rR   rS   )r   
change_mapposrB   s       r$   rR   zWhereNode.relabel_aliases   s    
 $DM22 	G 	GJCu/00 G%%j1111 122 G%*%:%::%F%Fc"	G 	Gr%   c                    | j                             d| j        | j                  }| j        D ]Y}t          |d          r-|j                            |                                           ?|j                            |           Z|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().
        N)r   r   r   clone)r   _new_instancer   r   r   r   r   rX   )r   rX   rB   s      r$   rX   zWhereNode.clone   s     ,,nL - 
 

 ] 	- 	-Eug&& -%%ekkmm4444%%e,,,,r%   c                 X    |                                  }|                    |           |S rH   )rX   rR   )r   rU   rX   s      r$   rS   zWhereNode.relabeled_clone   s(    

j)))r%   c                 *    |                                  S rH   )rX   rM   s    r$   copyzWhereNode.copy   s    zz||r%   c                      t          |t          j                  r t           fd|j        D                       S |j        S )Nc              3   B   K   | ]}                     |          V  d S rH   _contains_aggregater+   r   clss     r$   r,   z0WhereNode._contains_aggregate.<locals>.<genexpr>   s1      HHas..q11HHHHHHr%   )
isinstancer
   Nodeanyr   r   rb   objs   ` r$   r`   zWhereNode._contains_aggregate   sF    c49%% 	IHHHH3<HHHHHH%%r%   c                 ,    |                      |           S rH   r_   rM   s    r$   r   zWhereNode.contains_aggregate   s    ''---r%   c                      t          |t          j                  r t           fd|j        D                       S |j        S )Nc              3   B   K   | ]}                     |          V  d S rH   _contains_over_clausera   s     r$   r,   z2WhereNode._contains_over_clause.<locals>.<genexpr>   s1      JJs0033JJJJJJr%   )rc   r
   rd   re   r   contains_over_clauserf   s   ` r$   rl   zWhereNode._contains_over_clause   sF    c49%% 	KJJJJS\JJJJJJ''r%   c                 ,    |                      |           S rH   rk   rM   s    r$   rm   zWhereNode.contains_over_clause   s    ))$///r%   c                 H    t          | d          r | j        |g|R i |} | S )Nresolve_expression)r   rp   )exprqueryargskwargss       r$   _resolve_leafzWhereNode._resolve_leaf   s=    4-.. 	C*4*5B4BBB6BBDr%   c                    t          |d          r|j        D ]} | j        ||g|R i | t          |d          r | j        |j        |g|R i ||_        t          |d          r | j        |j        |g|R i ||_        d S d S )Nr   r?   rA   )r   r   _resolve_noderu   r?   rA   )rb   noderr   rs   rt   rB   s         r$   rw   zWhereNode._resolve_node   s    4$$ 	A A A!!%@@@@@@@@4 	K(s(5J4JJJ6JJDH4 	K(s(5J4JJJ6JJDHHH	K 	Kr%   c                 ^    |                                  } |j        |g|R i | d|_        |S )NT)rX   rw   r8   )r   rs   rt   rX   s       r$   rp   zWhereNode.resolve_expression   s>    

E3D333F333r%   c                 "    ddl m}  |            S )Nr   )BooleanField)django.db.modelsr{   )r   r{   s     r$   output_fieldzWhereNode.output_field   s     111111|~~r%   c                 8    |j         j        j        sd| d}||fS )Nz
CASE WHEN z THEN 1 ELSE 0 END)r:   r0   &supports_boolean_expr_in_select_clause)r   r9   rC   rD   s       r$   select_formatzWhereNode.select_format   s/     "+R 	76s666CF{r%   c                 6    | j                             |          S rH   )r}   get_db_converters)r   r:   s     r$   r   zWhereNode.get_db_converters   s     22:>>>r%   c                 6    | j                             |          S rH   )r}   
get_lookup)r   lookups     r$   r   zWhereNode.get_lookup  s     ++F333r%   )FrH   )__name__
__module____qualname____doc__r   r*   r8   conditionalr   r4   rI   rN   rP   rR   rX   rS   r\   classmethodr`   r   r   rl   rm   staticmethodru   rw   rp   r}   r   r   r    r%   r$   r   r      s         GHK)' )' )' )'VA) A) A)F        ! ! !
G 
G 
G  $  
   & & [&
 . . _. ( ( [(
 0 0 _0   \
 K K [K     _
  ? ? ?4 4 4 4 4r%   r   c                       e Zd ZdZdZddZdS )NothingNodezA node that matches nothing.FNc                     t           rH   r   )r   r9   r:   s      r$   r4   zNothingNode.as_sql  s    r%   NN)r   r   r   r   r   r4   r   r%   r$   r   r     s4        &&     r%   r   c                        e Zd ZdZd ZddZdS )
ExtraWhereFc                 "    || _         || _        d S rH   )sqlsrD   )r   r   rD   s      r$   __init__zExtraWhere.__init__  s    	r%   Nc                 z    d | j         D             }d                    |          t          | j        pd          fS )Nc                     g | ]}d |z  S )r.   r   )r+   rC   s     r$   
<listcomp>z%ExtraWhere.as_sql.<locals>.<listcomp>  s    222222r%   z AND r   )r   r7   listrD   )r   r9   r:   r   s       r$   r4   zExtraWhere.as_sql  s=    22	222||D!!4(9r#:#:::r%   r   r   r   r   r   r   r4   r   r%   r$   r   r     s=          ; ; ; ; ; ;r%   r   c                       e Zd ZdZd Zd ZdS )SubqueryConstraintFc                 j    || _         || _        || _        |                    d           || _        d S )NT)clear_default)rJ   columnstargetsclear_orderingquery_object)r   rJ   r   r   r   s        r$   r   zSubqueryConstraint.__init__!  s<    
##$#777(r%   c                     | j         }|                    | j                   |                    |          }|                    | j        | j        |          S )N)r:   )r   
set_valuesr   get_compileras_subquery_conditionrJ   r   )r   r9   r:   rr   query_compilers        r$   r4   zSubqueryConstraint.as_sql(  sR    !&&&++z+BB33DJhWWWr%   Nr   r   r%   r$   r   r     s?         ) ) )X X X X Xr%   r   )r   r2   	functoolsr   django.core.exceptionsr   django.db.models.expressionsr   r   django.db.models.lookupsr	   django.utilsr
   django.utils.functionalr   r   r   r   rd   r   r   r   r   r   r%   r$   <module>r      s^           1 1 1 1 1 1 3 3 3 3 3 3 3 3 * * * * * *       3 3 3 3 3 3 	p4 p4 p4 p4 p4	 p4 p4 p4f       
; 
; 
; 
; 
; 
; 
; 
;X X X X X X X X X Xr%   