B
    ©0H[¥  ã               @   sà   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
mZ ddl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)ÚCaseÚFuncÚStarÚWhen)ÚDecimalFieldÚ
FloatFieldÚIntegerField)ÚQÚ	AggregateÚAvgÚCountÚMaxÚMinÚStdDevÚSumÚVariancec                   s�   e Zd ZdZdZdZdZ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„ Z‡ fdd„Z‡ fdd„Z‡  ZS )r   TNz%s FILTER (WHERE %%(filter)s))Úfilterc               s   || _ tƒ j||Ž d S )N)r   ÚsuperÚ__init__)Úselfr   ÚargsÚkwargs)Ú	__class__© ú_C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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7 }|S )N)r   r   r   )r   Úsource_expressions)r   r   r   r      s    
z Aggregate.get_source_expressionsc                s   | j r| ¡ | _ tƒ  |¡S )N)r   Úpopr   Úset_source_expressions)r   Úexprs)r   r   r   r#   "   s    
z Aggregate.set_source_expressionsFc                s–   t ƒ  ||||¡}|jr,|j ||||¡|_|s’t t|ƒ ¡ }xRt|ƒD ]F\}}	|	jrH|  ¡ | }
t|
dƒrr|
jnt	|
ƒ}t
d|j||f ƒ‚qHW |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ÚcÚexpressionsÚ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%   ÚlowerÚ	TypeError)r   r-   r   r   r   Údefault_alias7   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                sÐ   | j r¾|jjrX| j  ||¡\}}| j| d| j¡ }tƒ j||||d�\}}||| fS |  ¡ }	d |	_ t	t
ƒ ƒ}
|	 ¡ }|
 | j |d g¡ |	 t|
ƒg|dd …  ¡ tt|	ƒj||f|ŽS tƒ j||f|ŽS )NÚtemplate)r6   r   r   r0   )r   ÚfeaturesZ supports_aggregate_filter_clauseÚas_sqlÚfilter_templateÚgetr6   r   Úcopyr   r
   r   r#   r   r   )r   ÚcompilerÚ
connectionZextra_contextZ
filter_sqlZfilter_paramsr6   ZsqlÚparamsr;   Ú	conditionr!   )r   r   r   r8   A   s    
zAggregate.as_sqlc                s$   t ƒ  ¡ }| jr | d| ji¡ |S )Nr   )r   Ú_get_repr_optionsr   Úupdate)r   Úoptions)r   r   r   r@   R   s    
zAggregate._get_repr_options)NTNFF)Ú__name__Ú
__module__Ú__qualname__r(   r%   r9   Zwindow_compatibler   r    r   r#   r&   Úpropertyr4   r5   r8   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                s*   |   ¡ d }t|ttfƒr tƒ S tƒ  ¡ S )Nr   )r    Ú
isinstancer	   r   r   r   Ú_resolve_output_field)r   Zsource_field)r   r   r   rI   ]   s    zAvg._resolve_output_fieldc                sT   | j  ¡ dkrF|  ¡ d }ddlm}m} | |t||ƒ| jd�ƒ¡S t	ƒ  
||¡S )NÚDurationFieldr   )ÚIntervalToSecondsÚSecondsToInterval)r   )Úoutput_fieldÚget_internal_typer   Ú#django.db.backends.oracle.functionsrK   rL   Úcompiler   r   r   r8   )r   r<   r=   Ú
expressionrK   rL   )r   r   r   Ú	as_oraclec   s    zAvg.as_oracle)rC   rD   rE   Úfunctionr%   rI   rR   rG   r   r   )r   r   r   Y   s   c                   sD   e Zd ZdZd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z	d	d
„ Z
‡  ZS )r   ZCOUNTz)%(function)s(%(distinct)s%(expressions)s)FNc                sN   |dkrt ƒ }t|t ƒr(|d k	r(tdƒ‚tƒ j|f|r:dnd|dœ|—Ž d S )NÚ*z8Star cannot be used with filter. Please specify a field.z	DISTINCT Ú )Údistinctr   )r   rH   Ú
ValueErrorr   r   )r   rQ   rV   r   Úextra)r   r   r   r   s   s    zCount.__init__c                s    t ƒ  ¡ }t|| jd dkd�S )NrV   rU   )rV   )r   r@   ÚdictrX   )r   rB   )r   r   r   r@   }   s    
zCount._get_repr_optionsc             C   s   |d krdS |S )Nr   r   )r   ÚvaluerQ   r=   r   r   r   Úconvert_value�   s    zCount.convert_value)FN)rC   rD   rE   rS   r%   r6   r	   rM   r   r@   r[   rG   r   r   )r   r   r   m   s   
c               @   s   e Zd ZdZd ZdS )r   ÚMAXN)rC   rD   rE   rS   r%   r   r   r   r   r   …   s   c               @   s   e Zd ZdZd ZdS )r   ZMINN)rC   rD   rE   rS   r%   r   r   r   r   r   Š   s   c                   s4   e Zd Zd Zeƒ 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)rS   r   r   )r   rQ   ÚsamplerX   )r   r   r   r   “   s    zStdDev.__init__c                s   t ƒ  ¡ }t|| jdkd�S )Nr]   )r^   )r   r@   rY   rS   )r   rB   )r   r   r   r@   —   s    
zStdDev._get_repr_options)F)	rC   rD   rE   r%   r   rM   r   r@   rG   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                sN   | j  ¡ dkr@|  ¡ d }ddlm}m} | |t||ƒƒƒ¡S tƒ  	||¡S )NrJ   r   )rK   rL   )
rM   rN   r   rO   rK   rL   rP   r   r   r8   )r   r<   r=   rQ   rK   rL   )r   r   r   rR       s    zSum.as_oracle)rC   rD   rE   rS   r%   rR   rG   r   r   )r   r   r   œ   s   c                   s4   e Zd Zd Zeƒ 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_POP)rS   r   r   )r   rQ   r^   rX   )r   r   r   r   ®   s    zVariance.__init__c                s   t ƒ  ¡ }t|| jdkd�S )Nr_   )r^   )r   r@   rY   rS   )r   rB   )r   r   r   r@   ²   s    
zVariance._get_repr_options)F)	rC   rD   rE   r%   r   rM   r   r@   rG   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   r   r	   Zdjango.db.models.query_utilsr
   Ú__all__r   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s   K