
    +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dS )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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    }|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   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/e360mart/e360mart_env/lib/python3.11/site-packages/django/db/models/sql/where.pyr   zWhereNode.split_having    ss    & 	:t|+
 1DNc1 6^4" 4 	  	d5 	: 
	& 
	&Aq.)) 	&*+..*D*D'
K)&&z222* ''444% &##A&&&&""1%%%%T`jdnn\4>4<PPPfjR]gT^^KNNNcg
;&&    c                 d   g }g }| j         t          k    rt          | j                  d}}ndt          | j                  }}| 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.
           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   s    >S  (+DM(:(:AKK()3t}+=+=K] 	" 	"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   BB)(B)Nc                 l    g }| j         D ])}|                    |                                           *|S N)r   r&   get_group_by_cols)r   aliascolsr/   s       r   r7   zWhereNode.get_group_by_colsu   s>    ] 	3 	3EKK//112222r   c                      | j         d d          S r6   )r   r   s    r   get_source_expressionsz WhereNode.get_source_expressions{   s    }QQQr   c                 b    t          |          t          | j                  k    sJ || _        d S r6   )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   r@   rA   )r   
change_mapposr/   s       r   r@   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   rF   )r   rF   r/   s      r   rF   zWhereNode.clone   s     ,,T^T\ - 
 
 ] 	- 	-Eug&& -%%ekkmm4444%%e,,,,r   c                 X    |                                  }|                    |           |S r6   )rF   r@   )r   rC   rF   s      r   rA   zWhereNode.relabeled_clone   s(    

j)))r   c                 *    |                                  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   B   K   | ]}                     |          V  d S r6   _contains_aggregate.0r   clss     r   	<genexpr>z0WhereNode._contains_aggregate.<locals>.<genexpr>   s1      HHas..q11HHHHHHr   )
isinstancer   Nodeanyr   r   rQ   objs   ` r   rN   zWhereNode._contains_aggregate   sF    c49%% 	IHHHH3<HHHHHH%%r   c                 ,    |                      |           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   B   K   | ]}                     |          V  d S r6   _contains_over_clauserO   s     r   rR   z2WhereNode._contains_over_clause.<locals>.<genexpr>   s1      JJs0033JJJJJJr   )rS   r   rT   rU   r   contains_over_clauserV   s   ` r   r\   zWhereNode._contains_over_clause   sF    c49%% 	KJJJJS\JJJJJJ''r   c                 ,    |                      |           S r6   r[   r;   s    r   r]   zWhereNode.contains_over_clause   s    ))$///r   c                 H    t          | d          r | j        |g|R i |} | S )Nresolve_expression)r   r`   )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   lhsrhs)r   r   _resolve_nodere   rg   rh   )rQ   noderb   rc   rd   r/   s         r   ri   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)rF   ri   r(   )r   rc   rd   rF   s       r   r`   zWhereNode.resolve_expression   s>    

E3D333F333r   c                 "    ddl m}  |            S )Nr   )BooleanField)django.db.modelsrm   )r   rm   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*   features&supports_boolean_expr_in_select_clause)r   r)   r0   r1   s       r   select_formatzWhereNode.select_format   s/     "+R 	76s666CF{r   c                 6    | j                             |          S r6   )ro   get_db_converters)r   r*   s     r   ru   zWhereNode.get_db_converters   s     22:>>>r   c                 6    | j                             |          S r6   )ro   
get_lookup)r   lookups     r   rw   zWhereNode.get_lookup   s     ++F333r   )Fr6   )__name__
__module____qualname____doc__r   defaultr(   conditionalr   r4   r7   r<   r>   r@   rF   rA   rJ   classmethodrN   r   r   r\   r]   staticmethodre   ri   r`   ro   rs   ru   rw    r   r   r
   r
      s         GHK' ' ' 'B2) 2) 2)h        ! ! !
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           r6   r   )r   r)   r*   s      r   r4   zNothingNode.as_sql   s    r   NN)ry   rz   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 r6   )sqlsr1   )r   r   r1   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   )rP   r0   s     r   
<listcomp>z%ExtraWhere.as_sql.<locals>.<listcomp>   s    222222r   z AND r   )r   r'   listr1   )r   r)   r*   r   s       r   r4   zExtraWhere.as_sql   s=    22	222||D!!4(9r#:#:::r   r   ry   rz   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)r8   columnstargetsclear_orderingquery_object)r   r8   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_conditionr8   r   )r   r)   r*   rb   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   N)r|   django.core.exceptionsr   django.utilsr   django.utils.functionalr   r   r   rT   r
   r   r   r   r   r   r   <module>r      s    2 1 1 1 1 1       3 3 3 3 3 3 	S4 S4 S4 S4 S4	 S4 S4 S4l       
; 
; 
; 
; 
; 
; 
; 
;X X X X X X X X X Xr   