o
    `Zh                    @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ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 G dd dZ G dd dZ!G dd dZ"eG dd de"e!Z#dd e!j$e!j%e!j&e!j'e!j(fD 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!j-e!j.fD dd e!j$e!j)e!j%e!j&e!j'e!j(fD e!j$ej/ej0ej1fej1ej0ej1fej0ej/ej1fej0ej1ej1fej0ej0ej0fej2ej0ej2fej0ej2ej2fgie!j)ej/ej0ej1fej1ej0ej1fej/ej/ej0fej/ej1ej0fej1ej/ej0fej1ej1ej0fej0ej0ej0fej2ej0ej2fej2ej2ej0fg	igZ3ee4Z5dd Z6e3D ]Z7e78 D ]\Z9Z:e:D ]\Z;Z<Z=e6e;e9e<e= qdq^qXej>ddd d! Z?G d"d# d#e e#Z@G d$d% d%e@ZAG d&d' d'e@ZBed(d)G d*d+ d+e!ZCG d,d- d-eCZDG d.d/ d/eCZEed0d)G d1d2 d2e e#ZFed3d)G d4d5 d5e e#ZGG d6d7 d7e#ZHG d8d9 d9e#ZIG d:d; d;e#ZJG d<d= d=e#ZKG d>d? d?e#ZLG d@dA dAeFZMG dBdC dCeFZNedDd)G dEdF dFe e#ZOG dGdH dHeOZPedId)G dJdK dKe#ZQedLd)G dMdN dNe e#ZRG dOdP dPe"e!ZSG dQdR dReSZTedSd)G dTdU dUe#ZUG dVdW dWe e#ZVG dXdY dYe#ZWG dZd[ d[eWZXG d\d] d]eWZYdS )^    N)defaultdictDecimal)NoneType)UUID)EmptyResultSet
FieldErrorFullResultSet)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_property)make_hashablec                   @      e Zd ZdZdd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c                 K   s\   | j ||fi |\}}z| j dkrd| }W ||fS W ||fS  ty-   Y ||fS w )NDecimalFieldz(CAST(%s AS NUMERIC)))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparams r   S/var/www/html/lang_env/lib/python3.10/site-packages/django/db/models/expressions.py	as_sqlite   s   
zSQLiteNumericMixin.as_sqliteN)__name__
__module____qualname____doc__r    r   r   r   r   r      s    r   c                   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAS )B
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|z<<z>>#c                 C   s.   t |ds	t|}|rt||| S t| ||S )Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreversedr   r   r   _combine=   s
   
zCombinable._combinec                 C   s   |  d| jdS )NFr5   MULr   r   r   r   __neg__J      zCombinable.__neg__c                 C      |  || jdS NFr5   ADDr   r2   r   r   r   __add__M   r;   zCombinable.__add__c                 C   r<   r=   r5   SUBr@   r   r   r   __sub__P   r;   zCombinable.__sub__c                 C   r<   r=   r7   r@   r   r   r   __mul__S   r;   zCombinable.__mul__c                 C   r<   r=   r5   DIVr@   r   r   r   __truediv__V   r;   zCombinable.__truediv__c                 C   r<   r=   r5   MODr@   r   r   r   __mod__Y   r;   zCombinable.__mod__c                 C   r<   r=   r5   POWr@   r   r   r   __pow__\   r;   zCombinable.__pow__c                 C   s0   t | ddrt |ddrt| t|@ S tdNconditionalFFUse .bitand(), .bitor(), and .bitxor() for bitwise logical operations.getattrr   NotImplementedErrorr@   r   r   r   __and___   
   zCombinable.__and__c                 C   r<   r=   )r5   BITANDr@   r   r   r   bitandf   r;   zCombinable.bitandc                 C   r<   r=   )r5   BITLEFTSHIFTr@   r   r   r   bitleftshifti   r;   zCombinable.bitleftshiftc                 C   r<   r=   )r5   BITRIGHTSHIFTr@   r   r   r   bitrightshiftl   r;   zCombinable.bitrightshiftc                 C   s0   t | ddrt |ddrt| t|A S tdrO   rR   r@   r   r   r   __xor__o   rV   zCombinable.__xor__c                 C   r<   r=   )r5   BITXORr@   r   r   r   bitxorv   r;   zCombinable.bitxorc                 C   s0   t | ddrt |ddrt| t|B S tdrO   rR   r@   r   r   r   __or__y   rV   zCombinable.__or__c                 C   r<   r=   )r5   BITORr@   r   r   r   bitor   r;   zCombinable.bitorc                 C   r<   NTr>   r@   r   r   r   __radd__   r;   zCombinable.__radd__c                 C   r<   rc   rB   r@   r   r   r   __rsub__   r;   zCombinable.__rsub__c                 C   r<   rc   r7   r@   r   r   r   __rmul__   r;   zCombinable.__rmul__c                 C   r<   rc   rF   r@   r   r   r   __rtruediv__   r;   zCombinable.__rtruediv__c                 C   r<   rc   rI   r@   r   r   r   __rmod__   r;   zCombinable.__rmod__c                 C   r<   rc   rL   r@   r   r   r   __rpow__   r;   zCombinable.__rpow__c                 C      t dNrQ   rT   r@   r   r   r   __rand__      zCombinable.__rand__c                 C   rj   rk   rl   r@   r   r   r   __ror__   rn   zCombinable.__ror__c                 C   rj   rk   rl   r@   r   r   r   __rxor__   rn   zCombinable.__rxor__c                 C   s   t | S N)NegatedExpressionr9   r   r   r   
__invert__      zCombinable.__invert__N))r!   r"   r#   r$   r?   rC   r8   rG   rM   rJ   rW   ra   rY   r[   r^   r5   r:   rA   rD   rE   rH   rK   rN   rU   rX   rZ   r\   r]   r_   r`   rb   rd   re   rf   rg   rh   ri   rm   ro   rp   rs   r   r   r   r   r%   $   sN    r%   c                   @   s^  e Zd ZdZeZdZdZdZdZ	dZ
dGddZdd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd Zedd Zedd Z	dHddZedd Zedd  Zed!d" Zed#d$ Zd%d& Zed'd( Zed)d* Z d+d, Z!d-d. Z"d/d0 Z#d1d2 Z$d3d4 Z%d5d6 Z&d7d8 Z'd9d: Z(d;d< Z)d=d> Z*d?d@ Z+dAdB Z,dCdD Z-dEdF Z.dS )IBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S rq   r   r   r   r   r   r   __init__   s   
zBaseExpression.__init__c                 C   s   | j  }|dd  |S )Nconvert_value)__dict__copypop)r   stater   r   r   __getstate__      
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j| S rq   )ry   _convert_value_noopr   get_db_convertersr   r   r   r   r   r      s
   
z BaseExpression.get_db_convertersc                 C      g S rq   r   r9   r   r   r   get_source_expressions      z%BaseExpression.get_source_expressionsc                 C   s   |rJ d S rq   r   r   exprsr   r   r   set_source_expressions      z%BaseExpression.set_source_expressionsc                 G   s   dd |D S )Nc                 S   s4   g | ]}t |d r|nt|trt|nt|qS r.   )r/   
isinstancestrFr0   .0argr   r   r   
<listcomp>   s    z5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   expressionsr   r   r   _parse_expressions   s   z!BaseExpression._parse_expressionsc                 C   rj   )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

        Different backends can provide their own implementation, by
        providing an `as_{vendor}` method and patching the Expression:

        ```
        def override_as_sql(self, compiler, connection):
            # custom logic
            return super().as_sql(compiler, connection)
        setattr(Expression, 'as_' + connection.vendor, override_as_sql)
        ```

        Arguments:
         * compiler: the query compiler responsible for generating the query.
           Must have a compile method, returning a (sql, [params]) tuple.
           Calling compiler(value) will return a quoted `value`.

         * connection: the database connection used for the current query.

        Return: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()rl   r   r   r   r   r   r   r      s   zBaseExpression.as_sqlc                 C      t dd |  D S )Nc                 s       | ]}|o|j V  qd S rq   )contains_aggregater   exprr   r   r   	<genexpr>       

z4BaseExpression.contains_aggregate.<locals>.<genexpr>anyr   r9   r   r   r   r         z!BaseExpression.contains_aggregatec                 C   r   )Nc                 s   r   rq   )contains_over_clauser   r   r   r   r      r   z6BaseExpression.contains_over_clause.<locals>.<genexpr>r   r9   r   r   r   r      r   z#BaseExpression.contains_over_clausec                 C   r   )Nc                 s   r   rq   )contains_column_referencesr   r   r   r   r      s
    
z<BaseExpression.contains_column_references.<locals>.<genexpr>r   r9   r   r   r   r         z)BaseExpression.contains_column_referencesc                 C   r   )Nc                 s   s&    | ]}|ot |d dp|jV  qdS )subqueryFN)rS   contains_subqueryr   r   r   r   r     s
    
z3BaseExpression.contains_subquery.<locals>.<genexpr>r   r9   r   r   r   r     r   z BaseExpression.contains_subqueryc                    s4   |   }|_| fdd| D  |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

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

        Return: an Expression to be added to the query.
        c                    s$   g | ]}|r|  nd qS rq   r   r   allow_joinsqueryreuse	summarizer   r   r     s    z5BaseExpression.resolve_expression.<locals>.<listcomp>)r{   
is_summaryr   r   r   r   r   r   r   for_savecr   r   r   r.   
  s   z!BaseExpression.resolve_expressionc                 C   s   t | jtjS rq   )r   r   r   BooleanFieldr9   r   r   r   rP   '  s   zBaseExpression.conditionalc                 C      | j S rq   rv   r9   r   r   r   field+     zBaseExpression.fieldc                 C   s"   |   }|du rd| _td|S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   rw   r   r   r   r   /  s
   zBaseExpression.output_fieldc                 C   s&   z| j W S  ty   | js Y dS w )z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r   r9   r   r   r   _output_field_or_none8  s   z$BaseExpression._output_field_or_nonec                 C   sT   dd |   D }|D ]}|D ]}t||js#td|jj|jjf q|  S dS )a}  
        Attempt to infer the output type of the expression.

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

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c                 s   s    | ]	}|d ur|V  qd S rq   r   )r   sourcer   r   r   r   R  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   D  s    	z$BaseExpression._resolve_output_fieldc                 C      | S rq   r   value
expressionr   r   r   r   r   b     z"BaseExpression._convert_value_noopc                 C   sF   | j }| }|dkrdd S |drdd S |dkr dd S | jS )z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        
FloatFieldc                 S      | d u rd S t | S rq   )floatr   r   r   r   <lambda>q     z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   r   rq   )intr   r   r   r   r   w  r   r   c                 S   r   rq   r   r   r   r   r   r   }  r   )r   r   endswithr   )r   r   Zinternal_typer   r   r   ry   f  s   
zBaseExpression.convert_valuec                 C      | j |S rq   )r   
get_lookup)r   lookupr   r   r   r     r   zBaseExpression.get_lookupc                 C   r   rq   )r   get_transformr   namer   r   r   r     r   zBaseExpression.get_transformc                    (   |   }| fdd|  D  |S )Nc                    s"   g | ]}|d ur|  nd qS rq   )relabeled_cloner   e
change_mapr   r   r     s    z2BaseExpression.relabeled_clone.<locals>.<listcomp>r{   r   r   )r   r   cloner   r   r   r     s   
zBaseExpression.relabeled_clonec                    s>     |  }r	|S |  }| }| fdd|D  |S )Nc                    s   g | ]}|r|  nd qS rq   )replace_expressionsr   replacementsr   r   r     s    z6BaseExpression.replace_expressions.<locals>.<listcomp>)getr{   r   r   )r   r   replacementr   source_expressionsr   r   r   r     s   
z"BaseExpression.replace_expressionsc                 C   s$   t  }|  D ]}|| O }q|S rq   )setr   get_refs)r   refsr   r   r   r   r     s   zBaseExpression.get_refsc                 C   
   t  | S rq   r{   r9   r   r   r   r{        
zBaseExpression.copyc                    r   )Nc                    s2   g | ]}t |trt  |j n| qS r   )r   r   r   prefix_referencesr   prefixr   r   r     s    z4BaseExpression.prefix_references.<locals>.<listcomp>r   )r   r   r   r   r   r   r     s   
z BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  D ]	}||  q|S rq   )r   r   extendget_group_by_colsr   colsr   r   r   r   r     s   z BaseExpression.get_group_by_colsc                 C   s   dd |   D S )z9Return the underlying field types used by this aggregate.c                 S   s   g | ]}|j qS r   )r   r   r   r   r   r     s    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r   r9   r   r   r   r     s   z BaseExpression.get_source_fieldsc                 K      t | fi |S rq   OrderByr   kwargsr   r   r   asc  r;   zBaseExpression.ascc                 K      t | fddi|S N
descendingTr   r   r   r   r   desc     zBaseExpression.descc                 C   r   rq   r   r9   r   r   r   reverse_ordering  r   zBaseExpression.reverse_orderingc                 c   s>    | V  |   D ]}|rt|dr| E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r/   r   )r   r   r   r   r   r     s   
zBaseExpression.flattenc                 C   s$   t | jdr| j|||S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r/   r   r   r   r   r   r   r   r   r   r     s   zBaseExpression.select_formatrq   NTNFF)/r!   r"   r#   r$   NotImplementedempty_result_set_valuer   r   Z
filterablewindow_compatibleallowed_defaultrx   r~   r   r   r   r   r   r   r   r   r   r   r.   propertyrP   r   r   r   r   staticmethodr   ry   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   ru      sh    












ru   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	
Expressionz:An expression that can be combined with other expressions.c           	      C   s   t | j}| j\}}|j|i |}|  |j }| jg}|D ])\}}t	|t
jr@|jr;|jr;|jjj|jf}n	t|}nt|}|||f q"t|S rq   )inspect	signaturerx   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 rq   )r   r   r   r
  r@   r   r   r   __eq__  s   
zExpression.__eq__c                 C   
   t | jS rq   )hashr
  r9   r   r   r   __hash__  r   zExpression.__hash__N)r!   r"   r#   r$   r   r
  r  r  r   r   r   r   r     s    
r   c                 C       i | ]}|t jt jt jfgqS r   )r   ZPositiveIntegerFieldr   r3   r   r   r   
<dictcomp>  s    r  c                 C   s<   i | ]}|t jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r  r   r   r   r    s    c              	   C   sJ   i | ]!}|t jt jt jft jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r  r   r   r   r  /  s    c                 C   r  r   )r   r   r  r   r   r   r  ?  s    c                 C   s8   i | ]}t jt jt jfD ]}||t|ft||fgqqS r   )r   r   r   r   r   )r   r3   Z
field_typer   r   r   r  L  s    c                 C   s   t | | ||f dS )z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr  )lhsr3   rhsresultr   r   r   register_combinable_fields  s   	r     )maxsizec                 C   s<   t | d}|D ]\}}}t||rt||r|  S qd S )Nr   )r  r   
issubclass)r3   lhs_typerhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typecombined_typer   r   r   _resolve_combined_type  s   r  c                       sf   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
edd Z  ZS )r1   Nc                    s$   t  j|d || _|| _|| _d S Nrv   )superrx   r3   r  r  )r   r  r3   r  r   r   r   r   rx     s   
zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r!   r9   r   r   r   __repr__  r;   zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})r!  r  r3   r  r9   r   r   r   __str__  r   zCombinedExpression.__str__c                 C      | j | jgS rq   r  r  r9   r   r   r   r     r   z)CombinedExpression.get_source_expressionsc                 C      |\| _ | _d S rq   r%  r   r   r   r   r     r;   z)CombinedExpression.set_source_expressionsc                 C   sZ   t | jt| jjt| jj}|d u r*td| jd| jjjj	 d| jjjj	 d| S )NzCannot infer type of z# expression involving these types: , z. You must set output_field.)
r  r3   r  r  r   r  r   r   r   r!   )r   r  r   r   r   r     s   




z(CombinedExpression._resolve_output_fieldc                 C   sp   g }g }| | j\}}|| || | | j\}}|| || d}|j| j|}|| |fS Nz(%s))compiler  r  r   r  opsZcombine_expressionr3   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y/   d }Y nw z|j }	W n tt	fyD   d }	Y nw d||	hv r_||	kr_t| j | j
| j|||||S h d}
| j
| jkr||
v r||	krt| j | j|||||S |  }||_||_ ||_|S )NDurationField>   DateTimeField	DateField	TimeField)r  r.   r  r   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r3   rC   r{   r   )r   r   r   r   r   r   r  r  r  r  Zdatetime_fieldsr   r   r   r   r.     sZ   

	z%CombinedExpression.resolve_expressionc                 C      | j jo| jjS rq   )r  r   r  r9   r   r   r   r        z"CombinedExpression.allowed_defaultrq   r   )r!   r"   r#   rx   r"  r#  r   r   r   r   r.   r   r   __classcell__r   r   r   r   r1     s    
/r1   c                       s,   e Zd Zdd Z fddZdd Z  ZS )r0  c                 C   sR   z|j }W n	 ty   Y nw | dkr$||\}}|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_expressionr3   r+  r   r   r   r     s   



zDurationExpression.as_sqlc           	   	   K   s   | j ||fi |\}}| jtjtjhv rGz| jj }| jj }W n t	t
fy1   Y ||fS w h d}||vs>||vrGtd| j d||fS )N>   r   r   r,  r   zInvalid arguments for operator .)r   r3   r%   r8   rG   r  r   r   r  r2  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    r5  r   r   r   r   r0    s    r0  c                       s,   e Zd Ze Z fddZdd Z  ZS )r1  c                    s   t  || j| d S rq   )r  rx   rC   )r   r  r  r   r   r   rx   7     zTemporalSubtraction.__init__c                 C   s<   |j |  || j}|| j}|j | jj ||S rq   )r*  r8  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   rx   r   r5  r   r   r   r   r1  4  s    r1  zdjango.db.models.F)pathc                   @   s`   e Zd 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.Fc                 C   s
   || _ dS )z^
        Arguments:
         * name: the name of the field this expression references
        N)r   r   r   r   r   rx   I  s   
z
F.__init__c                 C      d | jj| jS N{}({}))r!  r   r!   r   r9   r   r   r   r"  P     z
F.__repr__NTc                 C   s   | | j|||S rq   )resolve_refr   r   r   r   r   r   r   r   r   r   r.   S  s   zF.resolve_expressionc                 C   s   | | | S rq   )r   )r   r   r   r   r   r   X  r   zF.replace_expressionsc                 K   r   rq   r   r   r   r   r   r   [  r;   zF.ascc                 K   r   r   r   r   r   r   r   r   ^  r   zF.descc                 C   s   | j |j ko| j|jkS rq   )r   r   r@   r   r   r   r  a     zF.__eq__c                 C   r  rq   )r  r   r9   r   r   r   r  d  r   z
F.__hash__c                 C   r   rq   r   r9   r   r   r   r{   g  r   zF.copyr   )r!   r"   r#   r$   r   rx   r"  r.   r   r   r   r  r  r{   r   r   r   r   r   C  s    
r   c                       s@   e Zd ZdZdZdZdd Z fddZdd Zd	d
 Z	  Z
S )ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                 O   rj   )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)
ValueErrorr   r	  r   r   r   r   r   v  rn   zResolvedOuterRef.as_sqlc                    s:   t  j|i |}|jrtd| j dt| jv |_|S )Nz<Referencing outer query window expression is not supported: r9  )r  r.   r   r   r   r   possibly_multivalued)r   r	  r   colr   r   r   r.   |  s   z#ResolvedOuterRef.resolve_expressionc                 C   r   rq   r   r   relabelsr   r   r   r     r   z ResolvedOuterRef.relabeled_clonec                 C   r   rq   r   r9   r   r   r   r     r   z"ResolvedOuterRef.get_group_by_cols)r!   r"   r#   r$   r   r   r   r.   r   r   r5  r   r   r   r   rC  k  s    rC  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )OuterRefFc                 O   s   t | j| jr
| jS t| jS rq   )r   r   r   rC  rE  r   r   r   r.     s   
zOuterRef.resolve_expressionc                 C   r   rq   r   rH  r   r   r   r     r   zOuterRef.relabeled_cloneN)r!   r"   r#   r   r   r.   r   r   r   r   r   rJ    s
    rJ  zdjango.db.models.Funcc                       s   e Zd ZdZdZdZdZdZdd fdd
Zdd	 Z	d
d Z
dd Zdd Z	dddZ			dddZ fddZedd Z  ZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)r'  rv   c                   sh   | j d ur"t|| j kr"td| jj| j | j dkrdndt|f t j|d | j| | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)   argumentr   rv   )
aritylen	TypeErrorr   r!   r  rx   r   r   extra)r   r   r   rQ  r   r   r   rx     s   	
zFunc.__init__c                 C   sl   | j dd | jD }i | j|  }|r.ddd t| D }d| jj	||S d| jj	|S )Nc                 s       | ]}t |V  qd S rq   r   r   r   r   r   r         z Func.__repr__.<locals>.<genexpr>r'  c                 s   s(    | ]\}}t |d  t | V  qdS )=NrS  )r   keyvalr   r   r   r     s    

{}({}, {})r>  )

arg_joinerjoinr   rQ  _get_repr_optionssortedr  r!  r   r!   )r   r	  rQ  r   r   r   r"    s   

zFunc.__repr__c                 C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r   r9   r   r   r   r[    r   zFunc._get_repr_optionsc                 C   r   rq   r   r9   r   r   r   r        zFunc.get_source_expressionsc                 C   s
   || _ d S rq   r]  r   r   r   r   r     r   zFunc.set_source_expressionsTFc           	      C   s>   |   }||_t|jD ]\}}|||||||j|< q|S rq   )r{   r   	enumerater   r.   )	r   r   r   r   r   r   r   posr   r   r   r   r.     s   
zFunc.resolve_expressionc              	   K   s  |j |  g }g }| jD ]D}	z	||	\}
}W n. ty5   t|	dt}|tu r* |t|\}
}Y n tyF   |td\}
}Y nw |	|
 |
| qi | j|}|d urb||d< n|d| j |pq|d| j}|pz|d| j}|| |d< |d< || |fS )Nr   TfunctiontemplaterY  r   r   )r*  r8  r   r)  r   rS   r   r0   r	   r  r   rQ  
setdefaultra  r   rb  rY  rZ  )r   r   r   ra  rb  rY  r   Z	sql_partsr   r   Zarg_sqlZ
arg_paramsr   datar   r   r   r     s4   	


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S rq   )r  r{   r   rQ  )r   r{   r   r   r   r{     s   
z	Func.copyc                 C   s   t dd | jD S )Nc                 s       | ]}|j V  qd S rq   r   )r   r   r   r   r   r     s    z'Func.allowed_default.<locals>.<genexpr>)allr   r9   r   r   r   r        zFunc.allowed_defaultr   )NNN)r!   r"   r#   r$   ra  rb  rY  rN  rx   r"  r[  r   r   r.   r   r{   r   r   r5  r   r   r   r   rK    s(    


'rK  zdjango.db.models.Valuec                       sf   e Zd ZdZdZdZd fdd	Zdd Zd	d
 Z	d fdd	Z	dd Z
dd Zedd Z  ZS )r0   z9Represent a wrapped value as a node within an expression.FTNc                    s   t  j|d || _dS )a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        rv   N)r  rx   r   )r   r   r   r   r   r   rx     s   	
zValue.__init__c                 C   s   | j j d| jdS )N())r   r!   r   r9   r   r   r   r"    r:  zValue.__repr__c                 C   s|   |j |  | j}| j}|d ur1| jr|j||d}n|j||d}t|dr1|||||gfS |d u r9dg fS d|gfS )N)r   get_placeholderZNULLz%s)	r*  r8  r   r   r   Zget_db_prep_saveZget_db_prep_valuer/   rk  )r   r   r   rW  r   r   r   r   r     s   

zValue.as_sqlc                    s   t  |||||}||_|S rq   )r  r.   r   r   r   r   r   r.   0  s   zValue.resolve_expressionc                 C   r   rq   r   r9   r   r   r   r   7  r   zValue.get_group_by_colsc                 C   s   t | jtr
t S t | jtrt S t | jtrt S t | jt	r(t
 S t | jtjr3t S t | jtjr>t S t | jtjrIt S t | jtjrTt S t | jtr^t S t | jtrht S t | jtrrt S d S rq   )r   r   r   r   Z	CharFieldboolr   r   r   r   r   datetimer-  dater.  timer/  	timedeltar,  r   r   bytesZBinaryFieldr   Z	UUIDFieldr9   r   r   r   r   :  s.   zValue._resolve_output_fieldc                 C   r   rq   )r   r9   r   r   r   r   R  r   zValue.empty_result_set_valuerq   r   )r!   r"   r#   r$   r   r   rx   r"  r   r.   r   r   r   r   r5  r   r   r   r   r0     s    r0   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z	d fdd	Z  Z	S )RawSQLTNc                    s0   |d u rt  }||| _| _t j|d d S r  )r   r  r   r   r  rx   )r   r   r   r   r   r   r   rx   Z  s   zRawSQL.__init__c                 C      d | jj| j| jS NrX  )r!  r   r!   r   r   r9   r   r   r   r"  `  r:  zRawSQL.__repr__c                 C   s   d| j  | jfS r(  )r   r   r   r   r   r   r   c  r;   zRawSQL.as_sqlc                 C      | gS rq   r   r9   r   r   r   r   f  r^  zRawSQL.get_group_by_colsFc           
         sn   |j r-|j j D ]#}|jjD ]}| \}}	|	 | j v r+||j|||  nqq	t	 
|||||S rq   )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_expressionrq   r   )
r!   r"   r#   r   rx   r"  r   r   r.   r5  r   r   r   r   rr  W  s    rr  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r   r9   r   r   r   r"  |  r   zStar.__repr__c                 C      dg fS )Nr(   r   r   r   r   r   r     rt   zStar.as_sqlN)r!   r"   r#   r"  r   r   r   r   r   ry  {  s    ry  c                   @   r   )DatabaseDefaultzCPlaceholder expression for the database default in an insert query.c                 C   rz  )NDEFAULTr   r   r   r   r   r     rt   zDatabaseDefault.as_sqlN)r!   r"   r#   r$   r   r   r   r   r   r{        r{  c                       sN   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
  ZS )ColTFNc                    s,   |d u r|}t  j|d ||| _| _d S r  )r  rx   aliastarget)r   r  r  r   r   r   r   rx     s   zCol.__init__c                 C   s>   | j | j}}|r|t|fnt|f}d| jjd|S )Nr>  r'  )r  r  r   r!  r   r!   rZ  )r   r  r  identifiersr   r   r   r"    s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}dt|j|}|g fS )Nr9  )r  r  columnrZ  mapZquote_name_unless_alias)r   r   r   r  r  r  r   r   r   r   r     s   z
Col.as_sqlc                 C   s,   | j d u r| S | || j | j | j| jS rq   )r  r   r   r  r   rH  r   r   r   r     s
   
zCol.relabeled_clonec                 C   ru  rq   r   r9   r   r   r   r     r^  zCol.get_group_by_colsc                 C   s0   | j | jkr| j|S | j|| j | S rq   )r  r   r   r   r   r   r   r     s   
zCol.get_db_convertersrq   )r!   r"   r#   r   rF  rx   r"  r   r   r   r   r5  r   r   r   r   r~    s    r~  c                       sd   e Zd ZdZ fddZdd Zdd Zdd	 Z	dddZdd Z	dd Z
dd Zdd Z  ZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                    s   t    ||| _| _d S rq   )r  rx   r   r   )r   r   r   r   r   r   rx     s   
zRef.__init__c                 C   rs  rt  )r!  r   r!   r   r   r9   r   r   r   r"    r:  zRef.__repr__c                 C      | j gS rq   r   r9   r   r   r   r     rt   zRef.get_source_expressionsc                 C   s   |\| _ d S rq   r  r   r   r   r   r     r   zRef.set_source_expressionsNTFc                 C   r   rq   r   rA  r   r   r   r.     s   zRef.resolve_expressionc                 C   s   | j hS rq   )r   r9   r   r   r   r     rt   zRef.get_refsc                 C   s   |   }| j||_|S rq   )r{   r   r   )r   rI  r   r   r   r   r     s   zRef.relabeled_clonec                 C   s   |j | jg fS rq   )r*  Z
quote_namer   r   r   r   r   r     r?  z
Ref.as_sqlc                 C   ru  rq   r   r9   r   r   r   r     r^  zRef.get_group_by_colsr   )r!   r"   r#   r$   rx   r"  r   r   r.   r   r   r   r   r5  r   r   r   r   r    s    
r  c                       s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  Z	S )ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                    s*   |s
t d| jj t j|i | d S )Nz$%s requires at least one expression.)rD  r   r!   r  rx   r   r   rQ  r   r   r   rx     s
   
zExpressionList.__init__c                 C   s   | j dd | jD S )Nc                 s   rR  rq   rS  r   r   r   r   r     rT  z)ExpressionList.__str__.<locals>.<genexpr>)rY  rZ  r   r9   r   r   r   r#    rB  zExpressionList.__str__c                 K   s   | j ||fi |S rq   )r   )r   r   r   r   r   r   r   r      rh  zExpressionList.as_sqlitec                 C   $   g }|   D ]	}||  q|S rq   r   r   r   )r   group_by_cols	partitionr   r   r   r        z ExpressionList.get_group_by_cols)
r!   r"   r#   r$   rb  rx   r#  r    r   r5  r   r   r   r   r    s    r  c                       s8   e Zd ZdZdZ fddZ fddZdd Z  ZS )	OrderByListFzORDER BY %(expressions)sc                    s$   dd |D }t  j|i | d S )Nc                 s   sB    | ]}t |tr|d  dkrtt|dd ddn|V  qdS )r   r'   rL  NTr   )r   r   r   r   r   r   r   r   r     s    
z'OrderByList.__init__.<locals>.<genexpr>)r  rx   r  r   r   r   rx     s   zOrderByList.__init__c                    s   | j sdS t j|i |S )N) r   )r   r  r   rE  r   r   r   r     s   zOrderByList.as_sqlc                 C   r  rq   r  )r   r  order_byr   r   r   r     r  zOrderByList.get_group_by_cols)	r!   r"   r#   r   rb  rx   r   r   r5  r   r   r   r   r    s    r  z"django.db.models.ExpressionWrapperc                       sX   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	e
dd Z  ZS )ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                    s   t  j|d || _d S r  )r  rx   r   )r   r   r   r   r   r   rx     s   
zExpressionWrapper.__init__c                 C      |d | _ d S Nr   r   r   r   r   r   r        z(ExpressionWrapper.set_source_expressionsc                 C   r  rq   r  r9   r   r   r   r   !  rt   z(ExpressionWrapper.get_source_expressionsc                    s0   t | jtr| j }| j|_| S t  S rq   )r   r   r   r{   r   r   r  r   r   r   r   r   r   $  s
   

z#ExpressionWrapper.get_group_by_colsc                 C   s   | | jS rq   )r)  r   r   r   r   r   r   -  r   zExpressionWrapper.as_sqlc                 C   r<  r=  )r!  r   r!   r   r9   r   r   r   r"  0  r?  zExpressionWrapper.__repr__c                 C      | j jS rq   )r   r   r9   r   r   r   r   3     z!ExpressionWrapper.allowed_default)r!   r"   r#   r$   rx   r   r   r   r   r"  r   r   r5  r   r   r   r   r    s    	r  c                       sL   e Zd ZdZ fddZdd Z fddZ	
d fdd	Zdd Z  Z	S )rr   z1The logical negation of a conditional expression.c                    s   t  j|t d d S r  )r  rx   r   r   r  r   r   r   rx   ;  rB  zNegatedExpression.__init__c                 C   
   | j  S rq   )r   r{   r9   r   r   r   rs   >  r   zNegatedExpression.__invert__c                    s~   zt  ||\}}W n ty%   |jj}|jsY dS |td Y S w |jj}|	| j
s8d| d|fS d| |fS )N)z1=1r   Tz
CASE WHEN z = 0 THEN 1 ELSE 0 ENDzNOT )r  r   r   r   r7  &supports_boolean_expr_in_select_clauser)  r0   r*  0conditional_expression_supported_in_where_clauser   )r   r   r   r   r   r7  r*  r   r   r   r   A  s   zNegatedExpression.as_sqlNTFc                    s.   t  |||||}t|jddstd|S )NrP   Fz*Cannot negate non-conditional expressions.)r  r.   rS   r   rP  )r   r   r   r   r   r   resolvedr   r   r   r.   Q  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  r7  r  r   r!  )r   r   r   r   Z$expression_supported_in_where_clauser   r   r   r   [  s   
zNegatedExpression.select_formatr   )
r!   r"   r#   r$   rx   rs   r   r.   r   r5  r   r   r   r   rr   8  s    
rr   zdjango.db.models.Whenc                       sx   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edd Z  ZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                    s   |r"|d u rt di |d }}nt|ddr"t |fi |d }}|d u s.t|ddr.|r2tdt|t r=|s=tdt jd d || _| |d | _	d S )NrP   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rv   r   r   )
r   rS   rP  r   rD  r  rx   	conditionr   r  )r   r  thenlookupsr   r   r   rx   q  s   zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rr  r  r9   r   r   r   r#    r;   zWhen.__str__c                 C      d| j j| f S Nz<%s: %s>r   r!   r9   r   r   r   r"    r;   zWhen.__repr__c                 C   r$  rq   r  r9   r   r   r   r     r   zWhen.get_source_expressionsc                 C   r&  rq   r  r   r   r   r   r     r;   zWhen.set_source_expressionsc                 C   s
   | j jgS rq   )r  r   r9   r   r   r   r     s   
zWhen.get_source_fieldsTc                 C   sJ   |   }||_t|jdr|j||||d|_|j||||||_|S )Nr.   F)r{   r   r/   r  r.   r  r   r   r   r   r.     s   

zWhen.resolve_expressionc                 K   sh   |j |  |}g }|| j\}}||d< || j\}	}
|	|d< |p&| j}|| g |||
R fS )Nr  r  )r*  r8  r)  r  r  rb  )r   r   r   rb  r   template_params
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r     s   
zWhen.as_sqlc                 C   r  rq   r  r   r   r   r   r     s   zWhen.get_group_by_colsc                 C   r3  rq   )r  r   r  r9   r   r   r   r     r4  zWhen.allowed_defaultNNr   rq   )r!   r"   r#   rb  rP   rx   r#  r"  r   r   r   r.   r   r   r   r   r5  r   r   r   r   r  k  s    

r  zdjango.db.models.Casec                       s   e Zd ZdZdZdZddd fdd
Zdd	 Zd
d Zdd Z	dd Z
	dddZ fddZ	dddZ fddZedd Z  ZS )Casez
    An SQL searched CASE expression:

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s END N)defaultr   c                   sJ   t dd |D stdt | t|| _| |d | _|| _d S )Nc                 s   s    | ]}t |tV  qd S rq   )r   r  )r   caser   r   r   r     s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	rg  rP  r  rx   listcasesr   r  rQ  )r   r  r   r  rQ  r   r   r   rx     s   

zCase.__init__c                 C   s    dd dd | jD | jf S )NzCASE %s, ELSE %rr'  c                 s   rR  rq   rS  )r   r   r   r   r   r     rT  zCase.__str__.<locals>.<genexpr>)rZ  r  r  r9   r   r   r   r#    s   zCase.__str__c                 C   r  r  r  r9   r   r   r   r"    r;   zCase.__repr__c                 C   s   | j | jg S rq   r  r  r9   r   r   r   r     r  zCase.get_source_expressionsc                 C   s   |^ | _ | _d S rq   r  r   r   r   r   r     r?  zCase.set_source_expressionsTFc           	      C   sT   |   }||_t|jD ]\}}|||||||j|< q|j||||||_|S rq   )r{   r   r_  r  r.   r  )	r   r   r   r   r   r   r   r`  r  r   r   r   r.     s   

zCase.resolve_expressionc                    s   t   }|jd d  |_|S rq   )r  r{   r  )r   r   r   r   r   r{     s   
z	Case.copyc              	   K   s   |j |  | js|| jS i | j|}g }g }|| j\}	}
| jD ]0}z	||\}}W n ty9   Y q% tyJ   ||j\}	}
Y  nw |	| |
| q%|s\|	|
fS |p`| j}|||d< |	|d< |
|
 |py|d| j}|| }| jd ur|j | j| }||fS )Nr  r  rb  )r*  r8  r  r)  r  rQ  r   r	   r  r  r   case_joinerrZ  r   rb  r   Zunification_cast_sqlr   )r   r   r   rb  r  r   r  Z
case_partsr  Zdefault_sqlZdefault_paramsr  Zcase_sqlZcase_paramsr   r   r   r   r     s:   




zCase.as_sqlc                    s   | j s| j S t  S rq   )r  r  r   r  r9   r   r   r   r     s   

zCase.get_group_by_colsc                 C   s   | j jotdd | jD S )Nc                 s   re  rq   rf  )r   Zcase_r   r   r   r     s    
z'Case.allowed_default.<locals>.<genexpr>)r  r   rg  r  r9   r   r   r   r     s   zCase.allowed_defaultr   r  )r!   r"   r#   r$   rb  r  rx   r#  r"  r   r   r.   r{   r   r   r   r   r5  r   r   r   r   r    s"    

 r  c                       s|   e Zd ZdZdZdZdZdZd fdd	Zdd	 Z	d
d Z
dd Z fddZedd Zdd ZdddZdd Z  ZS )Subqueryz
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNTc                    s0   t |d| | _d| j_|| _t | d S )Nr   T)rS   r   r   r   rQ  r  rx   )r   querysetr   rQ  r   r   r   rx   -  s   zSubquery.__init__c                 C   r  rq   r   r9   r   r   r   r   4  rt   zSubquery.get_source_expressionsc                 C   r  r  r  r   r   r   r   r   7  r  zSubquery.set_source_expressionsc                 C   r  rq   )r   r   r9   r   r   r   r   :  rt   zSubquery._resolve_output_fieldc                    s   t   }|j |_|S rq   )r  r{   r   r   )r   r   r   r   r   r{   =  r   zSubquery.copyc                 C   r  rq   )r   external_aliasesr9   r   r   r   r  B  r  zSubquery.external_aliasesc                 C   r  rq   )r   get_external_colsr9   r   r   r   r  F  r   zSubquery.get_external_colsc           	      K   s^   |j |  i | j|}| j||\}}|dd |d< |p&|d| j}|| }||fS )NrL  r6   r   rb  )r*  r8  rQ  r   r   r   rb  )	r   r   r   rb  r   r  Zsubquery_sqlr  r   r   r   r   r   I  s   zSubquery.as_sqlc                 C   s   | j j| dS )N)wrapper)r   r   r9   r   r   r   r   S  r  zSubquery.get_group_by_colsrq   )r!   r"   r#   r$   rb  r   r   r   rx   r   r   r   r{   r   r  r  r   r   r5  r   r   r   r   r  "  s     


r  c                       s@   e Zd ZdZe ZdZ fddZdd Z	 fddZ
  ZS )	ExistszEXISTS(%(subquery)s)Fc                    s$   t  j|fi | | j | _d S rq   )r  rx   r   exists)r   r  r   r   r   r   rx   \  s   zExists.__init__c                 C   s   |j jjs
d|}||fS r  )r   r7  r  r!  r   r   r   r   r   `  s   

zExists.select_formatc                    sR   zt  j|g|R i |W S  ty(   |jj}|jsY dS |td Y S w )N)z1=0r   F)r  r   r   r   r7  r  r)  r0   )r   r   r	  r   r7  r   r   r   r   h  s   zExists.as_sql)r!   r"   r#   rb  r   r   r   r   rx   r   r   r5  r   r   r   r   r  W  s    r  zdjango.db.models.OrderByc                   @   sh   e Zd ZdZdZdddZdd Zdd	 Zd
d ZdddZ	dd Z
dd Zdd Zdd Zdd ZdS )r   z%(expression)s %(ordering)sFNc                 C   sV   |r|rt d|du s|du rt d|| _|| _|| _t|ds&t d|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFz7nulls_first and nulls_last values must be True or None.r.   z%expression must be an expression type)rD  nulls_first
nulls_lastr   r/   r   )r   r   r   r  r  r   r   r   rx   w  s   

zOrderBy.__init__c                 C   rs  )Nz{}({}, descending={}))r!  r   r!   r   r   r9   r   r   r   r"    s   zOrderBy.__repr__c                 C   r  r  r  r   r   r   r   r     r  zOrderBy.set_source_expressionsc                 C   r  rq   r  r9   r   r   r   r     rt   zOrderBy.get_source_expressionsc                 K   s   |p| j }|jjr| jrd| }n%| jrd| }n| jr(| jr#|jjs(d| }n| jr6| js2|jjs6d| }|j|  |	| j
\}}|| jrJdndd|}||d9 }||  |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sZDESCASC)r   Zorderingz%(expression)s)rb  r7  Z supports_order_by_nulls_modifierr  r  r   Zorder_by_nulls_firstr*  r8  r)  r   countrstrip)r   r   r   rb  r   Zexpression_sqlr   Zplaceholdersr   r   r   r     s8   


zOrderBy.as_sqlc                 C   sN   |j js!|j| jr!|  }tt| jdddd|_|||S | ||S )NT)r  F)r  )	r7  r  r*  r  r   r{   r  r  r   )r   r   r   r{   r   r   r   	as_oracle  s   zOrderBy.as_oraclec                 C   r  rq   r  r   r   r   r   r     r  zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rc   )r   r  r  r9   r   r   r   r     s   
zOrderBy.reverse_orderingc                 C   
   d| _ d S r=   r  r9   r   r   r   r     r   zOrderBy.ascc                 C   r  rc   r  r9   r   r   r   r     r   zOrderBy.desc)FNNrq   )r!   r"   r#   rb  rP   rx   r"  r   r   r   r  r   r   r   r   r   r   r   r   r   r  s    


r   c                       sx   e Zd ZdZdZdZ				d fdd	Zdd Zd	d
 Zdd Z	dddZ
 fddZdd Zdd Zdd Z  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                    s   || _ || _|| _t|ddstd|jj | j d ur/t| j tt	fs)| j f| _ t
| j  | _ | jd urVt| jt	tfrCt| j | _nt| jttfrRt| j| _ntdt j|d | |d | _d S )Nr   Fz3Expression '%s' isn't compatible with OVER clauses.zhWindow.order_by must be either a string reference to a field, an expression, or a list or tuple of them.rv   r   )partition_byr  framerS   rD  r   r!   r   r  r  r  r  ru   r   r  rx   r   source_expression)r   r   r  r  r  r   r   r   r   rx     s.   


zWindow.__init__c                 C   r  rq   )r  r   r9   r   r   r   r     rt   zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rq   r  r  r  r  r9   r   r   r   r     r   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rq   r  r   r   r   r   r     rB  zWindow.set_source_expressionsc                 C   s   |j |  |jjstd|| j\}}g d}}| jd ur6| jj||dd\}}	|	| |t
|	7 }| jd urN|| j\}
}|	|
 |t
|7 }| jrd|| j\}}|	| |t
|7 }|ph| j}||d| d g ||R fS )Nz1This backend does not support window expressions.r   zPARTITION BY %(expressions)s)r   r   rb  r  )r   Zwindow)r*  r8  r7  Zsupports_over_clauser   r)  r  r  r   r  r  r  r  rb  rZ  strip)r   r   r   rb  Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprr  Z	order_sqlZorder_paramsZ	frame_sqlZframe_paramsr   r   r   r     s2   



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