U
    e                     @   s   d Z ddlmZmZ ddlmZmZmZmZm	Z	 ddl
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FullResultSet)CaseFuncStarValueWhen)IntegerField)Coalesce)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Z	d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filterdefaultc                   sb   |r| j std| jj |d k	r>| jd k	r>t| jj d|| _|| _|| _t j	|| d S )Nz%s does not allow distinct.z does not allow default.)
allow_distinct	TypeError	__class____name__empty_result_set_valuer   r   r   super__init__)selfr   r   r   expressionsextrar    ?/tmp/pip-unpacked-wheel-lctamlir/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>0   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)   2   s    
z Aggregate.get_source_expressionsc                    s   | j o| | _ t |S r,   )r   popr   set_source_expressions)r   exprsr"   r#   r$   r/   8   s    z Aggregate.set_source_expressionsc              	      s@  t  ||||}|jo(|j|||||_|rj| D ].}|j| jr8td|j d| d| dq8nd| jst t|	 }t
|D ]F\}	}
|
jr| 	 |	 }t|dr|jnt|}td|j||f q|j }d kr|S t|dr|||||}|jd kr|j|_nt||j}d |_t|||jd}|j|_|S )	NzCannot compute z('z'): 'z' is an aggregatenamez-Cannot compute %s('%s'): '%s' is an aggregateresolve_expression)output_field)r   r2   r   Zget_refsannotationsZ
is_summaryr   r1   r   r)   	enumeratecontains_aggregatehasattrreprr   r%   r3   r   r
   )r   queryZallow_joinsZreuseZ	summarizeZfor_savecrefr    indexexprZbefore_resolvedr1   r   Zcoalescer"   r#   r$   r2   <   sL       

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   r1   z%s__%sz$Complex expressions require an alias)r)   lenr7   r1   lowerr   )r   r    r#   r#   r$   default_aliash   s    zAggregate.default_aliasc                 C   s   g S r,   r#   r*   r#   r#   r$   get_group_by_colso   s    zAggregate.get_group_by_colsc                    s   | j r
dnd|d< | jr|jjrz| j||\}}W n tk
rJ   Y qX | j|d| j }t	 j||f||d|\}}|||fS nZ| 
 }	d |	_|	 }
t| j|
d d}|	t|g|
dd    t	t|	j||f|S t	 j||f|S )	Nz	DISTINCT  r   template)rD   r   r   )Zthenr>   )r   r   featuresZ supports_aggregate_filter_clauseas_sqlr   filter_templategetrD   r   copyr)   r   r/   r   r   )r   compiler
connectionZextra_contextZ
filter_sqlZfilter_paramsrD   ZsqlparamsrI   r-   	conditionr"   r#   r$   rF   r   sB     

 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$   rN      s    


zAggregate._get_repr_options)NTNFF)r   
__module____qualname__rD   r6   r1   rG   Zwindow_compatibler   r   r   r+   r)   r/   r2   propertyrA   rB   rF   rN   __classcell__r#   r#   r"   r$   r      s2              ,
c                   @   s   e Zd ZdZd ZdZdS )r   ZAVGTNr   rP   rQ   functionr1   r   r#   r#   r#   r$   r      s   c                       s4   e Zd ZdZd Ze ZdZdZd fdd	Z	  Z
S )r   ZCOUNTTr   Nc                    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      s
    zCount.__init__)N)r   rP   rQ   rU   r1   r	   r3   r   r   r   rS   r#   r#   r"   r$   r      s   c                   @   s   e Zd ZdZd ZdS )r   MAXNr   rP   rQ   rU   r1   r#   r#   r#   r$   r      s   c                   @   s   e Zd ZdZd ZdS )r   ZMINNr[   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rU   r   r   r   rY   sampler!   r"   r#   r$   r      s    zStdDev.__init__c                    s   t   d| jdkiS )Nr_   r\   r   rN   rU   r*   r"   r#   r$   rN      s    zStdDev._get_repr_options)Fr   rP   rQ   r1   r   rN   rS   r#   r#   r"   r$   r      s   c                   @   s   e Zd ZdZd ZdZdS )r   ZSUMTNrT   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_POPr]   r^   r"   r#   r$   r      s    zVariance.__init__c                    s   t   d| jdkiS )Nr_   rb   r`   r*   r"   r#   r$   rN      s    zVariance._get_repr_options)Fra   r#   r#   r"   r$   r      s   N)__doc__Zdjango.core.exceptionsr   r   Zdjango.db.models.expressionsr   r   r   r   r   Zdjango.db.models.fieldsr	   Z%django.db.models.functions.comparisonr
   Z!django.db.models.functions.mixinsr   r   __all__r   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s.    