3
š(ƒhÂ  ã               @   sÌ   d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 ddddd	d
ddg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 dd	„ d	eƒZG dd
„ d
eƒZG dd„ deƒZG dd„ deƒZdS )z>
Classes to represent the definitions of aggregate functions.
é    )Ú
FieldError)ÚFuncÚStar)ÚDecimalFieldÚ
FloatFieldÚIntegerFieldÚ	AggregateÚAvgÚCountÚMaxÚMinÚStdDevÚSumÚVariancec                   s:   e Zd ZdZdZd
‡ fdd„	Zedd„ ƒZdd	„ Z‡  Z	S )r   TNFc                sz   t t| ƒj||||ƒ}|sv|jƒ }xRt|ƒD ]F\}}	|	jr,| jƒ | }
t|
dƒrV|
jnt|
ƒ}t	d|j||f ƒ‚q,W |S )NÚnamez-Cannot compute %s('%s'): '%s' is an aggregate)
Úsuperr   Úresolve_expressionÚget_source_expressionsÚ	enumerateÚcontains_aggregateÚhasattrr   Úreprr   )ÚselfÚqueryZallow_joinsZreuseZ	summarizeZfor_saveÚcÚexpressionsÚindexÚexprZbefore_resolvedr   )Ú	__class__© ú?/tmp/pip-install-q3hcpn_q/Django/django/db/models/aggregates.pyr      s    zAggregate.resolve_expressionc             C   sF   | j ƒ }t|ƒdkr:t|d dƒr:d|d j| jjƒ f S t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_cols)NTNFF)
Ú__name__Ú
__module__Ú__qualname__r   r   r   Úpropertyr%   r&   Ú__classcell__r   r   )r   r    r      s
   c                   s0   e Zd ZdZd Z‡ fdd„Z‡ fdd„Z‡  ZS )r	   ZAVGc                s4   | j ƒ d }t|ttfƒr"tƒ | _tt| ƒjƒ  d S )Nr   )	Zget_source_fieldsÚ
isinstancer   r   r   Z_output_fieldr   r	   Ú_resolve_output_field)r   Zsource_field)r   r   r    r-   ,   s    zAvg._resolve_output_fieldc                sR   | j jƒ dkr@| jƒ d }ddlm}m} |j|t||ƒƒƒƒS tt| ƒj	||ƒS )NÚDurationFieldr   )ÚIntervalToSecondsÚSecondsToInterval)
Úoutput_fieldÚget_internal_typer   Ú#django.db.backends.oracle.functionsr/   r0   Úcompiler	   r   Úas_sql)r   ÚcompilerÚ
connectionÚ
expressionr/   r0   )r   r   r    Ú	as_oracle2   s    zAvg.as_oracle)r'   r(   r)   Úfunctionr   r-   r9   r+   r   r   )r   r    r	   (   s   c                   s:   e Zd ZdZd ZdZd
‡ fdd„	Zdd„ Zdd	„ Z‡  Z	S )r
   ZCOUNTz)%(function)s(%(distinct)s%(expressions)s)Fc                s:   |dkrt ƒ }tt| ƒj|f|r$dndtƒ dœ|—Ž d S )NÚ*z	DISTINCT Ú )Údistinctr1   )r   r   r
   Ú__init__r   )r   r8   r=   Úextra)r   r   r    r>   A   s    
zCount.__init__c             C   s8   dj | jj| jjdd„ | jD ƒƒ| jd dkr2dndƒS )Nz{}({}, distinct={})c             s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úargr   r   r    ú	<genexpr>J   s    z!Count.__repr__.<locals>.<genexpr>r=   r<   ÚFalseÚTrue)Úformatr   r'   Ú
arg_joinerÚjoinÚsource_expressionsr?   )r   r   r   r    Ú__repr__G   s    zCount.__repr__c             C   s   |d krdS t |ƒS )Nr   )Úint)r   Úvaluer8   r7   Úcontextr   r   r    Úconvert_valueN   s    zCount.convert_value)F)
r'   r(   r)   r:   r   Útemplater>   rJ   rN   r+   r   r   )r   r    r
   <   s   c               @   s   e Zd ZdZd ZdS )r   ÚMAXN)r'   r(   r)   r:   r   r   r   r   r    r   T   s   c               @   s   e Zd ZdZd ZdS )r   ZMINN)r'   r(   r)   r:   r   r   r   r   r    r   Y   s   c                   s2   e Zd Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	r   Fc                s0   |rdnd| _ tt| ƒj|fdtƒ i|—Ž d S )NZSTDDEV_SAMPÚ
STDDEV_POPr1   )r:   r   r   r>   r   )r   r8   Úsampler?   )r   r   r    r>   a   s    zStdDev.__init__c             C   s4   dj | jj| jjdd„ | jD ƒƒ| jdkr.dndƒS )Nz{}({}, sample={})c             s   s   | ]}t |ƒV  qd S )N)r@   )rA   rB   r   r   r    rC   h   s    z"StdDev.__repr__.<locals>.<genexpr>rQ   rD   rE   )rF   r   r'   rG   rH   rI   r:   )r   r   r   r    rJ   e   s    zStdDev.__repr__c             C   s   |d kr|S t |ƒS )N)Úfloat)r   rL   r8   r7   rM   r   r   r    rN   l   s    zStdDev.convert_value)F)r'   r(   r)   r   r>   rJ   rN   r+   r   r   )r   r    r   ^   s   c                   s$   e Zd ZdZd Z‡ fdd„Z‡  ZS )r   ZSUMc                sR   | j jƒ dkr@| jƒ d }ddlm}m} |j|t||ƒƒƒƒS tt| ƒj	||ƒS )Nr.   r   )r/   r0   )
r1   r2   r   r3   r/   r0   r4   r   r   r5   )r   r6   r7   r8   r/   r0   )r   r   r    r9   v   s    zSum.as_oracle)r'   r(   r)   r:   r   r9   r+   r   r   )r   r    r   r   s   c                   s2   e Zd Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	r   Fc                s0   |rdnd| _ tt| ƒj|fdtƒ i|—Ž d S )NZVAR_SAMPÚVAR_POPr1   )r:   r   r   r>   r   )r   r8   rR   r?   )r   r   r    r>   ƒ   s    zVariance.__init__c             C   s4   dj | jj| jjdd„ | jD ƒƒ| jdkr.dndƒS )Nz{}({}, sample={})c             s   s   | ]}t |ƒV  qd S )N)r@   )rA   rB   r   r   r    rC   Š   s    z$Variance.__repr__.<locals>.<genexpr>rT   rD   rE   )rF   r   r'   rG   rH   rI   r:   )r   r   r   r    rJ   ‡   s    zVariance.__repr__c             C   s   |d kr|S t |ƒS )N)rS   )r   rL   r8   r7   rM   r   r   r    rN   Ž   s    zVariance.convert_value)F)r'   r(   r)   r   r>   rJ   rN   r+   r   r   )r   r    r   €   s   N)Ú__doc__Zdjango.core.exceptionsr   Zdjango.db.models.expressionsr   r   Zdjango.db.models.fieldsr   r   r   Ú__all__r   r	   r
   r   r   r   r   r   r   r   r   r    Ú<module>   s   