U
    8ÄT_-  ã                   @   sæ   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
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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eƒZG dd„ deeƒZG dd„ deeƒZdS )z>
Classes to represent the definitions of aggregate functions.
é    )Ú
FieldError)ÚCaseÚFuncÚStarÚWhen)ÚIntegerField)ÚFixDurationInputMixinÚNumericOutputFieldMixinÚ	AggregateÚAvgÚCountÚMaxÚMinÚStdDevÚSumÚVariancec                       sœ   e Zd ZdZdZdZdZdZdZdddœ‡ fdd„
Z	‡ fd	d
„Z
‡ fdd„Z‡ fdd„Zd‡ fdd„	Zedd„ ƒZddd„Z‡ fdd„Z‡ fdd„Z‡  ZS )r
   z)%(function)s(%(distinct)s%(expressions)s)TNz%s FILTER (WHERE %%(filter)s)F)ÚdistinctÚfilterc                   s8   |r| j std| jj ƒ‚|| _|| _tƒ j||Ž d S )Nz%s does not allow distinct.)Úallow_distinctÚ	TypeErrorÚ	__class__Ú__name__r   r   ÚsuperÚ__init__)Úselfr   r   ÚexpressionsÚextra©r   © ú?/tmp/pip-unpacked-wheel-dv63caxw/django/db/models/aggregates.pyr      s
    
zAggregate.__init__c                    s   dd„ t ƒ  ¡ D ƒS )Nc                 S   s   g | ]
}|j ‘qS r   )Z_output_field_or_none)Ú.0Úer   r   r   Ú
<listcomp>!   s     z/Aggregate.get_source_fields.<locals>.<listcomp>)r   Úget_source_expressions©r   r   r   r   Úget_source_fields   s    zAggregate.get_source_fieldsc                    s    t ƒ  ¡ }| jr|| jg S |S ©N)r   r#   r   )r   Úsource_expressionsr   r   r   r#   #   s    
z Aggregate.get_source_expressionsc                    s   | j o| ¡ | _ tƒ  |¡S r&   )r   Úpopr   Úset_source_expressions)r   Úexprsr   r   r   r)   )   s    z Aggregate.set_source_expressionsc                    s’   t ƒ  ||||¡}|jo(|j ||||¡|_|sŽt t|ƒ ¡ }t|ƒD ]F\}}	|	jrF|  ¡ | }
t|
dƒrp|
jnt	|
ƒ}t
d|j||f ƒ‚qF|S )NÚnamez-Cannot compute %s('%s'): '%s' is an aggregate)r   Úresolve_expressionr   r
   r#   Ú	enumerateÚcontains_aggregateÚhasattrr+   Úreprr   )r   ÚqueryZallow_joinsZreuseZ	summarizeZfor_saveÚcr   ÚindexÚexprZbefore_resolvedr+   r   r   r   r,   -   s    zAggregate.resolve_expressionc                 C   sF   |   ¡ }t|ƒdkr:t|d dƒr:d|d j| j ¡ f S tdƒ‚d S )Né   r   r+   z%s__%sz$Complex expressions require an alias)r#   Úlenr/   r+   Úlowerr   )r   r   r   r   r   Údefault_alias<   s    zAggregate.default_aliasc                 C   s   g S r&   r   )r   Úaliasr   r   r   Úget_group_by_colsC   s    zAggregate.get_group_by_colsc                    sÞ   | j r
dnd|d< | jrÌ|jjrr| j ||¡\}}| j| d| j¡ }tƒ j||f||dœ|—Ž\}}||| fS |  	¡ }	d |	_|	 
¡ }
t| j|
d d�}|	 t|ƒg|
dd …  ¡ tt|	ƒj||f|ŽS tƒ j||f|ŽS )	Nz	DISTINCT Ú r   Útemplate)r<   r   r   )Zthenr5   )r   r   ÚfeaturesZ supports_aggregate_filter_clauseÚas_sqlÚfilter_templateÚgetr<   r   Úcopyr#   r   r)   r   r
   )r   ÚcompilerÚ
connectionZextra_contextZ
filter_sqlZfilter_paramsr<   ZsqlÚparamsrA   r'   Ú	conditionr   r   r   r>   F   s,     ÿ ÿþ
zAggregate.as_sqlc                    s.   t ƒ  ¡ }| jr| j|d< | jr*| j|d< |S )Nr   r   )r   Ú_get_repr_optionsr   r   )r   Úoptionsr   r   r   rF   Z   s    


zAggregate._get_repr_options)NTNFF)N)r   Ú
__module__Ú__qualname__r<   r.   r+   r?   Zwindow_compatibler   r   r%   r#   r)   r,   Úpropertyr8   r:   r>   rF   Ú__classcell__r   r   r   r   r
      s    

c                   @   s   e Zd ZdZd ZdZdS )r   ZAVGTN©r   rH   rI   Úfunctionr+   r   r   r   r   r   r   c   s   c                       s8   e Zd ZdZd Zeƒ ZdZd‡ fdd„	Zdd„ Z	‡  Z
S )	r   ZCOUNTTNc                    sD   |dkrt ƒ }t|t ƒr(|d k	r(tdƒ‚tƒ j|fd|i|—Ž d S )NÚ*z8Star cannot be used with filter. Please specify a field.r   )r   Ú
isinstanceÚ
ValueErrorr   r   )r   Ú
expressionr   r   r   r   r   r   o   s
    zCount.__init__c                 C   s   |d krdS |S )Nr   r   )r   ÚvaluerQ   rC   r   r   r   Úconvert_valuev   s    zCount.convert_value)N)r   rH   rI   rM   r+   r   Zoutput_fieldr   r   rS   rK   r   r   r   r   r   i   s   c                   @   s   e Zd ZdZd ZdS )r   ÚMAXN©r   rH   rI   rM   r+   r   r   r   r   r   z   s   c                   @   s   e Zd ZdZd ZdS )r   ZMINNrU   r   r   r   r   r      s   c                       s.   e Zd Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )r   Fc                    s"   |rdnd| _ tƒ j|f|Ž d S )NÚSTDDEV_SAMPZ
STDDEV_POP©rM   r   r   ©r   rQ   Úsampler   r   r   r   r   ‡   s    zStdDev.__init__c                    s   t ƒ  ¡ d| jdki–S )NrY   rV   ©r   rF   rM   r$   r   r   r   rF   ‹   s    zStdDev._get_repr_options)F©r   rH   rI   r+   r   rF   rK   r   r   r   r   r   „   s   c                   @   s   e Zd ZdZd ZdZdS )r   ZSUMTNrL   r   r   r   r   r   �   s   c                       s.   e Zd Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )r   Fc                    s"   |rdnd| _ tƒ j|f|Ž d S )NÚVAR_SAMPZVAR_POPrW   rX   r   r   r   r   ˜   s    zVariance.__init__c                    s   t ƒ  ¡ d| jdki–S )NrY   r\   rZ   r$   r   r   r   rF   œ   s    zVariance._get_repr_options)Fr[   r   r   r   r   r   •   s   N)Ú__doc__Zdjango.core.exceptionsr   Zdjango.db.models.expressionsr   r   r   r   Zdjango.db.models.fieldsr   Z!django.db.models.functions.mixinsr   r	   Ú__all__r
   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s*          ÿS