o
    uvXjí  ã                   @   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 g d¢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„ 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                   s<   |r| j std| jj ƒ‚|| _|| _tƒ j|i |¤Ž d S )Nz%s does not allow distinct.)Úallow_distinctÚ	TypeErrorÚ	__class__Ú__name__r   r   ÚsuperÚ__init__)Úselfr   r   ÚexpressionsÚextra©r   © úX/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/models/aggregates.pyr      s
   
zAggregate.__init__c                    s   dd„ t ƒ  ¡ D ƒS )Nc                 S   s   g | ]}|j ‘qS r   )Ú_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 ||||¡|_|sGt t|ƒ ¡ }t|ƒD ]#\}}	|	jrF|  ¡ | }
t|
dƒr8|
jnt	|
ƒ}t
d|j||f ƒ‚q#|S )NÚnamez-Cannot compute %s('%s'): '%s' is an aggregate)r   Úresolve_expressionr   r
   r$   Ú	enumerateÚcontains_aggregateÚhasattrr,   Úreprr   )r   ÚqueryÚallow_joinsÚreuseÚ	summarizeÚfor_saveÚcr   ÚindexÚexprÚbefore_resolvedr,   r   r   r   r-   -   s   ýzAggregate.resolve_expressionc                 C   sB   |   ¡ }t|ƒdkrt|d dƒrd|d j| j ¡ f S tdƒ‚)Né   r   r,   z%s__%sz$Complex expressions require an alias)r$   Úlenr0   r,   Úlowerr   )r   r   r   r   r   Údefault_alias<   s   zAggregate.default_aliasc                 C   s   g S r'   r   r%   r   r   r   Úget_group_by_colsC   s   zAggregate.get_group_by_colsc                    sæ   | j rdnd|d< | jrh|jjr9| j ||¡\}}| j| d| j¡ }tƒ j||f||dœ|¤Ž\}}||| fS |  	¡ }	d |	_|	 
¡ }
t| j|
d d�}|	 t|ƒg|
dd …  ¡ tt|	ƒj||fi |¤ŽS tƒ j||fi |¤ŽS )	Nz	DISTINCT Ú r   Útemplate)rA   r   r   )Úthenr;   )r   r   ÚfeaturesÚ supports_aggregate_filter_clauseÚas_sqlÚfilter_templateÚgetrA   r   Úcopyr$   r   r*   r   r
   )r   ÚcompilerÚ
connectionÚextra_contextÚ
filter_sqlÚfilter_paramsrA   ÚsqlÚparamsrH   r(   Ú	conditionr   r   r   rE   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   rQ   Z   s   


zAggregate._get_repr_options)NTNFF)r   Ú
__module__Ú__qualname__rA   r/   r,   rF   Úwindow_compatibler   r   r&   r$   r*   r-   Úpropertyr>   r?   rE   rQ   Ú__classcell__r   r   r   r   r
      s"    
r
   c                   @   ó   e Zd ZdZd ZdS )r   ÚAVGN©r   rS   rT   Úfunctionr,   r   r   r   r   r   c   ó    r   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   ÚCOUNTTNc                    sD   |dkrt ƒ }t|t ƒr|d u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   n   s
   zCount.__init__c                 C   s   |d u rdS |S )Nr   r   )r   Úvaluera   rJ   r   r   r   Úconvert_valueu   s   zCount.convert_valuer'   )r   rS   rT   r[   r,   r   Úoutput_fieldr   r   rc   rW   r   r   r   r   r   h   s    r   c                   @   rX   )r   ÚMAXNrZ   r   r   r   r   r   y   r\   r   c                   @   rX   )r   ÚMINNrZ   r   r   r   r   r   ~   r\   r   c                       ó.   e Zd Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )r   Fc                    ó&   |rdnd| _ tƒ j|fi |¤Ž d S )NÚSTDDEV_SAMPÚ
STDDEV_POP©r[   r   r   ©r   ra   Úsampler   r   r   r   r   †   ó   zStdDev.__init__c                    ó   i t ƒ  ¡ ¥d| jdki¥S )Nrm   ri   ©r   rQ   r[   r%   r   r   r   rQ   Š   ó   zStdDev._get_repr_options©F©r   rS   rT   r,   r   rQ   rW   r   r   r   r   r   ƒ   ó    r   c                   @   rX   )r   ÚSUMNrZ   r   r   r   r   r   Ž   r\   r   c                       rg   )r   Fc                    rh   )NÚVAR_SAMPÚVAR_POPrk   rl   r   r   r   r   –   rn   zVariance.__init__c                    ro   )Nrm   rv   rp   r%   r   r   r   rQ   š   rq   zVariance._get_repr_optionsrr   rs   r   r   r   r   r   “   rt   r   N)Ú__doc__Údjango.core.exceptionsr   Údjango.db.models.expressionsr   r   r   r   Údjango.db.models.fieldsr   Ú!django.db.models.functions.mixinsr   r	   Ú__all__r
   r   r   r   r   r   r   r   r   r   r   r   Ú<module>   s    S