3
v^-                 @   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               s:   |r| j  r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    ?/usr/lib/python3.6/site-packages/django/db/models/aggregates.pyr      s
    zAggregate.__init__c                s   dd t  j 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 }| jr|| jg S |S )N)r   r"   r   )r   source_expressions)r   r   r   r"   #   s    
z Aggregate.get_source_expressionsc                s   | j o|j | _ t j|S )N)r   popr   set_source_expressions)r   Zexprs)r   r   r   r&   )   s    z Aggregate.set_source_expressionsc                s   t  j||||}|jo(|jj|||||_|st t|j }xRt|D ]F\}}	|	jrH| j | }
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cr   indexexprZbefore_resolvedr'   )r   r   r   r(   -   s    zAggregate.resolve_expressionc             C   sF   | j  }t|dkr:t|d dr:d|d j| 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 )Nr   )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||\}}| j|jd| j }t j||f||d|\}}||| fS | j	 }	d |	_|	j
 }
t| j|
d d}|	jt|g|
dd    tt|	j||f|S t j||f|S )	Nz	DISTINCT  r   template)r8   r   r   )Zthenr1   )r   r   ZfeaturesZ supports_aggregate_filter_clauseas_sqlfilter_templategetr8   r   copyr"   r   r&   r   r
   )r   Zcompiler
connectionZextra_contextZ
filter_sqlZfilter_paramsr8   Zsqlparamsr<   r$   Z	condition)r   r   r   r9   F   s     zAggregate.as_sqlc                s.   t  j }| jr| j|d< | jr*| j|d< |S )Nr   r   )r   _get_repr_optionsr   r   )r   options)r   r   r   r?   Z   s    


zAggregate._get_repr_options)NTNFF)N)r   
__module____qualname__r8   r*   r'   r:   Zwindow_compatibler   r   r#   r"   r&   r(   propertyr4   r6   r9   r?   __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   rA   rB   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   valuerI   r=   r   r   r   convert_valuev   s    zCount.convert_value)N)r   rA   rB   rE   r'   r   Zoutput_fieldr   r   rK   rD   r   r   )r   r   r   i   s   c               @   s   e Zd ZdZd ZdS )r   MAXN)r   rA   rB   rE   r'   r   r   r   r   r   z   s   c               @   s   e Zd ZdZd ZdS )r   ZMINN)r   rA   rB   rE   r'   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)rE   r   r   )r   rI   sampler   )r   r   r   r      s    zStdDev.__init__c                s   t  j d| jdkiS )NrN   rM   )r   r?   rE   )r   )r   r   r   r?      s    zStdDev._get_repr_options)F)r   rA   rB   r'   r   r?   rD   r   r   )r   r   r      s   c               @   s   e Zd ZdZd ZdZdS )r   ZSUMTN)r   rA   rB   rE   r'   r   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_POP)rE   r   r   )r   rI   rN   r   )r   r   r   r      s    zVariance.__init__c                s   t  j d| jdkiS )NrN   rO   )r   r?   rE   )r   )r   r   r   r?      s    zVariance._get_repr_options)F)r   rA   rB   r'   r   r?   rD   r   r   )r   r   r      s   N)__doc__django.core.exceptionsr   django.db.models.expressionsr   r   r   r   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