
    P}bg                     @   d dl Z d dlZd dl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mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d d          Z G d d          Z G d d          Ze G d dee                      Zd ej        ej         ej!        ej"        fD             Z# ej$        d          d             Z% G d dee          Z& G d de&          Z' G d de&          Z(e G d de                      Z) G d  d!e)          Z* G d" d#e)          Z+ G d$ d%ee          Z, G d& d'ee          Z- G d( d)e          Z. G d* d+e          Z/ G d, d-e          Z0 G d. d/e          Z1 G d0 d1e,          Z2 G d2 d3e          Z3 G d4 d5e          Z4 G d6 d7e          Z5 G d8 d9ee          Z6 G d: d;e6          Z7 G d< d=e          Z8 G d> d?ee          Z9 G d@ dAe          Z: G dB dCe:          Z; G dD dEe:          Z<dS )F    NDecimal)UUID)EmptyResultSet
FieldError)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_property)make_hashablec                       e Zd ZdZd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                      | j         ||fi |\  }}	 | j                                        dk    rd|z  }n# t          $ r Y nw xY w||fS )NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr
   extra_contextsqlparamss         o/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/django/db/models/expressions.py	as_sqlitezSQLiteNumericMixin.as_sqlite   su    !dk(JHH-HHV	 2244FF+c1 	 	 	D	F{s   "7 
AAN)__name__
__module____qualname____doc__r        r   r   r      s-             r$   r   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$S )%
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|z<<z>>#c                     t          |d          st          |          }|rt          |||           S t          | ||          S )Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreverseds       r   _combinezCombinable._combine:   sL    u233 	!%LLE 	>%eY===!$	5999r$   c                 :    |                      d| j        d          S )NFr7   MULr   s    r   __neg__zCombinable.__neg__G   s    }}R5111r$   c                 :    |                      || j        d          S NFr7   ADDr   r4   s     r   __add__zCombinable.__add__J       }}UDHe444r$   c                 :    |                      || j        d          S r?   r7   SUBrB   s     r   __sub__zCombinable.__sub__M   rD   r$   c                 :    |                      || j        d          S r?   r:   rB   s     r   __mul__zCombinable.__mul__P   rD   r$   c                 :    |                      || j        d          S r?   r7   DIVrB   s     r   __truediv__zCombinable.__truediv__S   rD   r$   c                 :    |                      || j        d          S r?   r7   MODrB   s     r   __mod__zCombinable.__mod__V   rD   r$   c                 :    |                      || j        d          S r?   r7   POWrB   s     r   __pow__zCombinable.__pow__Y   rD   r$   c                     t          | dd          r0t          |dd          rt          |           t          |          z  S t          d          NconditionalF:Use .bitand() and .bitor() for bitwise logical operations.getattrr   NotImplementedErrorrB   s     r   __and__zCombinable.__and__\   V    4.. 	&75-QV3W3W 	&T77QuXX%%!H
 
 	
r$   c                 :    |                      || j        d          S r?   )r7   BITANDrB   s     r   bitandzCombinable.bitandc       }}UDK777r$   c                 :    |                      || j        d          S r?   )r7   BITLEFTSHIFTrB   s     r   bitleftshiftzCombinable.bitleftshiftf   s    }}UD$5u===r$   c                 :    |                      || j        d          S r?   )r7   BITRIGHTSHIFTrB   s     r   bitrightshiftzCombinable.bitrightshifti   s    }}UD$6>>>r$   c                 :    |                      || j        d          S r?   )r7   BITXORrB   s     r   bitxorzCombinable.bitxorl   rc   r$   c                     t          | dd          r0t          |dd          rt          |           t          |          z  S t          d          rX   r[   rB   s     r   __or__zCombinable.__or__o   r_   r$   c                 :    |                      || j        d          S r?   )r7   BITORrB   s     r   bitorzCombinable.bitorv   s    }}UDJ666r$   c                 :    |                      || j        d          S NTr@   rB   s     r   __radd__zCombinable.__radd__y       }}UDHd333r$   c                 :    |                      || j        d          S rs   rF   rB   s     r   __rsub__zCombinable.__rsub__|   ru   r$   c                 :    |                      || j        d          S rs   r:   rB   s     r   __rmul__zCombinable.__rmul__   ru   r$   c                 :    |                      || j        d          S rs   rL   rB   s     r   __rtruediv__zCombinable.__rtruediv__   ru   r$   c                 :    |                      || j        d          S rs   rP   rB   s     r   __rmod__zCombinable.__rmod__   ru   r$   c                 :    |                      || j        d          S rs   rT   rB   s     r   __rpow__zCombinable.__rpow__   ru   r$   c                      t          d          NrZ   r]   rB   s     r   __rand__zCombinable.__rand__       !H
 
 	
r$   c                      t          d          r   r   rB   s     r   __ror__zCombinable.__ror__   r   r$   N)&r   r    r!   r"   rA   rG   r;   rM   rU   rQ   ra   rp   re   rh   rk   r7   r=   rC   rH   rJ   rN   rR   rV   r^   rb   rf   ri   rl   rn   rq   rt   rw   ry   r{   r}   r   r   r   r#   r$   r   r&   r&   !   s         C
C
C
C
C C
 FELMF: : :2 2 25 5 55 5 55 5 55 5 55 5 55 5 5
 
 
8 8 8> > >? ? ?8 8 8
 
 
7 7 74 4 44 4 44 4 44 4 44 4 44 4 4
 
 


 
 
 
 
r$   r&   c                   j   e Zd ZdZeZdZdZ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d#dZed             Zed             Zed             Zed             Zd Zed             Zed             Zd Zd Z d Z!d Z"d"dZ#d Z$d Z%d Z&d Z'd  Z(d! Z)dS )$BaseExpressionz%Base class for all query expressions.FTNc                     |	|| _         d S d S Nr   r   r   s     r   __init__zBaseExpression.__init__   s    # ,D $#r$   c                 d    | j                                         }|                    dd            |S )Nconvert_value)__dict__copypop)r   states     r   __getstate__zBaseExpression.__getstate__   s.    ""$$		/4(((r$   c                 h    | j         | j        u rg n| j         g| j                            |          z   S r   )r   _convert_value_noopr   get_db_convertersr   r
   s     r   r   z BaseExpression.get_db_converters   sC     !T%=== B //
;;	< 	<r$   c                     g S r   r#   r<   s    r   get_source_expressionsz%BaseExpression.get_source_expressions       	r$   c                     |rJ d S r   r#   r   exprss     r   set_source_expressionsz%BaseExpression.set_source_expressions   s    yr$   c                     d |D             S )Nc                     g | ]G}t          |d           r|n2t          |t                    rt          |          nt	          |          HS r0   )r1   
isinstancestrFr2   .0args     r   
<listcomp>z5BaseExpression._parse_expressions.<locals>.<listcomp>   s`     
 
 
  3 455 CC$S#..>#E#JJ
 
 
r$   r#   )r   expressionss     r   _parse_expressionsz!BaseExpression._parse_expressions   s%    
 
 %
 
 
 	
r$   c                      t          d          )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

        Different backends can provide their own implementation, by
        providing an `as_{vendor}` method and patching the Expression:

        ```
        def override_as_sql(self, compiler, connection):
            # custom logic
            return super().as_sql(compiler, connection)
        setattr(Expression, 'as_' + connection.vendor, override_as_sql)
        ```

        Arguments:
         * compiler: the query compiler responsible for generating the query.
           Must have a compile method, returning a (sql, [params]) tuple.
           Calling compiler(value) will return a quoted `value`.

         * connection: the database connection used for the current query.

        Return: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()r   r   r   r
   s      r   r   zBaseExpression.as_sql   s    4 ""FGGGr$   c                 X    t          d |                                 D                       S )Nc              3   (   K   | ]}|o|j         V  d S r   )contains_aggregater   exprs     r   	<genexpr>z4BaseExpression.contains_aggregate.<locals>.<genexpr>   s*      ^^43D3^^^^^^r$   anyr   r<   s    r   r   z!BaseExpression.contains_aggregate   s+    ^^@[@[@]@]^^^^^^r$   c                 X    t          d |                                 D                       S )Nc              3   (   K   | ]}|o|j         V  d S r   )contains_over_clauser   s     r   r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>   s*      ``$45D5``````r$   r   r<   s    r   r   z#BaseExpression.contains_over_clause   s+    ``$B]B]B_B_``````r$   c                 X    t          d |                                 D                       S )Nc              3   (   K   | ]}|o|j         V  d S r   )contains_column_referencesr   s     r   r   z<BaseExpression.contains_column_references.<locals>.<genexpr>   s*      ff4;D;ffffffr$   r   r<   s    r   r   z)BaseExpression.contains_column_references   s+    ffHcHcHeHeffffffr$   c                     |                                  }|_        |                    fd|                                D                        |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

        Arguments:
         * query: the backend query implementation
         * allow_joins: boolean allowing or denying use of joins
           in this query
         * reuse: a set of reusable joins for multijoins
         * summarize: a terminal aggregate clause
         * for_save: whether this expression about to be used in a save or update

        Return: an Expression to be added to the query.
        c                 H    g | ]}|r|                               nd S r   r   )r   r   allow_joinsqueryreuse	summarizes     r   r   z5BaseExpression.resolve_expression.<locals>.<listcomp>   sL     "
 "
 "
  D##E;yIII"
 "
 "
r$   )r   
is_summaryr   r   r   r   r   r   r   for_savecs    ````  r   r0   z!BaseExpression.resolve_expression   s~     IIKK 	   "
 "
 "
 "
 "
 "
 "
 0022"
 "
 "
 	 	 	
 r$   c                 @    t          | j        t          j                  S r   )r   r   r   BooleanFieldr<   s    r   rY   zBaseExpression.conditional   s    $+V-@AAAr$   c                     | j         S r   r   r<   s    r   fieldzBaseExpression.field  s      r$   c                 ^    |                                  }|d| _        t          d          |S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   r   s     r   r   zBaseExpression.output_field  s8     113326D/STTTr$   c                 D    	 | j         S # t          $ r | j        s Y dS w xY w)z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r   r<   s    r   _output_field_or_nonez$BaseExpression._output_field_or_none  sH    	$$ 	 	 	6   	s   	 c           	          d |                                  D             }|D ]I}|D ]A}t          ||j                  s*t          d|j        j        d|j        j        d          B|c S dS )a  
        Attempt to infer the output type of the expression. If the output
        fields of all source fields match then, simply infer the same type
        here. This isn't always correct, but it makes sense most of the time.

        Consider the difference between `2 + 2` and `2 / 3`. Inferring
        the type here is a convenience for the common case. The user should
        supply their own output_field with more complex computations.

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c              3      K   | ]}||V  	d S r   r#   )r   sources     r   r   z7BaseExpression._resolve_output_field.<locals>.<genexpr>*  s'      \\6I[I[I[I[I[\\r$   z!Expression contains mixed types: , z. You must set output_field.N)get_source_fieldsr   	__class__r   r   )r   sources_iterr   r   s       r   r   z$BaseExpression._resolve_output_field  s     ]\T-C-C-E-E\\\( 
	  
	 L&  !,0@AA $* )2;;;",555    
	  
	 r$   c                     | S r   r#   value
expressionr
   s      r   r   z"BaseExpression._convert_value_noop7  s    r$   c                     | j         }|                                }|dk    rd S |                    d          rd S |dk    rd S | j        S )z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        
FloatFieldc                 (    | d nt          |           S r   )floatr   s      r   <lambda>z.BaseExpression.convert_value.<locals>.<lambda>E  s    TYZ_T`T` r$   IntegerFieldc                 (    | d nt          |           S r   )intr   s      r   r   z.BaseExpression.convert_value.<locals>.<lambda>G  s    TWX]T^T^ r$   r   c                 (    | d nt          |           S r   r   r   s      r   r   z.BaseExpression.convert_value.<locals>.<lambda>I  s    T[\aTbTb r$   )r   r   endswithr   )r   r   internal_types      r   r   zBaseExpression.convert_value;  sn     !//11L((```##N33 	c^^^n,,bbb''r$   c                 6    | j                             |          S r   )r   
get_lookup)r   lookups     r   r   zBaseExpression.get_lookupL  s     ++F333r$   c                 6    | j                             |          S r   )r   get_transformr   names     r   r   zBaseExpression.get_transformO  s     ..t444r$   c                     |                                  }|                    fd|                                 D                        |S )Nc                 B    g | ]}||                               nd S r   )relabeled_clone)r   e
change_maps     r   r   z2BaseExpression.relabeled_clone.<locals>.<listcomp>T  s@     &
 &
 &
 ./]Aj)))&
 &
 &
r$   )r   r   r   )r   r   clones    ` r   r   zBaseExpression.relabeled_cloneR  sa    		$$ &
 &
 &
 &
0022&
 &
 &
 	 	 	 r$   c                 *    t          j         |           S r   )r   r<   s    r   r   zBaseExpression.copyZ  s    yr$   c                     | j         s| gS g }|                                 D ])}|                    |                                           *|S r   )r   r   extendget_group_by_colsr   aliascolsr   s       r   r   z BaseExpression.get_group_by_cols]  sZ    & 	6M1133 	4 	4FKK00223333r$   c                 >    d |                                  D             S )z9Return the underlying field types used by this aggregate.c                     g | ]	}|j         
S r#   )r   )r   r   s     r   r   z4BaseExpression.get_source_fields.<locals>.<listcomp>g  s    OOOA'OOOr$   )r   r<   s    r   r   z BaseExpression.get_source_fieldse  s"    OO1L1L1N1NOOOOr$   c                     t          | fi |S r   OrderByr   kwargss     r   asczBaseExpression.asci      t&&v&&&r$   c                      t          | fddi|S N
descendingTr   r   s     r   desczBaseExpression.descl      t777777r$   c                     | S r   r#   r<   s    r   reverse_orderingzBaseExpression.reverse_orderingo      r$   c              #      K   | V  |                                  D ]3}|r/t          |d          r|                                E d{V  /|V  4dS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r1   r  )r   r   s     r   r  zBaseExpression.flattenr  s}      
 


//11 	 	D 4++ #||~~--------JJJ	 	r$   c                 l    t          | j        d          r| j                            |||          S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r1   r   r  r   r   r   r   s       r   r  zBaseExpression.select_format  s?    
 4$o66 	J$228S&IIIF{r$   r   NTNFF)*r   r    r!   r"   NotImplementedempty_result_set_valuer   r   
filterablewindow_compatibler   r   r   r   r   r   r   r   r   r   r   r0   propertyrY   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r  r  r  r  r#   r$   r   r   r      sv       //+J%*"J- - - -  
< < <    
 
 
H H H8 _ _ __ a a _a g g _g   0 B B XB ! ! X!   _ 	 	 _	     6   \ ( ( _( 4 4 45 5 5       P P P' ' '8 8 8        r$   r   c                   4    e Zd ZdZed             Zd Zd ZdS )
Expressionz:An expression that can be combined with other expressions.c                    t          j        | j                  }| j        \  }} |j        |i |}|                                 |j                                        }| j        g}|D ]|\  }}t          |t          j                  r7|j        r |j        r|j        j        j        |j        f}nt!          |          }nt#          |          }|                    ||f           }t'          |          S r   )inspect	signaturer   _constructor_argsbind_partialapply_defaults	argumentsitemsr   r   r   Fieldr   model_metalabeltyper   appendtuple)	r   constructor_signatureargsr   r  r  identityr   r   s	            r   r)  zExpression.identity  s     ' 1$- @ @-f6)6GGG	  """'--//	N## 	* 	*JC%.. -: (%+ ("[.4ejAEE KKEE%e,,OOS%L))))Xr$   c                 Z    t          |t                    st          S |j        | j        k    S r   )r   r  r  r)  rB   s     r   __eq__zExpression.__eq__  s)    %,, 	"!!~..r$   c                 *    t          | j                  S r   )hashr)  r<   s    r   __hash__zExpression.__hash__  s    DM"""r$   N)r   r    r!   r"   r   r)  r+  r.  r#   r$   r   r  r    sQ        DD  _$/ / /
# # # # #r$   r  c           
      h   i | ]}|t           j        t           j        t           j        ft           j        t           j        t           j        ft           j        t           j        t           j        ft           j        t           j        t           j        ft           j        t           j        t           j        fgS r#   )r   r   r   r   )r   r5   s     r   
<dictcomp>r0    s     	 	 	 	 		f163FG		f163FG		f163FG		f/1BC		F/1BC	 	 	r$      )maxsizec                     t                               | d          }|D ]*\  }}}t          ||          rt          ||          r|c S +d S )Nr#   )_connector_combinatorsget
issubclass)r5   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_types          r   _resolve_combined_typer=    sk    (,,Y;;KCN ! !?0-h 344 	!HNa9b9b 	!    ! !r$   c                   P     e Zd Zd fd	Zd Zd Zd Zd Z fdZd Z	ddZ
 xZS )r3   Nc                 v    t                                          |           || _        || _        || _        d S Nr   )superr   r5   lhsrhs)r   rB  r5   rC  r   r   s        r   r   zCombinedExpression.__init__  s7    l333"r$   c                 B    d                     | j        j        |           S )Nz<{}: {}>)formatr   r   r<   s    r   __repr__zCombinedExpression.__repr__  s      !8$???r$   c                 N    d                     | j        | j        | j                  S )Nz{} {} {})rE  rB  r5   rC  r<   s    r   __str__zCombinedExpression.__str__  s       4>48DDDr$   c                     | j         | j        gS r   rB  rC  r<   s    r   r   z)CombinedExpression.get_source_expressions  s    $(##r$   c                 $    |\  | _         | _        d S r   rJ  r   s     r   r   z)CombinedExpression.set_source_expressions  s    "$(((r$   c                    	 t                                                      S # t          $ rT t          | j        t          | j        j                  t          | j        j                            }|  |            cY S w xY wr   )	rA  r   r   r=  r5   r$  rB  r   rC  )r   r<  r   s     r   r   z(CombinedExpression._resolve_output_field  s    
	#7700222 	# 	# 	#2TX*++TX*++ M
 $ =??"""	#s   # AB Bc                 x   g }g }|                     | j                  \  }}|                    |           |                    |           |                     | j                  \  }}|                    |           |                    |           d}|j                            | j        |          }||z  |fS Nz(%s))compilerB  r%  r   rC  opscombine_expressionr5   )r   r   r
   r   expression_paramsr   r   expression_wrappers           r   r   zCombinedExpression.as_sql  s    &&tx00V3  (((&&tx00V3  (((#n//LL!C'):::r$   TFc                    | j                             |||||          }| j                            |||||          }t          | t          t
          f          s	 |j                                        }n# t          t          f$ r d }Y nw xY w	 |j                                        }	n# t          t          f$ r d }	Y nw xY wd||	hv r=||	k    r7t	          | j         | j
        | j                                      |||||          S h d}
| j
        | j        k    r;||
v r7||	k    r1t          | j         | j                                      |||||          S |                                 }||_        ||_         ||_        |S )NDurationField>   	DateField	TimeFieldDateTimeField)rB  r0   rC  r   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r5   rG   r   r   )r   r   r   r   r   r   rB  rC  r7  r8  datetime_fieldsr   s               r   r0   z%CombinedExpression.resolve_expression  s   h))%eYPXYYh))%eYPXYY$!35H IJJ 	 +==??"J/        +==??"J/       8X"6668x;O;O)$(DNDHMM``;y(   JIIO~))h/.I.IhZbNbNb*48TX>>QQ;y(   IIKK s$   A4 4B
	B
B( (B>=B>r   r  )r   r    r!   r   rF  rH  r   r   r   r   r0   __classcell__r   s   @r   r3   r3     s             @ @ @E E E$ $ $# # ## # # # #; ; ;       r$   r3   c                   *     e Zd Zd Z fdZd Z xZS )rY  c                     	 |j         }|                                dk    r4|                    |          \  }}|j                            |          |fS n# t
          $ r Y nw xY w|                    |          S )NrU  )r   r   rO  rP  format_for_duration_arithmeticr   )r   sider   r
   outputr   r   s          r   rO  zDurationExpression.compile	  s    	R&F ''))_<<&..t44V!~DDSII6QQ =  	 	 	D	 %%%s   A 
A#"A#c                    |j         j        r"t                                          ||          S |j                            |            g }g }|                     | j        ||          \  }}|                    |           |	                    |           |                     | j
        ||          \  }}|                    |           |	                    |           d}|j                            | j        |          }||z  |fS rN  )featureshas_native_duration_fieldrA  r   rP  check_expression_supportrO  rB  r%  r   rC  combine_duration_expressionr5   )	r   r   r
   r   rR  r   r   rS  r   s	           r   r   zDurationExpression.as_sql  s    8 	877>>(J777//555ll48XzBBV3  (((ll48XzBBV3  (((#n88UU!C'):::r$   c                 ^    | j         ||fi |\  }}| j        t          j        t          j        hv ry	 | j        j                                        }| j        j                                        }h d}||vs||vrt          d| j         d          n# t          t          f$ r Y nw xY w||fS )N>   r   r   r   rU  zInvalid arguments for operator .)r   r5   r&   r;   rM   rB  r   r   rC  r   r[  r   )	r   r   r
   r   r   r   r7  r8  allowed_fieldss	            r   r   zDurationExpression.as_sqlite%  s    !dk(JHH-HHV>jnjn===80BBDD80BBDD" " " >11X^5S5S'K$.KKK   6T #J/    F{s   <B B('B()r   r    r!   rO  r   r   r]  r^  s   @r   rY  rY    sV        	& 	& 	&; ; ; ; ;"      r$   rY  c                   B     e Zd Z ej                    Z fdZd Z xZS )rZ  c                 X    t                                          || j        |           d S r   )rA  r   rG   )r   rB  rC  r   s      r   r   zTemporalSubtraction.__init__;  s'    dh,,,,,r$   c                    |j                             |            |                    | j                  }|                    | j                  }|j                             | j        j                                        ||          S r   )rP  rg  rO  rB  rC  subtract_temporalsr   r   )r   r   r
   rB  rC  s        r   r   zTemporalSubtraction.as_sql>  so    //555tx((tx((~001F1X1X1Z1Z\_adeeer$   )	r   r    r!   r   rU  r   r   r   r]  r^  s   @r   rZ  rZ  8  s^        '6'))L- - - - -f f f f f f fr$   rZ  c                   B    e Zd ZdZd Zd Z	 	 ddZd Zd	 Zd
 Z	d Z
dS )r   zDAn object capable of resolving references to existing query objects.c                     || _         dS )z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   s     r   r   z
F.__init__I  s    
 			r$   c                 L    d                     | j        j        | j                  S N{}({}))rE  r   r   r   r<   s    r   rF  z
F.__repr__P  s    t~6	BBBr$   NTFc                 <    |                     | j        |||          S r   )resolve_refr   r   r   r   r   r   r   s         r   r0   zF.resolve_expressionS  s      K	JJJr$   c                     t          | fi |S r   r   r   s     r   r   zF.ascW  r  r$   c                      t          | fddi|S r  r   r   s     r   r  zF.descZ  r  r$   c                 B    | j         |j         k    o| j        |j        k    S r   )r   r   rB   s     r   r+  zF.__eq__]  s    ~0LTY%*5LLr$   c                 *    t          | j                  S r   )r-  r   r<   s    r   r.  z
F.__hash__`  s    DIr$   r  )r   r    r!   r"   r   rF  r0   r   r  r+  r.  r#   r$   r   r   r   E  s        NN  C C C FJ5:K K K K' ' '8 8 8M M M    r$   r   c                   :     e Zd ZdZdZd Z fdZd ZddZ xZ	S )	ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                      t          d          )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)
ValueErrorr   r(  r   s      r   r   zResolvedOuterRef.as_sqlm  s    *
 
 	
r$   c                 `     t                      j        |i |}t          | j        v |_        |S r   )rA  r0   r   r   possibly_multivalued)r   r(  r   colr   s       r   r0   z#ResolvedOuterRef.resolve_expressions  s4    (egg($9&99 $.#: 
r$   c                     | S r   r#   r   relabelss     r   r   z ResolvedOuterRef.relabeled_clone{  r	  r$   Nc                     g S r   r#   r   r   s     r   r   z"ResolvedOuterRef.get_group_by_cols~  r   r$   r   )
r   r    r!   r"   r   r   r0   r   r   r]  r^  s   @r   r}  r}  d  s|          
 
 
             r$   r}  c                       e Zd ZdZd Zd ZdS )OuterRefFc                 l    t          | j        | j                  r| j        S t          | j                  S r   )r   r   r   r}  r  s      r   r0   zOuterRef.resolve_expression  s0    di00 	9	***r$   c                     | S r   r#   r  s     r   r   zOuterRef.relabeled_clone  r	  r$   N)r   r    r!   r   r0   r   r#   r$   r   r  r    s8        + + +
    r$   r  c                   j     e Zd ZdZdZdZdZdZdd fd
Zd Z	d Z
d	 Zd
 ZddZddZ fdZ xZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)r   r   c                @   | j         ]t          |          | j         k    rEt          d| j        j        d| j         d| j         dk    rdnddt          |          d	          t                                          |	            | j        | | _        || _	        d S )
N'z' takes exactly     argumentr  z (z given)r   )
aritylen	TypeErrorr   r   rA  r   r   source_expressionsextra)r   r   r   r  r   s       r   r   zFunc.__init__  s    :!c+&6&6$*&D&D)N+++JJJ"&*//JJ{BB$$$$	   	l333"9$"9;"G


r$   c                    | j                             d | j        D                       }i | j        |                                 }|r_d                    d t          |                                          D                       }d                    | j        j	        ||          S d                    | j        j	        |          S )Nc              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r   z Func.__repr__.<locals>.<genexpr>  (      #P#PCHH#P#P#P#P#P#Pr$   r   c              3   `   K   | ])\  }}t          |          d z   t          |          z   V  *dS )=Nr  )r   keyvals      r   r   z Func.__repr__.<locals>.<genexpr>  s;      ^^HCc#hhns3xx7^^^^^^r$   
{}({}, {})rt  )

arg_joinerjoinr  r  _get_repr_optionssortedr  rE  r   r   )r   r(  r  s      r   rF  zFunc.__repr__  s    ###P#P8O#P#P#PPP:4::!7!7!9!9: 	MII^^u{{}}H]H]^^^^^E&&t~'>eLLLt~6===r$   c                     i S )zAReturn a dict of extra __init__() options to include in the repr.r#   r<   s    r   r  zFunc._get_repr_options  s    	r$   c                     | j         S r   r  r<   s    r   r   zFunc.get_source_expressions  s    &&r$   c                     || _         d S r   r  r   s     r   r   zFunc.set_source_expressions  s    "'r$   TFc                     |                                  }||_        t          |j                  D ]&\  }}|                    |||||          |j        |<   '|S r   )r   r   	enumerater  r0   )	r   r   r   r   r   r   r   posr   s	            r   r0   zFunc.resolve_expression  sd    IIKK !!"677 	o 	oHC(+(>(>ukSXZcem(n(nA %%r$   c                    |j                             |            g }g }| j        D ]}		 |                    |	          \  }
}nU# t          $ rH t          |	dt                    }|t          u r |                    t          |                    \  }
}Y nw xY w|                    |
           |	                    |           i | j
        |}|||d<   n|                    d| j                   |p|                    d| j                  }|p|                    d| j                  }|                    |          x|d<   |d<   ||z  |fS )Nr  functiontemplater  r   r   )rP  rg  r  rO  r   r\   r  r2   r%  r   r  
setdefaultr  r5  r  r  r  )r   r   r
   r  r  r  r   	sql_partsr   r   arg_sql
arg_paramsr  datas                 r   r   zFunc.as_sql  s   //555	* 		& 		&CV&.&6&6s&;&;#! V V V)06NP^)_)_&)^;;&.&6&6u=S7T7T&U&U#	V
 W%%%MM*%%%%.$*.. 'DOOJ666Btxx
DMBBJ488L$/#J#J
.8ooi.H.HH]d7m$&&s   AABBc                     t                                                      }| j        d d          |_        | j                                        |_        |S r   )rA  r   r  r  )r   r   r   s     r   r   z	Func.copy  s@    ww||~~"&"9!!!"<Z__&&
r$   r  )NNN)r   r    r!   r"   r  r  r  r  r   rF  r  r   r   r0   r   r   r]  r^  s   @r   r  r    s        H.HJE26       > > >  ' ' '( ( (   ' ' ' '6        r$   r  c                   d     e Zd ZdZdZd fd	Zd Zd Zd fd	Zdd	Z	d
 Z
ed             Z xZS )r2   z9Represent a wrapped value as a node within an expression.FNc                 Z    t                                          |           || _        dS )a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        r   N)rA  r   r   )r   r   r   r   s      r   r   zValue.__init__  s+     	l333


r$   c                 0    | j         j         d| j        dS )N())r   r   r   r<   s    r   rF  zValue.__repr__  s     .);;DJ;;;;r$   c                 ,   |j                             |            | j        }| j        }|`| j        r|                    ||          }n|                    ||          }t          |d          r|                    |||          |gfS |dg fS d|gfS )N)r
   get_placeholderNULLz%s)	rP  rg  r   r   r   get_db_prep_saveget_db_prep_valuer1   r  )r   r   r
   r  r   s        r   r   zValue.as_sql  s    //555j1#} Q"33CJ3OO"44SZ4PP|%677 V#33C:NNQTPUUU; 2:cU{r$   Tc                 `    t                                          |||||          }||_        |S r   )rA  r0   r   )r   r   r   r   r   r   r   r   s          r   r0   zValue.resolve_expression  s.    GG&&uk5)XVV
r$   c                     g S r   r#   r  s     r   r   zValue.get_group_by_cols
  r   r$   c                    t          | j        t                    rt          j                    S t          | j        t
                    rt          j                    S t          | j        t                    rt          j                    S t          | j        t                    rt          j
                    S t          | j        t          j                  rt          j                    S t          | j        t          j                  rt          j                    S t          | j        t          j                  rt          j                    S t          | j        t          j                  rt          j                    S t          | j        t&                    rt          j                    S t          | j        t*                    rt          j                    S t          | j        t.                    rt          j                    S d S r   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimerX  daterV  timerW  	timedeltarU  r   r   bytesBinaryFieldr   	UUIDFieldr<   s    r   r   zValue._resolve_output_field  s   dj#&& 	&#%%%dj$'' 	)&(((dj#&& 	)&(((dj%(( 	'$&&&dj("344 	*')))dj(-00 	&#%%%dj(-00 	&#%%%dj("455 	*')))dj'** 	)&(((dj%(( 	(%'''dj$'' 	&#%%%	& 	&r$   c                     | j         S r   )r   r<   s    r   r  zValue.empty_result_set_value%  s
    zr$   r   r  )r   r    r!   r"   r   r   rF  r   r0   r   r   r  r  r]  r^  s   @r   r2   r2     s        CC H
 
 
 
 
 
< < <  $     
   & & &0   X    r$   r2   c                   @     e Zd Zd	 fd	Zd Zd Zd	dZd
 fd	Z xZS )RawSQLNc                     |t          j                    }||c| _        | _        t	                                          |           d S r@  )r   r   r   r   rA  r   )r   r   r   r   r   s       r   r   zRawSQL.__init__+  sE    !<>>L #V$+l33333r$   c                 X    d                     | j        j        | j        | j                  S Nr  )rE  r   r   r   r   r<   s    r   rF  zRawSQL.__repr__1  s#    ""4>#:DHdkRRRr$   c                 $    d| j         z  | j        fS rN  )r   r   r   s      r   r   zRawSQL.as_sql4  s     $+--r$   c                     | gS r   r#   r  s     r   r   zRawSQL.get_group_by_cols7  	    vr$   TFc                 t   |j         j                                        D ]t}|j        j        D ]e}|                                \  }}	|	                                | j                                        v r|                    |j        |||            nfut                      
                    |||||          S r   )r!  r"  get_parent_listlocal_fieldsget_attname_columnlowerr   rv  r   rA  r0   )r   r   r   r   r   r   parentparent_field_column_namer   s             r   r0   zRawSQL.resolve_expression:  s    k'7799 	 	F & 9  !-!@!@!B!B;$$&&$(..*:*:::%%l&7eYWWWE ; ww))%eYPXYYYr$   r   r  )	r   r    r!   r   rF  r   r   r0   r]  r^  s   @r   r  r  *  s        4 4 4 4 4 4S S S. . .   Z Z Z Z Z Z Z Z Z Zr$   r  c                       e Zd Zd Zd ZdS )Starc                     dS )Nz'*'r#   r<   s    r   rF  zStar.__repr__F  s    ur$   c                 
    dg fS )Nr)   r#   r   s      r   r   zStar.as_sqlI  s    Bwr$   N)r   r    r!   rF  r   r#   r$   r   r  r  E  s2              r$   r  c                   H     e Zd ZdZdZd
 fd	Zd Zd Zd Zd
dZ	d	 Z
 xZS )ColTFNc                 r    ||}t                                          |           ||c| _        | _        d S r@  )rA  r   r   target)r   r   r  r   r   s       r   r   zCol.__init__R  s=    !Ll333"'
DKKKr$   c                     | j         | j        }}|r|t          |          fnt          |          f}d                    | j        j        d                    |                    S )Nrt  r   )r   r  r   rE  r   r   r  )r   r   r  identifierss       r   rF  zCol.__repr__X  sV    
DKv.3Guc&kk**#f++t~6		+8N8NOOOr$   c                     | j         | j        j        }}|r||fn|f}d                    t	          |j        |                    }|g fS )Nrj  )r   r  columnr  mapquote_name_unless_alias)r   r   r
   r   r  r  r   s          r   r   z
Col.as_sql]  sM    
DK$6v).=ufooVIhhs8;[IIJJBwr$   c                     | j         | S |                     |                    | j         | j                   | j        | j                  S r   )r   r   r5  r  r   r  s     r   r   zCol.relabeled_clonec  s=    :K~~hll4:tzBBDKQUQbcccr$   c                     | gS r   r#   r  s     r   r   zCol.get_group_by_colsh  r  r$   c                     | j         | j        k    r| j                            |          S | j                            |          | j                             |          z   S r   )r  r   r   r   s     r   r   zCol.get_db_convertersk  sZ    ;$+++$66zBBB!33J??--j99: 	;r$   r   )r   r    r!   r   r  r   rF  r   r   r   r   r]  r^  s   @r   r  r  M  s        !% 0 0 0 0 0 0P P P
  d d d
   ; ; ; ; ; ; ;r$   r  c                   P     e Zd ZdZ fdZd Zd Zd Zdd	Zd
 Z	d Z
ddZ xZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                 f    t                                                       ||c| _        | _        d S r   )rA  r   refsr   )r   r  r   r   s      r   r   zRef.__init__w  s-    !%v	4;;;r$   c                 X    d                     | j        j        | j        | j                  S r  )rE  r   r   r  r   r<   s    r   rF  zRef.__repr__{  s#    ""4>#:DIt{SSSr$   c                     | j         gS r   r   r<   s    r   r   zRef.get_source_expressions~  s    }r$   c                     |\  | _         d S r   r  r   s     r   r   zRef.set_source_expressions  s    r$   NTFc                     | S r   r#   rw  s         r   r0   zRef.resolve_expression  s	     r$   c                     | S r   r#   r  s     r   r   zRef.relabeled_clone  r	  r$   c                 D    |j                             | j                  g fS r   )rP  
quote_namer  r   s      r   r   z
Ref.as_sql  s    ~((33R77r$   c                     | gS r   r#   r  s     r   r   zRef.get_group_by_cols  r  r$   r  r   )r   r    r!   r"   r   rF  r   r   r0   r   r   r   r]  r^  s   @r   r  r  r  s         . . . . .T T T       
  8 8 8       r$   r  c                   2     e Zd ZdZdZ fdZd Zd Z xZS )ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like an
    ordering clause.
    z%(expressions)sc                 v    |st          d| j        j        z             t                      j        |i | d S )Nz$%s requires at least one expression.)r  r   r   rA  r   )r   r   r  r   s      r   r   zExpressionList.__init__  sG     	_CdnF]]^^^+//////r$   c                 T    | j                             d | j        D                       S )Nc              3   4   K   | ]}t          |          V  d S r   r  r   s     r   r   z)ExpressionList.__str__.<locals>.<genexpr>  r  r$   )r  r  r  r<   s    r   rH  zExpressionList.__str__  s*    ###P#P8O#P#P#PPPPr$   c                       | j         ||fi |S r   )r   )r   r   r
   r   s       r   r   zExpressionList.as_sqlite  s    t{8ZAA=AAAr$   )	r   r    r!   r"   r  r   rH  r   r]  r^  s   @r   r  r    sq         
 !H0 0 0 0 0
Q Q QB B B B B B Br$   r  c                   F     e Zd ZdZ fdZd Zd Zd	 fd	Zd Zd Z	 xZ
S )
ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                 Z    t                                          |           || _        d S r@  )rA  r   r   )r   r   r   r   s      r   r   zExpressionWrapper.__init__  s)    l333$r$   c                      |d         | _         d S Nr   r   r   s     r   r   z(ExpressionWrapper.set_source_expressions      (r$   c                     | j         gS r   r  r<   s    r   r   z(ExpressionWrapper.get_source_expressions        r$   Nc                     t          | j        t                    r;| j                                        }| j        |_        |                    |          S t                                                      S )N)r   )r   r   r  r   r   r   rA  )r   r   r   r   s      r   r   z#ExpressionWrapper.get_group_by_cols  sd    doz22 	=--//J&*&7J#//e/<<< ww((***r$   c                 6    |                     | j                  S r   )rO  r   r   s      r   r   zExpressionWrapper.as_sql  s    000r$   c                 L    d                     | j        j        | j                  S rs  )rE  r   r   r   r<   s    r   rF  zExpressionWrapper.__repr__  s    t~6HHHr$   r   )r   r    r!   r"   r   r   r   r   r   rF  r]  r^  s   @r   r  r    s         
% % % % %# # #! ! !+ + + + + +1 1 1I I I I I I Ir$   r  c                   ^     e Zd ZdZdZd fd	Zd Zd Zd Zd Z	d	 Z
ddZddZddZ xZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                    |r1|t          di |d }}n t          |dd          rt          |fi |d }}|t          |dd          r|rt          d          t          |t                     r|st	          d          t                                          d            || _        |                     |          d         | _	        d S )NrY   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.r   r   r#   )
r   r\   r  r   r  rA  r   	conditionr   result)r   r  thenlookupsr   s       r   r   zWhen.__init__  s     	C %&\\\\47		M599 C%&y%<%<G%<%<d7	GI}e$L$LPW"   i## 	RI 	RPQQQd+++"--d33A6r$   c                 &    d| j         d| j        S )NzWHEN z THEN r  r  r<   s    r   rH  zWhen.__str__  s     $(NNNDKK@@r$   c                 (    d| j         j        d| dS N<z: >r   r   r<   s    r   rF  zWhen.__repr__       !^444ddd;;r$   c                     | j         | j        gS r   r  r<   s    r   r   zWhen.get_source_expressions  s    ,,r$   c                 $    |\  | _         | _        d S r   r  r   s     r   r   zWhen.set_source_expressions  s    &+#r$   c                     | j         j        gS r   )r  r   r<   s    r   r   zWhen.get_source_fields  s    122r$   Tc                     |                                  }||_        t          |j        d          r#|j                            ||||d          |_        |j                            |||||          |_        |S )Nr0   F)r   r   r1   r  r0   r  r   s          r   r0   zWhen.resolve_expression  sr    IIKK 1; 455 	f+88UT]_deeAK8..uk5)U]^^r$   c                 :   |j                             |            |}g }|                    | j                  \  }}||d<   |                    |           |                    | j                  \  }	}
|	|d<   |                    |
           |p| j        }||z  |fS )Nr  r  )rP  rg  rO  r  r   r  r  )r   r   r
   r  r   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramss              r   r   zWhen.as_sql  s    //555'
*2*:*:4>*J*J'''4$*+++$,$4$4T[$A$A!
M$.!-(((,t}/):55r$   c                     g }|                                  D ])}|                    |                                           *|S r   r   r   r   r   s       r   r   zWhen.get_group_by_cols  sH    1133 	4 	4FKK00223333r$   NNr  r   )r   r    r!   r  rY   r   rH  rF  r   r   r   r0   r   r   r]  r^  s   @r   r  r    s        3HK7 7 7 7 7 7"A A A< < <- - -, , ,3 3 3   6 6 6 6       r$   r  c                   p     e Zd ZdZdZdZddd fd
Zd Zd Zd	 Z	d
 Z
ddZ fdZddZd fd	Z xZS )Casez
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s ENDr  N)defaultr   c                   t          d |D                       st          d          t                                          |           t	          |          | _        |                     |          d         | _        || _        d S )Nc              3   @   K   | ]}t          |t                    V  d S r   )r   r  )r   cases     r   r   z Case.__init__.<locals>.<genexpr>  s,      <<d:dD))<<<<<<r$   z.Positional arguments must all be When objects.r   )	allr  rA  r   listcasesr   r-  r  )r   r-  r   r3  r  r   s        r   r   zCase.__init__  s|    <<e<<<<< 	NLMMM&&&%[[
..w77:


r$   c                 `    dd                     d | j        D                       d| j        S )NzCASE r   c              3   4   K   | ]}t          |          V  d S r   r  )r   r   s     r   r   zCase.__str__.<locals>.<genexpr>#  s(      .J.J!s1vv.J.J.J.J.J.Jr$   z, ELSE )r  r3  r-  r<   s    r   rH  zCase.__str__"  s6     %)YY.J.Jtz.J.J.J%J%J%J%JDLLYYr$   c                 (    d| j         j        d| dS r  r  r<   s    r   rF  zCase.__repr__%  r  r$   c                 "    | j         | j        gz   S r   r3  r-  r<   s    r   r   zCase.get_source_expressions(  s    zT\N**r$   c                 $    |^ | _         | _        d S r   r8  r   s     r   r   zCase.set_source_expressions+  s    $)!T\\\r$   TFc                     |                                  }||_        t          |j                  D ]&\  }}|                    |||||          |j        |<   '|j                            |||||          |_        |S r   )r   r   r  r3  r0   r-  )	r   r   r   r   r   r   r   r  r0  s	            r   r0   zCase.resolve_expression.  s~    IIKK "17++ 	c 	cIC225+uiYabbAGCLLI00UIW_``	r$   c                 p    t                                                      }|j        d d          |_        |S r   )rA  r   r3  )r   r   r   s     r   r   z	Case.copy6  s*    GGLLNN'!!!*r$   c                    |j                             |            | j        s|                    | j                  S i | j        |}g }g }| j        D ]V}		 |                    |	          \  }
}n# t          $ r Y (w xY w|                    |
           |                    |           W|                    | j                  \  }}|s||fS |p| j	        }|
                    |          |d<   ||d<   |                    |           |p|                    d| j                  }||z  }| j        "|j                             | j                  |z  }||fS )Nr3  r-  r  )rP  rg  r3  rO  r-  r  r   r%  r   case_joinerr  r5  r  r   unification_cast_sqlr   )r   r   r
   r  r=  r   r"  
case_partsr#  r0  case_sqlcase_paramsdefault_sqldefault_paramsr   s                  r   r   zCase.as_sql;  s   //555z 	2##DL1119TZ9=9

J 	+ 	+D(0(8(8(>(>%++!   h'''k****&.&6&6t|&D&D#^ 	/..!5T%5#.#3#3J#?#? %0	".)))M22:t}MM(%1.55d6GHH3NCJs   A..
A;:A;c                     | j         s| j                            |          S t                                          |          S r   )r3  r-  r   rA  )r   r   r   s     r   r   zCase.get_group_by_colsV  s;    z 	9<11%888ww((///r$   r  r*  r   )r   r    r!   r"   r  r=  r   rH  rF  r   r   r0   r   r   r   r]  r^  s   @r   r,  r,    s        
 
 5HK'+$       Z Z Z< < <+ + +* * *       
   60 0 0 0 0 0 0 0 0 0r$   r,  c                   x     e Zd ZdZdZdZdZd fd	Zd Zd Z	d Z
 fd	Zed
             Zd ZddZddZ xZS )Subqueryz
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNc                     t          |d|          | _        || _        t                                          |           d S )Nr   )r\   r   r  rA  r   )r   querysetr   r  r   s       r   r   zSubquery.__init__e  s;    Xw99

&&&&&r$   c                     | j         gS r   r   r<   s    r   r   zSubquery.get_source_expressionsk  s    
|r$   c                      |d         | _         d S r  rJ  r   s     r   r   zSubquery.set_source_expressionsn  s    1X


r$   c                     | j         j        S r   )r   r   r<   s    r   r   zSubquery._resolve_output_fieldq  s    z&&r$   c                     t                                                      }|j                                        |_        |S r   )rA  r   r   r   )r   r   r   s     r   r   zSubquery.copyt  s.    k''))r$   c                     | j         j        S r   )r   external_aliasesr<   s    r   rO  zSubquery.external_aliasesy  s    z**r$   c                 4    | j                                         S r   )r   get_external_colsr<   s    r   rQ  zSubquery.get_external_cols}  s    z++---r$   c                     |j                             |            i | j        |}|p| j        }|                    ||          \  }}|dd         |d<   |p|                    d| j                  }||z  }	|	|fS )Nr  r9   subqueryr  )rP  rg  r  r   r   r5  r  )
r   r   r
   r  r   r   r"  subquery_sqlr#  r   s
             r   r   zSubquery.as_sql  s    //5559TZ9=9##(<<*#E#E j&21R4&8
#M22:t}MM(Jr$   c                     |rt          ||           gS |                                 }t          d |D                       r| gS |S )Nc              3   $   K   | ]}|j         V  d S r   )r  )r   r  s     r   r   z-Subquery.get_group_by_cols.<locals>.<genexpr>  s%      AACs'AAAAAAr$   )r  rQ  r   )r   r   external_colss      r   r   zSubquery.get_group_by_cols  sZ     	&t$$%%..00AA=AAAAA 	6Mr$   r   r*  )r   r    r!   r"   r  r   r  r   r   r   r   r   r  rO  rQ  r   r   r]  r^  s   @r   rF  rF  \  s           H!' ' ' ' ' '    ' ' '    
 + + X+. . .	 	 	 	       r$   rF  c                   Z     e Zd ZdZ ej                    Zd fd	Zd Zd	 fd	Z	d Z
 xZS )
ExistszEXISTS(%(subquery)s)Fc                 J    || _          t                      j        |fi | d S r   )negatedrA  r   )r   rH  r[  r   r   s       r   r   zExists.__init__  s/    ,,V,,,,,r$   c                 H    |                                  }| j         |_        |S r   )r   r[  )r   r   s     r   
__invert__zExists.__invert__  s     		 L(r$   Nc                     | j                             |j                  } t                      j        ||f||d|\  }}| j        rd                    |          }||fS )N)using)r  r   zNOT {})r   existsr   rA  r   r[  rE  )	r   r   r
   r  r   r   r   r   r   s	           r   r   zExists.as_sql  s    
!!
(8!99$eggn
 	
 

 
 
V < 	'//#&&CF{r$   c                 V    |j         j        j        sd                    |          }||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r
   re  &supports_boolean_expr_in_select_clauserE  r  s       r   r  zExists.select_format  s2     "+R 	?299#>>CF{r$   )Fr   )r   r    r!   r  r   r   r   r   r]  r   r  r]  r^  s   @r   rY  rY    s        %H&6&((L- - - - - -  
           r$   rY  c                   X    e Zd ZdZdZddZd Zd Zd ZddZ	d	 Z
dd
Zd Zd Zd ZdS )r   z%(expression)s %(ordering)sFc                     |r|rt          d          || _        || _        || _        t	          |d          st          d          || _        d S )Nz1nulls_first and nulls_last are mutually exclusiver0   z%expression must be an expression type)r  nulls_first
nulls_lastr  r1   r   )r   r   r  re  rf  s        r   r   zOrderBy.__init__  sf     	R: 	RPQQQ&$$z#788 	FDEEE$r$   c                 X    d                     | j        j        | j        | j                  S )Nz{}({}, descending={}))rE  r   r   r   r  r<   s    r   rF  zOrderBy.__repr__  s-    &--N#T_doG G 	Gr$   c                      |d         | _         d S r  r  r   s     r   r   zOrderBy.set_source_expressions  r  r$   c                     | j         gS r   r  r<   s    r   r   zOrderBy.get_source_expressions  r
  r$   Nc                    |p| j         }|j        j        r| j        rd|z  }nL| j        rd|z  }n?| j        r| j        r|j        j        sd|z  }n| j        r| j        s|j        j        sd|z  }|j                            |            |	                    | j
                  \  }}|| j        rdndd|}||                    d          z  }||z                                  |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)r   orderingz%(expression)s)r  re   supports_order_by_nulls_modifierrf  re  r  order_by_nulls_firstrP  rg  rO  r   countrstrip)r   r   r
   r  r   expression_sqlr   placeholderss           r   r   zOrderBy.as_sql  s:   ,t}? 	H 7*X5! 7+h6 HH$.$7$LH 98C! HOH(2(;(PH =xG//555!)!1!1$/!B!B("&/<u
 
 

 	(..!1222<'//11699r$   c                 
   |j                             | j                  rO|                                 }t	          t          | j        d          d          |_         |j        ||          S |                     ||          S )NT)r  F)r-  )rP  0conditional_expression_supported_in_where_clauser   r   r,  r  r   )r   r   r
   r   s       r   	as_oraclezOrderBy.as_oracle  s     >JJ4?[[ 	599;;D"T_4000  DO 4;x444{{8Z000r$   c                     g }|                                  D ])}|                    |                                           *|S r   r)  r   s       r   r   zOrderBy.get_group_by_cols  sH    1133 	4 	4FKK00223333r$   c                 p    | j          | _         | j        s| j        r| j         | _        | j         | _        | S r   )r  re  rf  r<   s    r   r  zOrderBy.reverse_ordering  sA    "o- 	2t 	2#'#33D"&/1DOr$   c                     d| _         d S r?   r  r<   s    r   r   zOrderBy.asc  s    r$   c                     d| _         d S rs   rz  r<   s    r   r  zOrderBy.desc  s    r$   )FFFr   )r   r    r!   r  rY   r   rF  r   r   r   rv  r   r  r   r  r#   r$   r   r   r     s        ,HK% % % %G G G# # #! ! !: : : :4
1 
1 
1              r$   r   c                   h     e Zd ZdZdZdZdZd fd	Zd Zd Z	d Z
dd	Z fd
Zd Zd ZddZ xZS )Windowz %(expression)s OVER (%(window)s)FTNc                 j   || _         || _        || _        t          |dd          st	          d|j        j        z            | j         At          | j         t          t          f          s| j         f| _         t          | j          | _         | j        ^t          | j        t          t          f          rt          | j         | _        n)t          | j        t                    st	          d          t                                          |           |                     |          d         | _        d S )Nr  Fz3Expression '%s' isn't compatible with OVER clauses.zCorder_by must be either an Expression or a sequence of expressions.r   r   )partition_byorder_byframer\   r  r   r   r   r&  r2  r  r   rA  r   r   source_expression)r   r   r  r  r  r   r   s         r   r   zWindow.__init__  s,   ( 
z#6>> 	E$-.  
 (d/%?? 9%)%6$8! .0A BD=$$-$77  . >~>>  #   	l333!%!8!8!D!DQ!Gr$   c                     | j         j        S r   )r  r   r<   s    r   r   zWindow._resolve_output_field-  s    %22r$   c                 6    | j         | j        | j        | j        gS r   r  r  r  r  r<   s    r   r   zWindow.get_source_expressions0  s    &(94=$*UUr$   c                 <    |\  | _         | _        | _        | _        d S r   r  r   s     r   r   zWindow.set_source_expressions3  s    OTL 14=$***r$   c                 R   |j                             |            |j        j        st	          d          |                    | j                  \  }}g g }}| j        J| j                            ||d          \  }}	|	                    |           |	                    |	           | j
        \|                    d           |                    | j
                  \  }
}|	                    |
           |	                    |           | j        rJ|                    | j                  \  }}|                    d|z              |	                    |           |	                    |           |p| j        }||d                    |                                          dz  |fS )Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)r   r
   r  z
 ORDER BY r   )r   window)rP  rg  re  supports_over_clauser	   rO  r  r  r   r   r  r%  r  r  r  strip)r   r   r
   r  expr_sqlr   
window_sqlwindow_paramssql_exprr#  	order_sqlorder_params	frame_sqlframe_paramss                 r   r   zWindow.as_sql6  s   //555"7 	Y#$WXXX#++D,BCC&$&M
(#'#4#;#;!j7 $< $ $ Hj h'''  ,,,=$l+++&.&6&6t}&E&E#I|i(((  ...: 	/&.&6&6tz&B&B#I|cIo...  ...m$$$,t}"ggj))//11
 
 
  	r$   c                 b   t          | j        t          j                  rz|                                 } |j                    }t          j                    |d         _         |j        |           t          t          |          
                    ||          S |                     ||          S r  )r   r   r   r   r   r   r   r   rA  r}  r   r   )r   r   r
   r   r  r   s        r   r   zWindow.as_sqliteX  s    d')<== 	G99;;D!<!<!>!>171B1D1Dq!.'D'(:;;;&&00:FFF{{8Z000r$   c                     d                     t          | j                  | j        rdt          | j                  z   nd| j        rdt          | j                  z   ndt          | j        pd                    S )Nz{} OVER ({}{}{})zPARTITION BY r  z	ORDER BY )rE  r   r  r  r  r  r<   s    r   rH  zWindow.__str__b  sx    !((&''8<8IQOc$"34444r04EK#dm,,,,2
 b!!	
 
 	
r$   c                 (    d| j         j        d| dS r  r  r<   s    r   rF  zWindow.__repr__j  r  r$   c                     g S r   r#   r  s     r   r   zWindow.get_group_by_colsm  r   r$   )NNNNr   )r   r    r!   r  r   r   r  r   r   r   r   r   r   rH  rF  r   r]  r^  s   @r   r}  r}  	  s        1H JH H H H H H63 3 3V V VU U U       D1 1 1 1 1
 
 
< < <       r$   r}  c                   J    e Zd ZdZdZddZd Zd Zd Zd Z	dd	Z
d
 Zd ZdS )WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z,%(frame_type)s BETWEEN %(start)s AND %(end)sNc                 V    t          |          | _        t          |          | _        d S r   )r2   startendr   r  r  s      r   r   zWindowFrame.__init__{  s     5\\
::r$   c                 $    |\  | _         | _        d S r   r  r  r   s     r   r   z"WindowFrame.set_source_expressions  s    $
DHHHr$   c                     | j         | j        gS r   r  r<   s    r   r   z"WindowFrame.get_source_expressions  s    
DH%%r$   c                     |j                             |            |                     || j        j        | j        j                  \  }}| j        | j        ||dz  g fS )N
frame_typer  r  )rP  rg  window_frame_start_endr  r   r  r  r  )r   r   r
   r  r  s        r   r   zWindowFrame.as_sql  sj    //55500TZ=Mtx~^^
s}/ 
  
 
 	 	r$   c                 (    d| j         j        d| dS r  r  r<   s    r   rF  zWindowFrame.__repr__  r  r$   c                     g S r   r#   r  s     r   r   zWindowFrame.get_group_by_cols  r   r$   c                 2   | j         j        >| j         j        dk     r.dt          | j         j                  t          j        j        fz  }n?| j         j        "| j         j        dk    rt          j        j        }nt          j        j        }| j        j        1| j        j        dk    r!d| j        j        t          j        j	        fz  }n?| j        j        "| j        j        dk    rt          j        j        }nt          j        j
        }| j        | j        ||dz  S )Nr   z%d %sr  )r  r   absr
   rP  	PRECEDINGCURRENT_ROWUNBOUNDED_PRECEDINGr  	FOLLOWINGUNBOUNDED_FOLLOWINGr  r  r  s      r   rH  zWindowFrame.__str__  s    :'DJ,<q,@,@s4:#344jn6NOOEEZ)dj.>!.C.CN.EEN6E8>%$(.1*<*<TX^Z^-EFFCCX^'DHNa,?,?.,CC.4C}/ 
  
 
 	
r$   c                      t          d          )Nz3Subclasses must implement window_frame_start_end().r   r   r
   r  r  s       r   r  z"WindowFrame.window_frame_start_end  s    !"WXXXr$   r*  r   )r   r    r!   r"   r  r   r   r   r   rF  r   rH  r  r#   r$   r   r  r  q  s          >H   % % %& & &  < < <   
 
 
(Y Y Y Y Yr$   r  c                       e Zd ZdZd ZdS )RowRangeROWSc                 8    |j                             ||          S r   )rP  window_frame_rows_start_endr  s       r   r  zRowRange.window_frame_start_end  s    ~99%EEEr$   Nr   r    r!   r  r  r#   r$   r   r  r    s-        JF F F F Fr$   r  c                       e Zd ZdZd ZdS )
ValueRangeRANGEc                 8    |j                             ||          S r   )rP  window_frame_range_start_endr  s       r   r  z!ValueRange.window_frame_start_end  s    ~::5#FFFr$   Nr  r#   r$   r   r  r    s-        JG G G G Gr$   r  )=r   r  	functoolsr  decimalr   uuidr   django.core.exceptionsr   r   	django.dbr   r	   r
   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.functionalr   django.utils.hashabler   r   r&   r   r  rA   rG   r;   rM   r4  	lru_cacher=  r3   rY  rZ  r   r}  r  r  r2   r  r  r  r  r  r  r  r,  rF  rY  r   r}  r  r  r  r#   r$   r   <module>r     s~                      = = = = = = = = B B B B B B B B B B # # # # # # 1 1 1 1 1 1 * * * * * * 4 4 4 4 4 4 3 3 3 3 3 3 / / / / / /       r
 r
 r
 r
 r
 r
 r
 r
jp p p p p p p pf # # # # # # # #>	 	 !njnjnjnU	 	 	  S!!!! ! "!!H H H H H+Z H H HV- - - - -+ - - -`
f 
f 
f 
f 
f, 
f 
f 
f     
   <    q   <	 	 	 	 	q 	 	 	M M M M Mz M M M`I I I I I
 I I IXZ Z Z Z ZZ Z Z Z6    :   "; "; "; "; ";* "; "; ";J    *   BB B B B BT B B B*I I I I I
 I I I@@ @ @ @ @: @ @ @FN0 N0 N0 N0 N0: N0 N0 N0b5 5 5 5 5~z 5 5 5p         X      FO O O O Oj O O Ode e e e e e e eP8Y 8Y 8Y 8Y 8Y* 8Y 8Y 8YvF F F F F{ F F FG G G G G G G G G Gr$   