3
d                 @   s  d dl mZmZ d dlmZmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ G dd	 d	eZG d
d deZdd ZG dd d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ZG dd deZG dd deZG dd deZdS )    )LiteralXSD)	text_type
itervalues)_evalNotBoundError_val)numeric)type_promotion)SPARQLTypeError)Decimalc               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Accumulatorz8abstract base class for different aggregation functions c             C   s:   |j | _|j| _|js&| j| _d| _n|j| _t | _d S )NF)	resvarvarsexprdistinct	dont_careuse_rowsetseen)selfaggregation r   B/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/sparql/aggregates.py__init__   s    zAccumulator.__init__c             C   s   dS )zskips distinct test Tr   )r   rowr   r   r   r      s    zAccumulator.dont_carec             C   s   t | j|| jkS )ztests distinct with set )r   r   r   )r   r   r   r   r   r   "   s    zAccumulator.use_rowc             C   s   | j  || j< dS )zsets final value in bindingsN)	get_valuer   )r   bindingsr   r   r   	set_value&   s    zAccumulator.set_valueN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r      s
   
r   c                   sD   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z  Z	S )Counterc                s,   t t| j| d| _| jdkr(| j| _d S )Nr   *)superr$   r   valuer   eval_full_roweval_row)r   r   )	__class__r   r   r   -   s    
zCounter.__init__c             C   sH   y| j |}W n tk
r"   d S X |  jd7  _| jrD| jj| d S )N   )r)   r   r'   r   r   add)r   r   
aggregatorvalr   r   r   update4   s    zCounter.updatec             C   s
   t | jS )N)r   r'   )r   r   r   r   r   >   s    zCounter.get_valuec             C   s   t | j|S )N)r   r   )r   r   r   r   r   r)   A   s    zCounter.eval_rowc             C   s   |S )Nr   )r   r   r   r   r   r(   D   s    zCounter.eval_full_rowc             C   s   | j || jkS )N)r)   r   )r   r   r   r   r   r   G   s    zCounter.use_row)
r    r!   r"   r   r/   r   r)   r(   r   __classcell__r   r   )r*   r   r$   +   s   
r$   c              G   s2   t dd | D r.t dd | D r.tt| S | S )Nc             s   s   | ]}t |tV  qd S )N)
isinstancefloat).0argr   r   r   	<genexpr>M   s    z$type_safe_numbers.<locals>.<genexpr>c             s   s   | ]}t |tV  qd S )N)r1   r   )r3   r4   r   r   r   r5   N   s    )anymapr2   )argsr   r   r   type_safe_numbersK   s    
r9   c                   s,   e Zd Z fddZdd Zdd Z  ZS )Sumc                s    t t| j| d| _d | _d S )Nr   )r&   r:   r   r'   datatype)r   r   )r*   r   r   r   V   s    zSum.__init__c             C   sz   y`t | j|}| j}|d kr$|j}nt||j}|| _tt| jt|| _| jr^| j	j
| W n tk
rt   Y nX d S )N)r   r   r;   r
   sumr9   r'   r	   r   r   r,   r   )r   r   r-   r'   dtr   r   r   r/   [   s    z
Sum.updatec             C   s   t | j| jdS )N)r;   )r   r'   r;   )r   r   r   r   r   k   s    zSum.get_value)r    r!   r"   r   r/   r   r0   r   r   )r*   r   r:   T   s   r:   c                   s,   e Zd Z fddZdd Zdd Z  ZS )Averagec                s&   t t| j| d| _d| _d | _d S )Nr   )r&   r>   r   counterr<   r;   )r   r   )r*   r   r   r   q   s    zAverage.__init__c             C   s   ynt | j|}| j}tt| jt|| _|d kr:|j}nt||j}|| _| jr^| jj	| |  j
d7  _
W n& tk
r   Y n tk
r   Y nX d S )Nr+   )r   r   r;   r<   r9   r	   r
   r   r   r,   r?   r   r   )r   r   r-   r'   r=   r   r   r   r/   w   s    zAverage.updatec             C   sP   | j dkrtdS | jtjtjfkr4t| j| j  S tt| jt| j  S d S )Nr   )r?   r   r;   r   r2   doubler<   r   )r   r   r   r   r      s
    
zAverage.get_value)r    r!   r"   r   r/   r   r0   r   r   )r*   r   r>   o   s   r>   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )Extremumz+abstract base class for Minimum and Maximumc                s"   t t| j| d | _| j| _d S )N)r&   rA   r   r'   r   r   )r   r   )r*   r   r   r      s    zExtremum.__init__c             C   s   | j d k	rt| j || j< d S )N)r'   r   r   )r   r   r   r   r   r      s    
zExtremum.set_valuec             C   sb   y6| j d krt| j|| _ n| j| j t| j|| _ W n& tk
rJ   Y n tk
r\   Y nX d S )N)r'   r   r   comparer   r   )r   r   r-   r   r   r   r/      s    
zExtremum.update)r    r!   r"   r#   r   r   r/   r0   r   r   )r*   r   rA      s   rA   c               @   s   e Zd Zdd ZdS )Minimumc             C   s   t ||tdS )N)key)minr   )r   val1val2r   r   r   rB      s    zMinimum.compareN)r    r!   r"   rB   r   r   r   r   rC      s   rC   c               @   s   e Zd Zdd ZdS )Maximumc             C   s   t ||tdS )N)rD   )maxr   )r   rF   rG   r   r   r   rB      s    zMaximum.compareN)r    r!   r"   rB   r   r   r   r   rH      s   rH   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )Sampleztakes the first eligable valuec                s   t t| j| | j| _d S )N)r&   rJ   r   r   r   )r   r   )r*   r   r   r      s    zSample.__init__c             C   s<   y"t | j||j| j< |j| j= W n tk
r6   Y nX d S )N)r   r   r   r   accumulatorsr   )r   r   r-   r   r   r   r/      s
    zSample.updatec             C   s   d S )Nr   )r   r   r   r   r      s    zSample.get_value)r    r!   r"   r#   r   r/   r   r0   r   r   )r*   r   rJ      s   	rJ   c                   s,   e Zd Z fddZdd Zdd Z  ZS )GroupConcatc                s&   t t| j| g | _|jpd| _d S )N )r&   rL   r   r'   	separator)r   r   )r*   r   r   r      s    zGroupConcat.__init__c             C   sH   y.t | j|}| jj| | jr,| jj| W n tk
rB   Y nX d S )N)r   r   r'   appendr   r   r,   r   )r   r   r-   r'   r   r   r   r/      s    zGroupConcat.updatec             C   s   t | jjdd | jD S )Nc             s   s   | ]}t |V  qd S )N)r   )r3   vr   r   r   r5      s    z(GroupConcat.get_value.<locals>.<genexpr>)r   rN   joinr'   )r   r   r   r   r      s    zGroupConcat.get_value)r    r!   r"   r   r/   r   r0   r   r   )r*   r   rL      s   
rL   c               @   s<   e Zd ZdZeeeeee	e
dZdd Zdd Zdd Zd	S )

Aggregatorz&combines different Accumulator objects)ZAggregate_CountZAggregate_SampleZAggregate_SumZAggregate_AvgZAggregate_MinZAggregate_MaxZAggregate_GroupConcatc             C   sR   i | _ i | _x@|D ]8}| jj|j}|d kr:td|j ||| j|j< qW d S )NzUnknown aggregate function )r   rK   accumulator_classesgetname	Exceptionr   )r   ZaggregationsaZaccumulator_classr   r   r   r      s    
zAggregator.__init__c             C   s2   x,t t| jD ]}|j|r|j||  qW dS )zupdate all own accumulatorsN)listr   rK   r   r/   )r   r   accr   r   r   r/      s    
zAggregator.updatec             C   s&   xt | jD ]}|j| j qW | jS )zcalculate and set last values)r   rK   r   r   )r   rY   r   r   r   get_bindings  s    zAggregator.get_bindingsN)r    r!   r"   r#   r$   rJ   r:   r>   rC   rH   rL   rS   r   r/   rZ   r   r   r   r   rR      s   		rR   N)Zrdflibr   r   sixr   r   Zrdflib.plugins.sparql.evalutilsr   r   r   Zrdflib.plugins.sparql.operatorsr	   Zrdflib.plugins.sparql.datatypesr
   Zrdflib.plugins.sparql.sparqlr   decimalr   objectr   r$   r9   r:   r>   rA   rC   rH   rJ   rL   rR   r   r   r   r   <module>   s"    	$