
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 Gd d   d e  Z Gd d   d e e e  Z Gd d   d e  Z Gd d	   d	 e  Z Gd d
   d
 e  Z Gd d   d e e  Z Gd d   d e e  Z Gd 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 d   f d d	  Z	   f d
 d   Z
   f d d   Z   f d d   Z d d d d d   f d d  Z e d d    Z d d d  Z   f d d   Z   f d d   Z   S)r
   z)%(function)s(%(distinct)s%(expressions)s)TNz%s FILTER (WHERE %%(filter)s)Fdistinctfilterc               sO   | 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    =/tmp/pip-build-8lau8j11/django/django/db/models/aggregates.pyr      s
    		zAggregate.__init__c                s   d d   t    j   D S)Nc             S   s   g  |  ] } | j   q Sr   )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   exprs)r   r   r   r&   )   s    z Aggregate.set_source_expressionsc                s   t    j | | | |  } | j o< | j j | | | |  | _ | s t  t |  j   } xs t |  D]e \ } }	 |	 j rj |  j   | }
 t |
 d  r |
 j n	 t	 |
  } t
 d | j | | f   qj W| 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   s_   |  j    } t |  d k rO t | d d  rO d | d j |  j j   f St 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 r |  j j | |  \ } } |  j | j d |  j  } t   j | | d | d | | \ } } | | | f S|  j	   }	 d  |	 _ |	 j
   }
 t |  j d |
 d } |	 j t |  g |
 d d    t t |	  j | | |  St   j | | |  S)	Nz	DISTINCT  r   templater   Zthenr   r2   )r   r   featuresZ supports_aggregate_filter_clauseas_sqlfilter_templategetr9   r   copyr"   r   r&   r   r
   )r   compiler
connectionZextra_contextZ
filter_sqlZfilter_paramsr9   Zsqlparamsr>   r$   	condition)r   r   r   r;   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   rC   Z   s    		zAggregate._get_repr_options)r   
__module____qualname__r9   r+   r(   r<   Zwindow_compatibler   r   r#   r"   r&   r)   propertyr5   r7   r;   rC   r   r   )r   r   r
      s   !c               @   s"   e  Z d  Z d Z d  Z d Z d S)r   ZAVGTN)r   rE   rF   functionr(   r   r   r   r   r   r   c   s   c                   sL   e  Z d  Z d Z d  Z e   Z d Z d   f d d  Z d d   Z	   S)r   ZCOUNTTNc                sY   | d k r t    } t | t   r< | d  k	 r< t d   t   j | d | | 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   valuerL   r@   r   r   r   convert_valuev   s    zCount.convert_value)
r   rE   rF   rH   r(   r   Zoutput_fieldr   r   rN   r   r   )r   r   r   i   s   	c               @   s   e  Z d  Z d Z d  Z d S)r   MAXN)r   rE   rF   rH   r(   r   r   r   r   r   z   s   c               @   s   e  Z d  Z d Z d  Z d S)r   ZMINN)r   rE   rF   rH   r(   r   r   r   r   r      s   c                   s=   e  Z d  Z d  Z d   f d d  Z   f d d   Z   S)r   Fc                s,   | r d n d |  _  t   j | |  d  S)NSTDDEV_SAMPZ
STDDEV_POP)rH   r   r   )r   rL   sampler   )r   r   r   r      s    zStdDev.__init__c                s"   t    j   d |  j d k i  S)NrQ   rP   )r   rC   rH   )r   )r   r   r   rC      s    zStdDev._get_repr_options)r   rE   rF   r(   r   rC   r   r   )r   r   r      s   c               @   s"   e  Z d  Z d Z d  Z d Z d S)r   ZSUMTN)r   rE   rF   rH   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   S)r   Fc                s,   | r d n d |  _  t   j | |  d  S)NVAR_SAMPZVAR_POP)rH   r   r   )r   rL   rQ   r   )r   r   r   r      s    zVariance.__init__c                s"   t    j   d |  j d k i  S)NrQ   rR   )r   rC   rH   )r   )r   r   r   rC      s    zVariance._get_repr_options)r   rE   rF   r(   r   rC   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