U
    Ha-                     @   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-3jxiddxt/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|||||_|st 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