
    h                     "   d dl Z d dlZd dlZd dlmZ d dlmZ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 dlmZ d d	lmZ d d
lmZ  G d d      Z G d d      Ze G d d             Z G d dee      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      Z" G d# d$e"      Z# G d% d&e      Z$ G d' d(e      Z% G d) d*e      Z& G d+ d,e      Z' G d- d.e      Z( G d/ d0e!      Z) G d1 d2e      Z* G d3 d4e      Z+ G d5 d6e      Z, G d7 d8e      Z- G d9 d:e-      Z. G d; d<e      Z/ G d= d>e      Z0 G d? d@e      Z1 G dA dBe1      Z2 G dC dDe1      Z3y)E    NDecimal)EmptyResultSet
FieldError)NotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_property)make_hashablec                       e Zd ZdZd Zy)SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                      | j                   ||fi |\  }}	 | j                  j                         dk(  rd|z  }||fS # t        $ r Y ||fS w xY w)NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparamss         _/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/models/expressions.py	as_sqlitezSQLiteNumericMixin.as_sqlite   sm    !dkk(JH-HV	  224F+c1 F{  	F{	s   "? 	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%y$)%
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      sEt        |t        j                        r t	        |t        j                               }nt        |      }|rt        |||       S t        | ||      S )Nresolve_expressionr   )	hasattr
isinstancedatetime	timedeltaDurationValuer	   DurationFieldValueCombinedExpression)r   other	connectorreverseds       r   _combinezCombinable._combine8   s\    u23%!3!34%e&:N:N:PQe%eY==!$	599r"   c                 <    | j                  d| j                  d      S )NFr;   MULr   s    r   __neg__zCombinable.__neg__H   s    }}R511r"   c                 <    | j                  || j                  d      S NFr;   ADDr   r8   s     r   __add__zCombinable.__add__K       }}UDHHe44r"   c                 <    | j                  || j                  d      S rC   r;   SUBrF   s     r   __sub__zCombinable.__sub__N   rH   r"   c                 <    | j                  || j                  d      S rC   r>   rF   s     r   __mul__zCombinable.__mul__Q   rH   r"   c                 <    | j                  || j                  d      S rC   r;   DIVrF   s     r   __truediv__zCombinable.__truediv__T   rH   r"   c                 <    | j                  || j                  d      S rC   r;   MODrF   s     r   __mod__zCombinable.__mod__W   rH   r"   c                 <    | j                  || j                  d      S rC   r;   POWrF   s     r   __pow__zCombinable.__pow__Z   rH   r"   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      NconditionalF:Use .bitand() and .bitor() for bitwise logical operations.getattrr   NotImplementedErrorrF   s     r   __and__zCombinable.__and__]   =    4.75-QV3WT7QuX%%!H
 	
r"   c                 <    | j                  || j                  d      S rC   )r;   BITANDrF   s     r   bitandzCombinable.bitandd       }}UDKK77r"   c                 <    | j                  || j                  d      S rC   )r;   BITLEFTSHIFTrF   s     r   bitleftshiftzCombinable.bitleftshiftg   s    }}UD$5$5u==r"   c                 <    | j                  || j                  d      S rC   )r;   BITRIGHTSHIFTrF   s     r   bitrightshiftzCombinable.bitrightshiftj   s    }}UD$6$6>>r"   c                 <    | j                  || j                  d      S rC   )r;   BITXORrF   s     r   bitxorzCombinable.bitxorm   rg   r"   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      r\   r_   rF   s     r   __or__zCombinable.__or__p   rc   r"   c                 <    | j                  || j                  d      S rC   )r;   BITORrF   s     r   bitorzCombinable.bitorw   s    }}UDJJ66r"   c                 <    | j                  || j                  d      S NTrD   rF   s     r   __radd__zCombinable.__radd__z       }}UDHHd33r"   c                 <    | j                  || j                  d      S rw   rJ   rF   s     r   __rsub__zCombinable.__rsub__}   ry   r"   c                 <    | j                  || j                  d      S rw   r>   rF   s     r   __rmul__zCombinable.__rmul__   ry   r"   c                 <    | j                  || j                  d      S rw   rP   rF   s     r   __rtruediv__zCombinable.__rtruediv__   ry   r"   c                 <    | j                  || j                  d      S rw   rT   rF   s     r   __rmod__zCombinable.__rmod__   ry   r"   c                 <    | j                  || j                  d      S rw   rX   rF   s     r   __rpow__zCombinable.__rpow__   ry   r"   c                     t        d      Nr^   ra   rF   s     r   __rand__zCombinable.__rand__       !H
 	
r"   c                     t        d      r   r   rF   s     r   __ror__zCombinable.__ror__   r   r"   N)&r   r   r   r    rE   rK   r?   rQ   rY   rU   re   rt   ri   rl   ro   r;   rA   rG   rL   rN   rR   rV   rZ   rb   rf   rj   rm   rp   rr   ru   rx   r{   r}   r   r   r   r   r   r!   r"   r   r$   r$      s     C
C
C
C
C C
 FELMF
: 2555555
8>?8
7444444


r"   r$   c                   J   e Zd Z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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'ed"        Z(d# Z)d$ Z*y)'BaseExpressionz%Base class for all query expressions.FTNc                     ||| _         y y Nr/   r   r   s     r   __init__zBaseExpression.__init__   s    # ,D $r"   c                 ^    | j                   j                         }|j                  dd        |S )Nconvert_value)__dict__copypop)r   states     r   __getstate__zBaseExpression.__getstate__   s'    ""$		/4(r"   c                     | j                   | j                  u rg n| j                   g| j                  j                  |      z   S r   )r   _convert_value_noopr   get_db_convertersr   r   s     r   r   z BaseExpression.get_db_converters   sG     !!T%=%==  //
;	< 	<r"   c                     g S r   r!   r@   s    r   get_source_expressionsz%BaseExpression.get_source_expressions       	r"   c                     |rJ y r   r!   r   exprss     r   set_source_expressionsz%BaseExpression.set_source_expressions   s    y5r"   c                     |D cg c]6  }t        |d      r|n%t        |t              rt        |      n
t	        |      8 c}S c c}w )Nr.   )r0   r1   strFr6   )r   expressionsargs      r   _parse_expressionsz!BaseExpression._parse_expressions   sK     %
  3 45C$S#.#E#J
 	
 
s   ;A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Gr"   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_aggregate.0exprs     r   	<genexpr>z4BaseExpression.contains_aggregate.<locals>.<genexpr>   s     ^43D333^   anyr   r@   s    r   r   z!BaseExpression.contains_aggregate   s    ^@[@[@]^^^r"   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_over_clauser   s     r   r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>   s     `$45D555`r   r   r@   s    r   r   z#BaseExpression.contains_over_clause   s    `$B]B]B_```r"   c                 B    t        d | j                         D              S )Nc              3   <   K   | ]  }|xr |j                     y wr   )contains_column_referencesr   s     r   r   z<BaseExpression.contains_column_references.<locals>.<genexpr>   s     f4;D;;;fr   r   r@   s    r   r   z)BaseExpression.contains_column_references   s    fHcHcHefffr"   c                     | j                         }||_        |j                  |j                         D cg c]  }|r|j	                  ||||      nd c}       |S c c}w )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.
        N)r   
is_summaryr   r   r.   )r   queryallow_joinsreuse	summarizefor_savecr   s           r   r.   z!BaseExpression.resolve_expression   sq     IIK 	   002"
   ##E;yI"
 	
 "
s   Ac                 J    t        | j                  t        j                        S r   )r1   r   r	   BooleanFieldr@   s    r   r]   zBaseExpression.conditional   s    $++V-@-@AAr"   c                     | j                   S r   r/   r@   s    r   fieldzBaseExpression.field  s       r"   c                 N    | j                         }|d| _        t        d      |S )z+Return the output type of this expressions.Tz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   r   s     r   r   zBaseExpression.output_field  s2     11326D/STTr"   c                 T    	 | j                   S # t        $ r | j                  s Y y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  s3    	$$$ 	66 7	s    ''c           	          d | j                         D        }|D ]\  }|D ]R  }t        ||j                        rt        d|j                  j                  d|j                  j                  d       |c S  y)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   | ]	  }||  y wr   r!   )r   sources     r   r   z7BaseExpression._resolve_output_field.<locals>.<genexpr>+  s     \6I[\s   z!Expression contains mixed types: , z. You must set output_field.N)get_source_fieldsr1   	__class__r   r   )r   sources_iterr   r   s       r   r   z$BaseExpression._resolve_output_field  s     ]T-C-C-E\( 
	 L& !,0@0@A$ )22;;",,55   
	 r"   c                     | S r   r!   value
expressionr   s      r   r   z"BaseExpression._convert_value_noop8  s    r"   c                     | j                   }|j                         }|dk(  rd S |j                  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 S t        |       S r   )floatr   s      r   <lambda>z.BaseExpression.convert_value.<locals>.<lambda>F  s     TYZ_T` r"   IntegerFieldc                      | d S t        |       S r   )intr   s      r   r   z.BaseExpression.convert_value.<locals>.<lambda>H  s     TWX]T^ r"   r   c                      | d S t        |       S r   r   r   s      r   r   z.BaseExpression.convert_value.<locals>.<lambda>J  s     T[\aTb r"   )r   r   endswithr   )r   r   internal_types      r   r   zBaseExpression.convert_value<  sY     !!//1L(``##N3^^n,bb'''r"   c                 8    | j                   j                  |      S r   )r   
get_lookup)r   lookups     r   r   zBaseExpression.get_lookupM  s      ++F33r"   c                 8    | j                   j                  |      S r   )r   get_transformr   names     r   r   zBaseExpression.get_transformP  s      ..t44r"   c                     | j                         }|j                  | j                         D cg c]  }||j                  |      nd  c}       |S c c}w r   )r   r   r   relabeled_clone)r   
change_mapclonees       r   r   zBaseExpression.relabeled_cloneS  sZ    		$$002&
 ./]Aj)D&
 	 	&
s   Ac                 ,    t        j                   |       S r   )r   r@   s    r   r   zBaseExpression.copy[  s    yyr"   c                     | j                   s| gS g }| j                         D ]!  }|j                  |j                                # |S r   )r   r   extendget_group_by_colsr   aliascolsr   s       r   r   z BaseExpression.get_group_by_cols^  sI    &&6M113 	4FKK0023	4r"   c                 \    | j                         D cg c]  }|j                   c}S c c}w )z9Return the underlying field types used by this aggregate.)r   r   )r   r   s     r   r   z BaseExpression.get_source_fieldsf  s%    151L1L1NOA''OOOs   )c                     t        | fi |S r   OrderByr   kwargss     r   asczBaseExpression.ascj      t&v&&r"   c                     t        | fddi|S N
descendingTr   r   s     r   desczBaseExpression.descm      t7777r"   c                     | S r   r!   r@   s    r   reverse_orderingzBaseExpression.reverse_orderingp      r"   c              #   x   K   |  | j                         D ]  }|s|j                         E d{     y7 w)zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        N)r   flatten)r   r   s     r   r  zBaseExpression.flattens  s:     
 
//1 	*D<<>))	*)s   ::8:c                 p    t        | j                  d      r| j                  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)r0   r   r  r   r   r   r   s       r   r  zBaseExpression.select_format}  s9    
 4$$o6$$228S&IIF{r"   c                 ,   t        j                  | j                        }| j                  \  }} |j                  |i |}|j                          |j                  j                         }| j                  g}|D ]  \  }}t        |t        j                        rQ|j                  r9|j                  r-|j                  j                  j                  |j                  f}nt!        |      }nt#        |      }|j%                  ||f        t'        |      S r   )inspect	signaturer   _constructor_argsbind_partialapply_defaults	argumentsitemsr   r1   r	   Fieldr   model_metalabeltyper   appendtuple)	r   constructor_signatureargsr   r  r  identityr   r   s	            r   r  zBaseExpression.identity  s     ' 1 1$-- @--f6)66GG	  "''--/	NN## 	*JC%.::%++"[[..44ejjAE KE%e,OOS%L)	* Xr"   c                 `    t        |t              st        S |j                  | j                  k(  S r   )r1   r   NotImplementedr  rF   s     r   __eq__zBaseExpression.__eq__  s%    %0!!~~..r"   c                 ,    t        | j                        S r   )hashr  r@   s    r   __hash__zBaseExpression.__hash__  s    DMM""r"   r   NTNFF)+r   r   r   r    r   r   
filterablewindow_compatibler   r   r   r   r   r   r   r   r   r   r   r.   propertyr]   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r!  r!   r"   r   r   r      s]   / J%*"J-
<
H8 _ _ a a g g0 B B ! !   	 	 6   ( ( 45P'8*  $/
#r"   r   c                       e Zd ZdZy)
Expressionz:An expression that can be combined with other expressions.N)r   r   r   r    r!   r"   r   r(  r(    s    Dr"   r(  c                   F     e Zd Zd fd	Zd Zd Zd Zd Zd Zd	dZ	 xZ
S )
r7   c                 P    t         |   |       || _        || _        || _        y Nr/   )superr   r9   lhsrhs)r   r-  r9   r.  r   r   s        r   r   zCombinedExpression.__init__  s(    l3"r"   c                 N    dj                  | j                  j                  |       S )Nz<{}: {}>)formatr   r   r@   s    r   __repr__zCombinedExpression.__repr__  s      !8!8$??r"   c                 d    dj                  | j                  | j                  | j                        S )Nz{} {} {})r0  r-  r9   r.  r@   s    r   __str__zCombinedExpression.__str__  s#      4>>488DDr"   c                 2    | j                   | j                  gS r   r-  r.  r@   s    r   r   z)CombinedExpression.get_source_expressions  s    $((##r"   c                 "    |\  | _         | _        y r   r5  r   s     r   r   z)CombinedExpression.set_source_expressions  s    "$(r"   c                    	 | j                   j                  }	 | j                  j                  }|j                  j
                  se|r|j                         dk(  s|rN|j                         dk(  r;t        | j                   | j                  | j                        j                  ||      S |r~|r|| j                  | j                  k(  rc|j                         dv rQ|j                         |j                         k(  r0t        | j                   | j                        j                  ||      S g }g }|j                  | j                         \  }}|j                  |       |j                  |       |j                  | j                        \  }}|j                  |       |j                  |       d}	|j                  j!                  | j                  |      }|	|z  |fS # t        $ r d }Y w xY w# t        $ r d }Y w xY w)Nr5   >   	DateField	TimeFieldDateTimeField(%s))r-  r   r   r.  featureshas_native_duration_fieldr   DurationExpressionr9   r   rK   TemporalSubtractioncompiler  r   opscombine_expression)
r   r   r   
lhs_output
rhs_outputr   expression_paramsr   r   expression_wrappers
             r   r   zCombinedExpression.as_sql  s   	..J	..J ##==!=!=!??!R!=!=!??!R%dhhIPPQY[eff:$..DHH*D((*.YY,,.*2N2N2PP&txx:AA(JWW&&txx0V3  (&&txx0V3  (#nn//L!C'):::3  	J	  	J	s"   G G/ G,+G,/G>=G>c                     | j                         }||_        |j                  j                  |||||      |_        |j                  j                  |||||      |_        |S r   )r   r   r-  r.   r.  r   r   r   r   r   r   r   s          r   r.   z%CombinedExpression.resolve_expression  sU    IIK ((UIxX((UIxXr"   r   r"  )r   r   r   r   r1  r3  r   r   r   r.   __classcell__r   s   @r   r7   r7     s(    @E$#;<r"   r7   c                       e Zd Zd Zd Zy)r>  c                    t        |t              sQ	 |j                  }|j                         dk(  r1|j	                  |      \  }}|j
                  j                  |      |fS |j	                  |      S # t        $ r Y w xY w)Nr5   )r1   r4   r   r   r@  rA  format_for_duration_arithmeticr   )r   sider   r   outputr   r   s          r   r@  zDurationExpression.compile  s    $.V** ++-@"*"2"24"8KC%>>HHMvUU%%  s   A3 3	A?>A?c                    |j                   j                  |        g }g }| j                  | j                  ||      \  }}|j	                  |       |j                  |       | j                  | j                  ||      \  }}|j	                  |       |j                  |       d}|j                   j                  | j                  |      }||z  |fS Nr;  )	rA  check_expression_supportr@  r-  r  r   r.  combine_duration_expressionr9   )r   r   r   r   rE  r   r   rF  s           r   r   zDurationExpression.as_sql  s    //5ll488XzBV3  (ll488XzBV3  (#nn88U!C'):::r"   N)r   r   r   r@  r   r!   r"   r   r>  r>    s    
&;r"   r>  c                   F     e Zd Z ej                         Z fdZd Z xZS )r?  c                 <    t         |   || j                  |       y r   )r,  r   rK   )r   r-  r.  r   s      r   r   zTemporalSubtraction.__init__  s    dhh,r"   c                 "   |j                   j                  |        |j                  | j                        }|j                  | j                        }|j                   j                  | j                  j                  j                         ||      S r   )rA  rR  r@  r-  r.  subtract_temporalsr   r   )r   r   r   r-  r.  s        r   r   zTemporalSubtraction.as_sql  sj    //5txx(txx(~~001F1F1X1X1Z\_adeer"   )	r   r   r   r	   r5   r   r   r   rI  rJ  s   @r   r?  r?    s    '6'')L-fr"   r?  c                   @    e Zd ZdZd Zd Z	 	 d
dZd Zd Zd Z	d	 Z
y)r   zDAn object capable of resolving references to existing query objects.c                     || _         y)z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   s     r   r   z
F.__init__  s    
 	r"   c                 b    dj                  | j                  j                  | j                        S N{}({}))r0  r   r   r   r@   s    r   r1  z
F.__repr__  s!    t~~66		BBr"   Nc                 >    |j                  | j                  |||      S r   )resolve_refr   r   r   r   r   r   r   s         r   r.   zF.resolve_expression  s      K	JJr"   c                     t        | fi |S r   r   r   s     r   r   zF.asc  r   r"   c                     t        | fddi|S r   r   r   s     r   r   zF.desc   r  r"   c                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r   )r   r   rF   s     r   r  zF.__eq__#  s'    ~~0LTYY%**5LLr"   c                 ,    t        | j                        S r   )r   r   r@   s    r   r!  z
F.__hash__&  s    DIIr"   r"  )r   r   r   r    r   r1  r.   r   r   r  r!  r!   r"   r   r   r     s5    NC FJ5:K'8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_sql3  s    *
 	
r"   c                 T    t        |   |i |}t        | j                  v |_        |S r   )r,  r.   r
   r   possibly_multivalued)r   r  r   colr   s       r   r.   z#ResolvedOuterRef.resolve_expression9  s/    g($9&9 $.#: 
r"   c                     | S r   r!   r   relabelss     r   r   z ResolvedOuterRef.relabeled_cloneA  r  r"   c                     g S r   r!   r   r   s     r   r   z"ResolvedOuterRef.get_group_by_colsD  r   r"   r   )
r   r   r   r    r   r   r.   r   r   rI  rJ  s   @r   re  re  *  s$     
r"   re  c                       e Zd Zd Zd Zy)OuterRefc                     t        | j                  | j                        r| j                  S t        | j                        S r   )r1   r   r   re  rh  s      r   r.   zOuterRef.resolve_expressionI  s-    dii099		**r"   c                     | S r   r!   rm  s     r   r   zOuterRef.relabeled_cloneN  r  r"   N)r   r   r   r.   r   r!   r"   r   rr  rr  H  s    +
r"   rr  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                D   | j                   ht        |      | j                   k7  rPt        d| j                  j                  d| j                   d| j                   dk(  rdnddt        |      d	      t
        |   |	        | j                  | | _        || _	        y )
N'z' takes exactly     argumentr  z (z given)r/   )
aritylen	TypeErrorr   r   r,  r   r   source_expressionsextra)r   r   r   r  r   s       r   r   zFunc.__init__Y  s    ::!c+&6$**&DNN++JJ"&**/J{B$	  	l3"9$"9"9;"G
r"   c                    | j                   j                  d | j                  D              }i | j                  | j	                         }|rVdj                  d t        |j                               D              }dj                  | j                  j                  ||      S dj                  | j                  j                  |      S )Nc              3   2   K   | ]  }t        |        y wr   r   r   r   s     r   r   z Func.__repr__.<locals>.<genexpr>h       #PCH#P   r   c              3   V   K   | ]!  \  }}t        |      d z   t        |      z    # yw)=Nr  )r   keyvals      r   r   z Func.__repr__.<locals>.<genexpr>k  s%     ^HCc#hns3x7^s   ')
{}({}, {})r\  )

arg_joinerjoinr  r  _get_repr_optionssortedr  r0  r   r   )r   r  r  s      r   r1  zFunc.__repr__g  s    ###P8O8O#PP:4:::!7!7!9:II^u{{}H]^^E&&t~~'>'>eLLt~~6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_optionso  s    	r"   c                     | j                   S r   r  r@   s    r   r   zFunc.get_source_expressionss  s    &&&r"   c                     || _         y r   r  r   s     r   r   zFunc.set_source_expressionsv  s
    "'r"   c                     | j                         }||_        t        |j                        D ]'  \  }}|j	                  |||||      |j                  |<   ) |S r   )r   r   	enumerater  r.   )	r   r   r   r   r   r   r   posr   s	            r   r.   zFunc.resolve_expressiony  s_    IIK !!"6"67 	oHC(+(>(>ukSXZcem(nA  %	or"   c                    |j                   j                  |        g }g }| j                  D ]8  }	|j                  |	      \  }
}|j	                  |
       |j                  |       : i | j                  |}|||d<   n|j                  d| j                         |xs |j                  d| j                        }|xs |j                  d| j                        }|j                  |      x|d<   |d<   ||z  |fS )Nfunctiontemplater  r   r   )rA  rR  r  r@  r  r   r  
setdefaultr  getr  r  r  )r   r   r   r  r  r  r   	sql_partsr   r   arg_sql
arg_paramsdatas                r   r   zFunc.as_sql  s    //5	** 	&C"*"2"23"7GZW%MM*%	& /$**.. 'DOOJ6Btxx
DMMBJ488L$//#J
.8ooi.HH]d7m$&&r"   c                     t         |          }| j                  d d  |_        | j                  j                         |_        |S r   )r,  r   r  r  )r   r   r   s     r   r   z	Func.copy  s8    w|~"&"9"9!"<ZZ__&
r"   r"  )NNN)r   r   r   r    r  r  r  r|  r   r1  r  r   r   r.   r   r   rI  rJ  s   @r   rv  rv  R  sJ    H.HJE26 >'('* r"   rv  c                   D     e Zd ZdZd fd	Zd Zd Zd fd	ZddZ xZ	S )	r6   z9Represent a wrapped value as a node within an expression.c                 4    t         |   |       || _        y)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)r,  r   r   )r   r   r   r   s      r   r   zValue.__init__  s     	l3
r"   c                 b    dj                  | j                  j                  | j                        S r[  )r0  r   r   r   r@   s    r   r1  zValue.__repr__  s!    t~~66

CCr"   c                 ,   |j                   j                  |        | j                  }| j                  }|U| j                  r|j                  ||      }n|j                  ||      }t        |d      r|j                  |||      |gfS |dg fS d|gfS )N)r   get_placeholderNULLz%s)	rA  rR  r   r   r   get_db_prep_saveget_db_prep_valuer0   r  )r   r   r   r  r   s        r   r   zValue.as_sql  s    //5jj11#}}"33CJ3O"44SZ4P|%67#33C:NQTPUUU; 2:cU{r"   c                 <    t         |   |||||      }||_        |S r   )r,  r.   r   )r   r   r   r   r   r   r   r   s          r   r.   zValue.resolve_expression  s&    G&uk5)XV
r"   c                     g S r   r!   rp  s     r   r   zValue.get_group_by_cols  r   r"   r   r"  )
r   r   r   r    r   r1  r   r.   r   rI  rJ  s   @r   r6   r6     s     C
D$
r"   r6   c                        e Zd Z fdZ xZS )r4   c                     |j                   j                  |        |j                  j                  rt        |   ||      S |j                   j                  | j                        g fS r   )rA  rR  r<  r=  r,  r   date_interval_sqlr   )r   r   r   r   s      r   r   zDurationValue.as_sql  sS    //5887>(J77~~//

;R??r"   )r   r   r   r   rI  rJ  s   @r   r4   r4     s    @ @r"   r4   c                   @     e Zd Zd fd	Zd Zd ZddZd fd	Z xZS )RawSQLc                 p    |t        j                         }||c| _        | _        t        |   |       y r+  )r	   r  r   r   r,  r   )r   r   r   r   r   s       r   r   zRawSQL.__init__  s4    !<<>L #V$+l3r"   c                 x    dj                  | j                  j                  | j                  | j                        S Nr  )r0  r   r   r   r   r@   s    r   r1  zRawSQL.__repr__  s)    ""4>>#:#:DHHdkkRRr"   c                 8    d| j                   z  | j                  fS rQ  )r   r   r   s      r   r   zRawSQL.as_sql  s     $++--r"   c                     | gS r   r!   rp  s     r   r   zRawSQL.get_group_by_cols  	    vr"   c                 l   |j                   j                  j                         D ]z  }|j                  j                  D ]_  }|j	                         \  }}	|	j                         | j                  j                         v sA|j                  |j                  |||        z | t        
| )  |||||      S r   )r  r  get_parent_listlocal_fieldsget_attname_columnlowerr   r^  r   r,  r.   )r   r   r   r   r   r   parentparent_field_column_namer   s             r   r.   zRawSQL.resolve_expression  s    kk''779 	F & 9 9 !-!@!@!B;$$&$((..*::%%l&7&7eYW		 w)%eYPXYYr"   r   r"  )	r   r   r   r   r1  r   r   r.   rI  rJ  s   @r   r  r    s$    4S.Z Zr"   r  c                       e Zd Zd Zd Zy)Starc                      y)Nz'*'r!   r@   s    r   r1  zStar.__repr__  s    r"   c                 
    dg fS )Nr'   r!   r   s      r   r   zStar.as_sql  s    Bwr"   N)r   r   r   r1  r   r!   r"   r   r  r    s    r"   r  c                   :    e Zd Z ej                         Zd Zd Zy)Randomc                      y)NzRandom()r!   r@   s    r   r1  zRandom.__repr__  s    r"   c                 :    |j                   j                         g fS r   )rA  random_function_sqlr   s      r   r   zRandom.as_sql  s    ~~113R77r"   N)r   r   r   r	   r   r   r1  r   r!   r"   r   r  r    s    $6$$&L8r"   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 )
ColTFc                 L    ||}t         |   |       ||c| _        | _        y r+  )r,  r   r   target)r   r   r  r   r   s       r   r   zCol.__init__  s.    !Ll3"'
DKr"   c                     | j                   | j                  }}|r|t        |      fnt        |      f}dj                  | j                  j
                  dj                  |            S )Nr\  r   )r   r  r   r0  r   r   r  )r   r   r  identifierss       r   r1  zCol.__repr__  sO    

DKKv.3uc&k*#f+t~~66		+8NOOr"   c                     | j                   | j                  j                  }}|r||fn|f}dj                  t	        |j
                  |            }|g fS )N.)r   r  columnr  mapquote_name_unless_alias)r   r   r   r   r  r  r   s          r   r   z
Col.as_sql  sL    

DKK$6$6v).ufoVIhhs8;;[IJBwr"   c                     | j                   | S | j                  |j                  | j                   | j                         | j                  | j                        S r   )r   r   r  r  r   rm  s     r   r   zCol.relabeled_clone  sB    ::K~~hll4::tzzBDKKQUQbQbccr"   c                     | gS r   r!   rp  s     r   r   zCol.get_group_by_cols  r  r"   c                     | j                   | j                  k(  r| j                  j                  |      S | j                  j                  |      | j                   j                  |      z   S r   )r  r   r   r   s     r   r   zCol.get_db_converters  s[    ;;$+++$$66zBB!!33J?--j9: 	;r"   r   )r   r   r   r   rj  r   r1  r   r   r   r   rI  rJ  s   @r   r  r    s/    !% 0P
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                 @    t         |           ||c| _        | _        y r   )r,  r   refsr   )r   r  r   r   s      r   r   zRef.__init__'  s    !%v	4;r"   c                 x    dj                  | j                  j                  | j                  | j                        S r  )r0  r   r   r  r   r@   s    r   r1  zRef.__repr__+  s)    ""4>>#:#:DIIt{{SSr"   c                     | j                   gS r   r   r@   s    r   r   zRef.get_source_expressions.  s    }r"   c                     |\  | _         y r   r  r   s     r   r   zRef.set_source_expressions1  s    r"   c                     | S r   r!   r_  s         r   r.   zRef.resolve_expression4  s	     r"   c                     | S r   r!   rm  s     r   r   zRef.relabeled_clone9  r  r"   c                 P    |j                   j                  | j                        g fS r   )rA  
quote_namer  r   s      r   r   z
Ref.as_sql<  s     ~~((3R77r"   c                     | gS r   r!   rp  s     r   r   zRef.get_group_by_cols?  r  r"   r"  r   )r   r   r   r    r   r1  r   r   r.   r   r   r   rI  rJ  s   @r   r  r  "  s1    .T
8r"   r  c                   ,     e Zd ZdZdZ f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                 l    |s"t        d| j                  j                  z        t        |   |i | y )Nz$%s requires at least one expression.)rg  r   r   r,  r   )r   r   r  r   s      r   r   zExpressionList.__init__K  s3    CdnnF]F]]^^+//r"   c                 Z    | j                   j                  d | j                  D              S )Nc              3   2   K   | ]  }t        |        y wr   r  r  s     r   r   z)ExpressionList.__str__.<locals>.<genexpr>Q  r  r  )r  r  r  r@   s    r   r3  zExpressionList.__str__P  s#    ###P8O8O#PPPr"   )r   r   r   r    r  r   r3  rI  rJ  s   @r   r  r  C  s    
 !H0
Q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                 4    t         |   |       || _        y r+  )r,  r   r   )r   r   r   r   s      r   r   zExpressionWrapper.__init__Z  s    l3$r"   c                     |d   | _         y 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_expressionsa        r"   c                     t        | j                  t              r=| j                  j                         }| j                  |_        |j                  |      S t        |          S )N)r   )r1   r   r(  r   r   r   r,  )r   r   r   r   s      r   r   z#ExpressionWrapper.get_group_by_colsd  sU    dooz2--/J&*&7&7J#//e/<< w(**r"   c                 8    |j                  | j                        S r   )r@  r   r   s      r   r   zExpressionWrapper.as_sqlm  s    00r"   c                 b    dj                  | j                  j                  | j                        S r[  )r0  r   r   r   r@   s    r   r1  zExpressionWrapper.__repr__p  s!    t~~66HHr"   r   )r   r   r   r    r   r   r   r   r   r1  rI  rJ  s   @r   r  r  T  s'    
%#!+1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)sFc                     |r|t        di |d }}|t        |dd      r|rt        d      t        |t               r|st	        d      t
        |   d        || _        | j                  |      d   | _	        y )Nr]   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~  r1   rg  r,  r   	conditionr   result)r   r  thenlookupsr   s       r   r   zWhen.__init__y  s    y(!"WtwIGI}e$LPW"  i#IPQQd+"--d3A6r"   c                 :    d| j                   d| j                  S )NzWHEN z THEN r  r  r@   s    r   r3  zWhen.__str__  s    $(NNDKK@@r"   c                 <    d| j                   j                  d| dS N<z: >r   r   r@   s    r   r1  zWhen.__repr__      !^^44d;;r"   c                 2    | j                   | j                  gS r   r  r@   s    r   r   zWhen.get_source_expressions  s    ,,r"   c                 "    |\  | _         | _        y r   r  r   s     r   r   zWhen.set_source_expressions  s    &+#r"   c                 0    | j                   j                  gS r   )r  r   r@   s    r   r   zWhen.get_source_fields  s    1122r"   c                     | j                         }||_        t        |j                  d      r$|j                  j	                  ||||d      |_        |j
                  j	                  |||||      |_        |S )Nr.   F)r   r   r0   r  r.   r  rH  s          r   r.   zWhen.resolve_expression  sg    IIK 1;; 45++88UT]_deAK88..uk5)U]^r"   c                 >   |j                   j                  |        |}g }|j                  | j                        \  }}||d<   |j	                  |       |j                  | j
                        \  }	}
|	|d<   |j	                  |
       |xs | j                  }||z  |fS )Nr  r  )rA  rR  r@  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'
*2*:*:4>>*J'''4$*+$,$4$4T[[$A!
M$.!-(,t}}/):55r"   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   r   r   r   s       r   r   zWhen.get_group_by_cols  s9    113 	4FKK0023	4r"   NNr"  r   )r   r   r   r  r]   r   r3  r1  r   r   r   r.   r   r   rI  rJ  s   @r   r  r  t  s;    3HK7A<-,36r"   r  c                   d     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 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 ENDry  Ndefaultr   c                    t        d |D              st        d      t        |   |       t	        |      | _        | j                  |      d   | _        || _        y )Nc              3   <   K   | ]  }t        |t                y wr   )r1   r  )r   cases     r   r   z Case.__init__.<locals>.<genexpr>  s     <d:dD)<r   z.Positional arguments must all be When objects.r   )	allr~  r,  r   listcasesr   r  r  )r   r  r   r  r  r   s        r   r   zCase.__init__  sS    <e<<LMM&%[
..w7:
r"   c                 f    ddj                  d | j                  D              d| j                  S )NzCASE r   c              3   2   K   | ]  }t        |        y wr   r  )r   r   s     r   r   zCase.__str__.<locals>.<genexpr>  s     .J!s1v.Jr  z, ELSE )r  r  r  r@   s    r   r3  zCase.__str__  s$    %)YY.Jtzz.J%JDLLYYr"   c                 <    d| j                   j                  d| dS r  r  r@   s    r   r1  zCase.__repr__  r  r"   c                 6    | j                   | j                  gz   S r   r  r  r@   s    r   r   zCase.get_source_expressions  s    zzT\\N**r"   c                 "    |^ | _         | _        y r   r  r   s     r   r   zCase.set_source_expressions  s    $)!T\r"   c                     | j                         }||_        t        |j                        D ]'  \  }}|j	                  |||||      |j                  |<   ) |j
                  j	                  |||||      |_        |S r   )r   r   r  r  r.   r  )	r   r   r   r   r   r   r   r  r  s	            r   r.   zCase.resolve_expression  sw    IIK "177+ 	cIC225+uiYabAGGCL	cII00UIW_`	r"   c                 L    t         |          }|j                  d d  |_        |S r   )r,  r   r  )r   r   r   s     r   r   z	Case.copy  s"    GLN''!*r"   c                    |j                   j                  |        | j                  s|j                  | j                        S i | j
                  |}g }g }| j                  D ]9  }		 |j                  |	      \  }
}|j                  |
       |j                  |       ; |j                  | j                        \  }}|s||fS |xs | j                  }|j                  |      |d<   ||d<   |j                  |       |xs |j                  d| j                        }||z  }| j                  (|j                   j                  | j                        |z  }||fS # t        $ r Y w xY w)Nr  r  r  )rA  rR  r  r@  r  r  r   r  r   case_joinerr  r  r  r   unification_cast_sqlr   )r   r   r   r  r$  r   r  
case_partsr	  r  case_sqlcase_paramsdefault_sqldefault_paramsr   s                  r   r   zCase.as_sql  sl   //5zz##DLL119TZZ9=9

JJ 	+D(0(8(8(>%+ h'k*	+ '/&6&6t||&D#^..!5T%5%5#.#3#3J#? %0	".)M22:t}}M(%%1..55d6G6GH3NCJ " s   'E	E'&E'r"  r  )r   r   r   r    r  r$  r   r3  r1  r   r   r.   r   r   rI  rJ  s   @r   r  r    sB    
 5HK'+$ Z<+*
r"   r  c                   r     e Zd ZdZdZdZd fd	Z fdZd Zd Z	d Z
 fd	Ze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)Fc                     |j                   | _         || _        |j                  g d      | _        t        |   |       y )NT)_result_cacheprefetch_done)r   r  _chainquerysetr,  r   )r   r1  r   r  r   s       r   r   zSubquery.__init__  s6    ^^

 bM&r"   c                     t         |          }|d   \  }}|r| j                  g|dd  }n| j                  |d<   ||f|d<   |S )Nr  rz  r1  )r,  r   r1  )r   r   r  r   r   s       r   r   zSubquery.__getstate__  s[    $&01fMM-DH-D!%F:%)6\!"r"   c                     | j                   gS r   r   r@   s    r   r   zSubquery.get_source_expressions  s    

|r"   c                     |d   | _         y r  r4  r   s     r   r   zSubquery.set_source_expressions  s    1X
r"   c                 .    | j                   j                  S r   )r   r   r@   s    r   r   zSubquery._resolve_output_field  s    zz&&&r"   c                 b    t         |          }|j                  j                         |_        |S r   )r,  r   r   r   )r   r   r   s     r   r   zSubquery.copy"  s'    kk'')r"   c                 .    | j                   j                  S r   )r   external_aliasesr@   s    r   r9  zSubquery.external_aliases'  s    zz***r"   c                     |j                   j                  |        i | j                  |}| j                  j	                  ||      \  }}|dd |d<   |xs |j                  d| j                        }||z  }||fS )Nrz  r=   subqueryr  )rA  rR  r  r   r   r  r  )	r   r   r   r  r   r  subquery_sqlr	  r   s	            r   r   zSubquery.as_sql+  s    //59TZZ9=9#'::#4#4Xz#J j&21R&8
#M22:t}}M(Jr"   c                     |rt        ||       gS | j                  j                         }t        d |D              r| gS |S )Nc              3   4   K   | ]  }|j                     y wr   )rj  )r   rk  s     r   r   z-Subquery.get_group_by_cols.<locals>.<genexpr>9  s     ACs''As   )r  r   get_external_colsr   )r   r   external_colss      r   r   zSubquery.get_group_by_cols5  sB    t$%%

446A=AA6Mr"   r   )r   r   r   r    r  r   r   r   r   r   r   r   r%  r9  r   r   rI  rJ  s   @r   r,  r,     sQ      H''
 + +r"   r,  c                   ^     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)c                 T    |j                         }|| _        t        |   |fi | y r   )order_bynegatedr,  r   )r   r1  rE  r   r   s       r   r   zExists.__init__B  s,     $$&,V,r"   c                 J    | j                         }| j                   |_        |S r   )r   rE  )r   r   s     r   
__invert__zExists.__invert__I  s     		 LL(r"   c                 p    t        |   |||fi |\  }}| j                  rdj                  |      }||fS )NzNOT {})r,  r   rE  r0  )r   r   r   r  r   r   r   r   s          r   r   zExists.as_sqlN  s=    gnXz8U}UV<<//#&CF{r"   c                 l    |j                   j                  j                  sdj                  |      }||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r   r<  &supports_boolean_expr_in_select_clauser0  r	  s       r   r  zExists.select_formatT  s3     ""++RR299#>CF{r"   )Fr   )r   r   r   r  r	   r   r   r   rG  r   r  rI  rJ  s   @r   rB  rB  >  s,    %H&6&&(L-
r"   rB  c                   V    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y)r   z%(expression)s %(ordering)sFc                     |r|rt        d      || _        || _        || _        t	        |d      st        d      || _        y )Nz1nulls_first and nulls_last are mutually exclusiver.   z%expression must be an expression type)rg  nulls_first
nulls_lastr   r0   r   )r   r   r   rM  rN  s        r   r   zOrderBy.__init__a  sG    :PQQ&$$z#78DEE$r"   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz{}({}, descending={}))r0  r   r   r   r   r@   s    r   r1  zOrderBy.__repr__k  s0    &--NN##T__dooG 	Gr"   c                     |d   | _         y r  r  r   s     r   r   zOrderBy.set_source_expressionso  r  r"   c                     | j                   gS r   r  r@   s    r   r   zOrderBy.get_source_expressionsr  r  r"   Nc                 r   |xs | j                   }|j                  j                  r$| j                  rd|z  }ny| j                  rmd|z  }ng| j                  r(| j
                  r|j                  j                  sd|z  }n3| j                  r'| j
                  s|j                  j                  sd|z  }|j                  j                  |        |j                  | j                        \  }}|| j
                  rdndd|}|xs | j                   }||j                  d      z  }||z  j                         |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  r<   supports_order_by_nulls_modifierrN  rM  r   order_by_nulls_firstrA  rR  r@  r   countrstrip)r   r   r   r  r   expression_sqlr   placeholderss           r   r   zOrderBy.as_sqlu  s   ,t}}??*X5!!+h6J$7$7$L$L88C!!OO
(;(;(P(P<xG//5!)!1!1$//!B("&//u
 

 ,t}}(..!122<'//1699r"   c                    t        | j                  t              r]| j                         }t	        t        | j                  d      dt        j                               |_         |j                  ||      S | j                  ||      S )NT)r  Fr  )	r1   r   rB  r   r  r  r	   r   r   )r   r   r   r   s       r   	as_oraclezOrderBy.as_oracle  sl     doov.99;D"T__40#002DO
 4;;x44{{8Z00r"   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r  r   s       r   r   zOrderBy.get_group_by_cols  s9    113 	4FKK0023	4r"   c                     | j                    | _         | j                  s| j                  r$| j                   | _        | j                   | _        | S r   )r   rM  rN  r@   s    r   r  zOrderBy.reverse_ordering  sC    "oo-t#'#3#33D"&//1DOr"   c                     d| _         y rC   r   r@   s    r   r   zOrderBy.asc  s	    r"   c                     d| _         y rw   ra  r@   s    r   r   zOrderBy.desc  s	    r"   )FFFr   )r   r   r   r  r]   r   r1  r   r   r   r]  r   r  r   r   r!   r"   r   r   r   ]  s?    ,HK%G#!:61 r"   r   c                   ^     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d	 Zd
 ZddZ xZS )Windowz %(expression)s OVER (%(window)s)FTc                 \   || _         || _        || _        t        |dd      s"t	        d|j
                  j                  z        | j                   It        | 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        | 5  |       | j                  |      d   | _        y )Nr$  Fz3Expression '%s' isn't compatible with OVER clauses.zCorder_by must be either an Expression or a sequence of expressions.r/   r   )partition_byrD  framer`   rg  r   r   r1   r  r  r  r   r,  r   r   source_expression)r   r   rf  rD  rg  r   r   s         r   r   zWindow.__init__  s   ( 
z#6>E$$--. 
 (d//%?%)%6%6$8! .0A0A BD==$$--$7 . >~> #  	l3!%!8!8!DQ!Gr"   c                 .    | j                   j                  S r   )rh  r   r@   s    r   r   zWindow._resolve_output_field  s    %%222r"   c                 ^    | j                   | j                  | j                  | j                  gS r   rh  rf  rD  rg  r@   s    r   r   zWindow.get_source_expressions  s%    &&(9(94==$**UUr"   c                 :    |\  | _         | _        | _        | _        y r   rk  r   s     r   r   zWindow.set_source_expressions  s    OTL 14=$*r"   c                 D   |j                   j                  |        |j                  j                  st	        d      |j                  | j                        \  }}g g }}| j                  C| j                  j                  ||d      \  }}	|j                  |       |j                  |	       | j                  Q|j                  d       |j                  | j                        \  }
}|j                  |
       |j                  |       | j                  rC|j                  | j                        \  }}|j                  d|z          |j                  |       |j                  |       |xs | j                  }||dj                  |      j                         dz  |fS )Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)r   r   r  z
 ORDER BY ry   )r   window)rA  rR  r<  supports_over_clauser   r@  rh  rf  r   r   rD  r  rg  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_sql  s   //5""77#$WXX#++D,B,BC&$&M
(#'#4#4#;#;!j7 $< $ Hj h'  ,==$l+&.&6&6t}}&E#I|i(  .::&.&6&6tzz&B#I|cIo.  .m$,t}}"ggj)//1
 
  	r"   c           	         dj                  t        | j                        | j                  rdt        | j                        z   nd| j                  rdt        | j                        z   ndt        | j
                  xs d            S )Nz{} OVER ({}{}{})zPARTITION BY rn  z	ORDER BY )r0  r   rh  rf  rD  rg  r@   s    r   r3  zWindow.__str__   sj    !((&&'8<8I8IOc$"3"344r04K#dmm,,2

 b!	
 	
r"   c                 <    d| j                   j                  d| dS r  r  r@   s    r   r1  zWindow.__repr__  r  r"   c                     g S r   r!   rp  s     r   r   zWindow.get_group_by_cols  r   r"   )NNNNr   )r   r   r   r  r   r   r#  r   r   r   r   r   r3  r1  r   rI  rJ  s   @r   rd  rd    sG    1H JH63VU D
<r"   rd  c                   H    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y)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                 D    t        |      | _        t        |      | _        y r   )r6   startendr   r  r  s      r   r   zWindowFrame.__init__  s    5\
:r"   c                 "    |\  | _         | _        y r   r  r  r   s     r   r   z"WindowFrame.set_source_expressions  s    $
DHr"   c                 2    | j                   | j                  gS r   r  r@   s    r   r   z"WindowFrame.get_source_expressions   s    

DHH%%r"   c                     |j                   j                  |        | j                  || j                  j                  | j
                  j                        \  }}| j                  | j                  ||dz  g fS )N
frame_typer  r  )rA  rR  window_frame_start_endr  r   r  r  r  )r   r   r   r  r  s        r   r   zWindowFrame.as_sql#  sk    //500TZZ=M=Mtxx~~^
s}}// 
 
 	 	r"   c                 <    d| j                   j                  d| dS r  r  r@   s    r   r1  zWindowFrame.__repr__,  r  r"   c                     g S r   r!   rp  s     r   r   zWindowFrame.get_group_by_cols/  r   r"   c                 j   | j                   j                  V| j                   j                  dk  r=dt        | j                   j                        t        j                  j
                  fz  }nd| j                   j                  4| j                   j                  dk(  rt        j                  j                  }nt        j                  j                  }| j                  j                  M| j                  j                  dkD  r4d| j                  j                  t        j                  j                  fz  }nd| j                  j                  4| j                  j                  dk(  rt        j                  j                  }nt        j                  j                  }| j                  | j                  ||dz  S )Nr   z%d %sr  )r  r   absr   rA  	PRECEDINGCURRENT_ROWUNBOUNDED_PRECEDINGr  	FOLLOWINGUNBOUNDED_FOLLOWINGr  r  r  s      r   r3  zWindowFrame.__str__2  s&   ::'DJJ,<,<q,@s4::#3#34jnn6N6NOOEZZ)djj.>.>!.CNN..ENN66E88>>%$((..1*<TXX^^Z^^-E-EFFCXX^^'DHHNNa,?..,,C..4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_endF  s    !"WXXr"   r  r   )r   r   r   r    r  r   r   r   r   r1  r   r3  r  r!   r"   r   r~  r~    s7     >H%&<
(Yr"   r~  c                       e Zd ZdZd Zy)RowRangeROWSc                 :    |j                   j                  ||      S r   )rA  window_frame_rows_start_endr  s       r   r  zRowRange.window_frame_start_endM  s    ~~99%EEr"   Nr   r   r   r  r  r!   r"   r   r  r  J  s    JFr"   r  c                       e Zd ZdZd Zy)
ValueRangeRANGEc                 :    |j                   j                  ||      S r   )rA  window_frame_range_start_endr  s       r   r  z!ValueRange.window_frame_start_endT  s    ~~::5#FFr"   Nr  r!   r"   r   r  r  Q  s    JGr"   r  )4r   r2   r  decimalr   django.core.exceptionsr   r   	django.dbr   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(  r7   r>  r?  r   re  rr  rv  r6   r4   r  r  r  r  r  r  r  r  r  r,  rB  r   rd  r~  r  r  r!   r"   r   <module>r     s       = 3 # 1 * 4 3 / u
 u
p G# G# G#T	 	
7+Z 7t;+ ;:
f, 
f 
  <q <q Gz GT)J )X@E @ZZ Z6: 8Z 8";* ";J* BQT Q"I
 I@=: =@I: IX;z ;|X >Qn Qh[Z [|8Y* 8YvF{ FG Gr"   