o
    ˷e                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ G dd dZ G dd dZ!G dd dZ"eG dd de"e!Z#e$dZ%dd e!j&e!j'e!j(e!j)e!j*e!j+fD dd e!j&e!j'e!j(e!j)fD dd e!j,e!j-e!j.e!j/e!j0fD dd e!j&e!j'e!j(e!j)e!j*e!j+fD e!j&ej1ej2ej3fej3ej2ej3fej2ej1ej3fej2ej3ej3fej2ej2ej2fej4ej2ej4fej2ej4ej4fgie!j'ej1ej2ej3fej3ej2ej3fej1ej1ej2fej1ej3ej2fej3ej1ej2fej3ej3ej2fej2ej2ej2fej4ej2ej4fej4ej4ej2fg	igZ5ee6Z7dd Z8e5D ]Z9e9: D ]\Z;Z<e<D ]\Z=Z>Z?e8e=e;e>e? qXqRqLej@dddd  ZAG d!d" d"e e#ZBG d#d$ d$eBZCG d%d& d&eBZDed'd(G d)d* d*e!ZEG d+d, d,eEZFG d-d. d.eEZGed/d(G d0d1 d1e e#ZHed2d(G d3d4 d4e e#ZIG d5d6 d6e#ZJG d7d8 d8e#ZKG d9d: d:e#ZLG d;d< d<e#ZMG d=d> d>eHZNG d?d@ d@eHZOedAd(G dBdC dCe e#ZPedDd(G dEdF dFe#ZQedGd(G dHdI dIe e#ZRG dJdK dKe"e!ZSG dLdM dMeSZTedNd(G dOdP dPe#ZUG dQdR dRe e#ZVG dSdT dTe#ZWG dUdV dVeWZXG dWdX dXeWZYdS )Y    N)defaultdictDecimal)UUID)EmptyResultSet
FieldError)DatabaseErrorNotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)RemovedInDjango50Warning)cached_property)make_hashablec                   @      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/ideatree/venv/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?S )@
Combinablezu
    Provide the ability to combine one or two objects with
    some connector. For example F('foo') + F('bar').
    +-*/^z%%&|z<<z>>#c                 C   s.   t |ds	t|}|rt||| S t| ||S )Nresolve_expression)hasattrValueCombinedExpression)r   other	connectorreversedr   r   r   _combine>   s
   
zCombinable._combinec                 C   s   |  d| jdS )NFr4   MULr   r   r   r   __neg__K      zCombinable.__neg__c                 C      |  || jdS NFr4   ADDr   r1   r   r   r   __add__N   r:   zCombinable.__add__c                 C   r;   r<   r4   SUBr?   r   r   r   __sub__Q   r:   zCombinable.__sub__c                 C   r;   r<   r6   r?   r   r   r   __mul__T   r:   zCombinable.__mul__c                 C   r;   r<   r4   DIVr?   r   r   r   __truediv__W   r:   zCombinable.__truediv__c                 C   r;   r<   r4   MODr?   r   r   r   __mod__Z   r:   zCombinable.__mod__c                 C   r;   r<   r4   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<   )r4   BITANDr?   r   r   r   bitandg   r:   zCombinable.bitandc                 C   r;   r<   )r4   BITLEFTSHIFTr?   r   r   r   bitleftshiftj   r:   zCombinable.bitleftshiftc                 C   r;   r<   )r4   BITRIGHTSHIFTr?   r   r   r   bitrightshiftm   r:   zCombinable.bitrightshiftc                 C   s0   t | ddrt |ddrt| t|A S tdrN   rQ   r?   r   r   r   __xor__p   rU   zCombinable.__xor__c                 C   r;   r<   )r4   BITXORr?   r   r   r   bitxorw   r:   zCombinable.bitxorc                 C   s0   t | ddrt |ddrt| t|B S tdrN   rQ   r?   r   r   r   __or__z   rU   zCombinable.__or__c                 C   r;   r<   )r4   BITORr?   r   r   r   bitor   r:   zCombinable.bitorc                 C   r;   NTr=   r?   r   r   r   __radd__   r:   zCombinable.__radd__c                 C   r;   rb   rA   r?   r   r   r   __rsub__   r:   zCombinable.__rsub__c                 C   r;   rb   r6   r?   r   r   r   __rmul__   r:   zCombinable.__rmul__c                 C   r;   rb   rE   r?   r   r   r   __rtruediv__   r:   zCombinable.__rtruediv__c                 C   r;   rb   rH   r?   r   r   r   __rmod__   r:   zCombinable.__rmod__c                 C   r;   rb   rK   r?   r   r   r   __rpow__   r:   zCombinable.__rpow__c                 C      t dNrP   rS   r?   r   r   r   __rand__      zCombinable.__rand__c                 C   ri   rj   rk   r?   r   r   r   __ror__   rm   zCombinable.__ror__c                 C   ri   rj   rk   r?   r   r   r   __rxor__   rm   zCombinable.__rxor__N)(r    r!   r"   r#   r>   rB   r7   rF   rL   rI   rV   r`   rX   rZ   r]   r4   r9   r@   rC   rD   rG   rJ   rM   rT   rW   rY   r[   r\   r^   r_   ra   rc   rd   re   rf   rg   rh   rl   rn   ro   r   r   r   r   r$   %   sL    r$   c                   @   sH  e Zd ZdZeZdZdZdZdZ	dCddZ
dd Zd	d
 Zdd Zdd Zdd Zdd Zedd Zedd Zedd Z	dDddZedd Zedd Zedd  Zed!d" Zd#d$ Zed%d& Zed'd( Zd)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$dCd5d6Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dS )EBaseExpressionz%Base class for all query expressions.FTNc                 C   s   |d ur	|| _ d S d S Nr   r   r   r   r   r   __init__   s   
zBaseExpression.__init__c                 C   s   | j  }|dd  |S )Nconvert_value)__dict__copypop)r   stater   r   r   __getstate__      
zBaseExpression.__getstate__c                 C   s$   | j | ju rg n| j g| j| S rq   )ru   _convert_value_noopr   get_db_convertersr   r
   r   r   r   r}      s
   
z BaseExpression.get_db_convertersc                 C      g S rq   r   r8   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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   ri   )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()rk   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   r8   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   r8   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   r8   r   r   r   r      s   z)BaseExpression.contains_column_referencesc                    s4   |   }|_| fdd| D  |S )a
  
        Provide the chance to do any preprocessing or validation before being
        added to the query.

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

        Return: an Expression to be added to the query.
        c                    s$   g | ]}|r|  nd qS rq   r   r   allow_joinsqueryreuse	summarizer   r   r     s    z5BaseExpression.resolve_expression.<locals>.<listcomp>)rw   
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   BooleanFieldr8   r   r   r   rO     s   zBaseExpression.conditionalc                 C      | j S rq   rr   r8   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   rs   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   r8   r   r   r   _output_field_or_none-  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   G  s    z7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)get_source_fieldsr   	__class__r   r    )r   sources_iterr   r   r   r   r   r   9  s    	z$BaseExpression._resolve_output_fieldc                 C      | S rq   r   value
expressionr
   r   r   r   r|   W     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>f     z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc                 S   r   rq   )intr   r   r   r   r   l  r   r   c                 S   r   rq   r   r   r   r   r   r   r  r   )r   r   endswithr|   )r   r   internal_typer   r   r   ru   [  s   
zBaseExpression.convert_valuec                 C      | j |S rq   )r   
get_lookup)r   lookupr   r   r   r   x  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>rw   r   r   )r   r   cloner   r   r   r   ~  s   
zBaseExpression.relabeled_clonec                    r   )Nc                    s.   g | ]}t |tr |j|n| qS r   )r   r   getr   replace_referencesr   references_mapr   r   r     s    z5BaseExpression.replace_references.<locals>.<listcomp>r   )r   r   r   r   r   r   r        
z!BaseExpression.replace_referencesc                 C   s
   t  | S rq   )rw   r8   r   r   r   rw        
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     r   z BaseExpression.prefix_referencesc                 C   s0   | j s| gS g }|  D ]	}||  q|S rq   )r   r   extendget_group_by_colsr   aliascolsr   r   r   r   r     s   z BaseExpression.get_group_by_colsc                 C   s   dd |   D S )z9Return the underlying field types used by this aggregate.c                 S   s   g | ]}|j qS r   )r   r   r   r   r   r     s    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r   r8   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   r8   r   r   r   reverse_ordering  r   zBaseExpression.reverse_orderingc                 c   s>    | V  |   D ]}|rt|dr| E dH  q|V  qdS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r   r.   r   )r   r   r   r   r   r     s   
zBaseExpression.flattenc                 C   s$   t | jdr| j|||S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r.   r   r   r   r   r   r   r   r   r   r     s   zBaseExpression.select_formatrq   NTNFF),r    r!   r"   r#   NotImplementedempty_result_set_valuer   r   
filterablewindow_compatiblert   rz   r}   r   r   r   r   r   r   r   r   r-   propertyrO   r   r   r   r   staticmethodr|   ru   r   r   r   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   rp      s`    












rp   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	signaturert   _constructor_argsbind_partialapply_defaults	argumentsitemsr   r   r   Fieldr   model_metalabeltyper   appendtuple)	r   constructor_signatureargsr   r   r   identityr   r   r   r   r   r    s   


zExpression.identityc                 C   s   t |tstS |j| jkS rq   )r   r   r   r  r?   r   r   r   __eq__  s   
zExpression.__eq__c                 C   
   t | jS rq   )hashr  r8   r   r   r   __hash__  r   zExpression.__hash__N)r    r!   r"   r#   r   r  r  r  r   r   r   r   r     s    
r   c                 C   s<   i | ]}|t jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r   r2   r   r   r   
<dictcomp>  s    r  c              	   C   sJ   i | ]!}|t jt jt jft jt jt jft jt jt jft jt jt jfgqS r   )r   r   r   r   r  r   r   r   r    s    c                 C   s    i | ]}|t jt jt jfgqS r   )r   r   r  r   r   r   r    s    c                 C   s8   i | ]}t jt jt jfD ]}||t|ft||fgqqS r   )r   r   r   r   NoneType)r   r2   
field_typer   r   r   r  '  s    c                 C   s   t | | ||f dS )z
    Register combinable types:
        lhs <connector> rhs -> result
    e.g.
        register_combinable_fields(
            IntegerField, Combinable.ADD, FloatField, FloatField
        )
    N)_connector_combinatorsr   )lhsr2   rhsresultr   r   r   register_combinable_fieldsZ  s   	r     )maxsizec                 C   s<   t | d}|D ]\}}}t||rt||r|  S qd S )Nr   )r  r   
issubclass)r2   lhs_typerhs_typecombinatorscombinator_lhs_typecombinator_rhs_typecombined_typer   r   r   _resolve_combined_typel  s   r  c                       sZ   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z		dddZ
  ZS )r0   Nc                    s$   t  j|d || _|| _|| _d S Nrr   )superrt   r2   r  r  )r   r  r2   r  r   r   r   r   rt   w  s   
zCombinedExpression.__init__c                 C   s   d | jj| S )Nz<{}: {}>)formatr   r    r8   r   r   r   __repr__}  r:   zCombinedExpression.__repr__c                 C   s   d | j| j| jS )Nz{} {} {})r  r  r2   r  r8   r   r   r   __str__  r   zCombinedExpression.__str__c                 C      | j | jgS rq   r  r  r8   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  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  opscombine_expressionr2   r   r   r
   r   expression_paramsr   r   expression_wrapperr   r   r   r     s   



zCombinedExpression.as_sqlTFc              	   C   s  | j |||||}| j|||||}t| ttfsz|j }W n tt	fy/   d }Y nw z|j }	W n tt	fyD   d }	Y nw d||	hv r_||	kr_t| j | j
| j|||||S h d}
| j
| jkr||
v r||	krt| j | j|||||S |  }||_||_ ||_|S )NDurationField>   	DateField	TimeFieldDateTimeField)r  r-   r  r   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r2   rB   rw   r   )r   r   r   r   r   r   r  r  r  r  datetime_fieldsr   r   r   r   r-     sZ   

	z%CombinedExpression.resolve_expressionrq   r   )r    r!   r"   rt   r  r  r   r   r   r   r-   __classcell__r   r   r  r   r0   v  s    r0   c                       s,   e Zd Zdd Z fddZdd Z  ZS )r/  c                 C   sR   z|j }W n	 ty   Y nw | dkr$||\}}|j||fS ||S )Nr+  )r   r   r   r%  r&  format_for_duration_arithmetic)r   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$  )featureshas_native_duration_fieldr  r   r&  check_expression_supportr%  r  r   r   r  combine_duration_expressionr2   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   r2   r$   r7   rF   r  r   r   r  r1  r   r   )	r   r   r
   r   r   r   r  r  allowed_fieldsr   r   r   r     s   zDurationExpression.as_sqlite)r    r!   r"   r%  r   r   r3  r   r   r  r   r/    s    r/  c                       s,   e Zd Ze Z fddZdd Z  ZS )r0  c                    s   t  || j| d S rq   )r  rt   rB   )r   r  r  r  r   r   rt        zTemporalSubtraction.__init__c                 C   s<   |j |  || j}|| j}|j | jj ||S rq   )r&  r9  r%  r  r  subtract_temporalsr   r   )r   r   r
   r  r  r   r   r   r     s   zTemporalSubtraction.as_sql)	r    r!   r"   r   r+  r   rt   r   r3  r   r   r  r   r0    s    r0  zdjango.db.models.F)pathc                   @   sL   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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   rt     s   
z
F.__init__c                 C      d | jj| jS N{}({}))r  r   r    r   r8   r   r   r   r  %     z
F.__repr__NTFc                 C   s   | | j|||S rq   )resolve_refr   r   r   r   r   r   r   r   r   r   r-   (  s   zF.resolve_expressionc                 K   r   rq   r   r   r   r   r   r   -  r:   zF.ascc                 K   r   r   r   r   r   r   r   r   0  r   zF.descc                 C   s   | j |j ko| j|jkS rq   )r   r   r?   r   r   r   r  3     zF.__eq__c                 C   r  rq   )r  r   r8   r   r   r   r  6  r   z
F.__hash__r   )r    r!   r"   r#   rt   r  r-   r   r   r  r  r   r   r   r   r     s    
r   c                       s>   e Zd ZdZdZdd Z fddZdd Zdd
dZ  Z	S )ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc                 O   ri   )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   D  rm   zResolvedOuterRef.as_sqlc                    s"   t  j|i |}t| jv |_|S rq   )r  r-   r   r   possibly_multivalued)r   r  r   colr  r   r   r-   J  s   z#ResolvedOuterRef.resolve_expressionc                 C   r   rq   r   r   relabelsr   r   r   r   R  r   z ResolvedOuterRef.relabeled_cloneNc                 C   r   rq   r   r   r   r   r   r   r   U  r   z"ResolvedOuterRef.get_group_by_colsrq   )
r    r!   r"   r#   r   r   r-   r   r   r3  r   r   r  r   rG  :  s    rG  c                   @   s    e Zd ZdZdd Zdd ZdS )OuterRefFc                 O   s   t | j| jr
| jS t| jS rq   )r   r   r   rG  rI  r   r   r   r-   \  s   
zOuterRef.resolve_expressionc                 C   r   rq   r   rL  r   r   r   r   a  r   zOuterRef.relabeled_cloneN)r    r!   r"   r   r-   r   r   r   r   r   rO  Y  s    rO  zdjango.db.models.Funcc                       s~   e Zd ZdZdZdZdZdZdd fdd
Zdd	 Z	d
d Z
dd Zdd Z	dddZ			dddZ fddZ  ZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)r#  rr   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   rr   )
aritylen	TypeErrorr   r    r  rt   r   source_expressionsextra)r   r   r   rW  r  r   r   rt   n  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 )=NrY  )r   keyvalr   r   r   r     s    

{}({}, {})rB  )

arg_joinerjoinrV  rW  _get_repr_optionssortedr   r  r   r    )r   r  rW  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   ra    r   zFunc._get_repr_optionsc                 C   r   rq   rV  r8   r   r   r   r        zFunc.get_source_expressionsc                 C   s
   || _ d S rq   rc  r   r   r   r   r     r   zFunc.set_source_expressionsTFc           	      C   s>   |   }||_t|jD ]\}}|||||||j|< q|S rq   )rw   r   	enumeraterV  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 ]3}	z	||	\}
}W n ty5   t|	dt}|tu r* |t|\}
}Y nw ||
 |	| qi | j
|}|d urQ||d< n|d| j |p`|d| j}|pi|d| j}|| |d< |d< || |fS )Nr   functiontemplater_  r   r   )r&  r9  rV  r%  r   rR   r   r/   r   r   rW  
setdefaultrg  r   rh  r_  r`  )r   r   r
   rg  rh  r_  r   	sql_partsr   r   arg_sql
arg_paramsr   datar   r   r   r     s0   	


zFunc.as_sqlc                    s*   t   }| jd d  |_| j |_|S rq   )r  rw   rV  rW  )r   rw   r  r   r   rw     s   
z	Func.copyr   )NNN)r    r!   r"   r#   rg  rh  r_  rS  rt   r  ra  r   r   r-   r   rw   r3  r   r   r  r   rP  e  s$    


%rP  zdjango.db.models.Valuec                       sd   e Zd ZdZdZd fdd	Zdd Zdd	 Z	d fdd	ZdddZ	dd Z
edd Z  ZS )r/   z9Represent a wrapped value as a node within an expression.FNc                    s   t  j|d || _dS )a:  
        Arguments:
         * value: the value this expression represents. The value will be
           added into the sql parameter list and properly quoted.

         * output_field: an instance of the model field type that this
           expression will return, such as IntegerField() or CharField().
        rr   N)r  rt   r   )r   r   r   r  r   r   rt     s   	
zValue.__init__c                 C   s   | j j d| jdS )N())r   r    r   r8   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_placeholderNULLz%s)	r&  r9  r   r   r   get_db_prep_saveget_db_prep_valuer.   rp  )r   r   r
   r]  r   r   r   r   r     s   

zValue.as_sqlTc                    s   t  |||||}||_|S rq   )r  r-   r   r   r  r   r   r-     s   zValue.resolve_expressionc                 C   r   rq   r   rN  r   r   r   r     r   zValue.get_group_by_colsc                 C   s   t | jtr
t S t | jtrt S t | jtrt S t | jt	r(t
 S t | jtjr3t S t | jtjr>t S t | jtjrIt S t | jtjrTt S t | jtr^t S t | jtrht S t | jtrrt S d S rq   )r   r   r   r   	CharFieldboolr   r   r   r   r   datetimer.  dater,  timer-  	timedeltar+  r   r   bytesBinaryFieldr   	UUIDFieldr8   r   r   r   r     s.   zValue._resolve_output_fieldc                 C   r   rq   )r   r8   r   r   r   r     r   zValue.empty_result_set_valuerq   r   )r    r!   r"   r#   r   rt   r  r   r-   r   r   r   r   r3  r   r   r  r   r/     s    
r/   c                       sH   e Zd Zd fdd	Zdd Zdd Zddd	Z	d fdd	Z  ZS )RawSQLNc                    s0   |d u rt  }||| _| _t j|d d S r  )r   r   r   r   r  rt   )r   r   r   r   r  r   r   rt     s   zRawSQL.__init__c                 C      d | jj| j| jS Nr^  )r  r   r    r   r   r8   r   r   r   r    r=  zRawSQL.__repr__c                 C   s   d| j  | jfS r$  )r   r   r   r   r   r   r   "  r:   zRawSQL.as_sqlc                 C      | gS rq   r   rN  r   r   r   r   %  rd  zRawSQL.get_group_by_colsTFc           
         sn   |j r-|j j D ]#}|jjD ]}| \}}	|	 | j v r+||j|||  nqq	t	 
|||||S rq   )r   r   get_parent_listlocal_fieldsget_attname_columnlowerr   rD  r   r  r-   )
r   r   r   r   r   r   parentparent_field_column_namer  r   r   r-   (  s   

zRawSQL.resolve_expressionrq   r   )	r    r!   r"   rt   r  r   r   r-   r3  r   r   r  r   r}    s    
r}  c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s   dS )Nz'*'r   r8   r   r   r   r  ;  r   zStar.__repr__c                 C   s   dg fS )Nr'   r   r   r   r   r   r   >     zStar.as_sqlN)r    r!   r"   r  r   r   r   r   r   r  :  s    r  c                       sP   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d ZdddZ	dd Z
  ZS )ColTFNc                    s,   |d u r|}t  j|d ||| _| _d S r  )r  rt   r   target)r   r   r  r   r  r   r   rt   G  s   zCol.__init__c                 C   s>   | j | j}}|r|t|fnt|f}d| jjd|S )NrB  r#  )r   r  r   r  r   r    r`  )r   r   r  identifiersr   r   r   r  M  s   zCol.__repr__c                 C   s<   | j | jj}}|r||fn|f}dt|j|}|g fS )Nr;  )r   r  columnr`  mapquote_name_unless_alias)r   r   r
   r   r  r  r   r   r   r   r   R  s   z
Col.as_sqlc                 C   s,   | j d u r| S | || j | j | j| jS rq   )r   r   r   r  r   rL  r   r   r   r   X  s
   
zCol.relabeled_clonec                 C   r  rq   r   rN  r   r   r   r   _  rd  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}   b  s   
zCol.get_db_convertersrq   )r    r!   r"   r   rJ  rt   r  r   r   r   r}   r3  r   r   r  r   r  B  s    
r  c                       s^   e Zd ZdZ fddZdd Zdd Zdd	 Z	dddZdd Z	dd Z
dddZ  ZS )Refz~
    Reference to column alias of the query. For example, Ref('sum_cost') in
    qs.annotate(sum_cost=Sum('cost')) query.
    c                    s   t    ||| _| _d S rq   )r  rt   refsr   )r   r  r   r  r   r   rt   p  s   
zRef.__init__c                 C   r~  r  )r  r   r    r  r   r8   r   r   r   r  t  r=  zRef.__repr__c                 C      | j gS rq   r   r8   r   r   r   r   w  r  zRef.get_source_expressionsc                 C   s   |\| _ d S rq   r  r   r   r   r   r   z  r   zRef.set_source_expressionsNTFc                 C   r   rq   r   rE  r   r   r   r-   }  s   zRef.resolve_expressionc                 C   r   rq   r   rL  r   r   r   r     r   zRef.relabeled_clonec                 C   s   |j | jg fS rq   )r&  
quote_namer  r   r   r   r   r     rC  z
Ref.as_sqlc                 C   r  rq   r   rN  r   r   r   r     rd  zRef.get_group_by_colsr   rq   )r    r!   r"   r#   rt   r  r   r   r-   r   r   r   r3  r   r   r  r   r  j  s    
r  c                       s4   e Zd ZdZdZ fddZdd Zdd Z  ZS )	ExpressionListz
    An expression containing multiple expressions. Can be used to provide a
    list of expressions as an argument to another expression, like a partition
    clause.
    z%(expressions)sc                    s*   |s
t d| jj t j|i | d S )Nz$%s requires at least one expression.)rH  r   r    r  rt   r   r   rW  r  r   r   rt     s
   
zExpressionList.__init__c                 C   s   | j dd | jD S )Nc                 s   rX  rq   rY  r   r   r   r   r     rZ  z)ExpressionList.__str__.<locals>.<genexpr>)r_  r`  rV  r8   r   r   r   r    rF  zExpressionList.__str__c                 K   s   | j ||fi |S rq   )r   )r   r   r
   r   r   r   r   r     s   zExpressionList.as_sqlite)	r    r!   r"   r#   rh  rt   r  r   r3  r   r   r  r   r    s    r  c                       s,   e Zd ZdZ fddZ fddZ  ZS )OrderByListzORDER BY %(expressions)sc                    s$   dd |D }t  j|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&   rQ  NTr   )r   r   r   r   r   r   r   r   r     s    
z'OrderByList.__init__.<locals>.<genexpr>)r  rt   r  r  r   r   rt     s   zOrderByList.__init__c                    s   | j sdS t j|i |S )N) r   )rV  r  r   rI  r  r   r   r     s   zOrderByList.as_sql)r    r!   r"   rh  rt   r   r3  r   r   r  r   r    s    r  z"django.db.models.ExpressionWrapperc                       sN   e Zd ZdZ fddZdd Zdd Zd fd	d
	Zdd Zdd Z	  Z
S )ExpressionWrapperz
    An expression that can wrap another expression so that it can provide
    extra context to the inner expression, such as the output_field.
    c                    s   t  j|d || _d S r  )r  rt   r   )r   r   r   r  r   r   rt     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  r8   r   r   r   r     r  z(ExpressionWrapper.get_source_expressionsNc                    s4   t | jtr| j }| j|_|j|dS t  S )N)r   )r   r   r   rw   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@  rA  )r  r   r    r   r8   r   r   r   r    rC  zExpressionWrapper.__repr__rq   )r    r!   r"   r#   rt   r   r   r   r   r  r3  r   r   r  r   r    s    	r  zdjango.db.models.Whenc                       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
	dddZdddZd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 )NrO   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rr   r   r   )
r   rR   rU  r   rH  r  rt   	conditionr   r  )r   r  thenlookupsr  r   r   rt     s   zWhen.__init__c                 C   s   d| j | jf S )NzWHEN %r THEN %rr  r  r8   r   r   r   r    r:   zWhen.__str__c                 C      d| j j| f S Nz<%s: %s>r   r    r8   r   r   r   r    r:   zWhen.__repr__c                 C   r   rq   r  r8   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   r8   r   r   r   r     s   
zWhen.get_source_fieldsTc                 C   sJ   |   }||_t|jdr|j||||d|_|j||||||_|S )Nr-   F)rw   r   r.   r  r-   r  r   r   r   r   r-     s   

zWhen.resolve_expressionc                 K   sn   |j |  |}g }|| j\}}||d< || || j\}	}
|	|d< ||
 |p0| j}|| |fS )Nr  r  )r&  r9  r%  r  r   r  rh  )r   r   r
   rh  r   template_params
sql_paramscondition_sqlcondition_params
result_sqlresult_paramsr   r   r   r     s   


zWhen.as_sqlc                 C   $   g }|   D ]	}||  q|S rq   r   r   r   r   r   r   r   r     s   zWhen.get_group_by_colsNNr   rq   )r    r!   r"   rh  rO   rt   r  r  r   r   r   r-   r   r   r3  r   r   r  r   r    s    

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

        CASE
            WHEN n > 0
                THEN 'positive'
            WHEN n < 0
                THEN 'negative'
            ELSE 'zero'
        END
    z#CASE %(cases)s ELSE %(default)s END N)defaultr   c                   sJ   t dd |D stdt | t|| _| |d | _|| _d S )Nc                 s   s    | ]}t |tV  qd S rq   )r   r  )r   caser   r   r   r   7  s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	allrU  r  rt   listcasesr   r  rW  )r   r  r   r  rW  r  r   r   rt   6  s   

zCase.__init__c                 C   s    dd dd | jD | jf S )NzCASE %s, ELSE %rr#  c                 s   rX  rq   rY  )r   r   r   r   r   r   @  rZ  zCase.__str__.<locals>.<genexpr>)r`  r  r  r8   r   r   r   r  >  s   zCase.__str__c                 C   r  r  r  r8   r   r   r   r  D  r:   zCase.__repr__c                 C   s   | j | jg S rq   r  r  r8   r   r   r   r   G  r  zCase.get_source_expressionsc                 C   s   |^ | _ | _d S rq   r  r   r   r   r   r   J  rC  zCase.set_source_expressionsTFc           	      C   sT   |   }||_t|jD ]\}}|||||||j|< q|j||||||_|S rq   )rw   r   re  r  r-   r  )	r   r   r   r   r   r   r   rf  r  r   r   r   r-   M  s   

zCase.resolve_expressionc                    s   t   }|jd d  |_|S rq   )r  rw   r  )r   r   r  r   r   rw   [  s   
z	Case.copyc              	   K   s   |j |  | js|| jS i | j|}g }g }| jD ]}	z	||	\}
}W n	 ty1   Y qw ||
 || q|| j\}}|sK||fS |pO| j	}|
||d< ||d< || |ph|d| j}|| }| jd ur{|j | j| }||fS )Nr  r  rh  )r&  r9  r  r%  r  rW  r   r   r   case_joinerr`  r   rh  r   unification_cast_sqlr   )r   r   r
   rh  r  r   r  
case_partsr  r  case_sqlcase_paramsdefault_sqldefault_paramsr   r   r   r   r   `  s4   




zCase.as_sqlc                    s   | j s	| j|S t |S rq   )r  r  r   r  rN  r  r   r   r   }  s   zCase.get_group_by_colsr   r  rq   )r    r!   r"   r#   rh  r  rt   r  r  r   r   r-   rw   r   r   r3  r   r   r  r   r  %  s    

r  c                       sz   e Zd ZdZdZdZdZd fdd	Zdd Zd	d
 Z	dd Z
 fddZedd Zdd ZdddZdddZ  ZS )Subqueryz
    An explicit subquery. It may contain OuterRef() references to the outer
    query which will be resolved when it is applied to that query.
    z(%(subquery)s)FNc                    s0   t |d| | _d| j_|| _t | d S )Nr   T)rR   r   r   subqueryrW  r  rt   )r   querysetr   rW  r  r   r   rt     s   zSubquery.__init__c                 C   r  rq   r   r8   r   r   r   r     r  zSubquery.get_source_expressionsc                 C   r  r  r  r   r   r   r   r     r  zSubquery.set_source_expressionsc                 C      | j jS rq   )r   r   r8   r   r   r   r     r  zSubquery._resolve_output_fieldc                    s   t   }|j |_|S rq   )r  rw   r   r   r   r   r  r   r   rw     r{   zSubquery.copyc                 C   r  rq   )r   external_aliasesr8   r   r   r   r    s   zSubquery.external_aliasesc                 C   s
   | j  S rq   )r   get_external_colsr8   r   r   r   r    r   zSubquery.get_external_colsc           
      K   sf   |j |  i | j|}|p| j}|||\}}|dd |d< |p*|d| j}|| }	|	|fS )NrQ  r5   r  rh  )r&  r9  rW  r   r   r   rh  )
r   r   r
   rh  r   r   r  subquery_sqlr  r   r   r   r   r     s   
zSubquery.as_sqlc                 C   s   |rt || gS | j S rq   )r  r   r   rN  r   r   r   r     s   
zSubquery.get_group_by_colsrq   r  )r    r!   r"   r#   rh  r   r   rt   r   r   r   rw   r   r  r  r   r   r3  r   r   r  r   r    s    

r  c                       sH   e Zd ZdZe Zd fdd	Zdd Zd fdd		Z	d
d Z
  ZS )ExistszEXISTS(%(subquery)s)Fc                    s   || _ t j|fi | d S rq   )negatedr  rt   )r   r  r  r   r  r   r   rt     s   zExists.__init__c                 C   s   |   }| j |_|S rq   )rw   r  r  r   r   r   
__invert__  s   
zExists.__invert__Nc           	         s   | j j|jd}zt j||f||d|\}}W n ty8   | jr7|jj}|j	s.Y dS |
td Y S  w | jrAd|}||fS )N)using)rh  r   )z1=1r   TzNOT {})r   existsr   r  r   r   r  r
   r7  &supports_boolean_expr_in_select_clauser%  r/   r  )	r   r   r
   rh  r   r   r   r   r7  r  r   r   r     s,   
zExists.as_sqlc                 C   s   |j jjs
d|}||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r
   r7  r  r  r   r   r   r   r     s   

zExists.select_format)Frq   )r    r!   r"   rh  r   r   r   rt   r  r   r   r3  r   r   r  r   r    s    r  zdjango.db.models.OrderByc                   @   sj   e Zd ZdZdZdddZdd Zdd	 Zd
d ZdddZ	dd Z
dddZdd Zdd Zdd ZdS )r   z%(expression)s %(ordering)sFNc                 C   s^   |r|rt d|du s|du rtjdtdd || _|| _|| _t|ds*t d|| _d S )Nz1nulls_first and nulls_last are mutually exclusiveFzNPassing nulls_first=False or nulls_last=False is deprecated, use None instead.   )
stacklevelr-   z%expression must be an expression type)	rH  warningswarnr   nulls_first
nulls_lastr   r.   r   )r   r   r   r  r  r   r   r   rt     s   

zOrderBy.__init__c                 C   r~  )Nz{}({}, descending={}))r  r   r    r   r   r8   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  r8   r   r   r   r     r  zOrderBy.get_source_expressionsc                 K   s   |p| j }|jjr| jrd| }n%| jrd| }n| jr(| jr#|jjs(d| }n| jr6| js2|jjs6d| }|j|  |	| j
\}}|| jrJdndd|}||d9 }||  |fS )	Nz%s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)r   orderingz%(expression)s)rh  r7   supports_order_by_nulls_modifierr  r  r   order_by_nulls_firstr&  r9  r%  r   countrstrip)r   r   r
   rh  r   expression_sqlr   placeholdersr   r   r   r     s8   


zOrderBy.as_sqlc                 C   sF   |j | jr|  }tt| jdddd|_|||S | ||S )NT)r  F)r  )r&  0conditional_expression_supported_in_where_clauser   rw   r  r  r   )r   r   r
   rw   r   r   r   	as_oracle(  s   zOrderBy.as_oraclec                 C   r  rq   r  r   r   r   r   r   6  s   zOrderBy.get_group_by_colsc                 C   s6   | j  | _ | jrd| _d | _| S | jrd| _d | _| S rb   )r   r  r  r8   r   r   r   r   <  s   
zOrderBy.reverse_orderingc                 C   
   d| _ d S r<   r  r8   r   r   r   r   F  r   zOrderBy.ascc                 C   r  rb   r  r8   r   r   r   r   I  r   zOrderBy.desc)FNNrq   )r    r!   r"   rh  rO   rt   r  r   r   r   r  r   r   r   r   r   r   r   r   r     s    



r   c                       s~   e Zd ZdZdZdZdZ				d fdd	Zdd Zd	d
 Z	dd Z
dddZ fddZdd Zdd ZdddZ  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                    s   || _ || _|| _t|ddstd|jj | j d 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.rr   r   )partition_byorder_byframerR   rH  r   r    r   r   r  r  r  rp   r   r  rt   r   source_expression)r   r   r  r  r  r   r  r   r   rt   V  s.   


zWindow.__init__c                 C   r  rq   )r  r   r8   r   r   r   r   z  r  zWindow._resolve_output_fieldc                 C   s   | j | j| j| jgS rq   r  r  r  r  r8   r   r   r   r   }  r   zWindow.get_source_expressionsc                 C   s   |\| _ | _| _| _d S rq   r  r   r   r   r   r     rF  zWindow.set_source_expressionsc                 C   s   |j |  |jjstd|| j\}}g g }}| jd ur5| jj||dd\}}	|	| |
|	 | jd urL|| j\}
}|	|
 |
| | jra|| j\}}|	| |
| |
| |pj| j}||d| d |fS )Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)r   r
   rh  r  )r   window)r&  r9  r7  supports_over_clauser	   r%  r  r  r   r   r   r  r  rh  r`  strip)r   r   r
   rh  expr_sqlr   
window_sqlwindow_paramssql_exprr  	order_sqlorder_params	frame_sqlframe_paramsr   r   r   r     s4   











zWindow.as_sqlc                    sT   t | jtjr$|  }| }t |d _|| tt	|
||S | ||S r  )r   r   r   r   rw   r   r   r   r  r  r   r   )r   r   r
   rw   rV  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  r8   r   r   r   r    s   zWindow.__str__c                 C   r  r  r  r8   r   r   r   r    r:   zWindow.__repr__c                 C   r   rq   r   rN  r   r   r   r     r   zWindow.get_group_by_cols)NNNNrq   )r    r!   r"   rh  r   r   r   rt   r   r   r   r   r   r  r  r   r3  r   r   r  r   r  M  s$    $
"
r  c                   @   sX   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dddZ
dd Zdd ZdS )WindowFrameaV  
    Model the frame clause in window expressions. There are two types of frame
    clauses which are subclasses, however, all processing and validation (by no
    means intended to be complete) is done here. Thus, providing an end for a
    frame is optional (the default is UNBOUNDED FOLLOWING, which is the last
    row in the frame).
    z,%(frame_type)s BETWEEN %(start)s AND %(end)sNc                 C   s   t || _t || _d S rq   )r/   startendr   r  r  r   r   r   rt     s   
zWindowFrame.__init__c                 C   r"  rq   r  r  r   r   r   r   r     r:   z"WindowFrame.set_source_expressionsc                 C   r   rq   r  r8   r   r   r   r     r   z"WindowFrame.get_source_expressionsc                 C   s>   |j |  | || jj| jj\}}| j| j||d g fS )N
frame_typer  r  )r&  r9  window_frame_start_endr  r   r  rh  r  )r   r   r
   r  r  r   r   r   r     s   zWindowFrame.as_sqlc                 C   r  r  r  r8   r   r   r   r    r:   zWindowFrame.__repr__c                 C   r   rq   r   rN  r   r   r   r     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&  	PRECEDINGCURRENT_ROWUNBOUNDED_PRECEDINGr  	FOLLOWINGUNBOUNDED_FOLLOWINGrh  r  r  r   r   r   r    s   

zWindowFrame.__str__c                 C   ri   )Nz3Subclasses must implement window_frame_start_end().rk   r   r
   r  r  r   r   r   r    r  z"WindowFrame.window_frame_start_endr  rq   )r    r!   r"   r#   rh  rt   r   r   r   r  r   r  r  r   r   r   r   r    s    

r  c                   @   r   )RowRangeROWSc                 C      |j ||S rq   )r&  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  c                   @   r   )
ValueRangeRANGEc                 C   r  rq   )r&  window_frame_range_start_endr   r   r   r   r  
  r  z!ValueRange.window_frame_start_endNr  r   r   r   r   r    r  r  )Zrw   rv  	functoolsr   r  collectionsr   decimalr   uuidr   django.core.exceptionsr   r   	django.dbr   r	   r
   django.db.modelsr   django.db.models.constantsr   django.db.models.query_utilsr   django.utils.deconstructr   django.utils.deprecationr   django.utils.functionalr   django.utils.hashabler   r   r$   rp   r   r   r	  r>   rB   r7   rF   rI   rL   rV   r`   rX   rZ   r]   r,  r+  r.  r-  _connector_combinationsr  r  r  dr   r2   field_typesr  r  r  	lru_cacher  r0   r/  r0  r   rG  rO  rP  r/   r}  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r   r   r   <module>   s       +%`

	b3bO"($ I];+cqB