

_V                 @   s  d  Z  d d l m Z d d l m Z m Z d d l m Z m Z d d d d d	 d
 d d g Z	 Gd d   d e  Z
 Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z Gd d	   d	 e
  Z Gd d
   d
 e
  Z Gd d   d e
  Z Gd d   d e
  Z d S)z>
Classes to represent the definitions of aggregate functions.
    )
FieldError)FuncStar)
FloatFieldIntegerField	AggregateAvgCountMaxMinStdDevSumVariancec                   sg   e  Z d  Z d Z d Z d d d d d   f d d  Z e d d    Z d d	   Z d
 d   Z	   S)r   TNFc                s   t  t |   j | | | |  } | s | j   } xy t |  D]h \ } }	 |	 j r@ |  j   | }
 t |
 d  r} |
 j n	 t |
  } t	 d | j | | f   q@ q@ Wn  | j
 |  | S)Nnamez-Cannot compute %s('%s'): '%s' is an aggregate)superr   resolve_expressionget_source_expressions	enumeratecontains_aggregatehasattrr   reprr   _patch_aggregate)selfqueryZallow_joinsZreuseZ	summarizeZfor_savecexpressionsindexexprZbefore_resolvedr   )	__class__ =/tmp/pip-build-ghmbqnp_/Django/django/db/models/aggregates.pyr      s    !	$&zAggregate.resolve_expressionc             C   s_   |  j    } t |  d k rO t | d d  rO d | d j |  j j   f St d   d  S)N   r   r   z%s__%sz$Complex expressions require an alias)r   lenr   r   lower	TypeError)r   r   r   r   r    default_alias   s    %zAggregate.default_aliasc             C   s   g  S)Nr   )r   r   r   r    get_group_by_cols%   s    zAggregate.get_group_by_colsc             C   s   t  |  d  s |  j d k	 r# d Sd } |  j | | d d d  | j j |  } d |  j k r t  | d  r | j |  j d <n  t  | d  r | j |  j d <n  d S)as  
        Helper method for patching 3rd party aggregates that do not yet support
        the new way of subclassing. This method will be removed in Django 1.10.

        add_to_query(query, alias, col, source, is_summary) will be defined on
        legacy aggregates which, in turn, instantiates the SQL implementation of
        the aggregate. In all the cases found, the general implementation of
        add_to_query looks like:

        def add_to_query(self, query, alias, col, source, is_summary):
            klass = SQLImplementationAggregate
            aggregate = klass(col, source=source, is_summary=is_summary, **self.extra)
            query.aggregates[alias] = aggregate

        By supplying a known alias, we can get the SQLAggregate out of the
        aggregates dict, and use the sql_function and sql_template attributes
        to patch *this* aggregate.
        add_to_queryNZ
_XXXXXXXX_sql_functionfunctionsql_templatetemplate)r   r)   r'   Z
aggregatespopextrar(   r*   )r   r   Zplaceholder_aliasZsql_aggregater   r   r    r   (   s    zAggregate._patch_aggregate)
__name__
__module____qualname__r   r   r   propertyr%   r&   r   r   r   )r   r    r      s   !c                   s@   e  Z d  Z d Z d  Z   f d d   Z   f d d   Z   S)r   ZAVGc                s8   | j  d t    } t t |   j | d | | d  S)Noutput_field)r,   r   r   r   __init__)r   
expressionr-   r2   )r   r   r    r3   L   s    zAvg.__init__c                ss   |  j  j   d k rZ |  j   d } d d l m } m } | j | t | |     St t |   j	 | |  S)NDurationFieldr   )IntervalToSecondsSecondsToInterval)
r2   get_internal_typer   #django.db.backends.oracle.functionsr6   r7   compiler   r   as_sql)r   compiler
connectionr4   r6   r7   )r   r   r    	as_oracleP   s    zAvg.as_oracle)r.   r/   r0   r)   r   r3   r>   r   r   )r   r    r   H   s   c                   sO   e  Z d  Z d Z d  Z d Z d   f d d  Z d d   Z d d	   Z   S)
r	   ZCOUNTz)%(function)s(%(distinct)s%(expressions)s)Fc                sP   | d k r t    } n  t t |   j | d | r9 d n d d t   | d  S)N*distinctz	DISTINCT  r2   )r   r   r	   r3   r   )r   r4   r@   r-   )r   r   r    r3   _   s    zCount.__init__c             C   sN   d j  |  j j |  j j d d   |  j D  |  j d d k rG d n d  S)Nz{}({}, distinct={})c             s   s   |  ] } t  |  Vq d  S)N)str).0argr   r   r    	<genexpr>h   s    z!Count.__repr__.<locals>.<genexpr>r@   rA   FalseTrue)formatr   r.   
arg_joinerjoinsource_expressionsr-   )r   r   r   r    __repr__e   s    	zCount.__repr__c             C   s   | d  k r d St  |  S)Nr   )int)r   valuer4   r=   contextr   r   r    convert_valuel   s    zCount.convert_value)	r.   r/   r0   r)   r   r+   r3   rL   rP   r   r   )r   r    r	   Z   s   c               @   s   e  Z d  Z d Z d  Z d S)r
   MAXN)r.   r/   r0   r)   r   r   r   r   r    r
   r   s   c               @   s   e  Z d  Z d Z d  Z d S)r   ZMINN)r.   r/   r0   r)   r   r   r   r   r    r   w   s   c                   sC   e  Z d  Z d  Z d   f d d  Z d d   Z d d   Z   S)r   Fc                s;   | r d n d |  _  t t |   j | d t   | d  S)NZSTDDEV_SAMP
STDDEV_POPr2   )r)   r   r   r3   r   )r   r4   sampler-   )r   r   r    r3      s    zStdDev.__init__c             C   sJ   d j  |  j j |  j j d d   |  j D  |  j d k rC d n d  S)Nz{}({}, sample={})c             s   s   |  ] } t  |  Vq d  S)N)rB   )rC   rD   r   r   r    rE      s    z"StdDev.__repr__.<locals>.<genexpr>rR   rF   rG   )rH   r   r.   rI   rJ   rK   r)   )r   r   r   r    rL      s    	zStdDev.__repr__c             C   s   | d  k r | St  |  S)N)float)r   rN   r4   r=   rO   r   r   r    rP      s    zStdDev.convert_value)r.   r/   r0   r   r3   rL   rP   r   r   )r   r    r   |   s   c                   s.   e  Z d  Z d Z d  Z   f d d   Z   S)r   ZSUMc                ss   |  j  j   d k rZ |  j   d } d d l m } m } | j | t | |     St t |   j	 | |  S)Nr5   r   )r6   r7   )
r2   r8   r   r9   r6   r7   r:   r   r   r;   )r   r<   r=   r4   r6   r7   )r   r   r    r>      s    zSum.as_oracle)r.   r/   r0   r)   r   r>   r   r   )r   r    r      s   c                   sC   e  Z d  Z d  Z d   f d d  Z d d   Z d d   Z   S)r   Fc                s;   | r d n d |  _  t t |   j | d t   | d  S)NZVAR_SAMPVAR_POPr2   )r)   r   r   r3   r   )r   r4   rS   r-   )r   r   r    r3      s    zVariance.__init__c             C   sJ   d j  |  j j |  j j d d   |  j D  |  j d k rC d n d  S)Nz{}({}, sample={})c             s   s   |  ] } t  |  Vq d  S)N)rB   )rC   rD   r   r   r    rE      s    z$Variance.__repr__.<locals>.<genexpr>rU   rF   rG   )rH   r   r.   rI   rJ   rK   r)   )r   r   r   r    rL      s    	zVariance.__repr__c             C   s   | d  k r | St  |  S)N)rT   )r   rN   r4   r=   rO   r   r   r    rP      s    zVariance.convert_value)r.   r/   r0   r   r3   rL   rP   r   r   )r   r    r      s   N)__doc__Zdjango.core.exceptionsr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   r   __all__r   r   r	   r
   r   r   r   r   r   r   r   r    <module>   s   ;