3
gu                 @   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	m
Z
 d dl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!fD Z"ej#dddd Z$G dd deeZ%G dd de%Z&G dd de%Z'eG d d! d!eZ(G d"d# d#e(Z)G d$d% d%e(Z*G d&d' d'eeZ+G d(d) d)eZ,G d*d+ d+eZ-G d,d- d-eZ.G d.d/ d/eZ/G d0d1 d1eZ0G d2d3 d3e+Z1G d4d5 d5eZ2G d6d7 d7eZ3G d8d9 d9eZ4G d:d; d;eeZ5G d<d= d=e5Z6G d>d? d?eZ7G d@dA dAeeZ8G dBdC dCeZ9G dDdE dEe9Z:G dFdG dGe9Z;dS )H    N)Decimal)UUID)EmptyResultSet
FieldError)NotSupportedError
connection)fields)
LOOKUP_SEP)Q)deconstructible)cached_property)make_hashablec               @   s   e Zd ZdZdd ZdS )SQLiteNumericMixinzp
    Some expressions with output_field=DecimalField() must be cast to
    numeric to be properly filtered.
    c             K   sL   | j ||f|\}}y| jj dkr,d| }W n tk
rB   Y nX ||fS )NDecimalFieldzCAST(%s AS NUMERIC))as_sqloutput_fieldget_internal_typer   )selfcompilerr   extra_contextsqlparams r   Z/var/www/tester-filtro-web/env/lib/python3.6/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;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   | j d| jdS )N   F)r/   MUL)r   r   r   r   __neg__G   s    zCombinable.__neg__c             C   s   | j || jdS )NF)r/   ADD)r   r,   r   r   r   __add__J   s    zCombinable.__add__c             C   s   | j || jdS )NF)r/   SUB)r   r,   r   r   r   __sub__M   s    zCombinable.__sub__c             C   s   | j || jdS )NF)r/   r2   )r   r,   r   r   r   __mul__P   s    zCombinable.__mul__c             C   s   | j || jdS )NF)r/   DIV)r   r,   r   r   r   __truediv__S   s    zCombinable.__truediv__c             C   s   | j || jdS )NF)r/   MOD)r   r,   r   r   r   __mod__V   s    zCombinable.__mod__c             C   s   | j || jdS )NF)r/   POW)r   r,   r   r   r   __pow__Y   s    zCombinable.__pow__c             C   s4   t | ddr(t |ddr(t| t|@ S tdd S )NconditionalFz:Use .bitand() and .bitor() for bitwise logical operations.)getattrr
   NotImplementedError)r   r,   r   r   r   __and__\   s    zCombinable.__and__c             C   s   | j || jdS )NF)r/   BITAND)r   r,   r   r   r   bitandc   s    zCombinable.bitandc             C   s   | j || jdS )NF)r/   BITLEFTSHIFT)r   r,   r   r   r   bitleftshiftf   s    zCombinable.bitleftshiftc             C   s   | j || jdS )NF)r/   BITRIGHTSHIFT)r   r,   r   r   r   bitrightshifti   s    zCombinable.bitrightshiftc             C   s   | j || jdS )NF)r/   BITXOR)r   r,   r   r   r   bitxorl   s    zCombinable.bitxorc             C   s4   t | ddr(t |ddr(t| t|B S tdd S )Nr?   Fz:Use .bitand() and .bitor() for bitwise logical operations.)r@   r
   rA   )r   r,   r   r   r   __or__o   s    zCombinable.__or__c             C   s   | j || jdS )NF)r/   BITOR)r   r,   r   r   r   bitorv   s    zCombinable.bitorc             C   s   | j || jdS )NT)r/   r4   )r   r,   r   r   r   __radd__y   s    zCombinable.__radd__c             C   s   | j || jdS )NT)r/   r6   )r   r,   r   r   r   __rsub__|   s    zCombinable.__rsub__c             C   s   | j || jdS )NT)r/   r2   )r   r,   r   r   r   __rmul__   s    zCombinable.__rmul__c             C   s   | j || jdS )NT)r/   r9   )r   r,   r   r   r   __rtruediv__   s    zCombinable.__rtruediv__c             C   s   | j || jdS )NT)r/   r;   )r   r,   r   r   r   __rmod__   s    zCombinable.__rmod__c             C   s   | j || jdS )NT)r/   r=   )r   r,   r   r   r   __rpow__   s    zCombinable.__rpow__c             C   s   t dd S )Nz:Use .bitand() and .bitor() for bitwise logical operations.)rA   )r   r,   r   r   r   __rand__   s    zCombinable.__rand__c             C   s   t dd S )Nz:Use .bitand() and .bitor() for bitwise logical operations.)rA   )r   r,   r   r   r   __ror__   s    zCombinable.__ror__N)&r   r   r   r   r4   r6   r2   r9   r=   r;   rC   rL   rE   rG   rI   r/   r3   r5   r7   r8   r:   r<   r>   rB   rD   rF   rH   rJ   rK   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r   r   r   r   r   !   sF   r   c               @   s2  e Zd ZdZd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edd Zedd Zedd Zd@d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 dAd1d2Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;d< Z&d=d> Z'dS )BBaseExpressionz%Base class for all query expressions.FTNc             C   s   |d k	r|| _ d S )N)r   )r   r   r   r   r   __init__   s    zBaseExpression.__init__c             C   s   | j j }|jdd  |S )Nconvert_value)__dict__copypop)r   stater   r   r   __getstate__   s    
zBaseExpression.__getstate__c             C   s$   | j | jkrg n| j g| jj| S )N)rX   _convert_value_noopr   get_db_converters)r   r   r   r   r   r_      s    z BaseExpression.get_db_convertersc             C   s   g S )Nr   )r   r   r   r   get_source_expressions   s    z%BaseExpression.get_source_expressionsc             C   s   | s
t d S )N)AssertionError)r   exprsr   r   r   set_source_expressions   s    z%BaseExpression.set_source_expressionsc             G   s   dd |D S )Nc             S   s4   g | ],}t |d r|nt|tr(t|nt|qS )r(   )r)   
isinstancestrFr*   ).0argr   r   r   
<listcomp>   s   z5BaseExpression._parse_expressions.<locals>.<listcomp>r   )r   expressionsr   r   r   _parse_expressions   s    z!BaseExpression._parse_expressionsc             C   s   t ddS )a  
        Responsible for returning a (sql, [params]) tuple to be included
        in the current query.

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

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

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

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

        Return: (sql, params)
          Where `sql` is a string containing ordered sql parameters to be
          replaced with the elements of the list `params`.
        z"Subclasses must implement as_sql()N)rA   )r   r   r   r   r   r   r      s    zBaseExpression.as_sqlc             C   s   t dd | j D S )Nc             s   s   | ]}|o|j V  qd S )N)contains_aggregate)rg   exprr   r   r   	<genexpr>   s    z4BaseExpression.contains_aggregate.<locals>.<genexpr>)anyr`   )r   r   r   r   rl      s    z!BaseExpression.contains_aggregatec             C   s   t dd | j D S )Nc             s   s   | ]}|o|j V  qd S )N)contains_over_clause)rg   rm   r   r   r   rn      s    z6BaseExpression.contains_over_clause.<locals>.<genexpr>)ro   r`   )r   r   r   r   rp      s    z#BaseExpression.contains_over_clausec             C   s   t dd | j D S )Nc             s   s   | ]}|o|j V  qd S )N)contains_column_references)rg   rm   r   r   r   rn      s    z<BaseExpression.contains_column_references.<locals>.<genexpr>)ro   r`   )r   r   r   r   rq      s    z)BaseExpression.contains_column_referencesc                s4   | j  }|_|j fdd|j 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|j  nd qS )N)r(   )rg   rm   )allow_joinsqueryreuse	summarizer   r   ri      s   z5BaseExpression.resolve_expression.<locals>.<listcomp>)rZ   
is_summaryrc   r`   )r   rs   rr   rt   ru   for_savecr   )rr   rs   rt   ru   r   r(      s    z!BaseExpression.resolve_expressionc             C   s   t | jtjS )N)rd   r   r   BooleanField)r   r   r   r   r?      s    zBaseExpression.conditionalc             C   s   | j S )N)r   )r   r   r   r   field  s    zBaseExpression.fieldc             C   s"   | j  }|dkrd| _td|S )z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_noner   )r   r   r   r   r   r     s
    zBaseExpression.output_fieldc             C   s(   y| j S  tk
r"   | js Y nX dS )z
        Return the output field of this expression, or None if
        _resolve_output_field() didn't return an output type.
        N)r   r   r|   )r   r   r   r   _output_field_or_none  s
    z$BaseExpression._output_field_or_nonec             C   sX   dd | j  D }x@|D ]8}x0|D ](}t||js"td|jj|jjf q"W |S W dS )a  
        Attempt to infer the output type of the expression. If the output
        fields of all source fields match then, simply infer the same type
        here. This isn't always correct, but it makes sense most of the time.

        Consider the difference between `2 + 2` and `2 / 3`. Inferring
        the type here is a convenience for the common case. The user should
        supply their own output_field with more complex computations.

        If a source's output field resolves to None, exclude it from this check.
        If all sources are None, then an error is raised higher up the stack in
        the output_field property.
        c             s   s   | ]}|d k	r|V  qd S )Nr   )rg   sourcer   r   r   rn   )  s    z7BaseExpression._resolve_output_field.<locals>.<genexpr>zCExpression contains mixed types: %s, %s. You must set output_field.N)get_source_fieldsrd   	__class__r   r   )r   Zsources_iterr   r~   r   r   r   r{     s    

z$BaseExpression._resolve_output_fieldc             C   s   | S )Nr   )value
expressionr   r   r   r   r^   6  s    z"BaseExpression._convert_value_noopc             C   sF   | j }|j }|dkrdd S |jdr0dd S |dkr@dd S | jS )z
        Expressions provide their own converters because users have the option
        of manually specifying the output_field which may be a different type
        from the one the database returns.
        
FloatFieldc             S   s   | d krd S t | S )N)float)r   r   r   r   r   r   <lambda>D  s    z.BaseExpression.convert_value.<locals>.<lambda>IntegerFieldc             S   s   | d krd S t | S )N)int)r   r   r   r   r   r   r   F  s    r   c             S   s   | d krd S t | S )N)r   )r   r   r   r   r   r   r   H  s    )r   r   endswithr^   )r   rz   Zinternal_typer   r   r   rX   :  s    
zBaseExpression.convert_valuec             C   s   | j j|S )N)r   
get_lookup)r   lookupr   r   r   r   K  s    zBaseExpression.get_lookupc             C   s   | j j|S )N)r   get_transform)r   namer   r   r   r   N  s    zBaseExpression.get_transformc                s(   | j  }|j fdd| j D  |S )Nc                s"   g | ]}|d k	r|j  nd qS )N)relabeled_clone)rg   e)
change_mapr   r   ri   T  s   z2BaseExpression.relabeled_clone.<locals>.<listcomp>)rZ   rc   r`   )r   r   cloner   )r   r   r   Q  s
    
zBaseExpression.relabeled_clonec             C   s
   t j | S )N)rZ   )r   r   r   r   rZ   Y  s    zBaseExpression.copyc             C   s4   | j s| gS g }x| j D ]}|j|j  qW |S )N)rl   r`   extendget_group_by_cols)r   aliascolsr~   r   r   r   r   \  s    z BaseExpression.get_group_by_colsc             C   s   dd | j  D S )z9Return the underlying field types used by this aggregate.c             S   s   g | ]
}|j qS r   )r}   )rg   r   r   r   r   ri   f  s    z4BaseExpression.get_source_fields.<locals>.<listcomp>)r`   )r   r   r   r   r   d  s    z BaseExpression.get_source_fieldsc             K   s   t | f|S )N)OrderBy)r   kwargsr   r   r   asch  s    zBaseExpression.ascc             K   s   t | fddi|S )N
descendingT)r   )r   r   r   r   r   desck  s    zBaseExpression.descc             C   s   | S )Nr   )r   r   r   r   reverse_orderingn  s    zBaseExpression.reverse_orderingc             c   s@   | V  x4| j  D ](}|rt|dr2|j E dH  q|V  qW dS )zi
        Recursively yield this expression and all subexpressions, in
        depth-first order.
        flattenN)r`   r)   r   )r   rm   r   r   r   r   q  s    
zBaseExpression.flattenc             C   s$   t | jdr| jj|||S ||fS )z
        Custom format for select clauses. For example, EXISTS expressions need
        to be wrapped in CASE WHEN on Oracle.
        select_format)r)   r   r   )r   r   r   r   r   r   r   r   ~  s    zBaseExpression.select_format)N)NTNFF)N)(r   r   r   r   rv   r|   
filterablewindow_compatiblerW   r]   r_   r`   rc   rk   r   r   rl   rp   rq   r(   propertyr?   rz   r   r}   r{   staticmethodr^   rX   r   r   r   rZ   r   r   r   r   r   r   r   r   r   r   r   rV      sD   

	
rV   c               @   s,   e Zd ZdZedd Zdd Zdd ZdS )	
Expressionz:An expression that can be combined with other expressions.c       	      C   s   t j| j}| j\}}|j||}|j  |jj }| jg}xZ|D ]R\}}t	|t
jr~|jrt|jrt|jjj|jf}qt|}nt|}|j||f qBW t|S )N)inspect	signaturerW   Z_constructor_argsbind_partialapply_defaults	argumentsitemsr   rd   r   Fieldr   model_metalabeltyper   appendtuple)	r   Zconstructor_signatureargsr   r   r   identityrh   r   r   r   r   r     s    


zExpression.identityc             C   s   t |tstS |j| jkS )N)rd   r   NotImplementedr   )r   r,   r   r   r   __eq__  s    
zExpression.__eq__c             C   s
   t | jS )N)hashr   )r   r   r   r   __hash__  s    zExpression.__hash__N)r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c          	   C   sX   i | ]P}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t jt jt jfg|qS r   )r   r   r   r   )rg   r-   r   r   r   
<dictcomp>  s   r      )maxsizec             C   s<   t j| f }x*|D ]"\}}}t||rt||r|S qW d S )N)_connector_combinatorsget
issubclass)r-   lhs_typerhs_typeZcombinatorsZcombinator_lhs_typeZcombinator_rhs_typecombined_typer   r   r   _resolve_combined_type  s    r   c                   s\   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Z fddZdd Z	dddZ
  ZS )r+   Nc                s$   t  j|d || _|| _|| _d S )N)r   )superrW   r-   lhsrhs)r   r   r-   r   r   )r   r   r   rW     s    zCombinedExpression.__init__c             C   s   dj | jj| S )Nz<{}: {}>)formatr   r   )r   r   r   r   __repr__  s    zCombinedExpression.__repr__c             C   s   dj | j| j| jS )Nz{} {} {})r   r   r-   r   )r   r   r   r   __str__  s    zCombinedExpression.__str__c             C   s   | j | jgS )N)r   r   )r   r   r   r   r`     s    z)CombinedExpression.get_source_expressionsc             C   s   |\| _ | _d S )N)r   r   )r   rb   r   r   r   rc     s    z)CombinedExpression.set_source_expressionsc                sN   y
t  j S  tk
rH   t| jt| jjt| jj}|d krB | S X d S )N)	r   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\}}|j| |j| |j | j\}}|j| |j| d}|jj| j|}|| |fS )Nz(%s))compiler   r   r   r   opsZcombine_expressionr-   )r   r   r   rj   expression_paramsr   r   expression_wrapperr   r   r   r     s    



zCombinedExpression.as_sqlTFc             C   s&  | j j|||||}| jj|||||}t| ttfsy|jj }W n tt	fk
rb   d }Y nX y|jj }	W n tt	fk
r   d }	Y nX d||	hkr||	krt| j | j
| jj|||||S dddh}
| j
| jko||
ko||	krt| j | jj|||||S | j }||_||_ ||_|S )NDurationField	DateFieldDateTimeField	TimeField)r   r(   r   rd   DurationExpressionTemporalSubtractionr   r   AttributeErrorr   r-   r6   rZ   rv   )r   rs   rr   rt   ru   rw   r   r   r   r   Zdatetime_fieldsrx   r   r   r   r(     s.    


z%CombinedExpression.resolve_expression)N)NTNFF)r   r   r   rW   r   r   r`   rc   r{   r   r(   __classcell__r   r   )r   r   r+     s   r+   c                   s$   e Zd Zdd Z fddZ  ZS )r   c             C   sT   y
|j }W n tk
r   Y n,X |j dkrJ|j|\}}|jj||fS |j|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 j||S |jj|  g }g }| j| j||\}}|j| |j	| | j| j
||\}}|j| |j	| d}|jj| j|}|| |fS )Nz(%s))featuresZhas_native_duration_fieldr   r   r   check_expression_supportr   r   r   r   r   Zcombine_duration_expressionr-   )r   r   r   rj   r   r   r   r   )r   r   r   r     s    



zDurationExpression.as_sql)r   r   r   r   r   r   r   r   )r   r   r     s   r   c                   s,   e Zd Zej Z fddZdd Z  ZS )r   c                s   t  j|| j| d S )N)r   rW   r6   )r   r   r   )r   r   r   rW   (  s    zTemporalSubtraction.__init__c             C   s<   |j j|  |j| j}|j| j}|j j| jjj ||S )N)r   r   r   r   r   Zsubtract_temporalsr   r   )r   r   r   r   r   r   r   r   r   +  s    zTemporalSubtraction.as_sql)	r   r   r   r   r   r   rW   r   r   r   r   )r   r   r   %  s   r   c               @   sJ   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 )rf   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   r   rW   6  s    z
F.__init__c             C   s   dj | jj| jS )Nz{}({}))r   r   r   r   )r   r   r   r   r   =  s    z
F.__repr__NTFc             C   s   |j | j|||S )N)resolve_refr   )r   rs   rr   rt   ru   rw   r   r   r   r(   @  s    zF.resolve_expressionc             K   s   t | f|S )N)r   )r   r   r   r   r   r   D  s    zF.ascc             K   s   t | fddi|S )Nr   T)r   )r   r   r   r   r   r   G  s    zF.descc             C   s   | j |j ko| j|jkS )N)r   r   )r   r,   r   r   r   r   J  s    zF.__eq__c             C   s
   t | jS )N)r   r   )r   r   r   r   r   M  s    z
F.__hash__)NTNFF)r   r   r   r   rW   r   r(   r   r   r   r   r   r   r   r   rf   2  s    
rf   c                   s>   e Zd ZdZdZdd Z fddZdd Zdd
dZ  Z	S )ResolvedOuterRefz
    An object that contains a reference to an outer query.

    In this case, the reference to the outer query has been resolved because
    the inner query has been used as a subquery.
    Fc             O   s   t dd S )NzXThis queryset contains a reference to an outer query and may only be used in a subquery.)
ValueError)r   r   r   r   r   r   r   Z  s    zResolvedOuterRef.as_sqlc                s   t  j||}t| jk|_|S )N)r   r(   r	   r   possibly_multivalued)r   r   r   col)r   r   r   r(   `  s    z#ResolvedOuterRef.resolve_expressionc             C   s   | S )Nr   )r   relabelsr   r   r   r   h  s    z ResolvedOuterRef.relabeled_cloneNc             C   s   g S )Nr   )r   r   r   r   r   r   k  s    z"ResolvedOuterRef.get_group_by_cols)N)
r   r   r   r   rl   r   r(   r   r   r   r   r   )r   r   r   Q  s   r   c               @   s    e Zd ZdZdd Zdd ZdS )OuterRefFc             O   s   t | j| jr| jS t| jS )N)rd   r   r   r   )r   r   r   r   r   r   r(   r  s    zOuterRef.resolve_expressionc             C   s   | S )Nr   )r   r   r   r   r   r   w  s    zOuterRef.relabeled_cloneN)r   r   r   rl   r(   r   r   r   r   r   r   o  s   r   c                   sv   e Zd ZdZdZdZdZdZdd fdd
Zdd	 Z	d
d Z
dd Zdd ZdddZdddZ fddZ  ZS )FunczAn SQL function call.Nz%(function)s(%(expressions)s)z, )r   c               sh   | j d k	rDt|| j krDtd| jj| j | j dkr4dndt|f t j|d | j| | _|| _	d S )Nz#'%s' takes exactly %s %s (%s given)r0   argumentr   )r   )
aritylen	TypeErrorr   r   r   rW   rk   source_expressionsextra)r   r   rj   r   )r   r   r   rW     s    zFunc.__init__c             C   sh   | j jdd | jD }| j| j }|rXdjdd t|j D }dj| jj	||S dj| jj	|S )Nc             s   s   | ]}t |V  qd S )N)re   )rg   rh   r   r   r   rn     s    z Func.__repr__.<locals>.<genexpr>z, c             s   s&   | ]\}}t |d  t | V  qdS )=N)re   )rg   keyvalr   r   r   rn     s    z
{}({}, {})z{}({}))

arg_joinerjoinr   r   _get_repr_optionssortedr   r   r   r   )r   r   r   r   r   r   r     s    zFunc.__repr__c             C   s   i S )zAReturn a dict of extra __init__() options to include in the repr.r   )r   r   r   r   r     s    zFunc._get_repr_optionsc             C   s   | j S )N)r   )r   r   r   r   r`     s    zFunc.get_source_expressionsc             C   s
   || _ d S )N)r   )r   rb   r   r   r   rc     s    zFunc.set_source_expressionsTFc       	      C   sB   | j  }||_x.t|jD ] \}}|j||||||j|< qW |S )N)rZ   rv   	enumerater   r(   )	r   rs   rr   rt   ru   rw   rx   posrh   r   r   r   r(     s
    zFunc.resolve_expressionc             K   s   |j j|  g }g }x0| jD ]&}	|j|	\}
}|j|
 |j| qW | j|}|d k	rb||d< n|jd| j |p|j	d| j
}|p|j	d| j}|j| |d< |d< || |fS )Nfunctiontemplater   rj   rz   )r   r   r   r   r   r   r   
setdefaultr   r   r   r   r   )r   r   r   r   r   r   r   Z	sql_partsr   rh   Zarg_sqlZ
arg_paramsdatar   r   r   r     s    


zFunc.as_sqlc                s*   t  j }| jd d  |_| jj |_|S )N)r   rZ   r   r   )r   rZ   )r   r   r   rZ     s    
z	Func.copy)NTNFF)NNN)r   r   r   r   r   r   r   r   rW   r   r   r`   rc   r(   r   rZ   r   r   r   )r   r   r   {  s   

r   c                   sV   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
  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().
        )r   N)r   rW   r   )r   r   r   )r   r   r   rW     s    	zValue.__init__c             C   s   dj | jj| jS )Nz{}({}))r   r   r   r   )r   r   r   r   r     s    zValue.__repr__c             C   s|   |j j|  | j}| j}|d k	rb| jr6|j||d}n|j||d}t|drb|j||||gfS |d krrdg fS d|gfS )N)r   get_placeholderZNULLz%s)	r   r   r   r}   rw   Zget_db_prep_saveZget_db_prep_valuer)   r   )r   r   r   r   r   r   r   r   r     s    
zValue.as_sqlTc                s   t  j|||||}||_|S )N)r   r(   rw   )r   rs   rr   rt   ru   rw   rx   )r   r   r   r(     s    zValue.resolve_expressionc             C   s   g S )Nr   )r   r   r   r   r   r     s    zValue.get_group_by_colsc             C   s   t | jtrtj S t | jtr(tj S t | jtr<tj S t | jt	rPtj
 S t | jtjrftj S t | jtjr|tj S t | jtjrtj S t | jtjrtj S t | jtrtj S t | jtrtj S t | jtrtj S d S )N)rd   r   re   r   Z	CharFieldboolry   r   r   r   r   datetimer   dater   timer   	timedeltar   r   r   bytesZBinaryFieldr   Z	UUIDField)r   r   r   r   r{     s,    zValue._resolve_output_field)N)NTNFF)N)r   r   r   r   rw   rW   r   r   r(   r   r{   r   r   r   )r   r   r*     s   
r*   c                   sF   e Zd Zd fdd	Zdd Zdd Zddd	Zd fdd	Z  ZS )RawSQLNc                s0   |d krt j }|| | _| _t j|d d S )N)r   )r   r   r   r   r   rW   )r   r   r   r   )r   r   r   rW     s    zRawSQL.__init__c             C   s   dj | jj| j| jS )Nz
{}({}, {}))r   r   r   r   r   )r   r   r   r   r     s    zRawSQL.__repr__c             C   s   d| j  | jfS )Nz(%s))r   r   )r   r   r   r   r   r   r     s    zRawSQL.as_sqlc             C   s   | gS )Nr   )r   r   r   r   r   r     s    zRawSQL.get_group_by_colsTFc       
         sn   xX|j jj D ]H}xB|jjD ]6}|j \}}	|	j | jj kr|j|j||| P qW qW t	 j
|||||S )N)r   r   Zget_parent_listZlocal_fieldsZget_attname_columnlowerr   r   r   r   r(   )
r   rs   rr   rt   ru   rw   parentZparent_field_Zcolumn_name)r   r   r   r(     s    
zRawSQL.resolve_expression)N)N)NTNFF)	r   r   r   rW   r   r   r   r(   r   r   r   )r   r   r     s
   
r   c               @   s   e Zd Zdd Zdd ZdS )Starc             C   s   dS )Nz'*'r   )r   r   r   r   r   )  s    zStar.__repr__c             C   s   dg fS )Nr"   r   )r   r   r   r   r   r   r   ,  s    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 kr|}t  j|d || | _| _d S )N)r   )r   rW   r   target)r   r   r   r   )r   r   r   rW   5  s    zCol.__init__c             C   s>   | j | j }}|r|t|fnt|f}dj| jjdj|S )Nz{}({})z, )r   r   re   r   r   r   r   )r   r   r   identifiersr   r   r   r   ;  s    zCol.__repr__c             C   s<   | j | jj }}|r||fn|f}djt|j|}|g fS )N.)r   r   columnr   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 kr| S | j|j| j | j | j| jS )N)r   r   r   r   r   )r   r   r   r   r   r   F  s    
zCol.relabeled_clonec             C   s   | gS )Nr   )r   r   r   r   r   r   K  s    zCol.get_group_by_colsc             C   s0   | j | jkr| jj|S | jj|| j j| S )N)r   r   r_   )r   r   r   r   r   r_   N  s    
zCol.get_db_converters)N)N)r   r   r   rq   r   rW   r   r   r   r   r_   r   r   r   )r   r   r   0  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  j  || | _| _d S )N)r   rW   refsr~   )r   r  r~   )r   r   r   rW   Z  s    
zRef.__init__c             C   s   dj | jj| j| jS )Nz
{}({}, {}))r   r   r   r  r~   )r   r   r   r   r   ^  s    zRef.__repr__c             C   s   | j gS )N)r~   )r   r   r   r   r`   a  s    zRef.get_source_expressionsc             C   s   |\| _ d S )N)r~   )r   rb   r   r   r   rc   d  s    zRef.set_source_expressionsNTFc             C   s   | S )Nr   )r   rs   rr   rt   ru   rw   r   r   r   r(   g  s    zRef.resolve_expressionc             C   s   | S )Nr   )r   r   r   r   r   r   l  s    zRef.relabeled_clonec             C   s   |j j| jg fS )N)r   Z
quote_namer  )r   r   r   r   r   r   r   o  s    z
Ref.as_sqlc             C   s   | gS )Nr   )r   r   r   r   r   r   r  s    zRef.get_group_by_cols)NTNFF)N)r   r   r   r   rW   r   r`   rc   r(   r   r   r   r   r   r   )r   r   r  U  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 an
    ordering clause.
    z%(expressions)sc                s&   |st d| jj t j|| d S )Nz$%s requires at least one expression.)r   r   r   r   rW   )r   rj   r   )r   r   r   rW   ~  s    zExpressionList.__init__c             C   s   | j jdd | jD S )Nc             s   s   | ]}t |V  qd S )N)re   )rg   rh   r   r   r   rn     s    z)ExpressionList.__str__.<locals>.<genexpr>)r   r   r   )r   r   r   r   r     s    zExpressionList.__str__c             K   s   | j ||f|S )N)r   )r   r   r   r   r   r   r   r     s    zExpressionList.as_sqlite)	r   r   r   r   r   rW   r   r   r   r   r   )r   r   r  v  s
   r  c                   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 )N)r   )r   rW   r   )r   r   r   )r   r   r   rW     s    zExpressionWrapper.__init__c             C   s   |d | _ d S )Nr   )r   )r   rb   r   r   r   rc     s    z(ExpressionWrapper.set_source_expressionsc             C   s   | j gS )N)r   )r   r   r   r   r`     s    z(ExpressionWrapper.get_source_expressionsNc                s4   t | jtr*| jj }| j|_|j|dS t j S )N)r   )rd   r   r   rZ   r   r   r   )r   r   r   )r   r   r   r     s
    
z#ExpressionWrapper.get_group_by_colsc             C   s   |j | jS )N)r   r   )r   r   r   r   r   r   r     s    zExpressionWrapper.as_sqlc             C   s   dj | jj| jS )Nz{}({}))r   r   r   r   )r   r   r   r   r     s    zExpressionWrapper.__repr__)N)r   r   r   r   rW   rc   r`   r   r   r   r   r   r   )r   r   r    s   	r  c                   sl   e Zd ZdZdZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
dddZdddZdddZ  ZS )Whenz"WHEN %(condition)s THEN %(result)sFNc                s   |r<|d krt f |d  }}nt|ddr<t |f|d  }}|d ksVt|dd sV|r^tdt|t rv| rvtdt jd d || _| j|d | _	d S )Nr?   FzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.)r   r   )
r
   r@   r   rd   r   r   rW   	conditionrk   result)r   r  thenlookups)r   r   r   rW     s    zWhen.__init__c             C   s   d| j | jf S )NzWHEN %r THEN %r)r  r  )r   r   r   r   r     s    zWhen.__str__c             C   s   d| j j| f S )Nz<%s: %s>)r   r   )r   r   r   r   r     s    zWhen.__repr__c             C   s   | j | jgS )N)r  r  )r   r   r   r   r`     s    zWhen.get_source_expressionsc             C   s   |\| _ | _d S )N)r  r  )r   rb   r   r   r   rc     s    zWhen.set_source_expressionsc             C   s
   | j jgS )N)r  r}   )r   r   r   r   r     s    zWhen.get_source_fieldsTc             C   sJ   | j  }||_t|jdr0|jj||||d|_|jj||||||_|S )Nr(   F)rZ   rv   r)   r  r(   r  )r   rs   rr   rt   ru   rw   rx   r   r   r   r(     s    zWhen.resolve_expressionc             K   sn   |j j|  |}g }|j| j\}}||d< |j| |j| j\}	}
|	|d< |j|
 |p`| j}|| |fS )Nr  r  )r   r   r   r  r   r  r   )r   r   r   r   r   template_params
sql_paramsZcondition_sqlZcondition_paramsZ
result_sqlZresult_paramsr   r   r   r     s    


zWhen.as_sqlc             C   s(   g }x| j  D ]}|j|j  qW |S )N)r`   r   r   )r   r   r   r~   r   r   r   r     s    zWhen.get_group_by_cols)NN)NTNFF)N)N)r   r   r   r   r?   rW   r   r   r`   rc   r   r(   r   r   r   r   r   )r   r   r    s   

r  c                   s~   e Zd ZdZdZdZdd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 j| t|| _| j|d | _|| _d S )Nc             s   s   | ]}t |tV  qd S )N)rd   r  )rg   caser   r   r   rn     s    z Case.__init__.<locals>.<genexpr>z.Positional arguments must all be When objects.r   )	allr   r   rW   listcasesrk   r  r   )r   r  r   r  r   )r   r   r   rW     s    
zCase.__init__c             C   s    ddj dd | jD | jf S )NzCASE %s, ELSE %rz, c             s   s   | ]}t |V  qd S )N)re   )rg   rx   r   r   r   rn     s    zCase.__str__.<locals>.<genexpr>)r   r  r  )r   r   r   r   r     s    zCase.__str__c             C   s   d| j j| f S )Nz<%s: %s>)r   r   )r   r   r   r   r     s    zCase.__repr__c             C   s   | j | jg S )N)r  r  )r   r   r   r   r`     s    zCase.get_source_expressionsc             C   s   |^ | _ | _d S )N)r  r  )r   rb   r   r   r   rc     s    zCase.set_source_expressionsTFc       	      C   sX   | j  }||_x.t|jD ] \}}|j||||||j|< qW |jj||||||_|S )N)rZ   rv   r   r  r(   r  )	r   rs   rr   rt   ru   rw   rx   r   r  r   r   r   r(     s    zCase.resolve_expressionc                s   t  j }|jd d  |_|S )N)r   rZ   r  )r   rx   )r   r   r   rZ     s    
z	Case.copyc             K   s  |j j|  | js|j| jS | j|}g }g }xL| jD ]B}	y|j|	\}
}W n tk
rd   w8Y nX |j|
 |j| q8W |j| j\}}|s||fS |p| j	}|j
||d< ||d< |j| |p|jd| j}|| }| jd k	r|j j| j| }||fS )Nr  r  r   )r   r   r  r   r  r   r   r   r   case_joinerr   r   r   r}   Zunification_cast_sqlr   )r   r   r   r   r  r   r
  Z
case_partsr  r  Zcase_sqlZcase_paramsZdefault_sqlZdefault_paramsr   r   r   r   r     s2    




zCase.as_sqlc                s   | j s| jj|S t j|S )N)r  r  r   r   )r   r   )r   r   r   r   9  s    zCase.get_group_by_cols)NTNFF)NN)N)r   r   r   r   r   r  rW   r   r   r`   rc   r(   rZ   r   r   r   r   r   )r   r   r    s   

r  c                   sv   e 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                s$   t |d|| _|| _t j| d S )Nrs   )r@   rs   r   r   rW   )r   querysetr   r   )r   r   r   rW   G  s    zSubquery.__init__c             C   s   | j gS )N)rs   )r   r   r   r   r`   M  s    zSubquery.get_source_expressionsc             C   s   |d | _ d S )Nr   )rs   )r   rb   r   r   r   rc   P  s    zSubquery.set_source_expressionsc             C   s   | j jS )N)rs   r   )r   r   r   r   r{   S  s    zSubquery._resolve_output_fieldc                s   t  j }|jj |_|S )N)r   rZ   rs   r   )r   r   )r   r   r   rZ   V  s    
zSubquery.copyc             C   s   | j jS )N)rs   external_aliases)r   r   r   r   r  [  s    zSubquery.external_aliasesc             C   s
   | j j S )N)rs   get_external_cols)r   r   r   r   r  _  s    zSubquery.get_external_colsc       
      K   sb   |j j|  | j|}|p| j}|j||\}}|dd |d< |pP|jd| j}|| }	|	|fS )Nr0   Zsubqueryr   r1   )r   r   r   rs   r   r   r   )
r   r   r   r   rs   r   r
  Zsubquery_sqlr  r   r   r   r   r   b  s    

zSubquery.as_sqlc             C   s4   |rt || gS | j }tdd |D r0| gS |S )Nc             s   s   | ]}|j V  qd S )N)r   )rg   r   r   r   r   rn   q  s    z-Subquery.get_group_by_cols.<locals>.<genexpr>)r  r  ro   )r   r   Zexternal_colsr   r   r   r   m  s    zSubquery.get_group_by_cols)N)NN)N)r   r   r   r   r   rl   rW   r`   rc   r{   rZ   r   r  r  r   r   r   r   r   )r   r   r  ?  s   
r  c                   sH   e Zd ZdZej 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| d S )N)negatedr   rW   )r   r  r  r   )r   r   r   rW   z  s    zExists.__init__c             C   s   | j  }| j |_|S )N)rZ   r  )r   r   r   r   r   
__invert__~  s    
zExists.__invert__Nc                sH   | j j|jd}t j||f||d|\}}| jr@dj|}||fS )N)Zusing)r   rs   zNOT {})rs   existsr   r   r   r  r   )r   r   r   r   r   rs   r   r   )r   r   r   r     s    
zExists.as_sqlc             C   s   |j jjsdj|}||fS )NzCASE WHEN {} THEN 1 ELSE 0 END)r   r   Z&supports_boolean_expr_in_select_clauser   )r   r   r   r   r   r   r   r     s    

zExists.select_format)F)N)r   r   r   r   r   ry   r   rW   r  r   r   r   r   r   )r   r   r  v  s   r  c               @   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)sFc             C   s>   |r|rt d|| _|| _|| _t|ds4t d|| _d S )Nz1nulls_first and nulls_last are mutually exclusiver(   z%expression must be an expression type)r   nulls_first
nulls_lastr   r)   r   )r   r   r   r  r  r   r   r   rW     s    
zOrderBy.__init__c             C   s   dj | jj| j| jS )Nz{}({}, descending={}))r   r   r   r   r   )r   r   r   r   r     s    zOrderBy.__repr__c             C   s   |d | _ d S )Nr   )r   )r   rb   r   r   r   rc     s    zOrderBy.set_source_expressionsc             C   s   | j gS )N)r   )r   r   r   r   r`     s    zOrderBy.get_source_expressionsNc             K   s   |p| j }|jjr2| jr"d| }qr| jrrd| }n@| jrR| joD|jj rRd| }n | jrr| j of|jj rrd| }|jj|  |j	| j
\}}|| jrdndd|}|p| j }||jd9 }|| j |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)r   r   Z supports_order_by_nulls_modifierr  r  r   Zorder_by_nulls_firstr   r   r   r   countrstrip)r   r   r   r   r   Zexpression_sqlr   Zplaceholdersr   r   r   r     s(    




zOrderBy.as_sqlc             C   sD   t | jtr8| j }tt| jdddd|_|j||S | j||S )NT)r  F)r  )rd   r   r  rZ   r  r  r   )r   r   r   rZ   r   r   r   	as_oracle  s    
zOrderBy.as_oraclec             C   s(   g }x| j  D ]}|j|j  qW |S )N)r`   r   r   )r   r   r   r~   r   r   r   r     s    zOrderBy.get_group_by_colsc             C   s.   | j  | _ | js| jr*| j | _| j | _| S )N)r   r  r  )r   r   r   r   r     s
    


zOrderBy.reverse_orderingc             C   s
   d| _ d S )NF)r   )r   r   r   r   r     s    zOrderBy.ascc             C   s
   d| _ d S )NT)r   )r   r   r   r   r     s    zOrderBy.desc)FFF)N)N)r   r   r   r   r?   rW   r   rc   r`   r   r!  r   r   r   r   r   r   r   r   r     s   



r   c                   sv   e Zd ZdZdZdZdZd fdd	Zdd Zd	d
 Z	dd Z
dddZ fddZdd Zdd ZdddZ  ZS )Windowz %(expression)s OVER (%(window)s)FTNc                s   || _ || _|| _t|dds.td|jj | j d k	r^t| j tt	fsR| j f| _ t
| j  | _ | jd k	rt| jt	tfrt
| j | _nt| jtstdt j|d | j|d | _d S )Nr   Fz3Expression '%s' isn't compatible with OVER clauses.zCorder_by must be either an Expression or a sequence of expressions.)r   r   )partition_byorder_byframer@   r   r   r   rd   r   r  r  rV   r   rW   rk   source_expression)r   r   r#  r$  r%  r   )r   r   r   rW     s&    


zWindow.__init__c             C   s   | j jS )N)r&  r   )r   r   r   r   r{     s    zWindow._resolve_output_fieldc             C   s   | j | j| j| jgS )N)r&  r#  r$  r%  )r   r   r   r   r`     s    zWindow.get_source_expressionsc             C   s   |\| _ | _| _| _d S )N)r&  r#  r$  r%  )r   rb   r   r   r   rc     s    zWindow.set_source_expressionsc             C   s   |j j|  |jjstd|j| j\}}g g  }}| jd k	rj| jj||dd\}}	|j	| |j	|	 | j
d k	r|jd |j| j
\}
}|j	|
 |j	| | jr|j| j\}}|jd|  |j	| |j	| |p| j}||dj|j d |fS )Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)r   r   r   z
 ORDER BY r   )r   Zwindow)r   r   r   Zsupports_over_clauser   r   r&  r#  r   r   r$  r   r%  r   r   strip)r   r   r   r   Zexpr_sqlr   Z
window_sqlZwindow_paramsZsql_exprr  Z	order_sqlZorder_paramsZ	frame_sqlZframe_paramsr   r   r   r     s4    










zWindow.as_sqlc                sT   t | jtjrH| j }|j }tj |d _|j| tt	|j
||S | j||S )Nr   )rd   r   r   r   rZ   r`   r   rc   r   r"  r   r   )r   r   r   rZ   r   )r   r   r   r   ;  s    
zWindow.as_sqlitec             C   sH   dj t| j| jr dt| j nd| jr6dt| j ndt| jpBdS )Nz{} OVER ({}{}{})zPARTITION BY r'  z	ORDER BY )r   re   r&  r#  r$  r%  )r   r   r   r   r   E  s
    zWindow.__str__c             C   s   d| j j| f S )Nz<%s: %s>)r   r   )r   r   r   r   r   M  s    zWindow.__repr__c             C   s   g S )Nr   )r   r   r   r   r   r   P  s    zWindow.get_group_by_cols)NNNN)N)N)r   r   r   r   rl   rp   r   rW   r{   r`   rc   r   r   r   r   r   r   r   r   )r   r   r"    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 )N)r*   startend)r   r*  r+  r   r   r   rW   ^  s    
zWindowFrame.__init__c             C   s   |\| _ | _d S )N)r*  r+  )r   rb   r   r   r   rc   b  s    z"WindowFrame.set_source_expressionsc             C   s   | j | jgS )N)r*  r+  )r   r   r   r   r`   e  s    z"WindowFrame.get_source_expressionsc             C   s>   |j j|  | j|| jj| jj\}}| j| j||d g fS )N)
frame_typer*  r+  )r   r   window_frame_start_endr*  r   r+  r   r,  )r   r   r   r*  r+  r   r   r   r   h  s    zWindowFrame.as_sqlc             C   s   d| j j| f S )Nz<%s: %s>)r   r   )r   r   r   r   r   q  s    zWindowFrame.__repr__c             C   s   g S )Nr   )r   r   r   r   r   r   t  s    zWindowFrame.get_group_by_colsc             C   s   | j jd k	r2| j jdk r2dt| j jtjjf }n*| j jd k	rT| j jdkrTtjj}ntjj}| jjd k	r| jjdkrd| jjtjj	f }n*| jjd k	r| jjdkrtjj}ntjj
}| j| j||d S )Nr   z%d %s)r,  r*  r+  )r*  r   absr   r   Z	PRECEDINGZCURRENT_ROWZUNBOUNDED_PRECEDINGr+  Z	FOLLOWINGZUNBOUNDED_FOLLOWINGr   r,  )r   r*  r+  r   r   r   r   w  s    

zWindowFrame.__str__c             C   s   t dd S )Nz3Subclasses must implement window_frame_start_end().)rA   )r   r   r*  r+  r   r   r   r-    s    z"WindowFrame.window_frame_start_end)NN)N)r   r   r   r   r   rW   rc   r`   r   r   r   r   r-  r   r   r   r   r)  T  s   
	
r)  c               @   s   e Zd ZdZdd ZdS )RowRangeZROWSc             C   s   |j j||S )N)r   Zwindow_frame_rows_start_end)r   r   r*  r+  r   r   r   r-    s    zRowRange.window_frame_start_endN)r   r   r   r,  r-  r   r   r   r   r/    s   r/  c               @   s   e Zd ZdZdd ZdS )
ValueRangeRANGEc             C   s   |j j||S )N)r   Zwindow_frame_range_start_end)r   r   r*  r+  r   r   r   r-    s    z!ValueRange.window_frame_start_endN)r   r   r   r,  r-  r   r   r   r   r0    s   r0  )<rZ   r   	functoolsr   decimalr   uuidr   Zdjango.core.exceptionsr   r   Z	django.dbr   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   rV   r   r4   r6   r2   r9   r   	lru_cacher   r+   r   r   rf   r   r   r   r*   r   r   r   r  r  r  r  r  r  r  r   r"  r)  r/  r0  r   r   r   r   <module>   s\   u s
KJH%! CQ7#Sh;