o
    lfS                     @   s  d dl Z 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mZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm Z  G dd dZ!G dd dZ"G dd dZ#eG dd de#e"Z$e%dZ&dd e"j'e"j(e"j)e"j*e"j+e"j,fD dd e"j'e"j(e"j)e"j*e"j+fD dd e"j-e"j.e"j/e"j0e"j1fD dd e"j'e"j(e"j)e"j*e"j+e"j,fD e"j'ej2ej3ej4fej4ej3ej4fej3ej2ej4fej3ej4ej4fej3ej3ej3fej5ej3ej5fej3ej5ej5fgie"j(ej2ej3ej4fej4ej3ej4fej2ej2ej3fej2ej4ej3fej4ej2ej3fej4ej4ej3fej3ej3ej3fej5ej3ej5fej5ej5ej3fg	igZ6ee7Z8dd Z9e6D ]Z:e:; D ]\Z<Z=e=D ]\Z>Z?Z@e9e>e<e?e@ q\qVqPejAdddd  ZBG d!d" d"e!e$ZCG d#d$ d$eCZDG d%d& d&eCZEed'd(G d)d* d*e"ZFG d+d, d,eFZGG d-d. d.eFZHed/d(G d0d1 d1e!e$ZIed2d(G d3d4 d4e!e$ZJG d5d6 d6e$ZKG d7d8 d8e$ZLG d9d: d:e$ZMG d;d< d<e$ZNG d=d> d>eIZOG d?d@ d@eIZPedAd(G dBdC dCe!e$ZQG dDdE dEeQZRedFd(G dGdH dHe$ZSedId(G dJdK dKe!e$ZTG dLdM dMe#e"ZUG dNdO dOeUZVedPd(G dQdR dRe$ZWG dSdT dTe!e$ZXG dUdV dVe$ZYG dWdX dXeYZZG dYdZ dZeYZ[dS )[    N)defaultdictDecimal)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)RemovedInDjango50Warning)cached_property)make_hashablec                   @      e Zd ZdZdd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                 K   s\   | j ||fi |\}}z| j dkrd| }W ||fS W ||fS  ty-   Y ||fS w )NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparams r   `/var/www/ticemtrilhas/avaliacao_env/lib/python3.10/site-packages/django/db/models/expressions.py	as_sqlite   s   
zSQLiteNumericMixin.as_sqliteN)__name__
__module____qualname____doc__r    r   r   r   r   r      s    r   c                   @   s  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d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAS )B
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|z<<z>>#c                 C   s.   t |ds	t|}|rt||| S t| ||S )Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreversedr   r   r   _combine>   s
   
zCombinable._combinec                 C   s   |  d| jdS )NFr5   MULr   r   r   r   __neg__K      zCombinable.__neg__c                 C      |  || jdS NFr5   ADDr   r2   r   r   r   __add__N   r;   zCombinable.__add__c                 C   r<   r=   r5   SUBr@   r   r   r   __sub__Q   r;   zCombinable.__sub__c                 C   r<   r=   r7   r@   r   r   r   __mul__T   r;   zCombinable.__mul__c                 C   r<   r=   r5   DIVr@   r   r   r   __truediv__W   r;   zCombinable.__truediv__c                 C   r<   r=   r5   MODr@   r   r   r   __mod__Z   r;   zCombinable.__mod__c                 C   r<   r=   r5   POWr@   r   r   r   __pow__]   r;   zCombinable.__pow__c                 C   s0   t | ddrt |ddrt| t|@ S tdNconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorr@   r   r   r   __and__`   
   zCombinable.__and__c                 C   r<   r=   )r5   BITANDr@   r   r   r   bitandg   r;   zCombinable.bitandc                 C   r<   r=   )r5   BITLEFTSHIFTr@   r   r   r   bitleftshiftj   r;   zCombinable.bitleftshiftc                 C   r<   r=   )r5   BITRIGHTSHIFTr@   r   r   r   bitrightshiftm   r;   zCombinable.bitrightshiftc                 C   s0   t | ddrt |ddrt| t|A S tdrO   rR   r@   r   r   r   __xor__p   rV   zCombinable.__xor__c                 C   r<   r=   )r5   BITXORr@   r   r   r   bitxorw   r;   zCombinable.bitxorc                 C   s0   t | ddrt |ddrt| t|B S tdrO   rR   r@   r   r   r   __or__z   rV   zCombinable.__or__c                 C   r<   r=   )r5   BITORr@   r   r   r   bitor   r;   zCombinable.bitorc                 C   r<   NTr>   r@   r   r   r   __radd__   r;   zCombinable.__radd__c                 C   r<   rc   rB   r@   r   r   r   __rsub__   r;   zCombinable.__rsub__c                 C   r<   rc   r7   r@   r   r   r   __rmul__   r;   zCombinable.__rmul__c                 C   r<   rc   rF   r@   r   r   r   __rtruediv__   r;   zCombinable.__rtruediv__c                 C   r<   rc   rI   r@   r   r   r   __rmod__   r;   zCombinable.__rmod__c                 C   r<   rc   rL   r@   r   r   r   __rpow__   r;   zCombinable.__rpow__c                 C      t dNrQ   rT   r@   r   r   r   __rand__      zCombinable.__rand__c                 C   rj   rk   rl   r@   r   r   r   __ror__   rn   zCombinable.__ror__c                 C   rj   rk   rl   r@   r   r   r   __rxor__   rn   zCombinable.__rxor__c                 C   s   t | S N)NegatedExpressionr9   r   r   r   
__invert__      zCombinable.__invert__N))r!   r"   r#   r$   r?   rC   r8   rG   rM   rJ   rW   ra   rY   r[   r^   r5   r:   rA   rD   rE   rH   rK   rN   rU   rX   rZ   r\   r]   r_   r`   rb   rd   re   rf   rg   rh   ri   rm   ro   rp   rs   r   r   r   r   r%   %   sN    r%   c                   @   sZ  e Zd ZdZeZdZdZdZdZ	dGddZ
dd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zedd Z	dHddZedd Zedd  Zed!d" Zed#d$ Zd%d& Zed'd( Zed)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCdD Z,dEdF Z-dS )IBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S rq   r   r   r   r   r   r   __init__   s   
zBaseExpression.__init__c                 C   s   | j  }|dd  |S )Nconvert_value)__dict__copypop)r   stater   r   r   __getstate__      
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j| S rq   )ry   _convert_value_noopr   get_db_convertersr   r   r   r   r   r      s
   
z BaseExpression.get_db_convertersc                 C      g S rq   r   r9   r   r   r   get_source_expressions      z%BaseExpression.get_source_expressionsc                 C   s   |rJ d S rq   r   r   exprsr   r   r   set_source_expressions      z%BaseExpression.set_source_expressionsc                 G   s   dd |D S )Nc                 S   s4   g | ]}t |d r|nt|trt|nt|qS r.   )r/   
isinstancestrFr0   .0argr   r   r   
<listcomp>   s    z5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   expressionsr   r   r   _parse_expressions   s   z!BaseExpression._parse_expressionsc                 C   rj   )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()rl   r   r   r   r   r   r   r      s   zBaseExpression.as_sqlc                 C      t dd |  D S )Nc                 s       | ]}|o|j V  qd S rq   )contains_aggregater   exprr   r   r   	<genexpr>       

z4BaseExpression.contains_aggregate.<locals>.<genexpr>anyr   r9   r   r   r   r         z!BaseExpression.contains_aggregatec                 C   r   )Nc                 s   r   rq   )contains_over_clauser   r   r   r   r      r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>r   r9   r   r   r   r      r   z#BaseExpression.contains_over_clausec                 C   r   )Nc                 s   r   rq   )contains_column_referencesr   r   r   r   r      s
    
z<BaseExpression.contains_column_references.<locals>.<genexpr>r   r9   r   r   r   r         z)BaseExpression.contains_column_referencesc                 C   r   )Nc                 s   s&    | ]}|ot |d dp|jV  qdS )subqueryFN)rS   contains_subqueryr   r   r   r   r     s
    
z3BaseExpression.contains_subquery.<locals>.<genexpr>r   r9   r   r   r   r     r   z BaseExpression.contains_subqueryc                    s4   |   }|_| fdd| D  |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

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

        Return: an Expression to be added to the query.
        c                    s$   g | ]}|r|  nd qS rq   r   r   allow_joinsqueryreuse	summarizer   r   r     s    z5BaseExpression.resolve_expression.<locals>.<listcomp>)r{   
is_summaryr   r   r   r   r   r   r   for_savecr   r   r   r.   	  s   z!BaseExpression.resolve_expressionc                 C   s   t | jtjS rq   )r   r   r   BooleanFieldr9   r   r   r   rP   &  s   zBaseExpression.conditionalc                 C      | j S rq   rv   r9   r   r   r   field*     zBaseExpression.fieldc                 C   s"   |   }|du rd| _td|S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   rw   r   r   r   r   .  s
   zBaseExpression.output_fieldc                 C   s&   z| j W S  ty   | js Y dS w )z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r   r9   r   r   r   _output_field_or_none7  s   z$BaseExpression._output_field_or_nonec                 C   sT   dd |   D }|D ]}|D ]}t||js#td|jj|jjf q|  S dS )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                 s   s    | ]	}|d ur|V  qd S rq   r   )r   sourcer   r   r   r   Q  s    z7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)get_source_fieldsr   	__class__r   r!   )r   sources_iterr   r   r   r   r   r   C  s    	z$BaseExpression._resolve_output_fieldc                 C      | S rq   r   value
expressionr   r   r   r   r   a     z"BaseExpression._convert_value_noopc                 C   sF   | j }| }|dkrdd S |drdd S |dkr d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                 S      | d u rd S t | S rq   )floatr   r   r   r   <lambda>p     z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   r   rq   )intr   r   r   r   r   v  r   r   c                 S   r   rq   r   r   r   r   r   r   |  r   )r   r   endswithr   )r   r   internal_typer   r   r   ry   e  s   
zBaseExpression.convert_valuec                 C      | j |S rq   )r   
get_lookup)r   lookupr   r   r   r     r   zBaseExpression.get_lookupc                 C   r   rq   )r   get_transformr   namer   r   r   r     r   zBaseExpression.get_transformc                    (   |   }| fdd|  D  |S )Nc                    s"   g | ]}|d ur|  nd qS rq   )relabeled_cloner   e
change_mapr   r   r     s    z2BaseExpression.relabeled_clone.<locals>.<listcomp>r{   r   r   )r   r   cloner   r   r   r     s   
zBaseExpression.relabeled_clonec                    s>     |  }r	|S |  }| }| fdd|D  |S )Nc                    s   g | ]}|r|  nd qS rq   )replace_expressionsr   replacementsr   r   r     s    z6BaseExpression.replace_expressions.<locals>.<listcomp>)getr{   r   r   )r   r   replacementr   source_expressionsr   r   r   r     s   
z"BaseExpression.replace_expressionsc                 C   s$   t  }|  D ]}|| O }q|S rq   )setr   get_refs)r   refsr   r   r   r   r     s   zBaseExpression.get_refsc                 C   
   t  | S rq   r{   r9   r   r   r   r{        
zBaseExpression.copyc                    r   )Nc                    s2   g | ]}t |trt  |j n| qS r   )r   r   r   prefix_referencesr   prefixr   r   r     s    z4BaseExpression.prefix_references.<locals>.<listcomp>r   )r   r   r   r   r   r   r     s   
z BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  D ]	}||  q|S rq   )r   r   extendget_group_by_colsr   colsr   r   r   r   r     s   z BaseExpression.get_group_by_colsc                 C   s   dd |   D S )z9Return the underlying field types used by this aggregate.c                 S   s   g | ]}|j qS r   )r   r   r   r   r   r     s    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r   r9   r   r   r   r     s   z BaseExpression.get_source_fieldsc                 K      t | fi |S rq   OrderByr   kwargsr   r   r   asc  r;   zBaseExpression.ascc                 K      t | fddi|S N
descendingTr   r   r   r   r   desc     zBaseExpression.descc                 C   r   rq   r   r9   r   r   r   reverse_ordering  r   zBaseExpression.reverse_orderingc                 c   s>    | V  |   D ]}|rt|dr| E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r/   r   )r   r   r   r   r   r     s   
zBaseExpression.flattenc                 C   s$   t | jdr| j|||S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r/   r   r   r   r   r   r   r   r   r   r     s   zBaseExpression.select_formatrq   NTNFF).r!   r"   r#   r$   NotImplementedempty_result_set_valuer   r   
filterablewindow_compatiblerx   r~   r   r   r   r   r   r   r   r   r   r   r.   propertyrP   r   r   r   r   staticmethodr   ry   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   ru      sf    












ru   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	
Expressionz:An expression that can be combined with other expressions.c           	      C   s   t | j}| j\}}|j|i |}|  |j }| jg}|D ])\}}t	|t
jr@|jr;|jr;|jjj|jf}n	t|}nt|}|||f q"t|S rq   )inspect	signaturerx   _constructor_argsbind_partialapply_defaults	argumentsitemsr   r   r   Fieldr   model_metalabeltyper   appendtuple)	r   constructor_signatureargsr   r   r  identityr   r   r   r   r   r    s   


zExpression.identityc                 C   s   t |tstS |j| jkS rq   )r   r   r   r  r@   r   r   r   __eq__  s   
zExpression.__eq__c                 C   
   t | jS rq   )hashr  r9   r   r   r   __hash__  r   zExpression.__hash__N)r!   r"   r#   r$   r   r  r  r  r   r   r   r   r     s    
r   c                 C   s<   i | ]}|t jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r   r3   r   r   r   
<dictcomp>
  s    r  c              	   C   sJ   i | ]!}|t jt jt jft jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r  r   r   r   r    s    c                 C   s    i | ]}|t jt jt jfgqS r   )r   r   r  r   r   r   r  ,  s    c                 C   s8   i | ]}t jt jt jfD ]}||t|ft||fgqqS r   )r   r   r   r   NoneType)r   r3   
field_typer   r   r   r  9  s    c                 C   s   t | | ||f dS )z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr
  )lhsr3   rhsresultr   r   r   register_combinable_fieldsl  s   	r     )maxsizec                 C   s<   t | d}|D ]\}}}t||rt||r|  S qd S )Nr   )r  r   
issubclass)r3   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_typer   r   r   _resolve_combined_type~  s   r%  c                       sZ   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z		dddZ
  ZS )r1   Nc                    s$   t  j|d || _|| _|| _d S Nrv   )superrx   r3   r  r  )r   r  r3   r  r   r   r   r   rx     s   
zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r!   r9   r   r   r   __repr__  r;   zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})r)  r  r3   r  r9   r   r   r   __str__  r   zCombinedExpression.__str__c                 C      | j | jgS rq   r  r  r9   r   r   r   r     r   z)CombinedExpression.get_source_expressionsc                 C      |\| _ | _d S rq   r-  r   r   r   r   r     r;   z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjt| jj}|d u r*td| jd| jjjj	 d| jjjj	 d| S )NzCannot infer type of z# expression involving these types: , z. You must set output_field.)
r%  r3   r	  r  r   r  r   r   r   r!   )r   r$  r   r   r   r     s   




z(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }| | j\}}|| || | | j\}}|| || d}|j| j|}|| |fS Nz(%s))compiler  r
  r   r  opscombine_expressionr3   r   r   r   r   expression_paramsr   r   expression_wrapperr   r   r   r     s   



zCombinedExpression.as_sqlTFc              	   C   s  | j |||||}| j|||||}t| ttfsz|j }W n tt	fy/   d }Y nw z|j }	W n tt	fyD   d }	Y nw d||	hv r_||	kr_t| j | j
| j|||||S h d}
| j
| jkr||
v r||	krt| j | j|||||S |  }||_||_ ||_|S )NDurationField>   	DateField	TimeFieldDateTimeField)r  r.   r  r   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r3   rC   r{   r   )r   r   r   r   r   r   r  r  r  r   datetime_fieldsr   r   r   r   r.     sZ   

	z%CombinedExpression.resolve_expressionrq   r   )r!   r"   r#   rx   r*  r+  r   r   r   r   r.   __classcell__r   r   r(  r   r1     s    r1   c                       s,   e Zd Zdd Z fddZdd Z  ZS )r;  c                 C   sR   z|j }W n	 ty   Y nw | dkr$||\}}|j||fS ||S )Nr7  )r   r   r   r1  r2  format_for_duration_arithmetic)r   sider   r   outputr   r   r   r   r   r1    s   

zDurationExpression.compilec                    s   |j jrt ||S |j|  g }g }| | j||\}}|| |	| | | j
||\}}|| |	| d}|j| j|}|| |fS r0  )featureshas_native_duration_fieldr'  r   r2  check_expression_supportr1  r  r
  r   r  combine_duration_expressionr3   r4  r(  r   r   r     s   



zDurationExpression.as_sqlc           	   	   K   s   | j ||fi |\}}| jtjtjhv rGz| jj }| jj }W n t	t
fy1   Y ||fS w h d}||vs>||vrGtd| j d||fS )N>   r   r   r   r7  zInvalid arguments for operator .)r   r3   r%   r8   rG   r  r   r   r  r=  r   r	   )	r   r   r   r   r   r   r  r   allowed_fieldsr   r   r   r      s   zDurationExpression.as_sqlite)r!   r"   r#   r1  r   r    r?  r   r   r(  r   r;    s    r;  c                       s,   e Zd Ze Z fddZdd Z  ZS )r<  c                    s   t  || j| d S rq   )r'  rx   rC   )r   r  r  r(  r   r   rx         zTemporalSubtraction.__init__c                 C   s<   |j |  || j}|| j}|j | jj ||S rq   )r2  rE  r1  r  r  subtract_temporalsr   r   )r   r   r   r  r  r   r   r   r   #  s   zTemporalSubtraction.as_sql)	r!   r"   r#   r   r7  r   rx   r   r?  r   r   r(  r   r<    s    r<  zdjango.db.models.F)pathc                   @   s\   e Zd ZdZdd Zdd Z	dd	d
Zdd Zdd Zdd Z	dd Z
dd Zdd ZdS )r   zDAn object capable of resolving references to existing query objects.c                 C   s
   || _ dS )z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   r   r   r   rx   0  s   
z
F.__init__c                 C      d | jj| jS N{}({}))r)  r   r!   r   r9   r   r   r   r*  7     z
F.__repr__NTFc                 C   s   | | j|||S rq   )resolve_refr   r   r   r   r   r   r   r   r   r   r.   :  s   zF.resolve_expressionc                 C   s   | | | S rq   )r   )r   r   r   r   r   r   ?  r   zF.replace_expressionsc                 K   r   rq   r   r   r   r   r   r   B  r;   zF.ascc                 K   r   r   r   r   r   r   r   r   E  r   zF.descc                 C   s   | j |j ko| j|jkS rq   )r   r   r@   r   r   r   r  H     zF.__eq__c                 C   r  rq   )r  r   r9   r   r   r   r  K  r   z
F.__hash__c                 C   r   rq   r   r9   r   r   r   r{   N  r   zF.copyr   )r!   r"   r#   r$   rx   r*  r.   r   r   r   r  r  r{   r   r   r   r   r   ,  s    
r   c                       s@   e Zd ZdZdZdZdd Z fddZdd Zd	d
 Z	  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                 O   rj   )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)
ValueErrorr   r  r   r   r   r   r   ]  rn   zResolvedOuterRef.as_sqlc                    s:   t  j|i |}|jrtd| j dt| jv |_|S )Nz<Referencing outer query window expression is not supported: rG  )r'  r.   r   r
   r   r   possibly_multivalued)r   r  r   colr(  r   r   r.   c  s   z#ResolvedOuterRef.resolve_expressionc                 C   r   rq   r   r   relabelsr   r   r   r   p  r   z ResolvedOuterRef.relabeled_clonec                 C   r   rq   r   r9   r   r   r   r   s  r   z"ResolvedOuterRef.get_group_by_cols)r!   r"   r#   r$   r   r   r   r.   r   r   r?  r   r   r(  r   rS  R  s    rS  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )OuterRefFc                 O   s   t | j| jr
| jS t| jS rq   )r   r   r   rS  rU  r   r   r   r.   {  s   
zOuterRef.resolve_expressionc                 C   r   rq   r   rX  r   r   r   r     r   zOuterRef.relabeled_cloneN)r!   r"   r#   r   r   r.   r   r   r   r   r   rZ  w  s
    rZ  zdjango.db.models.Funcc                       s~   e Zd ZdZdZdZdZdZdd fdd
Zdd	 Z	d
d Z
dd Zdd Z	dddZ			dddZ fddZ  ZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)r/  rv   c                   sh   | j d ur"t|| j kr"td| jj| j | j dkrdndt|f t j|d | j| | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)   argumentr  rv   )
aritylen	TypeErrorr   r!   r'  rx   r   r   extra)r   r   r   ra  r(  r   r   rx     s   	
zFunc.__init__c                 C   sl   | j dd | jD }i | j|  }|r.ddd t| D }d| jj	||S d| jj	|S )Nc                 s       | ]}t |V  qd S rq   r   r   r   r   r   r         z Func.__repr__.<locals>.<genexpr>r/  c                 s   s(    | ]\}}t |d  t | V  qdS )=Nrc  )r   keyvalr   r   r   r     s    

{}({}, {})rN  )

arg_joinerjoinr   ra  _get_repr_optionssortedr  r)  r   r!   )r   r  ra  r   r   r   r*    s   

zFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r   r9   r   r   r   rk    r   zFunc._get_repr_optionsc                 C   r   rq   r   r9   r   r   r   r        zFunc.get_source_expressionsc                 C   s
   || _ d S rq   rm  r   r   r   r   r     r   zFunc.set_source_expressionsTFc           	      C   s>   |   }||_t|jD ]\}}|||||||j|< q|S rq   )r{   r   	enumerater   r.   )	r   r   r   r   r   r   r   posr   r   r   r   r.     s   
zFunc.resolve_expressionc              	   K   s  |j |  g }g }| jD ]D}	z	||	\}
}W n. ty5   t|	dt}|tu r* |t|\}
}Y n tyF   |td\}
}Y nw |	|
 |
| qi | j|}|d urb||d< n|d| j |pq|d| j}|pz|d| j}|| |d< |d< || |fS )Nr   Tfunctiontemplateri  r   r   )r2  rE  r   r1  r   rS   r   r0   r   r
  r   ra  
setdefaultrq  r   rr  ri  rj  )r   r   r   rq  rr  ri  r   	sql_partsr   r   arg_sql
arg_paramsr   datar   r   r   r     s4   	


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S rq   )r'  r{   r   ra  )r   r{   r(  r   r   r{     s   
z	Func.copyr   )NNN)r!   r"   r#   r$   rq  rr  ri  r^  rx   r*  rk  r   r   r.   r   r{   r?  r   r   r(  r   r[    s$    


'r[  zdjango.db.models.Valuec                       sb   e Zd ZdZdZd fdd	Zdd Zdd	 Z	d fdd	Zdd Z	dd Z
edd Z  ZS )r0   z9Represent a wrapped value as a node within an expression.FNc                    s   t  j|d || _dS )a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        rv   N)r'  rx   r   )r   r   r   r(  r   r   rx     s   	
zValue.__init__c                 C   s   | j j d| jdS )N())r   r!   r   r9   r   r   r   r*    rI  zValue.__repr__c                 C   s|   |j |  | j}| j}|d ur1| jr|j||d}n|j||d}t|dr1|||||gfS |d u r9dg fS d|gfS )N)r   get_placeholderNULLz%s)	r2  rE  r   r   r   get_db_prep_saveget_db_prep_valuer/   rz  )r   r   r   rg  r   r   r   r   r      s   

zValue.as_sqlTc                    s   t  |||||}||_|S rq   )r'  r.   r   r   r(  r   r   r.     s   zValue.resolve_expressionc                 C   r   rq   r   r9   r   r   r   r     r   zValue.get_group_by_colsc                 C   s   t | jtr
t S t | jtrt S t | jtrt S t | jt	r(t
 S t | jtjr3t S t | jtjr>t S t | jtjrIt S t | jtjrTt S t | jtr^t S t | jtrht S t | jtrrt S d S rq   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimer:  dater8  timer9  	timedeltar7  r   r   bytesBinaryFieldr   	UUIDFieldr9   r   r   r   r     s.   zValue._resolve_output_fieldc                 C   r   rq   )r   r9   r   r   r   r   4  r   zValue.empty_result_set_valuerq   r   )r!   r"   r#   r$   r   rx   r*  r   r.   r   r   r   r   r?  r   r   r(  r   r0     s    r0   c                       sF   e Zd Zd fdd	Zdd Zdd Zdd	 Z	d fdd	Z  ZS )RawSQLNc                    s0   |d u rt  }||| _| _t j|d d S r&  )r   r  r   r   r'  rx   )r   r   r   r   r(  r   r   rx   :  s   zRawSQL.__init__c                 C      d | jj| j| jS Nrh  )r)  r   r!   r   r   r9   r   r   r   r*  @  rI  zRawSQL.__repr__c                 C   s   d| j  | jfS r0  )r   r   r   r   r   r   r   C  r;   zRawSQL.as_sqlc                 C      | gS rq   r   r9   r   r   r   r   F  rn  zRawSQL.get_group_by_colsTFc           
         sn   |j r-|j j D ]#}|jjD ]}| \}}	|	 | j v r+||j|||  nqq	t	 
|||||S rq   )r  r  get_parent_listlocal_fieldsget_attname_columnlowerr   rP  r   r'  r.   )
r   r   r   r   r   r   parentparent_field_column_namer(  r   r   r.   I  s   

zRawSQL.resolve_expressionrq   r   )	r!   r"   r#   rx   r*  r   r   r.   r?  r   r   r(  r   r  9  s    r  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r   r9   r   r   r   r*  \  r   zStar.__repr__c                 C   s   dg fS )Nr(   r   r   r   r   r   r   _  rt   zStar.as_sqlN)r!   r"   r#   r*  r   r   r   r   r   r  [  s    r  c                       sN   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )ColTFNc                    s,   |d u r|}t  j|d ||| _| _d S r&  )r'  rx   aliastarget)r   r  r  r   r(  r   r   rx   g  s   zCol.__init__c                 C   s>   | j | j}}|r|t|fnt|f}d| jjd|S )NrN  r/  )r  r  r   r)  r   r!   rj  )r   r  r  identifiersr   r   r   r*  m  s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}dt|j|}|g fS )NrG  )r  r  columnrj  mapquote_name_unless_alias)r   r   r   r  r  r  r   r   r   r   r   r  s   z
Col.as_sqlc                 C   s,   | j d u r| S | || j | j | j| jS rq   )r  r   r   r  r   rX  r   r   r   r   x  s
   
zCol.relabeled_clonec                 C   r  rq   r   r9   r   r   r   r     rn  zCol.get_group_by_colsc                 C   s0   | j | jkr| j|S | j|| j | S rq   )r  r   r   r   r   r   r   r     s   
zCol.get_db_convertersrq   )r!   r"   r#   r   rV  rx   r*  r   r   r   r   r?  r   r   r(  r   r  c  s    r  c                       sd   e Zd ZdZ fddZdd Zdd Zdd	 Z	dddZdd Z	dd Z
dd Zdd Z  ZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                    s   t    ||| _| _d S rq   )r'  rx   r   r   )r   r   r   r(  r   r   rx     s   
zRef.__init__c                 C   r  r  )r)  r   r!   r   r   r9   r   r   r   r*    rI  zRef.__repr__c                 C      | j gS rq   r   r9   r   r   r   r     rt   zRef.get_source_expressionsc                 C   s   |\| _ d S rq   r  r   r   r   r   r     r   zRef.set_source_expressionsNTFc                 C   r   rq   r   rQ  r   r   r   r.     s   zRef.resolve_expressionc                 C   s   | j hS rq   )r   r9   r   r   r   r     rt   zRef.get_refsc                 C   s   |   }| j||_|S rq   )r{   r   r   )r   rY  r   r   r   r   r     s   zRef.relabeled_clonec                 C   s   |j | jg fS rq   )r2  
quote_namer   r   r   r   r   r     rO  z
Ref.as_sqlc                 C   r  rq   r   r9   r   r   r   r     rn  zRef.get_group_by_colsr   )r!   r"   r#   r$   rx   r*  r   r   r.   r   r   r   r   r?  r   r   r(  r   r    s    
r  c                       s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  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                    s*   |s
t d| jj t j|i | d S )Nz$%s requires at least one expression.)rT  r   r!   r'  rx   r   r   ra  r(  r   r   rx     s
   
zExpressionList.__init__c                 C   s   | j dd | jD S )Nc                 s   rb  rq   rc  r   r   r   r   r     rd  z)ExpressionList.__str__.<locals>.<genexpr>)ri  rj  r   r9   r   r   r   r+    rR  zExpressionList.__str__c                 K   s   | j ||fi |S rq   )r   )r   r   r   r   r   r   r   r      s   zExpressionList.as_sqlitec                 C   $   g }|   D ]	}||  q|S rq   r   r   r   )r   group_by_cols	partitionr   r   r   r        z ExpressionList.get_group_by_cols)
r!   r"   r#   r$   rr  rx   r+  r    r   r?  r   r   r(  r   r    s    r  c                       s4   e Zd ZdZ fddZ fddZdd Z  ZS )OrderByListzORDER BY %(expressions)sc                    s$   dd |D }t  j|i | d S )Nc                 s   sB    | ]}t |tr|d  dkrtt|dd ddn|V  qdS )r   r'   r\  NTr   )r   r   r   r   r   r   r   r   r     s    
z'OrderByList.__init__.<locals>.<genexpr>)r'  rx   r  r(  r   r   rx     s   zOrderByList.__init__c                    s   | j sdS t j|i |S )N) r   )r   r'  r   rU  r(  r   r   r     s   zOrderByList.as_sqlc                 C   r  rq   r  )r   r  order_byr   r   r   r     r  zOrderByList.get_group_by_cols)r!   r"   r#   rr  rx   r   r   r?  r   r   r(  r   r    s
    r  z"django.db.models.ExpressionWrapperc                       sL   e Zd ZdZ fddZdd Zdd Z fdd	Zd
d Zdd Z	  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                    s   t  j|d || _d S r&  )r'  rx   r   )r   r   r   r(  r   r   rx     s   
zExpressionWrapper.__init__c                 C      |d | _ d S Nr   r   r   r   r   r   r        z(ExpressionWrapper.set_source_expressionsc                 C   r  rq   r  r9   r   r   r   r     rt   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtr| j }| j|_| S t  S rq   )r   r   r   r{   r   r   r'  r   r   r(  r   r   r     s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   | | jS rq   )r1  r   r   r   r   r   r     r   zExpressionWrapper.as_sqlc                 C   rL  rM  )r)  r   r!   r   r9   r   r   r   r*    rO  zExpressionWrapper.__repr__)r!   r"   r#   r$   rx   r   r   r   r   r*  r?  r   r   r(  r   r    s    	r  c                       sL   e Zd ZdZ fddZdd Z fddZ	
d fdd	Zdd Z  Z	S )rr   z1The logical negation of a conditional expression.c                    s   t  j|t d d S r&  )r'  rx   r   r   r  r(  r   r   rx     rR  zNegatedExpression.__init__c                 C   
   | j  S rq   )r   r{   r9   r   r   r   rs     r   zNegatedExpression.__invert__c                    s~   zt  ||\}}W n ty%   |jj}|jsY dS |td Y S w |jj}|	| j
s8d| d|fS d| |fS )N)z1=1r   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )r'  r   r   r   rC  &supports_boolean_expr_in_select_clauser1  r0   r2  0conditional_expression_supported_in_where_clauser   )r   r   r   r   r   rC  r2  r(  r   r   r     s   zNegatedExpression.as_sqlNTFc                    s.   t  |||||}t|jddstd|S )NrP   Fz*Cannot negate non-conditional expressions.)r'  r.   rS   r   r`  )r   r   r   r   r   r   resolvedr(  r   r   r.   %  s   
z$NegatedExpression.resolve_expressionc                 C   s0   |j jj}|j jjs|| jrd|}||fS NzCASE WHEN {} THEN 1 ELSE 0 END)r   r2  r  rC  r  r   r)  )r   r   r   r   $expression_supported_in_where_clauser   r   r   r   /  s   
zNegatedExpression.select_formatr   )
r!   r"   r#   r$   rx   rs   r   r.   r   r?  r   r   r(  r   rr     s    
rr   zdjango.db.models.Whenc                       sl   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
	dddZdddZdd Z  ZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                    s   |r"|d u rt di |d }}nt|ddr"t |fi |d }}|d u s.t|ddr.|r2tdt|t r=|s=tdt jd d || _| |d | _	d S )NrP   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rv   r   r   )
r   rS   r`  r   rT  r'  rx   	conditionr   r  )r   r  thenlookupsr(  r   r   rx   E  s   zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rr  r  r9   r   r   r   r+  V  r;   zWhen.__str__c                 C      d| j j| f S Nz<%s: %s>r   r!   r9   r   r   r   r*  Y  r;   zWhen.__repr__c                 C   r,  rq   r  r9   r   r   r   r   \  r   zWhen.get_source_expressionsc                 C   r.  rq   r  r   r   r   r   r   _  r;   zWhen.set_source_expressionsc                 C   s
   | j jgS rq   )r  r   r9   r   r   r   r   b  s   
zWhen.get_source_fieldsTc                 C   sJ   |   }||_t|jdr|j||||d|_|j||||||_|S )Nr.   F)r{   r   r/   r  r.   r  r   r   r   r   r.   f  s   

zWhen.resolve_expressionc                 K   sh   |j |  |}g }|| j\}}||d< || j\}	}
|	|d< |p&| j}|| g |||
R fS )Nr  r  )r2  rE  r1  r  r  rr  )r   r   r   rr  r   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramsr   r   r   r   t  s   
zWhen.as_sqlc                 C   r  rq   r  r   r   r   r   r     s   zWhen.get_group_by_colsNNr   rq   )r!   r"   r#   rr  rP   rx   r+  r*  r   r   r   r.   r   r   r?  r   r   r(  r   r  ?  s    

r  zdjango.db.models.Casec                       s   e Zd ZdZdZdZddd fdd
Zdd	 Zd
d Zdd Z	dd Z
	dddZ fddZ	dddZ fddZ  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 END N)defaultr   c                   sJ   t dd |D stdt | t|| _| |d | _|| _d S )Nc                 s   s    | ]}t |tV  qd S rq   )r   r  )r   caser   r   r   r     s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	allr`  r'  rx   listcasesr   r  ra  )r   r  r   r  ra  r(  r   r   rx     s   

zCase.__init__c                 C   s    dd dd | jD | jf S )NzCASE %s, ELSE %rr/  c                 s   rb  rq   rc  )r   r   r   r   r   r     rd  zCase.__str__.<locals>.<genexpr>)rj  r  r  r9   r   r   r   r+    s   zCase.__str__c                 C   r  r  r  r9   r   r   r   r*    r;   zCase.__repr__c                 C   s   | j | jg S rq   r  r  r9   r   r   r   r     r  zCase.get_source_expressionsc                 C   s   |^ | _ | _d S rq   r  r   r   r   r   r     rO  zCase.set_source_expressionsTFc           	      C   sT   |   }||_t|jD ]\}}|||||||j|< q|j||||||_|S rq   )r{   r   ro  r  r.   r  )	r   r   r   r   r   r   r   rp  r  r   r   r   r.     s   

zCase.resolve_expressionc                    s   t   }|jd d  |_|S rq   )r'  r{   r  )r   r   r(  r   r   r{     s   
z	Case.copyc              	   K   s   |j |  | js|| jS i | j|}g }g }|| j\}	}
| jD ]0}z	||\}}W n ty9   Y q% tyJ   ||j\}	}
Y  nw |	| |
| q%|s\|	|
fS |p`| j}|||d< |	|d< |
|
 |py|d| j}|| }| jd ur|j | j| }||fS )Nr  r  rr  )r2  rE  r  r1  r  ra  r   r   r  r
  r   case_joinerrj  r   rr  r   unification_cast_sqlr   )r   r   r   rr  r  r   r  
case_partsr  default_sqldefault_paramsr  case_sqlcase_paramsr   r   r   r   r     s:   




zCase.as_sqlc                    s   | j s| j S t  S rq   )r  r  r   r'  r9   r(  r   r   r     s   

zCase.get_group_by_colsr   r  )r!   r"   r#   r$   rr  r  rx   r+  r*  r   r   r.   r{   r   r   r?  r   r   r(  r   r    s    

 r  c                       s|   e Zd ZdZdZdZdZdZd fdd	Zdd	 Z	d
d Z
dd Z fddZedd Zdd ZdddZdd Z  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                    s0   t |d| | _d| j_|| _t | d S )Nr   T)rS   r   r   r   ra  r'  rx   )r   querysetr   ra  r(  r   r   rx     s   zSubquery.__init__c                 C   r  rq   r   r9   r   r   r   r     rt   zSubquery.get_source_expressionsc                 C   r  r  r  r   r   r   r   r     r  zSubquery.set_source_expressionsc                 C      | j jS rq   )r   r   r9   r   r   r   r     rt   zSubquery._resolve_output_fieldc                    s   t   }|j |_|S rq   )r'  r{   r   r   )r   r   r(  r   r   r{     r   zSubquery.copyc                 C   r  rq   )r   external_aliasesr9   r   r   r   r    s   zSubquery.external_aliasesc                 C   r  rq   )r   get_external_colsr9   r   r   r   r    r   zSubquery.get_external_colsc           	      K   s^   |j |  i | j|}| j||\}}|dd |d< |p&|d| j}|| }||fS )Nr\  r6   r   rr  )r2  rE  ra  r   r   r   rr  )	r   r   r   rr  r   r  subquery_sqlr  r   r   r   r   r     s   zSubquery.as_sqlc                 C   s   | j j| dS )N)wrapper)r   r   r9   r   r   r   r     r  zSubquery.get_group_by_colsrq   )r!   r"   r#   r$   rr  r   r   r   rx   r   r   r   r{   r   r  r  r   r   r?  r   r   r(  r   r    s     


r  c                       s4   e Zd ZdZe ZdZ fddZdd Z	  Z
S )ExistszEXISTS(%(subquery)s)Fc                    s$   t  j|fi | | j | _d S rq   )r'  rx   r   exists)r   r  r   r(  r   r   rx   &  s   zExists.__init__c                 C   s   |j jjs
d|}||fS r  )r   rC  r  r)  r   r   r   r   r   *  s   

zExists.select_format)r!   r"   r#   rr  r   r   r   r   rx   r   r?  r   r   r(  r   r  !  s    r  zdjango.db.models.OrderByc                   @   sh   e Zd ZdZdZdddZdd Zdd	 Zd
d ZdddZ	dd Z
dd Zdd Zdd Zdd ZdS )r   z%(expression)s %(ordering)sFNc                 C   s^   |r|rt d|du s|du rtjdtdd || _|| _|| _t|ds*t d|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFzNPassing nulls_first=False or nulls_last=False is deprecated, use None instead.   )
stacklevelr.   z%expression must be an expression type)	rT  warningswarnr   nulls_first
nulls_lastr   r/   r   )r   r   r   r  r  r   r   r   rx   8  s   

zOrderBy.__init__c                 C   r  )Nz{}({}, descending={}))r)  r   r!   r   r   r9   r   r   r   r*  M  s   zOrderBy.__repr__c                 C   r  r  r  r   r   r   r   r   R  r  zOrderBy.set_source_expressionsc                 C   r  rq   r  r9   r   r   r   r   U  rt   zOrderBy.get_source_expressionsc                 K   s   |p| j }|jjr| jrd| }n%| jrd| }n| jr(| jr#|jjs(d| }n| jr6| js2|jjs6d| }|j|  |	| j
\}}|| jrJdndd|}||d9 }||  |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)r   orderingz%(expression)s)rr  rC   supports_order_by_nulls_modifierr  r  r   order_by_nulls_firstr2  rE  r1  r   countrstrip)r   r   r   rr  r   expression_sqlr   placeholdersr   r   r   r   X  s8   


zOrderBy.as_sqlc                 C   sF   |j | jr|  }tt| jdddd|_|||S | ||S )NT)r  F)r  )r2  r  r   r{   r  r  r   )r   r   r   r{   r   r   r   	as_oracler  s   zOrderBy.as_oraclec                 C   r  rq   r  r   r   r   r   r     r  zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rc   )r   r  r  r9   r   r   r   r     s   
zOrderBy.reverse_orderingc                 C   
   d| _ d S r=   r  r9   r   r   r   r     r   zOrderBy.ascc                 C   r  rc   r  r9   r   r   r   r     r   zOrderBy.desc)FNNrq   )r!   r"   r#   rr  rP   rx   r*  r   r   r   r  r   r   r   r   r   r   r   r   r   3  s    


r   c                       sx   e Zd ZdZdZdZ				d fdd	Zdd Zd	d
 Zdd Z	dddZ
 fddZdd Zdd Zdd Z  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                    s   || _ || _|| _t|ddstd|jj | j d ur/t| j tt	fs)| j f| _ t
| j  | _ | jd urVt| jt	tfrCt| j | _nt| jttfrRt| j| _ntdt j|d | |d | _d S )Nr   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.rv   r   )partition_byr  framerS   rT  r   r!   r   r  r  r  r  ru   r   r'  rx   r   source_expression)r   r   r  r  r  r   r(  r   r   rx     s.   


zWindow.__init__c                 C   r  rq   )r  r   r9   r   r   r   r     rt   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rq   r  r  r  r  r9   r   r   r   r     r   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rq   r  r   r   r   r   r     rR  zWindow.set_source_expressionsc                 C   s   |j |  |jjstd|| j\}}g d}}| jd ur6| jj||dd\}}	|	| |t
|	7 }| jd urN|| j\}
}|	|
 |t
|7 }| jrd|| j\}}|	| |t
|7 }|ph| j}||d| d g ||R fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r   rr  r  )r   window)r2  rE  rC  supports_over_clauser
   r1  r  r  r   r
  r  r  r  rr  rj  strip)r   r   r   rr  expr_sqlr   
window_sqlwindow_paramssql_exprr  	order_sqlorder_params	frame_sqlframe_paramsr   r   r   r     s2   







zWindow.as_sqlc                    sT   t | jtjr$|  }| }t |d _|| tt	|
||S | ||S r  )r   r   r   r   r{   r   r   r   r'  r  r    r   )r   r   r   r{   r   r(  r   r   r      s   
zWindow.as_sqlitec                 C   s>   d t| j| jrdt| j ndt| jpdt| jpdS )Nz{} OVER ({}{}{})zPARTITION BY r  )r)  r   r  r  r  r  r9   r   r   r   r+    s   zWindow.__str__c                 C   r  r  r  r9   r   r   r   r*    r;   zWindow.__repr__c                 C   s8   g }| j r|| j   | jd ur|| j  |S rq   )r  r   r   r  )r   r  r   r   r   r     s   
zWindow.get_group_by_cols)NNNNrq   )r!   r"   r#   rr  r   r   rx   r   r   r   r   r    r+  r*  r   r?  r   r   r(  r   r    s"    $
!
r  c                   @   sV   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z,%(frame_type)s BETWEEN %(start)s AND %(end)sNc                 C   s   t || _t || _d S rq   )r0   startendr   r   r  r   r   r   rx     s   
zWindowFrame.__init__c                 C   r.  rq   r   r  r   r   r   r   r     r;   z"WindowFrame.set_source_expressionsc                 C   r,  rq   r  r9   r   r   r   r     r   z"WindowFrame.get_source_expressionsc                 C   s>   |j |  | || jj| jj\}}| j| j||d g fS )N
frame_typer   r  )r2  rE  window_frame_start_endr   r   r  rr  r  )r   r   r   r   r  r   r   r   r      s   zWindowFrame.as_sqlc                 C   r  r  r  r9   r   r   r   r*  /  r;   zWindowFrame.__repr__c                 C   r   rq   r   r9   r   r   r   r   2  r   zWindowFrame.get_group_by_colsc                 C   s   | j jd ur| j jdk rdt| j jtjjf }n| j jd ur*| j jdkr*tjj}ntjj}| jjd urE| jjdkrEd| jjtjj	f }n| jjd urV| jjdkrVtjj}ntjj
}| j| j||d S )Nr   z%d %sr  )r   r   absr   r2  	PRECEDINGCURRENT_ROWUNBOUNDED_PRECEDINGr  	FOLLOWINGUNBOUNDED_FOLLOWINGrr  r  r  r   r   r   r+  5  s   

zWindowFrame.__str__c                 C   rj   )Nz3Subclasses must implement window_frame_start_end().rl   r   r   r   r  r   r   r   r  I  rt   z"WindowFrame.window_frame_start_endr  )r!   r"   r#   r$   rr  rx   r   r   r   r*  r   r+  r  r   r   r   r   r    s    
r  c                   @   r   )RowRangeROWSc                 C      |j ||S rq   )r2  window_frame_rows_start_endr  r   r   r   r  P  r  zRowRange.window_frame_start_endNr!   r"   r#   r  r  r   r   r   r   r  M      r  c                   @   r   )
ValueRangeRANGEc                 C   r  rq   )r2  window_frame_range_start_endr  r   r   r   r  W  r  z!ValueRange.window_frame_start_endNr  r   r   r   r   r  T  r  r  )\r{   r  	functoolsr   r  collectionsr   decimalr   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.deprecationr   django.utils.functionalr   django.utils.hashabler   r   r%   ru   r   r	  r  r?   rC   r8   rG   rJ   rM   rW   ra   rY   r[   r^   r8  r7  r:  r9  _connector_combinationsr  r  r  dr  r3   field_typesr  r  r  	lru_cacher%  r1   r;  r<  r   rS  rZ  r[  r0   r  r  r  r  r  r  r  rr   r  r  r  r  r   r  r  r  r  r   r   r   r   <module>   s       9%a

	b3%%dO"') 3K`5ctB