
    sgh!                       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	 d dl
mZ d dlmZ d dlmZ d dlmZ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!m"Z" d dl#m$Z$  G d d      Z% G d d      Z& G d de      Z' G d d      Z(e G d de(e&             Z)e&jT                  e&jV                  e&jX                  e&jZ                  e&j\                  fD  ci c]'  } | ej^                  ej^                  ej^                  fg) c} e&jT                  e&j`                  e&jV                  e&jX                  e&jZ                  e&j\                  fD  ci c]k  } | ejb                  ejb                  ejb                  fejd                  ejd                  ejd                  fejf                  ejf                  ejf                  fgm c} e&jT                  e&j`                  e&jV                  e&jX                  e&jZ                  fD  ci c]  } | ejb                  ejf                  ejf                  fejf                  ejb                  ejf                  fejb                  ejd                  ejd                  fejd                  ejb                  ejd                  fg c} e&jh                  e&jj                  e&jl                  e&jn                  e&jp                  fD  ci c]'  } | ejb                  ejb                  ejb                  fg) c} e&jT                  e&j`                  e&jV                  e&jX                  e&jZ                  e&j\                  fD  ci c]C  } |  e9 ejt                  d ejb                  ejf                  ejd                  fD                    E c} e&jT                  ejv                  ejx                  ejz                  fejz                  ejx                  ejz                  fejx                  ejv                  ejz                  fejx                  ejz                  ejz                  fejx                  ejx                  ejx                  fej|                  ejx                  ej|                  fejx                  ej|                  ej|                  fgie&j`                  ejv                  ejx                  ejz                  fejz                  ejx                  ejz                  fejv                  ejv                  ejx                  fejv                  ejz                  ejx                  fejz                  ejv                  ejx                  fejz                  ejz                  ejx                  fejx                  ejx                  ejx                  fej|                  ejx                  ej|                  fej|                  ej|                  ejx                  fg	igZ? ee9      Z@d ZAe?D ]0  ZBeBj                         D ]  \  ZDZEeED ]  \  ZFZGZH eAeFeDeGeH         2  ej                  d      d        ZJ G d d e%e)      ZK G d! d"eK      ZL G d# d$eK      ZM ed%&       G d' d(e&             ZN G d) d*eN      ZO G d+ d,eN      ZP G d- d.eN      ZQ ed/&       G d0 d1e%e)             ZR ed2&       G d3 d4e%e)             ZS G d5 d6e)      ZT G d7 d8e)      ZU G d9 d:e)      ZV G d; d<e)      ZW G d= d>e)      ZX G d? d@e)      ZY G dA dBeR      ZZ G dC dDeZ      Z[ edE&       G dF dGe%e)             Z\ G dH dIe\      Z] edJ&       G dK dLe)             Z^ edM&       G dN dOe%e)             Z_ G dP dQe(e&      Z` G dR dSe`      Za edT&       G dU dVe)             Zb G dW dXe%e)      Zc G dY dZe	      Zd G d[ d\e)      Ze G d] d^ee      Zf G d_ d`ee      Zgyc c} w c c} w c c} w c c} w c c} w )a    N)defaultdictDecimal)Enum)chainNoneType)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_propertyclassproperty)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/enzed_healthcare/enzed_env/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-3 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%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                 h    t        |d      st        |      }|rt        |||       S t        | ||      S Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreverseds       r$   _combinezCombinable._combine?   s7    u23%LE%eY==!$	599r+   c                 <    | j                  d| j                  d      S )NFr?   MULr   s    r$   __neg__zCombinable.__neg__L   s    }}R511r+   c                 <    | j                  || j                  d      S NFr?   ADDr   r<   s     r$   __add__zCombinable.__add__O       }}UDHHe44r+   c                 <    | j                  || j                  d      S rG   r?   SUBrJ   s     r$   __sub__zCombinable.__sub__R   rL   r+   c                 <    | j                  || j                  d      S rG   rB   rJ   s     r$   __mul__zCombinable.__mul__U   rL   r+   c                 <    | j                  || j                  d      S rG   r?   DIVrJ   s     r$   __truediv__zCombinable.__truediv__X   rL   r+   c                 <    | j                  || j                  d      S rG   r?   MODrJ   s     r$   __mod__zCombinable.__mod__[   rL   r+   c                 <    | j                  || j                  d      S rG   r?   POWrJ   s     r$   __pow__zCombinable.__pow__^   rL   r+   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      NconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorrJ   s     r$   __and__zCombinable.__and__a   =    4.75-QV3WT7QuX%%!T
 	
r+   c                 <    | j                  || j                  d      S rG   )r?   BITANDrJ   s     r$   bitandzCombinable.bitandh       }}UDKK77r+   c                 <    | j                  || j                  d      S rG   )r?   BITLEFTSHIFTrJ   s     r$   bitleftshiftzCombinable.bitleftshiftk   s    }}UD$5$5u==r+   c                 <    | j                  || j                  d      S rG   )r?   BITRIGHTSHIFTrJ   s     r$   bitrightshiftzCombinable.bitrightshiftn   s    }}UD$6$6>>r+   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      r`   rc   rJ   s     r$   __xor__zCombinable.__xor__q   rg   r+   c                 <    | j                  || j                  d      S rG   )r?   BITXORrJ   s     r$   bitxorzCombinable.bitxorx   rk   r+   c                 z    t        | dd      r$t        |dd      rt        |       t        |      z  S t        d      r`   rc   rJ   s     r$   __or__zCombinable.__or__{   rg   r+   c                 <    | j                  || j                  d      S rG   )r?   BITORrJ   s     r$   bitorzCombinable.bitor   s    }}UDJJ66r+   c                 <    | j                  || j                  d      S NTrH   rJ   s     r$   __radd__zCombinable.__radd__       }}UDHHd33r+   c                 <    | j                  || j                  d      S r}   rN   rJ   s     r$   __rsub__zCombinable.__rsub__   r   r+   c                 <    | j                  || j                  d      S r}   rB   rJ   s     r$   __rmul__zCombinable.__rmul__   r   r+   c                 <    | j                  || j                  d      S r}   rT   rJ   s     r$   __rtruediv__zCombinable.__rtruediv__   r   r+   c                 <    | j                  || j                  d      S r}   rX   rJ   s     r$   __rmod__zCombinable.__rmod__   r   r+   c                 <    | j                  || j                  d      S r}   r\   rJ   s     r$   __rpow__zCombinable.__rpow__   r   r+   c                     t        d      Nrb   re   rJ   s     r$   __rand__zCombinable.__rand__       !T
 	
r+   c                     t        d      r   r   rJ   s     r$   __ror__zCombinable.__ror__   r   r+   c                     t        d      r   r   rJ   s     r$   __rxor__zCombinable.__rxor__   r   r+   c                     t        |       S N)NegatedExpressionrD   s    r$   
__invert__zCombinable.__invert__   s     &&r+   N))r&   r'   r(   r)   rI   rO   rC   rU   r]   rY   ri   rz   rm   rp   ru   r?   rE   rK   rP   rR   rV   rZ   r^   rf   rj   rn   rq   rs   rv   rx   r{   r~   r   r   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                       e Zd Zy)OutputFieldIsNoneErrorN)r&   r'   r(   r*   r+   r$   r   r      s    r+   r   c                   f   e Zd ZdZeZd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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 Z'd Z(d Z)d Z*d  Z+d! Z,d" Z-d# Z.d$ Z/d% Z0d& Z1y))BaseExpressionz%Base class for all query expressions.FTNc                     ||| _         y y r   r   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*   rD   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 r7   )r9   
isinstancestrFr:   )r   expressionsargs      r$   _parse_expressionsz!BaseExpression._parse_expressions   sO     #
  3 45  *3 4af%*F
 	
 
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#      
15D,T,,,
   anyr   rD   s    r$   r   z!BaseExpression.contains_aggregate   s%     
9=9T9T9V
 
 	
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#      
37D.T...
r   r   rD   s    r$   r   z#BaseExpression.contains_over_clause  s%     
;?;V;V;X
 
 	
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&      
 4T444
r   r   rD   s    r$   r   z)BaseExpression.contains_column_references	  %     
335
 
 	
r+   c                 B    t        d | j                         D              S )Nc              3   Z   K   | ]#  }|xr t        |d d      xs |j                   % yw)subqueryFN)rd   contains_subqueryr   s     r$   r   z3BaseExpression.contains_subquery.<locals>.<genexpr>  s4      
 QgdJ6P$:P:PQ
s   )+r   rD   s    r$   r   z BaseExpression.contains_subquery  r   r+   c           
      H   | j                         }||_        |j                         D cg c]  }||j                  |||||      nd }}| j                  s4t        d |D              r"t        | j                  j                   d      |j                  |       |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.
        Nc              3   <   K   | ]  }t        |t                y wr   )r   ColPairsr   s     r$   r   z4BaseExpression.resolve_expression.<locals>.<genexpr>2  s      9
+/JtX&9
r   z4 expression does not support composite primary keys.)
r   
is_summaryr   r8   allows_composite_expressionsr   
ValueError	__class__r&   r   )	r   queryallow_joinsreuse	summarizefor_savecr   source_expressionss	            r$   r8   z!BaseExpression.resolve_expression  s    " IIK  002
  # ''{E9hW
 
 00S 9
3E9
 6
 >>**+ ,* *  	
  !34!
s    Bc                 J    t        | j                  t        j                        S r   )r   r   r   BooleanFieldrD   s    r$   ra   zBaseExpression.conditional<  s    $++V-@-@AAr+   c                     | j                   S r   r   rD   s    r$   fieldzBaseExpression.field@  s       r+   c                 @    | j                         }|t        d      |S )z+Return the output type of this expressions.z4Cannot resolve expression type, unknown output_field)_resolve_output_fieldr   r   s     r$   r   zBaseExpression.output_fieldD  s0     113(F  r+   c                 :    	 | j                   S # t        $ r 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   rD   s    r$   _output_field_or_nonez$BaseExpression._output_field_or_noneN  s%    	$$$% 		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.

        As a guess, if the output fields of all source fields match then simply
        infer the same type here.

        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>g  s      
V=OF
s   z!Expression contains mixed types: , . You must set output_field.N)get_source_fieldsr   r   r   r&   )r   sources_iterr   r   s       r$   r   z$BaseExpression._resolve_output_fieldY  s    
!%!7!7!9
 ) 	 L& 	!,0@0@A$ )22;;",,55	 	  	 r+   c                     | S r   r*   value
expressionr   s      r$   r   z"BaseExpression._convert_value_noopw  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>  s     +0< r+   IntegerFieldc                      | d S t        |       S r   )intr   s      r$   r   z.BaseExpression.convert_value.<locals>.<lambda>  s     +.u: r+   r   c                      | d S t        |       S r   r   r   s      r$   r   z.BaseExpression.convert_value.<locals>.<lambda>  s     +25> r+   )r   r   endswithr   )r   r   internal_types      r$   r   zBaseExpression.convert_value{  sk     !!//1L(  ##N3  n,  '''r+   c                 8    | j                   j                  |      S r   )r   
get_lookup)r   lookups     r$   r   zBaseExpression.get_lookup  s      ++F33r+   c                 8    | j                   j                  |      S r   )r   get_transformr   names     r$   r   zBaseExpression.get_transform  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_clone  s\    		$$ 446 23!!*-DH	
 s   Ac                     |s| S |j                  |       x}r|S | j                         x}s| S | j                         }|j                  |D cg c]  }|r|j	                  |      nd  c}       |S c c}w r   )getr   r   r   replace_expressions)r   replacementsreplacementr   r  r   s         r$   r	  z"BaseExpression.replace_expressions  s    K&**400;0&*&A&A&CC"CK		$$ / ;?((6DH	
 s   A2c                 p    t               }| j                         D ]  }|||j                         z  } |S r   )setr   get_refs)r   refsr   s      r$   r  zBaseExpression.get_refs  s@    u//1 	$D|DMMO#D	$ r+   c                 ,    t        j                   |       S r   r   rD   s    r$   r   zBaseExpression.copy      yyr+   c           	          | j                         }|j                  | j                         D cg c]<  }t        |t              rt	        | |j
                         n|j                  |      > c}       |S c c}w r   )r   r   r   r   r   r  prefix_references)r   prefixr  r   s       r$   r  z BaseExpression.prefix_references  s{    		$$ !779  "$* ,-//78		
 s   AA8c                     | j                   s| gS g }| j                         D ]!  }|j                  |j                                # |S r   )r   r   extendget_group_by_colsr   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_fields  s%    151L1L1NOA''OOOs   )c                     t        | fi |S r   OrderByr   kwargss     r$   asczBaseExpression.asc      t&v&&r+   c                     t        | fddi|S N
descendingTr  r  s     r$   desczBaseExpression.desc      t7777r+   c                     | S r   r*   rD   s    r$   reverse_orderingzBaseExpression.reverse_ordering      r+   c              #      K   |  | j                         D ].  }|st        |d      r|j                         E d{    +| 0 y7 w)zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r9   r,  )r   r   s     r$   r,  zBaseExpression.flatten  sK     
 
//1 	D4+#||~--J	 .s   AAA	A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)r9   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        | dd      s	 | j                         \  }|S | S # t        $ r}t        d      |d }~ww xY w)N constraint_validation_compatibleTzdExpressions with constraint_validation_compatible set to False must have only one source expression.)rd   r   r   )r   r   r  s      r$   get_expression_for_validationz,BaseExpression.get_expression_for_validation  sZ    t?F" $ ; ; = "!   < s   % 	?:?r   NTNFF)2r&   r'   r(   r)   NotImplementedempty_result_set_valuer   
filterablewindow_compatibleallowed_defaultr1  set_returningr   r   r   r   r   r   r   r   r   r   r   r   r   r8   propertyra   r   r   r   r   staticmethodr   r   r   r   r  r	  r  r   r  r  r   r!  r&  r)  r,  r.  r2  r*   r+   r$   r   r      s}   /+JJO'+$M#( -
<
H8 
 

 
 

 
 
 
 
 SX#J B B ! !     <   ( (,45 P'8r+   r   c                   x    e Zd ZdZe ej                  d      d               Zed        Z	e
d        Zd Zd Zy	)

Expressionz:An expression that can be combined with other expressions.   maxsizec                 @    t        j                  | j                        S r   )inspect	signaturer   )clss    r$   _constructor_signaturez!Expression._constructor_signature	  s       ..r+   c                     t        |t              rt        t         j                  |            S t        |t              r"t         fd|j                         D              S t        |t        j                        rO|j                  r8|j                  r,|j                  j                  j                  |j                  fS t        |      S t        |      S )Nc              3   J   K   | ]  \  }}|j                  |      f  y wr   )	_identity)r   keyvalrD  s      r$   r   z'Expression._identity.<locals>.<genexpr>  s#     QxsC#s}}S12Qs    #)r   tuplemaprH  dictitemsr   Fieldr  model_metalabeltyper   )rD  r   s   ` r$   rH  zExpression._identity  s    eU#S]]E233eT"Q5;;=QQQeV\\*zzekk{{((..

::;U##r+   c                 h   | j                   \  }} | j                  j                  | g|i |}|j                          t	        |j
                  j                               }t        |       | j                  g}|D ])  \  }}| j                  |      }|j                  ||f       + t        |      S r   )_constructor_argsrE  bind_partialapply_defaultsiter	argumentsrN  nextr   rH  appendrK  )r   argsr   rC  rY  identityr   r   s           r$   r]  zExpression.identity  s    --f<D//<<TSDSFS	  ",,2245	YNN## 	*JC NN5)EOOS%L)	* Xr+   c                 `    t        |t              st        S |j                  | j                  k(  S r   )r   r=  r4  r]  rJ   s     r$   __eq__zExpression.__eq__*  s%    %,!!~~..r+   c                 ,    t        | j                        S r   )hashr]  rD   s    r$   __hash__zExpression.__hash__/  s    DMM""r+   N)r&   r'   r(   r)   r   	functools	lru_cacherE  classmethodrH  r   r]  r_  rb  r*   r+   r$   r=  r=    s^    DY%/ & / 	$ 	$  /
#r+   r=  c              3   @   K   | ]  }|t         |ft         ||fg  y wr   r   )r   
field_types     r$   r   r     s+        h
3h
J5WX s   c                 :    t         |   j                  | ||f       y)z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr[  )lhsr=   rhsresults       r$   register_combinable_fieldsrm    s     9%,,c3-?@r+   r>  r?  c                     t         j                  | d      }|D ]#  \  }}}t        ||      st        ||      s!|c S  y )Nr*   )ri  r  
issubclass)r=   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_types          r$   _resolve_combined_typerv    sL    (,,Y;KCN !?0-h 34):
 ! 	!r+   c                   b     e Zd Zd
 fd	Zd Zd Zd Zd Zd Zd Z		 d fd	Z
ed	        Z xZS )r;   c                 P    t         |   |       || _        || _        || _        y Nr   )superr   r=   rj  rk  )r   rj  r=   rk  r   r   s        r$   r   zCombinedExpression.__init__  s(    l3"r+   c                 N    dj                  | j                  j                  |       S )Nz<{}: {}>)formatr   r&   rD   s    r$   __repr__zCombinedExpression.__repr__  s      !8!8$??r+   c                 d    dj                  | j                  | j                  | j                        S )Nz{} {} {})r|  rj  r=   rk  rD   s    r$   __str__zCombinedExpression.__str__  s#      4>>488DDr+   c                 2    | j                   | j                  gS r   rj  rk  rD   s    r$   r   z)CombinedExpression.get_source_expressions  s    $((##r+   c                 "    |\  | _         | _        y r   r  r   s     r$   r   z)CombinedExpression.set_source_expressions  s    "$(r+   c           	         t        | j                  t        | j                  j                        t        | j
                  j                              }|ot        d| j                  d| j                  j                  j                  j                   d| j
                  j                  j                  j                   d       |       S )NzCannot infer type of z# expression involving these types: r   r   )
rv  r=   rS  rj  r   rk  r   r   r   r&   )r   ru  s     r$   r   z(CombinedExpression._resolve_output_field  s     /NN//0//0

  ''9 :((//99BBC288((22;;< = !  r+   c                 h   g }g }|j                  | j                        \  }}|j                  |       |j                  |       |j                  | j                        \  }}|j                  |       |j                  |       d}|j
                  j                  | j                  |      }||z  |fS Nz(%s))compilerj  r[  r  rk  opscombine_expressionr=   )r   r    r   r   expression_paramsr"   r#   expression_wrappers           r$   r   zCombinedExpression.as_sql  s    &&txx0V3  (&&txx0V3  (#nn//L!C'):::r+   c                 B   t         
|   |||||      }t        | t        t        f      s	 |j
                  j                  j                         }	 |j                  j                  j                         }d||hv r0||k7  r+t        |j
                  |j                  |j                        S h d}	| j                  | j                  k(  r)||	v r%||k(  r t	        |j
                  |j                        S |S # t        t        f$ r d }Y w xY w# t        t        f$ r d }Y w xY w)NDurationField>   	DateField	TimeFieldDateTimeField)rz  r8   r   DurationExpressionTemporalSubtractionrj  r   r   AttributeErrorr   rk  r=   rO   )r   r   r   r   r   r   resolvedrp  rq  datetime_fieldsr   s             r$   r8   z%CombinedExpression.resolve_expression  s    7-
 $!35H IJ #<<44FFH #<<44FFH 8X"668x;O)LL("4"4hll  JO$((*/(*8<<FF# #J/    #J/   s#   $C3 $D
 3DD
DDc                 ^    | j                   j                  xr | j                  j                  S r   )rj  r8  rk  rD   s    r$   r8  z"CombinedExpression.allowed_default$  s!    xx''DDHH,D,DDr+   r   r3  )r&   r'   r(   r   r}  r  r   r   r   r   r8   r   r8  __classcell__r   s   @r$   r;   r;     sK    @E$#"; SX@ E Er+   r;   c                   *     e Zd Zd Z fdZd Z xZS )r  c                     	 |j                   }|j                         dk(  r1|j                  |      \  }}|j                  j	                  |      |fS |j                  |      S # t
        $ r Y w xY w)Nr  )r   r   r  r  format_for_duration_arithmeticr   )r   sider    r   outputr"   r#   s          r$   r  zDurationExpression.compile*  sy    	R&&F '')_<&..t4V!~~DDSI6QQ%%  		s   A# #	A/.A/c                    |j                   j                  rt        |   ||      S |j                  j                  |        g }g }| j                  | j                  ||      \  }}|j                  |       |j                  |       | j                  | j                  ||      \  }}|j                  |       |j                  |       d}|j                  j                  | j                  |      }||z  |fS r  )featureshas_native_duration_fieldrz  r   r  check_expression_supportr  rj  r[  r  rk  combine_duration_expressionr=   )	r   r    r   r   r  r"   r#   r  r   s	           r$   r   zDurationExpression.as_sql5  s    887>(J77//5ll488XzBV3  (ll488XzBV3  (#nn88U!C'):::r+   c                     | j                   ||fi |\  }}| j                  t        j                  t        j                  hv rr	 | j
                  j                  j                         }| j                  j                  j                         }h d}||vs||vrt        d| j                   d      ||fS ||fS # t        t        f$ r Y ||fS w xY w)N>   r   r   r   r  zInvalid arguments for operator .)r   r=   r-   rC   rU   rj  r   r   rk  r   r  r   )	r   r    r   r!   r"   r#   rp  rq  allowed_fieldss	            r$   r%   zDurationExpression.as_sqliteF  s    !dkk(JH-HV>>jnnjnn==8800BBD8800BBD" >1X^5S'9$..9IK  F{sF{ #J/  F{s   AB: :CC)r&   r'   r(   r  r   r%   r  r  s   @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   )rz  r   rO   )r   rj  rk  r   s      r$   r   zTemporalSubtraction.__init___  s    dhh,r+   c                 "   |j                   j                  |        |j                  | j                        }|j                  | j                        }|j                   j                  | j                  j                  j                         ||      S r   )r  r  r  rj  rk  subtract_temporalsr   r   )r   r    r   rj  rk  s        r$   r   zTemporalSubtraction.as_sqlb  sm    //5txx(txx(~~00HH!!335sC
 	
r+   )	r&   r'   r(   r   r  r   r   r   r  r  s   @r$   r  r  \  s    '6'')L-
r+   r  zdjango.db.models.F)pathc                   Z    e Zd 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y)r   zDAn object capable of resolving references to existing query objects.Fc                     || _         y)z^
        Arguments:
         * name: the name of the field this expression references
        N)r  r   s     r$   r   z
F.__init__q  s    
 	r+   c                 b    dj                  | j                  j                  | j                        S N{}({}))r|  r   r&   r  rD   s    r$   r}  z
F.__repr__x  s!    t~~66		BBr+   c                     t        | |      S r   )Sliced)r   	subscripts     r$   __getitem__zF.__getitem__{  s    dI&&r+   c                 H    t        d| j                  j                   d      )Nzargument of type 'z' is not iterable)	TypeErrorr   r&   rJ   s     r$   __contains__zF.__contains__~  s%     ,T^^-D-D,EEVWXXr+   Nc                 >    |j                  | j                  |||      S r   )resolve_refr  r   r   r   r   r   r   s         r$   r8   zF.resolve_expression  s       K	JJr+   c                 &    |j                  | |       S r   )r  )r   r
  s     r$   r	  zF.replace_expressions  s    d++r+   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  rJ   s     r$   r_  zF.__eq__  s'    ~~0LTYY%**5LLr+   c                 ,    t        | j                        S r   )ra  r  rD   s    r$   rb  z
F.__hash__  s    DIIr+   c                 ,    t        j                   |       S r   r  rD   s    r$   r   zF.copy  r  r+   r3  )r&   r'   r(   r)   r8  r   r}  r  r  r8   r	  r!  r&  r_  rb  r   r*   r+   r$   r   r   k  sL    NOC'Y SXK
,'8Mr+   r   c                   <     e Zd ZdZdZdZd Z fdZd Z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.)r   r   r\  r   s      r$   r   zResolvedOuterRef.as_sql  s    *
 	
r+   c                     t        |   |i |}|j                  rt        d| j                   d      t
        | j                  v |_        |S )Nz<Referencing outer query window expression is not supported: r  )rz  r8   r   r   r  r   possibly_multivalued)r   r\  r   colr   s       r$   r8   z#ResolvedOuterRef.resolve_expression  sX    g($9&9###N99+Q   $.#: 
r+   c                     | S r   r*   r   relabelss     r$   r  z ResolvedOuterRef.relabeled_clone  r*  r+   c                     g S r   r*   rD   s    r$   r  z"ResolvedOuterRef.get_group_by_cols  r   r+   )r&   r'   r(   r)   r   r   r   r8   r  r  r  r  s   @r$   r  r    s*      
r+   r  c                        e Zd ZdZdZd Zd Zy)OuterRefFc                     t        | j                  | j                        r| j                  S t        | j                        S r   )r   r  r   r  r  s      r$   r8   zOuterRef.resolve_expression  s-    dii099		**r+   c                     | S r   r*   r  s     r$   r  zOuterRef.relabeled_clone  r*  r+   N)r&   r'   r(   r   r   r8   r  r*   r+   r$   r  r    s     +
r+   r  c                   :     e Zd ZdZ fdZd Z	 	 	 	 	 ddZ xZS )r  z
    An object that contains a slice of an F expression.

    Object resolves the column on which the slicing is applied, and then
    applies the slicing if possible.
    c                    t         |   |j                         || _        t	        |t
              r"|dk  rt        d      |dz   | _        d| _        y t	        |t              r|j                  |j                  dk  s|j                  |j                  dk  rt        d      |j                  t        d      |j                  r0|j                  r$|j                  |j                  k  rt        d      |j                  dn|j                  dz   | _        |j                  d | _        y |j                  |j                  xs dz
  | _        y t        d      )Nr   z#Negative indexing is not supported.   zStep argument is not supported.z,Slice stop must be greater than slice start.z7Argument to slice must be either int or slice instance.)rz  r   r  objr   r   r   startlengthslicestopstepr  )r   r  r  r   s      r$   r   zSliced.__init__  s   "i%1} !FGG"QDJDK	5)+	!0C*y~~/A !FGG~~) !BCC~~)//inny6V !OPP'oo59??Q;NDJ~~%"'nn	0D1EUVVr+   c                     | j                   dz
  }| j                  d n|| j                  z   }t        ||      }| j                  j                   d| j
                  d|dS )Nr  (r   ))r  r  r  r   r(   r  )r   r  r  r  s       r$   r}  zSliced.__repr__  s\    

Q{{*t0C%&	..--.a|2i]!LLr+   c                 0   |j                  | j                  |||      }t        | j                  t        | j
                  f      r | j                  j                  |||||      }n|}|j                  j                  || j                  | j                        S r   )r  r  r   r  r  r   r8   r   slice_expressionr  r  )r   r   r   r   r   r   r  r   s           r$   r8   zSliced.resolve_expression  s~     $$TYYUINdhh4>> :;88..{E9hD D$$55dDJJTTr+   r3  )r&   r'   r(   r)   r   r}  r8   r  r  s   @r$   r  r    s+    W2M Ur+   r  zdjango.db.models.Funcc                   x     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 fdZe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  r  argumentrY  z (z given)r   )
aritylenr  r   r&   rz  r   r   r   extra)r   r   r   r  r   s       r$   r   zFunc.__init__  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>       #PCH#P   r   c              3   V   K   | ]!  \  }}t        |      d z   t        |      z    # yw)=Nr  )r   rI  rJ  s      r$   r   z Func.__repr__.<locals>.<genexpr>"  s*      .6c3C3S)s   ')
{}({}, {})r  )

arg_joinerjoinr   r  _get_repr_optionssortedrN  r|  r   r&   )r   r\  r  s      r$   r}  zFunc.__repr__  s    ###P8O8O#PP:4:::!7!7!9:II :@:O 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*   rD   s    r$   r  zFunc._get_repr_options(  s    	r+   c                     | j                   S r   r   rD   s    r$   r   zFunc.get_source_expressions,  s    &&&r+   c                     || _         y r   r  r   s     r$   r   zFunc.set_source_expressions/  s
    "'r+   c                    |j                   j                  |        g }g }| j                  D ]9  }		 |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 # t        $ r: t        |	dt              }|t        u r |j                  t        |            \  }
}Y t        $ r! |j                  t        d            \  }
}Y "w xY w)Nr5  Tfunctiontemplater  r   r   )r  r  r   r  r   rd   r4  r:   r   r[  r  r  
setdefaultr  r  r  r  r  )r   r    r   r  r  r  r!   	sql_partsr#   r   arg_sql
arg_paramsr5  datas                 r$   r   zFunc.as_sql2  sr    	//5	** 	&C
D&.&6&6s&;# W%MM*%	& /$**.. 'DOOJ6Btxx
DMMBJ488L$//#J
.8ooi.HH]d7m$&&- " V)01>*& *^;&.&6&6u=S7T&U#  D&.&6&6uT{&C#Ds   C<<A E'>%E'&E'c                     t         |          }| j                  d d  |_        | j                  j                         |_        |S r   )rz  r   r   r  )r   r   r   s     r$   r   z	Func.copyY  s8    w|~"&"9"9!"<ZZ__&
r+   c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wr   r8  )r   r   s     r$   r   z'Func.allowed_default.<locals>.<genexpr>a  s     X*:--X   )allr   rD   s    r$   r8  zFunc.allowed_default_  s    X@W@WXXXr+   NNN)r&   r'   r(   r)   r  r  r  r  r   r}  r  r   r   r   r   r   r8  r  r  s   @r$   r  r    sb    H.HJE26 >'( %'N Y Yr+   r  zdjango.db.models.Valuec                   b     e Zd ZdZdZdZd fd	Zd Zd Z	 d fd	Z	d Z
d	 Zed
        Z xZS )r:   z9Represent a wrapped value as a node within an expression.FTc                 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)rz  r   r   )r   r   r   r   s      r$   r   zValue.__init__m  s     	l3
r+   c                 N    | j                   j                   d| j                  dS )Nr  r  )r   r&   r   rD   s    r$   r}  zValue.__repr__y  s$    ..))*!DJJ>;;r+   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)	r  r  r   r   r   get_db_prep_saveget_db_prep_valuer9   r	  )r   r    r   rJ  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   )rz  r8   r   r   r   r   r   r   r   r   r   s          r$   r8   zValue.resolve_expression  s(     G&uk5)XV
r+   c                     g S r   r*   rD   s    r$   r  zValue.get_group_by_cols  r   r+   c                 H   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        j0                         S y r   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimer  dater  timer  	timedeltar  r   r   bytesBinaryFieldr
   	UUIDFieldrD   s    r$   r   zValue._resolve_output_field  sZ   djj#&##%%djj$'&&((djj#&&&((djj%($$&&djj("3"34''))djj(--0##%%djj(--0##%%djj("4"45''))djj'*&&((djj%(%%''djj$'##%% (r+   c                     | j                   S r   )r   rD   s    r$   r5  zValue.empty_result_set_value  s    zzr+   r   r3  )r&   r'   r(   r)   r   r8  r   r}  r   r8   r  r   r:  r5  r  r  s   @r$   r:   r:   d  sK    C HO
<& SX&0  r+   r:   c                   D     e Zd ZdZd fd	Zd Zd Zd Z	 d fd	Z xZ	S )	RawSQLTc                 p    |t        j                         }||c| _        | _        t        |   |       y ry  )r   rO  r"   r#   rz  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  )r|  r   r&   r"   r#   rD   s    r$   r}  zRawSQL.__repr__  s)    ""4>>#:#:DHHdkkRRr+   c                 8    d| j                   z  | j                  fS r  )r"   r#   r   s      r$   r   zRawSQL.as_sql  s     $++--r+   c                     | gS r   r*   rD   s    r$   r  zRawSQL.get_group_by_cols  	    vr+   c                 j   |j                   r|j                   j                  j                  D ]q  }|j                  j                  D ]V  }|j                  j                         | j                  j                         v s8|j                  |j                  |||        q s t        | )  |||||      S r   )rP  rQ  all_parentslocal_fieldscolumnlowerr"   r  r  rz  r8   )	r   r   r   r   r   r   parentparent_fieldr   s	           r$   r8   zRawSQL.resolve_expression  s     ;;++++77 $*LL$=$= L#**002dhhnn6FF))(--{E9  w);y(
 	
r+   r   r3  )
r&   r'   r(   r8  r   r}  r   r  r8   r  r  s   @r$   r  r    s.    O4S. SX
 
r+   r  c                       e Zd Zd Zd Zy)Starc                      y)Nz'*'r*   rD   s    r$   r}  zStar.__repr__  s    r+   c                 
    dg fS )Nr0   r*   r   s      r$   r   zStar.as_sql  s    Bwr+   N)r&   r'   r(   r}  r   r*   r+   r$   r+  r+    s    r+   r+  c                   @     e Zd ZdZd fd	Zd Zd Z	 ddZd Z xZ	S )	DatabaseDefaultz^
    Expression to use DEFAULT keyword during insert otherwise the underlying expression.
    c                 2    t         |   |       || _        y r   rz  r   r   r   r   r   r   s      r$   r   zDatabaseDefault.__init__  s    &$r+   c                     | j                   gS r   r   rD   s    r$   r   z&DatabaseDefault.get_source_expressions        r+   c                     |\  | _         y r   r4  r   s     r$   r   z&DatabaseDefault.set_source_expressions  s    "r+   c                 x    | j                   j                  |||||      }|s|S t        || j                        S )N)r   r   r   r   r   r   )r   r8   r/  r   )r   r   r   r   r   r   resolved_expressions          r$   r8   z"DatabaseDefault.resolve_expression  sQ     #oo@@# A 
 &&d.H.H
 	
r+   c                 l    |j                   j                  s|j                  | j                        S dg fS )NDEFAULT)r  "supports_default_keyword_in_insertr  r   r   s      r$   r   zDatabaseDefault.as_sql  s0    ""EE##DOO44"}r+   r   r3  )
r&   r'   r(   r)   r   r   r   r8   r   r  r  s   @r$   r/  r/    s(    %!# SX
$r+   r/  c                   F     e Zd ZdZdZd	 fd	Zd Zd Zd Zd Z	d Z
 xZS )
ColTFc                 L    ||}t         |   |       ||c| _        | _        y ry  )rz  r   alias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   r|  r   r&   r  )r   r?  r@  identifierss       r$   r}  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 Nr  )r?  r@  r&  r  rL  quote_name_unless_alias)r   r    r   r?  r&  rB  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   r  s     r$   r  zCol.relabeled_clone  sF    ::K~~LLTZZ0$++t?P?P
 	
r+   c                     | gS r   r*   rD   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  22
KK))*56 	6r+   r   )r&   r'   r(   r   r  r   r}  r   r  r  r   r  r  s   @r$   r=  r=    s.    !% 0P

6r+   r=  c                   Z     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )r   c                 P    t         |   |       || _        || _        || _        y ry  )rz  r   r?  targetssources)r   r?  rK  rL  r   r   s        r$   r   zColPairs.__init__/  s(    l3
r+   c                 ,    t        | j                        S r   )r  rK  rD   s    r$   __len__zColPairs.__len__5  s    4<<  r+   c                 4    t        | j                               S r   )rX  get_colsrD   s    r$   __iter__zColPairs.__iter__8  s    DMMO$$r+   c           
          | j                   j                   d| j                  d| j                  d| j                  d| j
                  d
S )Nr  r   r  )r   r&   r?  rK  rL  r   rD   s    r$   r}  zColPairs.__repr__;  sL    ~~&&'qb8H||b!2!2 5Q8	
r+   c           	          t        | j                  | j                        D cg c]  \  }}t        | j                  ||       c}}S c c}}w r   )ziprK  rL  r=  r?  )r   r@  r   s      r$   rP  zColPairs.get_colsA  sD     #&dllDLL"A
 

FF+
 	
 
s   !A	c                 "    | j                         S r   )rP  rD   s    r$   r   zColPairs.get_source_expressionsG  s    }}r+   c                      t         fd|D              sJ |D cg c]  }|j                   c} _        |D cg c]  }|j                   c} _        y c c}w c c}w )Nc              3   t   K   | ]/  }t        |t              xr |j                  j                  k(   1 y wr   )r   r=  r?  )r   r   r   s     r$   r   z2ColPairs.set_source_expressions.<locals>.<genexpr>K  s-     X$:dC(ETZZ4::-EEXs   58)r  r@  rK  r   rL  )r   r   r  s   `  r$   r   zColPairs.set_source_expressionsJ  sL    XRWXXXX.34s

4-23c		3 53s
   AAc                     g }g }| j                         }|D ]9  }|j                  ||      \  }}|j                  |       |j                  |       ; dj	                  |      |fS )Nr   )rP  r   r[  r  r  )	r   r    r   cols_sqlcols_paramsr  r  r"   r#   s	            r$   r   zColPairs.as_sqlO  sj    }} 	'C**Xz:KCOOC v&	'
 yy"K//r+   c                     | j                  |j                  | j                  | j                        | j                  | j                  | j
                        S r   )r   r  r?  rK  rL  r   r  s     r$   r  zColPairs.relabeled_clone[  s;    ~~LLTZZ0$,,djj
 	
r+   c                     | S r   r*   r  s      r$   r8   zColPairs.resolve_expression`  r*  r+   c                 
    ||fS r   r*   r/  s       r$   r.  zColPairs.select_formatc  s    F{r+   )r&   r'   r(   r   rN  rQ  r}  rP  r   r   r   r  r8   r.  r  r  s   @r$   r   r   .  s:    !%

4

0

r+   r   c                   V     e Zd ZdZ fdZd Zd Zd Z	 ddZd Z	d Z
d	 Z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   )rz  r   r  r   )r   r  r   r   s      r$   r   zRef.__init__m  s    !%v	4;r+   c                 x    dj                  | j                  j                  | j                  | j                        S r  )r|  r   r&   r  r   rD   s    r$   r}  zRef.__repr__q  s)    ""4>>#:#:DIIt{{SSr+   c                     | j                   gS r   r   rD   s    r$   r   zRef.get_source_expressionst  s    }r+   c                     |\  | _         y r   rc  r   s     r$   r   zRef.set_source_expressionsw  s    r+   c                     | S r   r*   r  s         r$   r8   zRef.resolve_expressionz  s	    
 r+   c                     | j                   hS r   )r  rD   s    r$   r  zRef.get_refs  s    		{r+   c                 f    | j                         }| j                  j                  |      |_        |S r   )r   r   r  )r   r  r  s      r$   r  zRef.relabeled_clone  s(    		{{228<r+   c                 P    |j                   j                  | j                        g fS r   )r  
quote_namer  r   s      r$   r   z
Ref.as_sql  s     ~~((3R77r+   c                     | gS r   r*   rD   s    r$   r  zRef.get_group_by_cols  r"  r+   r3  )r&   r'   r(   r)   r   r}  r   r   r8   r  r  r   r  r  r  s   @r$   r_  r_  g  s=    
.T SX
8r+   r_  c                   8     e Zd 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 a partition
    clause.
    z%(expressions)sc                 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>  r  r  )r  r  r   rD   s    r$   r  zExpressionList.__str__  s#    ###P8O8O#PPPr+   c                 <    | j                   syt        |   |i |S )N) r*   )r   rz  r   )r   r\  r   r   s      r$   r   zExpressionList.as_sql  s#    &&w~t.v..r+   c                 *     | j                   ||fi |S r   )r   )r   r    r   r!   s       r$   r%   zExpressionList.as_sqlite  s    t{{8ZA=AAr+   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   r   r  r  )r   group_by_colsr   s      r$   r  z ExpressionList.get_group_by_cols  s<    //1 	;D  !7!7!9:	;r+   )
r&   r'   r(   r)   r  r  r   r%   r  r  r  s   @r$   rl  rl    s%     !HQ/
Br+   rl  c                   &     e Zd ZdZdZ fdZ xZS )OrderByListFzORDER BY %(expressions)sc                 6    d |D        }t        |   |i | y )Nc              3      K   | ]7  }t        |t              r!|d    dk(  rt        t        |dd       d      n| 9 yw)r   r/   r  NTr%  )r   r   r  r   r   s     r$   r   z'OrderByList.__init__.<locals>.<genexpr>  sI      
  dC(T!W^ $qr(5
s   =?)rz  r   )r   r   r  r   s      r$   r   zOrderByList.__init__  s(    
 $
 	+//r+   )r&   r'   r(   r8  r  r   r  r  s   @r$   rv  rv    s    O)H	0 	0r+   rv  z"django.db.models.ExpressionWrapperc                   T     e Zd ZdZ fdZd Zd Z fdZd Zd Z	e
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 ry  r1  r2  s      r$   r   zExpressionWrapper.__init__  s    l3$r+   c                     |d   | _         y Nr   r4  r   s     r$   r   z(ExpressionWrapper.set_source_expressions      (r+   c                     | j                   gS r   r4  rD   s    r$   r   z(ExpressionWrapper.get_source_expressions  r5  r+   c                     t        | j                  t              r;| j                  j                         }| j                  |_        |j                         S t        |          S r   )r   r   r=  r   r   r  rz  r   r   r   s     r$   r  z#ExpressionWrapper.get_group_by_cols  sP    dooz2--/J&*&7&7J#//11 w(**r+   c                 8    |j                  | j                        S r   )r  r   r   s      r$   r   zExpressionWrapper.as_sql  s    00r+   c                 b    dj                  | j                  j                  | j                        S r  )r|  r   r&   r   rD   s    r$   r}  zExpressionWrapper.__repr__  s!    t~~66HHr+   c                 .    | j                   j                  S r   )r   r8  rD   s    r$   r8  z!ExpressionWrapper.allowed_default  s    ...r+   )r&   r'   r(   r)   r   r   r   r  r   r}  r:  r8  r  r  s   @r$   r{  r{    s;    
%#!+1I / /r+   r{  c                   F     e Zd ZdZ fdZd Z fdZ	 d fd	Zd Z xZ	S )r   z1The logical negation of a conditional expression.c                 L    t         |   |t        j                                y ry  )rz  r   r   r   r  s     r$   r   zNegatedExpression.__init__  s    &2E2E2GHr+   c                 6    | j                   j                         S r   )r   r   rD   s    r$   r   zNegatedExpression.__invert__  s    ##%%r+   c                 F   	 t         |   ||      \  }}|j                  j                  }|j                  | j                        sd| d|fS d| |fS # t        $ rA |j                  j                  }|j
                  sY y|j                  t        d            cY S w xY w)N)z1=1r*   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )rz  r   r   r   r  &supports_boolean_expr_in_select_clauser  r:   r  0conditional_expression_supported_in_where_clauser   )r   r    r   r"   r#   r  r  r   s          r$   r   zNegatedExpression.as_sql  s    	1'.:>KC !!%% CCDOOTu$:;VCCcU|V##  	1**33HBB ##E$K00		1s   A +B B B c                 r    t         |   |||||      }t        |j                  dd      st	        d      |S )Nra   Fz*Cannot negate non-conditional expressions.)rz  r8   rd   r   r  )r   r   r   r   r   r   r  r   s          r$   r8   z$NegatedExpression.resolve_expression  sD     7-;y(
 x**M5AHIIr+   c                     |j                   j                  j                  }|j                   j                  j                  s# || j
                        rdj                  |      }||fS NzCASE WHEN {} THEN 1 ELSE 0 END)r   r  r  r  r  r   r|  )r   r    r"   r#   $expression_supported_in_where_clauses        r$   r.  zNegatedExpression.select_format  s[    
 ##TT 	- ##,,SS4T__E299#>CF{r+   r3  )
r&   r'   r(   r)   r   r   r   r8   r.  r  r  s   @r$   r   r     s'    ;I&$" SXr+   r   zdjango.db.models.Whenc                   r     e Zd ZdZdZd fd	Zd Zd Zd Zd Z		 d fd	Z
d	 Zdd
Zd Zed        Z xZS )Whenz"WHEN %(condition)s THEN %(result)sFc                 2   |r+|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        || _        | j                  |      d   | _	        y )Nra   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   rd   r  r   r   rz  r   	conditionr   rl  )r   r  thenlookupsr   s       r$   r   zWhen.__init__  s     %&\\47	M59%&y%<G%<d7	GI}e$LPW"  i#IPQQd+"--d3A6r+   c                 :    d| j                   d| j                  S )NzWHEN z THEN r  rl  rD   s    r$   r  zWhen.__str__+  s    $(NNDKK@@r+   c                 <    d| j                   j                  d| dS N<z: >r   r&   rD   s    r$   r}  zWhen.__repr__.      !^^44d;;r+   c                 2    | j                   | j                  gS r   r  rD   s    r$   r   zWhen.get_source_expressions1  s    ,,r+   c                 "    |\  | _         | _        y r   r  r   s     r$   r   zWhen.set_source_expressions4  s    &+#r+   c                     t         |   |||||      }|r1|j                  %| j                  j                  ||||d      |_        |S )NF)r   )rz  r8   r  r  s          r$   r8   zWhen.resolve_expression7  sU     G&uk5)XV/..;;{E9u < AK r+   c                 0    | j                   j                  gS r   )rl  r   rD   s    r$   r   zWhen.get_source_fieldsB  s    1122r+   c                    |j                   j                  |        |}g }|j                  | j                        \  }}||d<   |j                  | j                        \  }	}
|	|d<   |xs | j
                  }||z  g |||
fS )Nr  rl  )r  r  r  r  rl  r  )r   r    r   r  r!   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramss              r$   r   zWhen.as_sqlF  s    //5'
*2*:*:4>>*J'''4$$,$4$4T[[$A!
M$.!,t}}/) ,
,
,
 ,
 
 	
r+   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   rs  r  s      r$   r  zWhen.get_group_by_colsU  s9    113 	4FKK0023	4r+   c                 ^    | j                   j                  xr | j                  j                  S r   )r  r8  rl  rD   s    r$   r8  zWhen.allowed_default\  s!    ~~--M$++2M2MMr+   NNr3  r   )r&   r'   r(   r  ra   r   r  r}  r   r   r8   r   r   r  r   r8  r  r  s   @r$   r  r    sX    3HK7"A<-, SX	3
 N Nr+   r  zdjango.db.models.Casec                   x     e Zd ZdZdZdZddd fd
Zd Zd Zd	 Z	d
 Z
 fdZ	 ddZ fdZe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	        |      | _        | j                  |      d   | _        || _        y )Nc              3   <   K   | ]  }t        |t                y wr   )r   r  )r   cases     r$   r   z Case.__init__.<locals>.<genexpr>s  s     <d:dD)<r   z.Positional arguments must all be When objects.r   )	r  r  rz  r   listcasesr   r  r  )r   r  r   r  r  r   s        r$   r   zCase.__init__r  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     1c!f1r  z, ELSE )r  r  r  rD   s    r$   r  zCase.__str__z  s)    II1djj11LL
 	
r+   c                 <    d| j                   j                  d| dS r  r  rD   s    r$   r}  zCase.__repr__  r  r+   c                 6    | j                   | j                  gz   S r   r  r  rD   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                 L    t         |          }|j                  d d  |_        |S r   )rz  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 t        $ r" |j                  |	j                        \  }}Y  w xY w)Nr  r  r  )r  r  r  r  r  r  r   r   rl  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  s    	//5zz##DLL119TZZ9=9

JJ 	ID(0(8(8(>%+ h'k*	I +3*:*:4<<*H'K..!5T%5%5#.#3#3J#? %0	".)M22:t}}M(%%1..55d6G6GH3NCJ' "   .6.>.>t{{.K+^s   'E	F&&FFc                 l    | j                   s| j                  j                         S t        | 	         S r   )r  r  r  rz  )r   r   s    r$   r  zCase.get_group_by_cols  s+    zz<<1133w(**r+   c                 j    | j                   j                  xr t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wr   r  )r   case_s     r$   r   z'Case.allowed_default.<locals>.<genexpr>  s      4
&+E!!4
r  )r  r8  r  r  rD   s    r$   r8  zCase.allowed_default  s1    ||++ 
 4
/3zz4
 1
 	
r+   r  )r&   r'   r(   r)   r  r  r   r  r}  r   r   r   r   r  r   r8  r  r  s   @r$   r  r  a  s]    
 5HK'+$ 
<+* @DB+
 
 
r+   r  c                   t     e Zd 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 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)FNTc                     t        |d|      j                         | _        d| j                  _        || _        t
        |   |       y )Nr   T)rd   r  r   r   r  rz  r   )r   querysetr   r  r   s       r$   r   zSubquery.__init__  s<    Xw9??A
"


&r+   c                     | j                   gS r   r   rD   s    r$   r   zSubquery.get_source_expressions  s    

|r+   c                     |d   | _         y r~  r  r   s     r$   r   zSubquery.set_source_expressions  s    1X
r+   c                 .    | j                   j                  S r   )r   r   rD   s    r$   r   zSubquery._resolve_output_field  s    zz&&&r+   c                 b    t         |          }|j                  j                         |_        |S r   )rz  r   r   r  )r   r  r   s     r$   r   zSubquery.copy  s'    kk'')r+   c                 .    | j                   j                  S r   )r   external_aliasesrD   s    r$   r  zSubquery.external_aliases  s    zz***r+   c                 6    | j                   j                         S r   )r   get_external_colsrD   s    r$   r  zSubquery.get_external_cols  s    zz++--r+   c                     |j                   j                  |        i | j                  |}| j                  j	                  ||      \  }}|dd |d<   |xs |j                  d| j                        }||z  }||fS )Nr  rA   r   r  )r  r  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                 :    | j                   j                  |       S )N)wrapper)r   r  rD   s    r$   r  zSubquery.get_group_by_cols  s    zz++D+99r+   r   )r&   r'   r(   r)   r  r   r5  r   r   r   r   r   r   r:  r  r  r   r  r  r  s   @r$   r  r    s\    
  H!H''
 + +.:r+   r  c                   X     e Zd ZdZ ej
                         ZdZ fdZd Z	 fdZ
 xZS )ExistszEXISTS(%(subquery)s)Fc                 d    t        |   |fi | | j                  j                         | _        y r   )rz  r   r   exists)r   r  r   r   s      r$   r   zExists.__init__  s)    ,V,ZZ&&(
r+   c                 l    |j                   j                  j                  sdj                  |      }||fS r  )r   r  r  r|  r/  s       r$   r.  zExists.select_format  s3     ""++RR299#>CF{r+   c                     	 t        |   |g|i |S # t        $ rA |j                  j                  }|j
                  sY y|j                  t        d            cY S w xY w)N)z1=0r*   F)rz  r   r   r   r  r  r  r:   )r   r    r\  r   r  r   s        r$   r   zExists.as_sql  sb    	27>(<T<V<< 	2**33HBB ##E%L11		2s    +A A A )r&   r'   r(   r  r   r   r   r5  r   r.  r   r  r  s   @r$   r  r    s2    %H&6&&(L")2 2r+   r  zdjango.db.models.OrderByc                   \    e Zd ZdZdZdZdZddZd Zd Z	d Z
dd	Zd
 Zd Zd Zd Zd Zy)r  z%(expression)s %(ordering)sFTNc                     |r|rt        d      |du s|du rt        d      || _        || _        || _        t	        |d      st        d      || _        y )Nz1nulls_first and nulls_last are mutually exclusiveFz7nulls_first and nulls_last values must be True or None.r8   z%expression must be an expression type)r   nulls_first
nulls_lastr%  r9   r   )r   r   r%  r  r  s        r$   r   zOrderBy.__init__  sb    :PQQ%:#6VWW&$$z#78DEE$r+   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz{}({}, descending={}))r|  r   r&   r   r%  rD   s    r$   r}  zOrderBy.__repr__  s.    &--NN##T__doo
 	
r+   c                     |d   | _         y r~  r4  r   s     r$   r   zOrderBy.set_source_expressions#  r  r+   c                     | j                   gS r   r4  rD   s    r$   r   zOrderBy.get_source_expressions&  r5  r+   c                    t        | j                  t              rg }g }| j                  j                         D ][  }| j	                         } |j
                  |g       |j                  |      \  }	}
|j                  |	       |j                  |
       ] dj                  |      |fS |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|}||j'                  d	      z  }||z  j)                         |fS )
Nr   z%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   r   rP  r   r   r  r[  r  r  r  r   supports_order_by_nulls_modifierr  r  r%  order_by_nulls_firstr  r  countrstrip)r   r    r   r  r!   r  r#   r  r   r"   
col_paramsexpression_sqlplaceholderss                r$   r   zOrderBy.as_sql)  s   doox0IF//1 *yy{+++SE2"*"2"24"8Z  %j)* 99Y'//,t}}??*X5!!+h6J$7$7$L$L88C!!OO
(;(;(P(P<xG//5!)!1!1$//!B("&//u
 

 	(..!122<'//1699r+   c                 0   |j                   j                  so|j                  j                  | j                        rJ| j                         }t        t        | j                  d      d      |_         |j                  ||      S | j                  ||      S )NT)r  F)r  )	r  r  r  r  r   r   r  r  r   )r   r    r   r   s       r$   	as_oraclezOrderBy.as_oracleM  s|     ##JJOO 99;D"T__40DO 4;;x44{{8Z00r+   c                 r    g }| j                         D ]!  }|j                  |j                                # |S r   rs  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                  rd| _        d | _        | S | j                  rd| _        d | _        | S r}   )r%  r  r  rD   s    r$   r)  zOrderBy.reverse_orderingd  sL    "oo-"DO#D  __#D"DOr+   c                     d| _         y rG   ry  rD   s    r$   r!  zOrderBy.ascn  s	    r+   c                     d| _         y r}   ry  rD   s    r$   r&  zOrderBy.descq  s	    r+   )FNNr   )r&   r'   r(   r  ra   r1  r   r   r}  r   r   r   r  r  r)  r!  r&  r*   r+   r$   r  r    sK    ,HK',$#' 
%

#!":H1" r+   r  c                   j     e 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 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                   | _        nFt        | j                  t        t        f      rt        | j                        | _        nt	        d      t        | =  |       | j!                  |      d   | _        y )Nr7  Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.r   r   )partition_byorder_byframerd   r   r   r&   r   rK  r  rl  rv  r   r   rz  r   r   source_expression)r   r   r  r  r  r   r   s         r$   r   zWindow.__init__}  s    ) 
z#6>E&&//0 
 (d//%?%)%6%6$8! .0A0A BD==$$--$7 +T]] ;DMMNC+@A +DMM : H  	l3!%!8!8!DQ!Gr+   c                 .    | j                   j                  S r   )r  r   rD   s    r$   r   zWindow._resolve_output_field  s    %%222r+   c                 ^    | j                   | j                  | j                  | j                  gS r   r  r  r  r  rD   s    r$   r   zWindow.get_source_expressions  s%    &&(9(94==$**UUr+   c                 :    |\  | _         | _        | _        | _        y r   r  r   s     r$   r   zWindow.set_source_expressions  s    OTL 14=$*r+   c                    |j                   j                  |        |j                  j                  st	        d      |j                  | j                        \  }}g d}}| j                  @| j                  j                  ||d      \  }}	|j                  |       |t        |	      z  }| j                  =|j                  | j                        \  }
}|j                  |
       |t        |      z  }| j                  r=|j                  | j                        \  }}|j                  |       |t        |      z  }|xs | j                  }||dj                  |      j                         dz  g ||fS )Nz1This backend does not support window expressions.r*   zPARTITION BY %(expressions)s)r    r   r  r  )r   window)r  r  r  supports_over_clauser   r  r  r  r   r[  rK  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_sql  sj   //5""77#$WXX#++D,B,BC&$&M
(#'#4#4#;#;!%7 $< $ Hj
 h'U:..M==$&.&6&6t}}&E#I|i(U<00M::&.&6&6tzz&B#I|i(U<00M,t}} h#((::N:T:T:VWW%f%}%
 	
r+   c                 6   t        | j                  t        j                        rc| j	                         } |j
                         }t        j                         |d   _         |j                  |       t        t        |+  ||      S | j                  ||      S r~  )r   r   r   r   r   r   r   r   rz  r  r%   r   )r   r    r   r   r   r   s        r$   r%   zWindow.as_sqlite  s    d'')<)<=99;D!<!<!<!>171B1B1Dq!.'D''(:;0:FF{{8Z00r+   c           	          dj                  t        | j                        | j                  rdt        | j                        z   ndt        | j                  xs d      t        | j
                  xs d            S )Nz{} OVER ({}{}{})zPARTITION BY rp  )r|  r   r  r  r  r  rD   s    r$   r  zWindow.__str__  sb    !((&&'8<8I8IOc$"3"344r#$

 b!	
 	
r+   c                 <    d| j                   j                  d| dS r  r  rD   s    r$   r}  zWindow.__repr__  r  r+   c                     g }| j                   r)|j                  | j                   j                                | j                  )|j                  | j                  j                                |S r   )r  r  r  r  )r   rt  s     r$   r  zWindow.get_group_by_cols  sX      !2!2!D!D!FG==$  !@!@!BCr+   )NNNNr   )r&   r'   r(   r  r   r   r   r   r   r   r   r%   r  r}  r  r  r  s   @r$   r  r  u  sV    1H 
 "HH3VU
B1
<r+   r  c                   "    e Zd ZdZdZdZdZd Zy)WindowFrameExclusionzCURRENT ROWGROUPTIESz	NO OTHERSc                 L    | j                   j                   d| j                   S rD  )r   r(   _name_rD   s    r$   r}  zWindowFrameExclusion.__repr__  s"    ..--.a}==r+   N)r&   r'   r(   CURRENT_ROWr  r  	NO_OTHERSr}  r*   r+   r$   r  r    s    KEDI>r+   r  c                   L    e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
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).
    z7%(frame_type)s BETWEEN %(start)s AND %(end)s%(exclude)sNc                     t        |      | _        t        |      | _        t        |t        t
        f      s"t        | j                  j                   d      || _	        y )Nz3.exclusion must be a WindowFrameExclusion instance.)
r:   r  endr   r	   r  r  r   r(   	exclusion)r   r  r  r  s       r$   r   zWindowFrame.__init__  sX    5\
:)h0D%EF>>../ 01 1  #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  rD   s    r$   r   z"WindowFrame.get_source_expressions  s    

DHH%%r+   c                 N    | j                   yd| j                   j                   S )Nrp  z	 EXCLUDE )r  r   rD   s    r$   get_exclusionzWindowFrame.get_exclusion  s'    >>!4>>//011r+   c                 j   |j                   j                  |        | j                  || j                  j                  | j
                  j                        \  }}| j                  r!|j                  j                  st        d      | j                  | j                  ||| j                         dz  g fS )Nz6This backend does not support window frame exclusions.
frame_typer  r  exclude)r  r  window_frame_start_endr  r   r  r  r  supports_frame_exclusionr   r  r%  r"  )r   r    r   r  r  s        r$   r   zWindowFrame.as_sql  s    //500

(($((..

s >>*"5"5"N"N#H  MM"oo--/	 	
 		
r+   c                 <    d| j                   j                  d| dS r  r  rD   s    r$   r}  zWindowFrame.__repr__'  r  r+   c                     g S r   r*   rD   s    r$   r  zWindowFrame.get_group_by_cols*  r   r+   c                 &   | j                   j                  V| j                   j                  dk  r=dt        | j                   j                        t        j                  j
                  fz  }n| j                   j                  4| j                   j                  dk(  rt        j                  j                  }n}| j                   j                  M| j                   j                  dkD  r4d| j                   j                  t        j                  j                  fz  }nt        j                  j                  }| j                  j                  M| j                  j                  dkD  r4d| j                  j                  t        j                  j                  fz  }n| j                  j                  4| j                  j                  dk(  rt        j                  j                  }n| j                  j                  V| j                  j                  dk  r=dt        | j                  j                        t        j                  j
                  fz  }nt        j                  j                  }| j                  | j                  ||| j                         dz  S )Nr   z%d %sr$  )r  r   absr   r  	PRECEDINGr  	FOLLOWINGUNBOUNDED_PRECEDINGr  UNBOUNDED_FOLLOWINGr  r%  r"  )r   r  r  s      r$   r  zWindowFrame.__str__-  s   ::'DJJ,<,<q,@s4::#3#34jnn6N6NOOEZZ)djj.>.>!.CNN..EZZ)djj.>.>.Btzz//1I1IJJENN66E88>>%$((..1*<TXX^^Z^^-E-EFFCXX^^'DHHNNa,?..,,CXX^^'DHHNNQ,>S0*..2J2JKKC..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   r}  r  r  r'  r*   r+   r$   r  r    s=     IH#%&2

(<
2Yr+   r  c                       e Zd ZdZd Zy)RowRangeROWSc                 :    |j                   j                  ||      S r   )r  window_frame_rows_start_endr2  s       r$   r'  zRowRange.window_frame_start_endM  s    ~~99%EEr+   Nr&   r'   r(   r%  r'  r*   r+   r$   r4  r4  J  s    JFr+   r4  c                       e Zd ZdZd Zy)
ValueRangeRANGEc                 :    |j                   j                  ||      S r   )r  window_frame_range_start_endr2  s       r$   r'  z!ValueRange.window_frame_start_endT  s    ~~::5#FFr+   Nr8  r*   r+   r$   r:  r:  Q  s    JGr+   r:  )hr   r  rc  rB  collectionsr   decimalr   enumr   	itertoolsr   typesr	   uuidr
   django.core.exceptionsr   r   r   	django.dbr   r   r   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.functionalr   r   django.utils.hashabler   r   r-   r   r   r=  rI   rC   rU   rY   r]   PositiveIntegerFieldrO   r   r   r   ri   rz   rm   rp   ru   r  from_iterabler  r  r  r  _connector_combinationsri  rm  drN  r=   field_typesrj  rk  rl  rd  rv  r;   r  r  r   r  r  r  r  r:   r  r+  r/  r=  r   r_  rl  rv  r{  r   r  r  r  r  r  r  r  r  r4  r:  )r=   s   0r$   <module>rQ     s'       #      L L B B # 1 * 4 B /  A' A'H	Z 	T Tn
 *# *# *#B NNNNNNNNNN
  	++++++
 	
0 NNNNNN NNNNNN	
  	  &"5"5v7J7JK 1 163D3DE  &"5"5v7J7JK
 	
4 NNNNNNNNNN
  	  &"5"5v7J7JK  &"5"5v7J7JK  &"3"3V5F5FG 3 3V5F5FG	
 	
* ##$$
	  	  &"5"5v7J7JK
 	
2 NNNNNNNNNNNN
  	4E   ''''%%#  	
 		
, 	v33V5I5IJ!!6#7#79M9MN!!6#3#3V5I5IJ!!6#7#79M9MN!!6#7#79M9MNv33V5E5EF!!6#3#3V5E5EF
 	v33V5I5IJ!!6#7#79M9MNv//1E1EFv33V5I5IJ!!6#3#3V5I5IJ!!6#7#79M9MN!!6#7#79M9MNv33V5E5EFv//1E1EF
Ow r %T* 	A 
! DA"#'') D	; + 	DCf&sIsFC	DDD S!! "!TE+Z TEn0+ 0f
, 
 *+,
 , ,,^"q "J
q 
6UQ 6Ur -.ZYz ZY /ZYz ./M
 M 0M` 
Z  
F: $j $N$6* $6N6z 6r&* &RT 80. 0  :;!/*J !/ <!/H0) 0f -.IN: IN /INX -.V
z V
 /V
r2:~z 2:j2X 26 01fj f 2fRq qh>4 >TY* TYnF{ FG Gg0"$ s!   $,_A0_B_,_
A_