U
    eS                     @   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qqe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                   @   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-lctamlir/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r4   MULr   r   r   r   __neg__K   s    zCombinable.__neg__c                 C   s   |  || jdS NFr4   ADDr   r1   r   r   r   __add__N   s    zCombinable.__add__c                 C   s   |  || jdS r:   r4   SUBr=   r   r   r   __sub__Q   s    zCombinable.__sub__c                 C   s   |  || jdS r:   r6   r=   r   r   r   __mul__T   s    zCombinable.__mul__c                 C   s   |  || jdS r:   r4   DIVr=   r   r   r   __truediv__W   s    zCombinable.__truediv__c                 C   s   |  || jdS r:   r4   MODr=   r   r   r   __mod__Z   s    zCombinable.__mod__c                 C   s   |  || jdS r:   r4   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 r:   )r4   BITANDr=   r   r   r   bitandg   s    zCombinable.bitandc                 C   s   |  || jdS r:   )r4   BITLEFTSHIFTr=   r   r   r   bitleftshiftj   s    zCombinable.bitleftshiftc                 C   s   |  || jdS r:   )r4   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 rL   rO   r=   r   r   r   __xor__p   s
    zCombinable.__xor__c                 C   s   |  || jdS r:   )r4   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 rL   rO   r=   r   r   r   __or__z   s
    zCombinable.__or__c                 C   s   |  || jdS r:   )r4   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_   r6   r=   r   r   r   __rmul__   s    zCombinable.__rmul__c                 C   s   |  || jdS r_   rC   r=   r   r   r   __rtruediv__   s    zCombinable.__rtruediv__c                 C   s   |  || jdS r_   rF   r=   r   r   r   __rmod__   s    zCombinable.__rmod__c                 C   s   |  || jdS r_   rI   r=   r   r   r   __rpow__   s    zCombinable.__rpow__c                 C   s   t dd S NrN   rQ   r=   r   r   r   __rand__   s    zCombinable.__rand__c                 C   s   t dd S rf   rg   r=   r   r   r   __ror__   s    zCombinable.__ror__c                 C   s   t dd S rf   rg   r=   r   r   r   __rxor__   s    zCombinable.__rxor__c                 C   s   t | S N)NegatedExpressionr8   r   r   r   
__invert__   s    zCombinable.__invert__N))r    r!   r"   r#   r<   r@   r7   rD   rJ   rG   rS   r]   rU   rW   rZ   r4   r9   r>   rA   rB   rE   rH   rK   rR   rT   rV   rX   rY   r[   r\   r^   r`   ra   rb   rc   rd   re   rh   ri   rj   rm   r   r   r   r   r$   %   sL   r$   c                   @   sX  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 k	r|| _ d S rk   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   )rr   _convert_value_noopr   get_db_convertersr   r   r   r   r   ry      s
    

z BaseExpression.get_db_convertersc                 C   s   g S rk   r   r8   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()Nrg   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>anyr{   r8   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   r8   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   r8   r   r   r   r      s    z)BaseExpression.contains_column_referencesc                 C   s   t dd |  D S )Nc                 s   s$   | ]}|ot |d dp|jV  qdS )subqueryFN)rP   contains_subqueryr   r   r   r   r     s   z3BaseExpression.contains_subquery.<locals>.<genexpr>r   r8   r   r   r   r     s    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 rk   r   r   allow_joinsqueryreuse	summarizer   r   r     s   z5BaseExpression.resolve_expression.<locals>.<listcomp>)rt   
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 rk   )r   r   r   BooleanFieldr8   r   r   r   rM   &  s    zBaseExpression.conditionalc                 C   s   | j S rk   ro   r8   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   rp   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   r8   r   r   r   _output_field_or_none7  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   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   Zsources_iterr   r   r   r   r   r   C  s    z$BaseExpression._resolve_output_fieldc                 C   s   | S rk   r   value
expressionr   r   r   r   rx   a  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>p  s    z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   s   | d krd S t | S rk   )intr   r   r   r   r   v  s    r   c                 S   s   | d krd S t | S rk   r   r   r   r   r   r   |  s    )r   r   endswithrx   )r   r   Zinternal_typer   r   r   rr   e  s    
zBaseExpression.convert_valuec                 C   s   | j |S rk   )r   
get_lookup)r   lookupr   r   r   r     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>rt   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 rk   )replace_expressionsr   replacementsr   r   r     s   z6BaseExpression.replace_expressions.<locals>.<listcomp>)getrt   r{   r   )r   r   replacementr   source_expressionsr   r   r   r     s    
z"BaseExpression.replace_expressionsc                 C   s$   t  }|  D ]}|| O }q|S rk   )setr{   get_refs)r   refsr   r   r   r   r     s    zBaseExpression.get_refsc                 C   s
   t  | S rk   rt   r8   r   r   r   rt     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   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{   r8   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   r8   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)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_format)N)NTNFF).r    r!   r"   r#   NotImplementedempty_result_set_valuer   r   Z
filterablewindow_compatiblerq   rw   ry   r{   r   r   r   r   r   r   r   r   r-   propertyrM   r   r   r   r   staticmethodrx   rr   r   r   r   r   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   rn      sl   




         







rn   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	signaturerq   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   r8   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   r2   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   r2   Z
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   )lhsr2   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)r2   lhs_typerhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typecombined_typer   r   r   _resolve_combined_type~  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 )r0   Nc                    s$   t  j|d || _|| _|| _d S Nro   )superrq   r2   r   r   )r   r   r2   r   r   r   r   r   rq     s    zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r    r8   r   r   r   __repr__  s    zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})r  r   r2   r   r8   r   r   r   __str__  s    zCombinedExpression.__str__c                 C   s   | j | jgS rk   r   r   r8   r   r   r   r{     s    z)CombinedExpression.get_source_expressionsc                 C   s   |\| _ | _d S rk   r  r}   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   r2   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_expressionr2   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   r2   r@   rt   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"   rq   r  r  r{   r   r   r   r-   __classcell__r   r   r  r   r0     s            r0   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_expressionr2   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   r2   r$   r7   rD   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   rq   r@   )r   r   r   r  r   r   rq      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   rq   r   r  r   r   r  r   r    s   r  zdjango.db.models.F)pathc                   @   sZ   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   rq   0  s    z
F.__init__c                 C   s   d | jj| jS N{}({}))r  r   r    r   r8   r   r   r   r  7  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   | | | S rk   )r   )r   r   r   r   r   r   ?  s    zF.replace_expressionsc                 K   s   t | f|S rk   r   r   r   r   r   r   B  s    zF.ascc                 K   s   t | fddi|S r   r   r   r   r   r   r   E  s    zF.descc                 C   s   | j |j ko| j|jkS rk   )r   r   r=   r   r   r   r   H  s    zF.__eq__c                 C   s
   t | jS rk   )r   r   r8   r   r   r   r   K  s    z
F.__hash__c                 C   s
   t  | S rk   r   r8   r   r   r   rt   N  s    zF.copy)NTNFF)r    r!   r"   r#   rq   r  r-   r   r   r   r   r   rt   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   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   ]  s    zResolvedOuterRef.as_sqlc                    s6   t  j||}|jr&td| j dt| jk|_|S )Nz<Referencing outer query window expression is not supported: r  )r   r-   r   r
   r   r   possibly_multivalued)r   r   r   colr  r   r   r-   c  s    z#ResolvedOuterRef.resolve_expressionc                 C   s   | S rk   r   r   relabelsr   r   r   r   p  s    z ResolvedOuterRef.relabeled_clonec                 C   s   g S rk   r   r8   r   r   r   r   s  s    z"ResolvedOuterRef.get_group_by_cols)r    r!   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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     s    zOuterRef.relabeled_cloneN)r    r!   r"   r   r   r-   r   r   r   r   r   r#  w  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  ro   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   ro   )
aritylen	TypeErrorr   r    r   rq   r   r   extra)r   r   r   r*  r  r   r   rq     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   r8   r   r   r   r2    s    zFunc._get_repr_optionsc                 C   s   | j S rk   r   r8   r   r   r   r{     s    zFunc.get_source_expressionsc                 C   s
   || _ d S rk   r4  r}   r   r   r   r     s    zFunc.set_source_expressionsTFc           	      C   s>   |   }||_t|jD ] \}}|||||||j|< q|S rk   )rt   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 ]}	z||	\}
}W n` tk
rl   t|	dt}|tkrV |t|\}
}Y n& tk
r   |td\}
}Y nX |	|
 |
| q| j|}|d k	r||d< n|d| j |p|d| j}|p|d| j}|| |d< |d< || |fS )Nr   Tfunctiontemplater0  r   r   )r	  r  r   r  r   rP   r   r/   r   r   r   r*  
setdefaultr7  r   r8  r0  r1  )r   r   r   r7  r8  r0  r   Z	sql_partsr   r   Zarg_sqlZ
arg_paramsr   datar   r   r   r     s6    	
  


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S rk   )r   rt   r   r*  )r   rt   r  r   r   rt     s    
z	Func.copy)NTNFF)NNN)r    r!   r"   r#   r7  r8  r0  r'  rq   r  r2  r{   r   r-   r   rt   r  r   r   r  r   r$    s*   
         
   
'r$  zdjango.db.models.Valuec                       s`   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 )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().
        ro   N)r   rq   r   )r   r   r   r  r   r   rq     s    	zValue.__init__c                 C   s   | j j d| jdS )N())r   r    r   r8   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.   r=  )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   r8   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	UUIDFieldr8   r   r   r   r     s,    zValue._resolve_output_fieldc                 C   s   | j S rk   )r   r8   r   r   r   r   4  s    zValue.empty_result_set_value)N)NTNFF)r    r!   r"   r#   r   rq   r  r   r-   r   r   r   r   r  r   r   r  r   r/     s            r/   c                       sD   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 krt  }|| | _| _t j|d d S r   )r   r   r   r   r   rq   )r   r   r   r   r  r   r   rq   :  s    zRawSQL.__init__c                 C   s   d | jj| j| jS Nr/  )r  r   r    r   r   r8   r   r   r   r  @  s    zRawSQL.__repr__c                 C   s   d| j  | jfS r  )r   r   r   r   r   r   r   C  s    zRawSQL.as_sqlc                 C   s   | gS rk   r   r8   r   r   r   r   F  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-   I  s&           zRawSQL.resolve_expression)N)NTNFF)	r    r!   r"   rq   r  r   r   r-   r  r   r   r  r   rD  9  s            rD  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r   r8   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   rI  [  s   rI  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 kr|}t  j|d || | _| _d S r   )r   rq   aliastarget)r   rK  rL  r   r  r   r   rq   g  s    zCol.__init__c                 C   s>   | j | j }}|r|t|fnt|f}d| jjd|S )Nr  r  )rK  rL  r   r  r   r    r1  )r   rK  rL  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  )rK  rL  columnr1  mapZquote_name_unless_alias)r   r   r   rK  rN  rM  r   r   r   r   r   r  s    z
Col.as_sqlc                 C   s,   | j d kr| S | || j | j | j| jS rk   )rK  r   r   rL  r   r!  r   r   r   r   x  s    
  zCol.relabeled_clonec                 C   s   | gS rk   r   r8   r   r   r   r     s    zCol.get_group_by_colsc                 C   s0   | j | jkr| j|S | j|| j | S rk   )rL  r   ry   rz   r   r   r   ry     s    
zCol.get_db_converters)N)r    r!   r"   r   r  rq   r  r   r   r   ry   r  r   r   r  r   rJ  c  s   rJ  c                       sb   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 rk   )r   rq   r   r   )r   r   r   r  r   r   rq     s    
zRef.__init__c                 C   s   d | jj| j| jS rE  )r  r   r    r   r   r8   r   r   r   r    s    zRef.__repr__c                 C   s   | j gS rk   r   r8   r   r   r   r{     s    zRef.get_source_expressionsc                 C   s   |\| _ d S rk   rQ  r}   r   r   r   r     s    zRef.set_source_expressionsNTFc                 C   s   | S rk   r   r  r   r   r   r-     s    zRef.resolve_expressionc                 C   s   | j hS rk   )r   r8   r   r   r   r     s    zRef.get_refsc                 C   s   |   }| j||_|S rk   )rt   r   r   )r   r"  r   r   r   r   r     s    zRef.relabeled_clonec                 C   s   |j | jg fS rk   )r	  Z
quote_namer   r   r   r   r   r     s    z
Ref.as_sqlc                 C   s   | gS rk   r   r8   r   r   r   r     s    zRef.get_group_by_cols)NTNFF)r    r!   r"   r#   rq   r  r{   r   r-   r   r   r   r   r  r   r   r  r   rP    s            
rP  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|| d S )Nz$%s requires at least one expression.)r  r   r    r   rq   r   r   r*  r  r   r   rq     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>)r0  r1  r   r8   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_sqlitec                 C   s$   g }|   D ]}||  q|S rk   r{   r   r   )r   group_by_cols	partitionr   r   r   r     s    z ExpressionList.get_group_by_cols)
r    r!   r"   r#   r8  rq   r  r   r   r  r   r   r  r   rR    s   rR  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|| 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   rq   rS  r  r   r   rq     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_sqlc                 C   s$   g }|   D ]}||  q|S rk   rT  )r   rU  order_byr   r   r   r     s    zOrderByList.get_group_by_cols)r    r!   r"   r8  rq   r   r   r  r   r   r  r   rW    s   rW  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   rq   r   )r   r   r   r  r   r   rq     s    zExpressionWrapper.__init__c                 C   s   |d | _ d S Nr   r   r}   r   r   r   r     s    z(ExpressionWrapper.set_source_expressionsc                 C   s   | j gS rk   r]  r8   r   r   r   r{     s    z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtr&| j }| j|_| S t  S rk   )r   r   r   rt   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   r8   r   r   r   r    s    zExpressionWrapper.__repr__)r    r!   r"   r#   rq   r   r{   r   r   r  r  r   r   r  r   r[    s   	r[  c                       sJ   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 )rl   z1The logical negation of a conditional expression.c                    s   t  j|t d d S r   )r   rq   r   r   r^  r  r   r   rq     s    zNegatedExpression.__init__c                 C   s
   | j  S rk   )r   rt   r8   r   r   r   rm     s    zNegatedExpression.__invert__c                    s   zt  ||\}}W n6 tk
rL   |jj}|js:Y dS |td Y S X |jj}|	| j
srd| 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   r  &supports_boolean_expr_in_select_clauser  r/   r	  0conditional_expression_supported_in_where_clauser   )r   r   r   r   r   r  r	  r  r   r   r     s    zNegatedExpression.as_sqlNTFc                    s.   t  |||||}t|jdds*td|S )NrM   Fz*Cannot negate non-conditional expressions.)r   r-   rP   r   r)  )r   r   r   r   r   r   Z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   r	  r`  r  r_  r   r  )r   r   r   r   Z$expression_supported_in_where_clauser   r   r   r   /  s    
zNegatedExpression.select_format)NTNFF)
r    r!   r"   r#   rq   rm   r   r-   r   r  r   r   r  r   rl     s            
rl   zdjango.db.models.Whenc                       sj   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 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 )NrM   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.ro   r   )
r   rP   r)  r   r  r   rq   	conditionr   r   )r   rc  thenZlookupsr  r   r   rq   E  s    zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rrc  r   r8   r   r   r   r  V  s    zWhen.__str__c                 C   s   d| j j| f S Nz<%s: %s>r   r    r8   r   r   r   r  Y  s    zWhen.__repr__c                 C   s   | j | jgS rk   re  r8   r   r   r   r{   \  s    zWhen.get_source_expressionsc                 C   s   |\| _ | _d S rk   re  r}   r   r   r   r   _  s    zWhen.set_source_expressionsc                 C   s
   | j jgS rk   )r   r   r8   r   r   r   r   b  s    zWhen.get_source_fieldsTc                 C   sJ   |   }||_t|jdr0|j||||d|_|j||||||_|S )Nr-   F)rt   r   r.   rc  r-   r   r   r   r   r   r-   f  s$            zWhen.resolve_expressionc                 K   s`   |j |  |}g }|| j\}}||d< || j\}	}
|	|d< |pL| j}|| |||
fS )Nrc  r   )r	  r  r  rc  r   r8  )r   r   r   r8  r   template_params
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r   t  s    
zWhen.as_sqlc                 C   s$   g }|   D ]}||  q|S rk   rT  r   r   r   r   r     s    zWhen.get_group_by_cols)NN)NTNFF)N)r    r!   r"   r8  rM   rq   r  r  r{   r   r   r-   r   r   r  r   r   r  r   rb  ?  s             

rb  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 rk   )r   rb  )r   caser   r   r   r     s     z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	allr)  r   rq   listcasesr   rl  r*  )r   rl  r   rp  r*  r  r   r   rq     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>)r1  rp  rl  r8   r   r   r   r    s    zCase.__str__c                 C   s   d| j j| f S rf  rg  r8   r   r   r   r    s    zCase.__repr__c                 C   s   | j | jg S rk   rp  rl  r8   r   r   r   r{     s    zCase.get_source_expressionsc                 C   s   |^ | _ | _d S rk   rq  r}   r   r   r   r     s    zCase.set_source_expressionsTFc           	      C   sT   |   }||_t|jD ] \}}|||||||j|< q|j||||||_|S rk   )rt   r   r5  rp  r-   rl  )	r   r   r   r   r   r   r   r6  rm  r   r   r   r-     s$            zCase.resolve_expressionc                    s   t   }|jd d  |_|S rk   )r   rt   rp  )r   r   r  r   r   rt     s    
z	Case.copyc              	   K   s*  |j |  | js|| jS | j|}g }g }|| j\}	}
| jD ]l}z||\}}W n@ tk
rt   Y qFY n* tk
r   ||j\}	}
Y  qY nX |	| |
| qF|s|	|
fS |p| j}|||d< |	|d< |
|
 |p|d| j}|| }| jd k	r"|j | j| }||fS )Nrp  rl  r8  )r	  r  rp  r  rl  r*  r   r   r   r   r   case_joinerr1  r   r8  r   Zunification_cast_sqlr   )r   r   r   r8  rr  r   rh  Z
case_partsri  Zdefault_sqlZdefault_paramsrm  Zcase_sqlZcase_paramsr   r   r   r   r     s8    




zCase.as_sqlc                    s   | j s| j S t  S rk   )rp  rl  r   r   r8   r  r   r   r     s    
zCase.get_group_by_cols)NTNFF)NN)r    r!   r"   r#   r8  rr  rq   r  r  r{   r   r-   rt   r   r   r  r   r   r  r   rj    s&            
   
 rj  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)rP   r   r   r   r*  r   rq   )r   querysetr   r*  r  r   r   rq     s    zSubquery.__init__c                 C   s   | j gS rk   r   r8   r   r   r   r{     s    zSubquery.get_source_expressionsc                 C   s   |d | _ d S r\  ru  r}   r   r   r   r     s    zSubquery.set_source_expressionsc                 C   s   | j jS rk   )r   r   r8   r   r   r   r     s    zSubquery._resolve_output_fieldc                    s   t   }|j |_|S rk   )r   rt   r   r   )r   r   r  r   r   rt     s    
zSubquery.copyc                 C   s   | j jS rk   )r   external_aliasesr8   r   r   r   rv    s    zSubquery.external_aliasesc                 C   s
   | j  S rk   )r   get_external_colsr8   r   r   r   rw    s    zSubquery.get_external_colsc           	      K   sZ   |j |  | j|}| j||\}}|dd |d< |pH|d| j}|| }||fS )Nr%  r5   r   r8  )r	  r  r*  r   r   r   r8  )	r   r   r   r8  r   rh  Zsubquery_sqlri  r   r   r   r   r     s    
zSubquery.as_sqlc                 C   s   | j j| dS )N)wrapper)r   r   r8   r   r   r   r     s    zSubquery.get_group_by_cols)N)N)r    r!   r"   r#   r8  r   r   r   rq   r{   r   r   rt   r   rv  rw  r   r   r  r   r   r  r   rs    s   


rs  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| | j | _d S rk   )r   rq   r   exists)r   rt  r   r  r   r   rq   &  s    zExists.__init__c                 C   s   |j jjsd|}||fS ra  )r   r  r_  r  r   r   r   r   r   *  s    

zExists.select_format)r    r!   r"   r8  r   r   r   r   rq   r   r  r   r   r  r   ry  !  s
   ry  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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   r  r  r   r   r   rq   8  s    
zOrderBy.__init__c                 C   s   d | jj| j| jS )Nz{}({}, descending={}))r  r   r    r   r   r8   r   r   r   r  M  s
      zOrderBy.__repr__c                 C   s   |d | _ d S r\  r]  r}   r   r   r   r   R  s    zOrderBy.set_source_expressionsc                 C   s   | j gS rk   r]  r8   r   r   r   r{   U  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)r8  r  Z supports_order_by_nulls_modifierr  r  r   Zorder_by_nulls_firstr	  r  r  r   countrstrip)r   r   r   r8  r   Zexpression_sqlr   Zplaceholdersr   r   r   r   X  s6    



zOrderBy.as_sqlc                 C   sF   |j | jr:|  }tt| jdddd|_|||S | ||S )NT)rd  F)rl  )r	  r`  r   rt   rj  rb  r   )r   r   r   rt   r   r   r   	as_oracler  s    zOrderBy.as_oraclec                 C   s$   g }|   D ]}||  q|S rk   rT  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   r  r  r8   r   r   r   r     s    
zOrderBy.reverse_orderingc                 C   s
   d| _ d S r:   rX  r8   r   r   r   r     s    zOrderBy.ascc                 C   s
   d| _ d S r_   rX  r8   r   r   r   r     s    zOrderBy.desc)FNN)N)r    r!   r"   r8  rM   rq   r  r   r{   r   r  r   r   r   r   r   r   r   r   r   3  s   


r   c                       sp   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 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.ro   r   )partition_byrZ  framerP   r  r   r    r   r   ro  rR  rW  rn   r   r   rq   r   source_expression)r   r   r  rZ  r  r   r  r   r   rq     s.    


zWindow.__init__c                 C   s   | j jS rk   )r  r   r8   r   r   r   r     s    zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rk   r  r  rZ  r  r8   r   r   r   r{     s    zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rk   r  r}   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   r8  rk  )r   Zwindow)r	  r  r  Zsupports_over_clauser
   r  r  r  r   r   r   rZ  r  r8  r1  strip)r   r   r   r8  Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprri  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 r\  )r   r   r   r   rt   r{   r   r   r   r  r   r   )r   r   r   rt   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 rY  )r  r   r  r  rZ  r  r8   r   r   r   r    s    zWindow.__str__c                 C   s   d| j j| f S rf  rg  r8   r   r   r   r    s    zWindow.__repr__c                 C   s8   g }| j r|| j   | jd k	r4|| j  |S rk   )r  r   r   rZ  )r   rU  r   r   r   r     s    
zWindow.get_group_by_cols)NNNN)N)r    r!   r"   r8  r   r   rq   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 rk   )r/   startendr   r  r  r   r   r   rq     s    
zWindowFrame.__init__c                 C   s   |\| _ | _d S rk   r  r  r}   r   r   r   r     s    z"WindowFrame.set_source_expressionsc                 C   s   | j | jgS rk   r  r8   r   r   r   r{     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  r8  r  )r   r   r   r  r  r   r   r   r      s      zWindowFrame.as_sqlc                 C   s   d| j j| f S rf  rg  r8   r   r   r   r  /  s    zWindowFrame.__repr__c                 C   s   g S rk   r   r8   r   r   r   r   2  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_FOLLOWINGr8  r  r  r   r   r   r  5  s    

zWindowFrame.__str__c                 C   s   t dd S )Nz3Subclasses must implement window_frame_start_end().rg   r   r   r  r  r   r   r   r  I  s    z"WindowFrame.window_frame_start_end)NN)r    r!   r"   r#   r8  rq   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S )RowRangeZROWSc                 C   s   |j ||S rk   )r	  Zwindow_frame_rows_start_endr  r   r   r   r  P  s    zRowRange.window_frame_start_endNr    r!   r"   r  r  r   r   r   r   r  M  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  W  s    z!ValueRange.window_frame_start_endNr  r   r   r   r   r  T  s   r  )\rt   r?  	functoolsr   r}  collectionsr   decimalr   uuidr   Zdjango.core.exceptionsr   r   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$   rn   r   r   r   r<   r@   r7   rD   rG   rJ   rS   r]   rU   rW   rZ   r  r  r  r  Z_connector_combinationsro  r   r   dr   r2   Zfield_typesr   r   r   	lru_cacher   r0   r  r  r   r  r#  r$  r/   rD  rI  rJ  rP  rR  rW  r[  rl   rb  rj  rs  ry  r   r  r  r  r  r   r   r   r   <module>   s      9%a

	b3%%dO"') 3K`5ctB