U
    [+d                     @   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 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)fD dd e!j,e!j-e!j.e!j/e!j0fD dd e!j&e!j'e!j(e!j)e!j*e!j+fD e!j&ej1ej2ej3fej3ej2ej3fej2ej1ej3fej2ej3ej3fej2ej2ej2fej4ej2ej4fej2ej4ej4fgie!j'ej1ej2ej3fej3ej2ej3fej1ej1ej2fej1ej3ej2fej3ej1ej2fej3ej3ej2fej2ej2ej2fej4ej2ej4fej4ej4ej2fg	igZ5ee6Z7dd Z8e5D ]:Z9e9: D ]*\Z;Z<e<D ]\Z=Z>Z?e8e=e;e>e? qqqej@dddd  ZAG d!d" d"e e#ZBG d#d$ d$eBZCG d%d& d&eBZDed'd(G d)d* d*e!ZEG d+d, d,eEZFG d-d. d.eEZGed/d(G d0d1 d1e e#ZHed2d(G d3d4 d4e e#ZIG d5d6 d6e#ZJG d7d8 d8e#ZKG d9d: d:e#ZLG d;d< d<e#ZMG d=d> d>eHZNG d?d@ d@eHZOedAd(G dBdC dCe e#ZPedDd(G dEdF dFe#ZQedGd(G dHdI dIe e#ZRG dJdK dKe"e!ZSG dLdM dMeSZTedNd(G dOdP dPe#ZUG dQdR dRe e#ZVG dSdT dTe#ZWG dUdV dVeWZXG dWdX dXeWZYdS )Y    N)defaultdictDecimal)UUID)EmptyResultSet
FieldError)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)RemovedInDjango50Warning)cached_property)make_hashablec                   @   s   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   sL   | j ||f|\}}z| j dkr,d| }W n tk
rB   Y nX ||fS )NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr
   extra_contextsqlparams r   @/tmp/pip-unpacked-wheel-n7e__lmp/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?S )@
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r3   MULr   r   r   r   __neg__K   s    zCombinable.__neg__c                 C   s   |  || jdS NFr3   ADDr   r0   r   r   r   __add__N   s    zCombinable.__add__c                 C   s   |  || jdS r9   r3   SUBr<   r   r   r   __sub__Q   s    zCombinable.__sub__c                 C   s   |  || jdS r9   r5   r<   r   r   r   __mul__T   s    zCombinable.__mul__c                 C   s   |  || jdS r9   r3   DIVr<   r   r   r   __truediv__W   s    zCombinable.__truediv__c                 C   s   |  || jdS r9   r3   MODr<   r   r   r   __mod__Z   s    zCombinable.__mod__c                 C   s   |  || jdS r9   r3   POWr<   r   r   r   __pow__]   s    zCombinable.__pow__c                 C   s4   t | ddr(t |ddr(t| t|@ S tdd S NconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorr<   r   r   r   __and__`   s
    zCombinable.__and__c                 C   s   |  || jdS r9   )r3   BITANDr<   r   r   r   bitandg   s    zCombinable.bitandc                 C   s   |  || jdS r9   )r3   BITLEFTSHIFTr<   r   r   r   bitleftshiftj   s    zCombinable.bitleftshiftc                 C   s   |  || jdS r9   )r3   BITRIGHTSHIFTr<   r   r   r   bitrightshiftm   s    zCombinable.bitrightshiftc                 C   s4   t | ddr(t |ddr(t| t|A S tdd S rK   rN   r<   r   r   r   __xor__p   s
    zCombinable.__xor__c                 C   s   |  || jdS r9   )r3   BITXORr<   r   r   r   bitxorw   s    zCombinable.bitxorc                 C   s4   t | ddr(t |ddr(t| t|B S tdd S rK   rN   r<   r   r   r   __or__z   s
    zCombinable.__or__c                 C   s   |  || jdS r9   )r3   BITORr<   r   r   r   bitor   s    zCombinable.bitorc                 C   s   |  || jdS NTr:   r<   r   r   r   __radd__   s    zCombinable.__radd__c                 C   s   |  || jdS r^   r>   r<   r   r   r   __rsub__   s    zCombinable.__rsub__c                 C   s   |  || jdS r^   r5   r<   r   r   r   __rmul__   s    zCombinable.__rmul__c                 C   s   |  || jdS r^   rB   r<   r   r   r   __rtruediv__   s    zCombinable.__rtruediv__c                 C   s   |  || jdS r^   rE   r<   r   r   r   __rmod__   s    zCombinable.__rmod__c                 C   s   |  || jdS r^   rH   r<   r   r   r   __rpow__   s    zCombinable.__rpow__c                 C   s   t dd S NrM   rP   r<   r   r   r   __rand__   s    zCombinable.__rand__c                 C   s   t dd S re   rf   r<   r   r   r   __ror__   s    zCombinable.__ror__c                 C   s   t dd S re   rf   r<   r   r   r   __rxor__   s    zCombinable.__rxor__N)(r   r    r!   r"   r;   r?   r6   rC   rI   rF   rR   r\   rT   rV   rY   r3   r8   r=   r@   rA   rD   rG   rJ   rQ   rS   rU   rW   rX   rZ   r[   r]   r_   r`   ra   rb   rc   rd   rg   rh   ri   r   r   r   r   r#   %   sJ   r#   c                   @   sF  e Zd ZdZeZdZdZdZdZ	dCd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dDd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-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$dEd5d6Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dS )FBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d k	r|| _ d S N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__   s    
zBaseExpression.__getstate__c                 C   s$   | j | jkrg n| j g| j| S rk   )ro   _convert_value_noopr   get_db_convertersr   r
   r   r   r   rv      s
    

z BaseExpression.get_db_convertersc                 C   s   g S rk   r   r7   r   r   r   get_source_expressions   s    z%BaseExpression.get_source_expressionsc                 C   s   |rt d S rk   )AssertionErrorr   exprsr   r   r   set_source_expressions   s    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Fr.   .0argr   r   r   
<listcomp>   s   z5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   expressionsr   r   r   _parse_expressions   s    z!BaseExpression._parse_expressionsc                 C   s   t ddS )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()Nrf   r   r   r
   r   r   r   r      s    zBaseExpression.as_sqlc                 C   s   t dd |  D S )Nc                 s   s   | ]}|o|j V  qd S rk   )contains_aggregater   exprr   r   r   	<genexpr>   s    z4BaseExpression.contains_aggregate.<locals>.<genexpr>anyrx   r7   r   r   r   r      s    z!BaseExpression.contains_aggregatec                 C   s   t dd |  D S )Nc                 s   s   | ]}|o|j V  qd S rk   )contains_over_clauser   r   r   r   r      s    z6BaseExpression.contains_over_clause.<locals>.<genexpr>r   r7   r   r   r   r      s    z#BaseExpression.contains_over_clausec                 C   s   t dd |  D S )Nc                 s   s   | ]}|o|j V  qd S rk   )contains_column_referencesr   r   r   r   r      s   z<BaseExpression.contains_column_references.<locals>.<genexpr>r   r7   r   r   r   r      s    z)BaseExpression.contains_column_referencesc                    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 rk   r}   r   allow_joinsqueryreuse	summarizer   r   r     s   z5BaseExpression.resolve_expression.<locals>.<listcomp>)rq   
is_summaryr|   rx   r   r   r   r   r   for_savecr   r   r   r,      s    z!BaseExpression.resolve_expressionc                 C   s   t | jtjS rk   )r~   r   r   BooleanFieldr7   r   r   r   rL     s    zBaseExpression.conditionalc                 C   s   | j S rk   rl   r7   r   r   r   field   s    zBaseExpression.fieldc                 C   s"   |   }|dk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   rm   r   r   r   r   $  s
    zBaseExpression.output_fieldc                 C   s*   z| j W S  tk
r$   | js  Y nX dS )z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r   r7   r   r   r   _output_field_or_none-  s
    z$BaseExpression._output_field_or_nonec                 C   sT   dd |   D }|D ]8}|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 k	r|V  qd S rk   r   )r   sourcer   r   r   r   G  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   Zsources_iterr   r   r   r   r   r   9  s    z$BaseExpression._resolve_output_fieldc                 C   s   | S rk   r   value
expressionr
   r   r   r   ru   W  s    z"BaseExpression._convert_value_noopc                 C   sF   | j }| }|dkrdd S |dr0d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   s   | d krd S t | S rk   )floatr   r   r   r   <lambda>f  s    z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   s   | d krd S t | S rk   )intr   r   r   r   r   l  s    r   c                 S   s   | d krd S t | S rk   r   r   r   r   r   r   r  s    )r   r   endswithru   )r   r   Zinternal_typer   r   r   ro   [  s    
zBaseExpression.convert_valuec                 C   s   | j |S rk   )r   
get_lookup)r   lookupr   r   r   r   x  s    zBaseExpression.get_lookupc                 C   s   | j |S rk   )r   get_transformr   namer   r   r   r   {  s    zBaseExpression.get_transformc                    s(   |   }| fdd|  D  |S )Nc                    s"   g | ]}|d k	r|  nd qS rk   )relabeled_cloner   e
change_mapr   r   r     s   z2BaseExpression.relabeled_clone.<locals>.<listcomp>rq   r|   rx   )r   r   cloner   r   r   r   ~  s    
zBaseExpression.relabeled_clonec                    s(   |   }| fdd|  D  |S )Nc                    s   g | ]}|  qS r   )replace_referencesr   references_mapr   r   r     s   z5BaseExpression.replace_references.<locals>.<listcomp>r   )r   r   r   r   r   r   r     s    
z!BaseExpression.replace_referencesc                 C   s
   t  | S rk   )rq   r7   r   r   r   rq     s    zBaseExpression.copyc                    s(   |   }| fdd|  D  |S )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 rk   )r   rx   extendget_group_by_colsr   alias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>)rx   r7   r   r   r   r     s    z BaseExpression.get_source_fieldsc                 K   s   t | f|S rk   OrderByr   kwargsr   r   r   asc  s    zBaseExpression.ascc                 K   s   t | fddi|S N
descendingTr   r   r   r   r   desc  s    zBaseExpression.descc                 C   s   | S rk   r   r7   r   r   r   reverse_ordering  s    zBaseExpression.reverse_orderingc                 c   s<   | V  |   D ](}|rt|dr0| E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)rx   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_format)N)NTNFF)N),r   r    r!   r"   NotImplementedempty_result_set_valuer   r   
filterablewindow_compatiblern   rt   rv   rx   r|   r   r   r   r   r   r   r,   propertyrL   r   r   r   r   staticmethodru   ro   r   r   r   r   rq   r   r   r   r   r   r   r   r   r   r   r   r   rj      sf   



         









rj   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||}|  |j }| jg}|D ]R\}}t	|t
jr||jrr|jrr|jjj|jf}qt|}nt|}|||f q@t|S rk   )inspect	signaturern   Z_constructor_argsbind_partialapply_defaults	argumentsitemsr   r~   r   Fieldr   model_metalabeltyper   appendtuple)	r   Z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 rk   )r~   r   r   r   r<   r   r   r   __eq__  s    
zExpression.__eq__c                 C   s
   t | jS rk   )hashr   r7   r   r   r   __hash__  s    zExpression.__hash__N)r   r    r!   r"   r   r   r   r   r   r   r   r   r     s
   
r   c                 C   s<   i | ]4}|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   r1   r   r   r   
<dictcomp>  s   r   c              	   C   sJ   i | ]B}|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 | ]0}t jt jt jfD ]}||t|ft||fgqqS r   )r   r   r   r   NoneType)r   r1   Z
field_typer   r   r   r   %  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   )lhsr1   rhsresultr   r   r   register_combinable_fieldsX  s    	r      )maxsizec                 C   s<   t | d}|D ]&\}}}t||rt||r|  S qd S )Nr   )r   get
issubclass)r1   lhs_typerhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typecombined_typer   r   r   _resolve_combined_typej  s     r   c                       sX   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 )r/   Nc                    s$   t  j|d || _|| _|| _d S Nrl   )superrn   r1   r   r   )r   r   r1   r   r   r   r   r   rn   u  s    zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r   r7   r   r   r   __repr__{  s    zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})r   r   r1   r   r7   r   r   r   __str__~  s    zCombinedExpression.__str__c                 C   s   | j | jgS rk   r   r   r7   r   r   r   rx     s    z)CombinedExpression.get_source_expressionsc                 C   s   |\| _ | _d S rk   r   rz   r   r   r   r|     s    z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjt| jj}|d krTt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   r1   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   opsZcombine_expressionr1   r   r   r
   r   Zexpression_paramsr   r   Z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k
rb   d }Y nX z|j }	W n tt	fk
r   d }	Y nX d||	hkr||	krt| j | j
| j|||||S dddh}
| j
| jkr||
kr||	krt| j | j|||||S |  }||_||_ ||_|S )NDurationField	DateFieldDateTimeField	TimeField)r   r,   r   r~   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r1   r?   rq   r   )r   r   r   r   r   r   r   r   r   r   Zdatetime_fieldsr   r   r   r   r,     sl            

  	

z%CombinedExpression.resolve_expression)N)NTNFF)r   r    r!   rn   r   r   rx   r|   r   r   r,   __classcell__r   r   r   r   r/   t  s            r/   c                       s,   e Zd Zdd Z fddZdd Z  ZS )r  c                 C   sT   z
|j }W n tk
r   Y n,X | dkrJ||\}}|j||fS ||S )Nr  )r   r   r   r   r   Zformat_for_duration_arithmetic)r   Zsider   r
   outputr   r   r   r   r   r     s    
zDurationExpression.compilec                    s   |j jrt ||S |j|  g }g }| | j||\}}|| |	| | | j
||\}}|| |	| d}|j| j|}|| |fS r   )featuresZhas_native_duration_fieldr   r   r   check_expression_supportr   r   r   r   r   Zcombine_duration_expressionr1   r  r   r   r   r     s    



zDurationExpression.as_sqlc           	   	   K   s   | j ||f|\}}| jtjtjhkrz| jj }| jj }W n t	t
fk
rZ   Y n0X ddddh}||ksx||krtd| j d||fS )Nr   r  r   r   zInvalid arguments for operator .)r   r1   r#   r6   rC   r   r   r   r   r  r   r   )	r   r   r
   r   r   r   r   r   Zallowed_fieldsr   r   r   r     s"    zDurationExpression.as_sqlite)r   r    r!   r   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 rk   )r   rn   r?   )r   r   r   r   r   r   rn     s    zTemporalSubtraction.__init__c                 C   s<   |j |  || j}|| j}|j | jj ||S rk   )r   r  r   r   r   Zsubtract_temporalsr   r   )r   r   r
   r   r   r   r   r   r     s    
  zTemporalSubtraction.as_sql)	r   r    r!   r   r  r   rn   r   r	  r   r   r   r   r  	  s   r  zdjango.db.models.F)pathc                   @   sR   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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   rn     s    z
F.__init__c                 C   s   d | jj| jS N{}({}))r   r   r   r   r7   r   r   r   r   #  s    z
F.__repr__NTFc                 C   s   | | j|||S rk   )resolve_refr   r   r   r   r   r   r   r   r   r   r,   &  s    zF.resolve_expressionc                 C   s   | | j| S rk   )r   r   )r   r   r   r   r   r   +  s    zF.replace_referencesc                 K   s   t | f|S rk   r   r   r   r   r   r   .  s    zF.ascc                 K   s   t | fddi|S r   r   r   r   r   r   r   1  s    zF.descc                 C   s   | j |j ko| j|jkS rk   )r   r   r<   r   r   r   r   4  s    zF.__eq__c                 C   s
   t | jS rk   )r   r   r7   r   r   r   r   7  s    z
F.__hash__)NTNFF)r   r    r!   r"   rn   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d Z fddZdd Zd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   s   t dd S )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   E  s    zResolvedOuterRef.as_sqlc                    s   t  j||}t| jk|_|S rk   )r   r,   r   r   possibly_multivalued)r   r   r   colr   r   r   r,   K  s    z#ResolvedOuterRef.resolve_expressionc                 C   s   | S rk   r   r   Zrelabelsr   r   r   r   S  s    z ResolvedOuterRef.relabeled_cloneNc                 C   s   g S rk   r   r   r   r   r   r   r   V  s    z"ResolvedOuterRef.get_group_by_cols)N)
r   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d Zdd ZdS )OuterRefFc                 O   s   t | j| jr| jS t| jS rk   )r~   r   r   r  r  r   r   r   r,   ]  s    zOuterRef.resolve_expressionc                 C   s   | S rk   r   r  r   r   r   r   b  s    zOuterRef.relabeled_cloneN)r   r    r!   r   r,   r   r   r   r   r   r  Z  s   r  zdjango.db.models.Funcc                       sv   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   rl   c                   sh   | j d k	rDt|| j krDtd| jj| j | j dkr4dndt|f t j|d | j| | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)   argumentr   rl   )
aritylen	TypeErrorr   r   r   rn   r   source_expressionsextra)r   r   r   r"  r   r   r   rn   o  s    	zFunc.__init__c                 C   sh   | j dd | jD }| j|  }|rXddd t| D }d| jj	||S d| jj	|S )Nc                 s   s   | ]}t |V  qd S rk   r   r   r   r   r   r     s     z Func.__repr__.<locals>.<genexpr>r   c                 s   s&   | ]\}}t |d  t | V  qdS )=Nr#  )r   keyvalr   r   r   r     s    
{}({}, {})r  )

arg_joinerjoinr!  r"  _get_repr_optionssortedr   r   r   r   )r   r   r"  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   r7   r   r   r   r*    s    zFunc._get_repr_optionsc                 C   s   | j S rk   r!  r7   r   r   r   rx     s    zFunc.get_source_expressionsc                 C   s
   || _ d S rk   r,  rz   r   r   r   r|     s    zFunc.set_source_expressionsTFc           	      C   s>   |   }||_t|jD ] \}}|||||||j|< q|S rk   )rq   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 ]h}	z||	\}
}W n< tk
rl   t|	dt}|tkrV |t|\}
}Y nX ||
 |	| q| j
|}|d k	r||d< n|d| j |p|d| j}|p|d| j}|| |d< |d< || |fS )Nr   functiontemplater(  r   r   )r   r  r!  r   r   rO   r   r.   r   r   r"  
setdefaultr/  r   r0  r(  r)  )r   r   r
   r/  r0  r(  r   Z	sql_partsr   r   Zarg_sqlZ
arg_paramsr   datar   r   r   r     s2    	
  


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S rk   )r   rq   r!  r"  )r   rq   r   r   r   rq     s    
z	Func.copy)NTNFF)NNN)r   r    r!   r"   r/  r0  r(  r  rn   r   r*  rx   r|   r,   r   rq   r	  r   r   r   r   r  f  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dZ	dd Z
edd Z  ZS )r.   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().
        rl   N)r   rn   r   )r   r   r   r   r   r   rn     s    	zValue.__init__c                 C   s   | j j d| jdS )N())r   r   r   r7   r   r   r   r     s    zValue.__repr__c                 C   s|   |j |  | j}| j}|d k	rb| jr6|j||d}n|j||d}t|drb|||||gfS |d krrdg fS d|gfS )N)r
   get_placeholderZNULLz%s)	r   r  r   r   r   Zget_db_prep_saveZget_db_prep_valuer-   r5  )r   r   r
   r&  r   r   r   r   r     s    
zValue.as_sqlTc                    s   t  |||||}||_|S rk   )r   r,   r   r   r   r   r   r,     s    zValue.resolve_expressionc                 C   s   g S rk   r   r  r   r   r   r     s    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	rPt
 S t | jtjrft S t | jtjr|t S t | jtjrt S t | jtjrt S t | jtrt S t | jtrt S t | jtrt S d S rk   )r~   r   r   r   Z	CharFieldboolr   r   r   r   r   datetimer  dater  timer  	timedeltar  r   r   bytesZBinaryFieldr   Z	UUIDFieldr7   r   r   r   r     s,    zValue._resolve_output_fieldc                 C   s   | j S rk   )r   r7   r   r   r   r     s    zValue.empty_result_set_value)N)NTNFF)N)r   r    r!   r"   r   rn   r   r   r,   r   r   r   r   r	  r   r   r   r   r.     s            
r.   c                       sF   e Zd Zd fdd	Zdd Zdd Zddd	Zd fdd	Z  ZS )RawSQLNc                    s0   |d krt  }|| | _| _t j|d d S r   )r   r   r   r   r   rn   )r   r   r   r   r   r   r   rn     s    zRawSQL.__init__c                 C   s   d | jj| j| jS Nr'  )r   r   r   r   r   r7   r   r   r   r      s    zRawSQL.__repr__c                 C   s   d| j  | jfS r   )r   r   r   r   r   r   r   #  s    zRawSQL.as_sqlc                 C   s   | gS rk   r   r  r   r   r   r   &  s    zRawSQL.get_group_by_colsTFc           
         sn   |j rZ|j j D ]F}|jjD ]8}| \}}	|	 | j kr||j|||  qqqt	 
|||||S rk   )r   r   Zget_parent_listZlocal_fieldsZget_attname_columnlowerr   r  r   r   r,   )
r   r   r   r   r   r   parentZparent_field_Zcolumn_namer   r   r   r,   )  s&           zRawSQL.resolve_expression)N)N)NTNFF)	r   r    r!   rn   r   r   r   r,   r	  r   r   r   r   r<    s   
         r<  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r   r7   r   r   r   r   <  s    zStar.__repr__c                 C   s   dg fS )Nr&   r   r   r   r   r   r   ?  s    zStar.as_sqlN)r   r    r!   r   r   r   r   r   r   rA  ;  s   rA  c                       sP   e 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	dd Z
  ZS )ColTFNc                    s,   |d kr|}t  j|d || | _| _d S r   )r   rn   r   target)r   r   rC  r   r   r   r   rn   G  s    zCol.__init__c                 C   s>   | j | j }}|r|t|fnt|f}d| jjd|S )Nr  r   )r   rC  r   r   r   r   r)  )r   r   rC  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 )Nr  )r   rC  columnr)  mapZquote_name_unless_alias)r   r   r
   r   rE  rD  r   r   r   r   r   R  s    z
Col.as_sqlc                 C   s,   | j d kr| S | || j | j | j| jS rk   )r   r   r   rC  r   r  r   r   r   r   X  s    
  zCol.relabeled_clonec                 C   s   | gS rk   r   r  r   r   r   r   _  s    zCol.get_group_by_colsc                 C   s0   | j | jkr| j|S | j|| j | S rk   )rC  r   rv   rw   r   r   r   rv   b  s    
zCol.get_db_converters)N)N)r   r    r!   r   r  rn   r   r   r   r   rv   r	  r   r   r   r   rB  C  s   
rB  c                       s\   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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 rk   )r   rn   refsr   )r   rH  r   r   r   r   rn   p  s    
zRef.__init__c                 C   s   d | jj| j| jS r=  )r   r   r   rH  r   r7   r   r   r   r   t  s    zRef.__repr__c                 C   s   | j gS rk   r   r7   r   r   r   rx   w  s    zRef.get_source_expressionsc                 C   s   |\| _ d S rk   rI  rz   r   r   r   r|   z  s    zRef.set_source_expressionsNTFc                 C   s   | S rk   r   r  r   r   r   r,   }  s    zRef.resolve_expressionc                 C   s   | S rk   r   r  r   r   r   r     s    zRef.relabeled_clonec                 C   s   |j | jg fS rk   )r   Z
quote_namerH  r   r   r   r   r     s    z
Ref.as_sqlc                 C   s   | gS rk   r   r  r   r   r   r     s    zRef.get_group_by_cols)NTNFF)N)r   r    r!   r"   rn   r   rx   r|   r,   r   r   r   r	  r   r   r   r   rG  j  s            
rG  c                       s4   e Zd ZdZdZ f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|| d S )Nz$%s requires at least one expression.)r  r   r   r   rn   r   r   r"  r   r   r   rn     s
    
zExpressionList.__init__c                 C   s   | j dd | jD S )Nc                 s   s   | ]}t |V  qd S rk   r#  r   r   r   r   r     s     z)ExpressionList.__str__.<locals>.<genexpr>)r(  r)  r!  r7   r   r   r   r     s    zExpressionList.__str__c                 K   s   | j ||f|S rk   )r   )r   r   r
   r   r   r   r   r     s    zExpressionList.as_sqlite)	r   r    r!   r"   r0  rn   r   r   r	  r   r   r   r   rJ    s
   rJ  c                       s,   e Zd ZdZ fddZ fddZ  ZS )OrderByListzORDER BY %(expressions)sc                    s    dd |D }t  j|| d S )Nc                 s   s@   | ]8}t |tr4|d  dkr4t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   rn   rK  r   r   r   rn     s    zOrderByList.__init__c                    s   | j s
dS t j||S )N) r   )r!  r   r   r  r   r   r   r     s    zOrderByList.as_sql)r   r    r!   r0  rn   r   r	  r   r   r   r   rL    s   rL  z"django.db.models.ExpressionWrapperc                       sN   e Zd ZdZ fddZdd Zdd Zd 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   rn   r   )r   r   r   r   r   r   rn     s    zExpressionWrapper.__init__c                 C   s   |d | _ d S Nr   r   rz   r   r   r   r|     s    z(ExpressionWrapper.set_source_expressionsc                 C   s   | j gS rk   rQ  r7   r   r   r   rx     s    z(ExpressionWrapper.get_source_expressionsNc                    s4   t | jtr*| j }| j|_|j|dS t  S )N)r   )r~   r   r   rq   r   r   r   )r   r   r   r   r   r   r     s
    
z#ExpressionWrapper.get_group_by_colsc                 C   s   | | jS rk   )r   r   r   r   r   r   r     s    zExpressionWrapper.as_sqlc                 C   s   d | jj| jS r  )r   r   r   r   r7   r   r   r   r     s    zExpressionWrapper.__repr__)N)r   r    r!   r"   rn   r|   rx   r   r   r   r	  r   r   r   r   rO    s   	rO  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dZ  ZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                    s   |r<|d krt f |d  }}nt|ddr<t |f|d  }}|d ksTt|ddrT|r\tdt|t rr|srtdt jd d || _| |d | _	d S )NrL   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rl   r   )
r   rO   r   r~   r  r   rn   	conditionr   r   )r   rS  thenZlookupsr   r   r   rn     s    zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rrS  r   r7   r   r   r   r     s    zWhen.__str__c                 C   s   d| j j| f S Nz<%s: %s>r   r   r7   r   r   r   r     s    zWhen.__repr__c                 C   s   | j | jgS rk   rU  r7   r   r   r   rx     s    zWhen.get_source_expressionsc                 C   s   |\| _ | _d S rk   rU  rz   r   r   r   r|     s    zWhen.set_source_expressionsc                 C   s
   | j jgS rk   )r   r   r7   r   r   r   r     s    zWhen.get_source_fieldsTc                 C   sJ   |   }||_t|jdr0|j||||d|_|j||||||_|S )Nr,   F)rq   r   r-   rS  r,   r   r   r   r   r   r,     s$            zWhen.resolve_expressionc                 K   sn   |j |  |}g }|| j\}}||d< || || j\}	}
|	|d< ||
 |p`| j}|| |fS )NrS  r   )r   r  r   rS  r   r   r0  )r   r   r
   r0  r   template_params
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r     s    


zWhen.as_sqlc                 C   s$   g }|   D ]}||  q|S rk   rx   r   r   r   r   r   r   r     s    zWhen.get_group_by_cols)NN)NTNFF)N)N)r   r    r!   r0  rL   rn   r   r   rx   r|   r   r,   r   r   r	  r   r   r   r   rR    s             

rR  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d 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 rk   )r~   rR  )r   caser   r   r   r   7  s     z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	allr   r   rn   listcasesr   r]  r"  )r   r]  r   ra  r"  r   r   r   rn   6  s    
zCase.__init__c                 C   s    dd dd | jD | jf S )NzCASE %s, ELSE %rr   c                 s   s   | ]}t |V  qd S rk   r#  )r   r   r   r   r   r   @  s     zCase.__str__.<locals>.<genexpr>)r)  ra  r]  r7   r   r   r   r   >  s    zCase.__str__c                 C   s   d| j j| f S rV  rW  r7   r   r   r   r   D  s    zCase.__repr__c                 C   s   | j | jg S rk   ra  r]  r7   r   r   r   rx   G  s    zCase.get_source_expressionsc                 C   s   |^ | _ | _d S rk   rb  rz   r   r   r   r|   J  s    zCase.set_source_expressionsTFc           	      C   sT   |   }||_t|jD ] \}}|||||||j|< q|j||||||_|S rk   )rq   r   r-  ra  r,   r]  )	r   r   r   r   r   r   r   r.  r^  r   r   r   r,   M  s$            zCase.resolve_expressionc                    s   t   }|jd d  |_|S rk   )r   rq   ra  )r   r   r   r   r   rq   [  s    
z	Case.copyc              	   K   s   |j |  | js|| jS | j|}g }g }| jD ]D}	z||	\}
}W n tk
rd   Y q6Y nX ||
 || q6|| j\}}|s||fS |p| j	}|
||d< ||d< || |p|d| j}|| }| jd k	r|j | j| }||fS )Nra  r]  r0  )r   r  ra  r   r]  r"  r   r   r   case_joinerr)  r   r0  r   Zunification_cast_sqlr   )r   r   r
   r0  rc  r   rX  Z
case_partsrY  r^  Zcase_sqlZcase_paramsZdefault_sqlZdefault_paramsr   r   r   r   r   `  s2    






zCase.as_sqlc                    s   | j s| j|S t |S rk   )ra  r]  r   r   r  r   r   r   r   }  s    zCase.get_group_by_cols)NTNFF)NN)N)r   r    r!   r"   r0  rc  rn   r   r   rx   r|   r,   rq   r   r   r	  r   r   r   r   r[  %  s&            
   
r[  c                       sz   e 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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)FNc                    s0   t |d| | _d| j_|| _t | d S )Nr   T)rO   r   r   subqueryr"  r   rn   )r   querysetr   r"  r   r   r   rn     s    zSubquery.__init__c                 C   s   | j gS rk   r   r7   r   r   r   rx     s    zSubquery.get_source_expressionsc                 C   s   |d | _ d S rP  rg  rz   r   r   r   r|     s    zSubquery.set_source_expressionsc                 C   s   | j jS rk   )r   r   r7   r   r   r   r     s    zSubquery._resolve_output_fieldc                    s   t   }|j |_|S rk   )r   rq   r   r   r   r   r   r   r   rq     s    
zSubquery.copyc                 C   s   | j jS rk   )r   external_aliasesr7   r   r   r   ri    s    zSubquery.external_aliasesc                 C   s
   | j  S rk   )r   get_external_colsr7   r   r   r   rj    s    zSubquery.get_external_colsc           
      K   sb   |j |  | j|}|p| j}|||\}}|dd |d< |pP|d| j}|| }	|	|fS )Nr  r4   re  r0  )r   r  r"  r   r   r   r0  )
r   r   r
   r0  r   r   rX  Zsubquery_sqlrY  r   r   r   r   r     s    

zSubquery.as_sqlc                 C   s   |rt || gS | j S rk   )rG  r   r   r  r   r   r   r     s    zSubquery.get_group_by_cols)N)NN)N)r   r    r!   r"   r0  r   r   rn   rx   r|   r   rq   r   ri  rj  r   r   r	  r   r   r   r   rd    s   

rd  c                       sV   e Zd ZdZe Zd fdd	Zdd Zd fdd		Z	d fd
d	Z
dd Z  ZS )ExistszEXISTS(%(subquery)s)Fc                    s   || _ t j|f| d S rk   )negatedr   rn   )r   rf  rl  r   r   r   r   rn     s    zExists.__init__c                 C   s   |   }| j |_|S rk   )rq   rl  rh  r   r   r   
__invert__  s    
zExists.__invert__Nc                    s   |d kr| gS t  |S rk   )r   r   r  r   r   r   r     s    zExists.get_group_by_colsc           	         s   | j j|jd}z$t j||f||d|\}}W nB tk
rv   | jrp|jj}|j	s^Y dS |
td Y S  Y nX | jrd|}||fS )N)Zusing)r0  r   )z1=1r   TzNOT {})r   existsr   r   r   r   rl  r
   r  &supports_boolean_expr_in_select_clauser   r.   r   )	r   r   r
   r0  r   r   r   r   r  r   r   r   r     s*    
zExists.as_sqlc                 C   s   |j jjsd|}||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r
   r  ro  r   r   r   r   r   r     s    

zExists.select_format)F)N)N)r   r    r!   r0  r   r   r   rn   rm  r   r   r   r	  r   r   r   r   rk    s   rk  zdjango.db.models.OrderByc                   @   sj   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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ks |dkr0tjdtdd || _|| _|| _t|dsTt 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)	r  warningswarnr   nulls_first
nulls_lastr   r-   r   )r   r   r   rt  ru  r   r   r   rn     s    
zOrderBy.__init__c                 C   s   d | jj| j| jS )Nz{}({}, descending={}))r   r   r   r   r   r7   r   r   r   r     s
      zOrderBy.__repr__c                 C   s   |d | _ d S rP  rQ  rz   r   r   r   r|     s    zOrderBy.set_source_expressionsc                 C   s   | j gS rk   rQ  r7   r   r   r   rx     s    zOrderBy.get_source_expressionsc                 K   s   |p| j }|jjr2| jr"d| }ql| jrld| }n:| jrP| jrF|jjsPd| }n| jrl| jsd|jjsld| }|j|  |	| j
\}}|| jrdndd|}||d9 }||  |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sZDESCASC)r   Zorderingz%(expression)s)r0  r  Z supports_order_by_nulls_modifierru  rt  r   Zorder_by_nulls_firstr   r  r   r   countrstrip)r   r   r
   r0  r   Zexpression_sqlr   Zplaceholdersr   r   r   r     s6    



zOrderBy.as_sqlc                 C   sF   |j | jr:|  }tt| jdddd|_|||S | ||S )NT)rT  F)r]  )r   Z0conditional_expression_supported_in_where_clauser   rq   r[  rR  r   )r   r   r
   rq   r   r   r   	as_oracle0  s    zOrderBy.as_oraclec                 C   s$   g }|   D ]}||  q|S rk   rZ  r   r   r   r   r   >  s    zOrderBy.get_group_by_colsc                 C   s4   | j  | _ | jrd| _d | _n| jr0d| _d | _| S r^   )r   rt  ru  r7   r   r   r   r   D  s    
zOrderBy.reverse_orderingc                 C   s
   d| _ d S r9   rM  r7   r   r   r   r   N  s    zOrderBy.ascc                 C   s
   d| _ d S r^   rM  r7   r   r   r   r   Q  s    zOrderBy.desc)FNN)N)N)r   r    r!   r0  rL   rn   r   r|   rx   r   ry  r   r   r   r   r   r   r   r   r     s   



r   c                       sv   e 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
dddZ fddZdd Zdd ZdddZ  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                    s   || _ || _|| _t|dds.td|jj | j d k	r^t| j tt	fsR| j f| _ t
| j  | _ | jd k	rt| jt	tfrt| j | _n&t| jttfrt| 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.rl   r   )partition_byorder_byframerO   r  r   r   r~   r   r`  rJ  rL  rj   r   r   rn   r   source_expression)r   r   r{  r|  r}  r   r   r   r   rn   ^  s.    


zWindow.__init__c                 C   s   | j jS rk   )r~  r   r7   r   r   r   r     s    zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rk   r~  r{  r|  r}  r7   r   r   r   rx     s    zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rk   r  rz   r   r   r   r|     s    zWindow.set_source_expressionsc                 C   s   |j |  |jjstd|| j\}}g d }}| jd k	rl| jj||dd\}}	|	| |t
|	7 }| jd k	r|| j\}
}|	|
 |t
|7 }| jr|| j\}}|	| |t
|7 }|p| j}||d| d ||fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r
   r0  r\  )r   Zwindow)r   r  r  Zsupports_over_clauser	   r   r~  r{  r   r   r   r|  r}  r0  r)  strip)r   r   r
   r0  Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprrY  Z	order_sqlZorder_paramsZ	frame_sqlZframe_paramsr   r   r   r     s2    







zWindow.as_sqlc                    sT   t | jtjrH|  }| }t |d _|| tt	|
||S | ||S rP  )r~   r   r   r   rq   rx   r   r|   r   rz  r   r   )r   r   r
   rq   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p8dS )Nz{} OVER ({}{}{})zPARTITION BY rN  )r   r   r~  r{  r|  r}  r7   r   r   r   r     s    zWindow.__str__c                 C   s   d| j j| f S rV  rW  r7   r   r   r   r     s    zWindow.__repr__c                 C   s   g S rk   r   r  r   r   r   r     s    zWindow.get_group_by_cols)NNNN)N)N)r   r    r!   r0  r   r   r   rn   r   rx   r|   r   r   r   r   r   r	  r   r   r   r   rz  U  s"       $
!
rz  c                   @   sX   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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 rk   )r.   startendr   r  r  r   r   r   rn     s    
zWindowFrame.__init__c                 C   s   |\| _ | _d S rk   r  r  rz   r   r   r   r|     s    z"WindowFrame.set_source_expressionsc                 C   s   | j | jgS rk   r  r7   r   r   r   rx     s    z"WindowFrame.get_source_expressionsc                 C   s>   |j |  | || jj| jj\}}| j| j||d g fS )N
frame_typer  r  )r   r  window_frame_start_endr  r   r  r0  r  )r   r   r
   r  r  r   r   r   r     s      zWindowFrame.as_sqlc                 C   s   d| j j| f S rV  rW  r7   r   r   r   r     s    zWindowFrame.__repr__c                 C   s   g S rk   r   r  r   r   r   r     s    zWindowFrame.get_group_by_colsc                 C   s   | j jd k	r2| j jdk r2dt| j jtjjf }n*| j jd k	rT| j jdkrTtjj}ntjj}| jjd k	r| jjdkrd| jjtjj	f }n*| jjd k	r| jjdkrtjj}ntjj
}| j| j||d S )Nr   z%d %sr  )r  r   absr
   r   Z	PRECEDINGZCURRENT_ROWZUNBOUNDED_PRECEDINGr  Z	FOLLOWINGZUNBOUNDED_FOLLOWINGr0  r  r  r   r   r   r     s    

zWindowFrame.__str__c                 C   s   t dd S )Nz3Subclasses must implement window_frame_start_end().rf   r   r
   r  r  r   r   r   r    s    z"WindowFrame.window_frame_start_end)NN)N)r   r    r!   r"   r0  rn   r|   rx   r   r   r   r   r  r   r   r   r   r    s   

r  c                   @   s   e Zd ZdZdd ZdS )RowRangeZROWSc                 C   s   |j ||S rk   )r   Zwindow_frame_rows_start_endr  r   r   r   r  
  s    zRowRange.window_frame_start_endNr   r    r!   r  r  r   r   r   r   r    s   r  c                   @   s   e Zd ZdZdd ZdS )
ValueRangeRANGEc                 C   s   |j ||S rk   )r   Zwindow_frame_range_start_endr  r   r   r   r    s    z!ValueRange.window_frame_start_endNr  r   r   r   r   r    s   r  )Zrq   r7  	functoolsr   rr  collectionsr   decimalr   uuidr   Zdjango.core.exceptionsr   r   Z	django.dbr   r	   r
   Zdjango.db.modelsr   Zdjango.db.models.constantsr   Zdjango.db.models.query_utilsr   Zdjango.utils.deconstructr   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   Zdjango.utils.hashabler   r   r#   rj   r   r   r   r;   r?   r6   rC   rF   rI   rR   r\   rT   rV   rY   r  r  r  r  Z_connector_combinationsr`  r   r   dr   r1   Zfield_typesr   r   r   	lru_cacher   r/   r  r  r   r  r  r  r.   r<  rA  rB  rG  rJ  rL  rO  rR  r[  rd  rk  r   rz  r  r  r  r   r   r   r   <module>   s      )%`

	b3"bO"'$ I];3cpB