3
d4=                 @   s  d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZmZmZmZm Z m!Z!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z'm(Z( ddlm)Z) dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd  Z3d!d" Z4d#d$ Z5d%d& Z6d'd( Z7d)d* Z8d+d, Z9d-d. Z:d/d0 Z;d1d2 Z<d3d4 Z=d5d6 Z>d7d8 Z?d9d: Z@d;d< ZAd=d> ZBdAd?d@ZCdS )Ba  
These method recursively evaluate the SPARQL Algebra

evalQuery is the entry-point, it will setup context and
return the SPARQLResult object

evalPart is called on each level and will delegate to the right method

A rdflib.plugins.sparql.sparql.QueryContext is passed along, keeping
information needed for evaluation

A list of dicts (solution mappings) is returned, apart from GroupBy which may
also return a dict of list of dicts

    N)ParseException)VariableGraphBNodeURIRefLiteral)	iteritems
itervalues)CUSTOM_EVALS)value)QueryContextAlreadyBoundFrozenBindingsBindingsSPARQLError)_filter_eval_join_diff_minus_fillTemplate_ebv_val)
Aggregator)Join
ToMultiSetValues)parserc             c   s  |s| j  V  dS |d \}}}| | }| | }| | }x| jj|||fD ]\}}	}
d|||fkrn| j }n| }|dkr|||< y|dkr|	||< W n tk
r   wLY nX y|dkr|
||< W n tk
r   wLY nX x t||dd D ]
}|V  qW qLW dS )z
    A basic graph pattern
    Nr      )solutiongraphtriplespushr   evalBGP)ctxZbgpspoZ_sZ_pZ_ossspsocx r-   @/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/sparql/evaluate.pyr#   &   s2    

r#   c             c   sr   xlt | |jD ]\}y<t|j|j| |jd}t|tr:||j|j	|iV  W q tk
rh   |V  Y qX qW d S )N)_except)
evalPartr&   r   exprforget_vars
isinstancer   mergevar)r$   extendr+   er-   r-   r.   
evalExtendN   s    
r9   c             c   sF   x@t | |jD ]0}| j|}x t ||jD ]}|j|V  q*W qW dS )z
    A lazy join will push the variables bound
    in the first part to the second part,
    essentially doing the join implicitly
    hopefully evaluating much fewer triples
    N)r0   p1thawp2r5   )r$   joinar+   br-   r-   r.   evalLazyJoin]   s    
r@   c             C   s:   |j rt| |S t| |j}tt| |j}t||S d S )N)Zlazyr@   r0   r:   setr<   r   )r$   r=   r>   r?   r-   r-   r.   evalJoinj   s
    
rB   c             c   s<   xt | |jD ]
}|V  qW xt | |jD ]
}|V  q*W d S )N)r0   r:   r<   )r$   unionr,   r-   r-   r.   	evalUnionw   s    
rD   c             C   s&   t | |j}tt | |j}t||S )N)r0   r:   rA   r<   r   )r$   minusr>   r?   r-   r-   r.   	evalMinus~   s    rF   c             #   s   xt |  jD ]}d}| j|}x0t | jD ] }t j|j| r.d}|V  q.W |s jj}|d kst fddt | j|j	| jD  r|V  qW d S )NFTc             3   s   | ]}t  j|V  qd S )N)r   r1   ).0r?   )r=   r-   r.   	<genexpr>   s    zevalLeftJoin.<locals>.<genexpr>)
r0   r:   r;   r<   r   r1   r2   r3   anyZremember)r$   r=   r>   okr+   r?   Zp1_varsr-   )r=   r.   evalLeftJoin   s    

 rK   c             c   sB   x<t | |jD ],}t|j|js.|j| |jdn|r|V  qW d S )N)r/   )r0   r&   r   r1   Zno_isolated_scoper2   r3   )r$   partr+   r-   r-   r.   
evalFilter   s    "rM   c             c   s   | j d krtd| j } | |j }|d krx| j j D ]T}|| j jkrJq8| j|}|j }|j|jig}x t	t
||j|D ]
}|V  q~W q8W n.| j| j j|}xt
||jD ]
}|V  qW d S )Nz)Non-conjunctive-graph doesn't know about z"graphs. Try a query without GRAPH.zKNon-conjunctive-graph doesn't know about graphs. Try a query without GRAPH.)dataset	ExceptioncloneZtermZcontextsZdefault_context	pushGraphr"   
identifierr   r0   r&   get_context)r$   rL   r    r+   ZgraphSolutionr,   r-   r-   r.   	evalGraph   s$    
 

rT   c             c   sj   xd|j jD ]X}| j }y*x$|j D ]\}}|dkr"|||< q"W W n tk
rV   w
Y nX |j V  q
W d S )NZUNDEF)r&   resr"   itemsr   r   )r$   rL   rr+   kvr-   r-   r.   
evalValues   s    rZ   c             C   s"   |j jdkrt| |S t| |j S )Nvalues)r&   namerZ   r0   )r$   rL   r-   r-   r.   evalMultiset   s    
r]   c                s  x4t j D ](\}}y
| |S  tk
r0   Y q
X q
W |jdkr`t|j fddd}t |S |jdkrtt |S |jdkrt |S |jdkrt	 |S |jdkrt
 |S |jd	krt |S |jd
krt |S |jdk rt |S |jdkrt |S |jdkrt |S |jdkr0t |S |jdkrFt |S |jdkr\t |S |jdkrrt |S |jdkrt |S |jdkrt |S |jdkrt |S |jdkrt |S |jdkrt |S |jdkrt |S |jdkrtdntd|j d S )NZBGPc                s   t  fdd| D S )Nc                s   g | ]} | d kr|qS )Nr-   )rG   n)r$   r-   r.   
<listcomp>   s    z.evalPart.<locals>.<lambda>.<locals>.<listcomp>)len)t)r$   r-   r.   <lambda>   s    zevalPart.<locals>.<lambda>)keyFilterr   ZLeftJoinr   Unionr   ZExtendZMinusZProjectSliceZDistinctZReducedZOrderByGroupZAggregateJoinZSelectQueryZAskQueryZConstructQueryZServiceGraphPatternZDescribeQueryzDESCRIBE not implementedzI dont know: %s)r
   rV   NotImplementedErrorr\   sortedr!   r#   rM   rB   rK   rT   rD   r]   r9   rF   evalProject	evalSliceevalDistinctevalReducedevalOrderBy	evalGroupevalAggregateJoinevalSelectQueryevalAskQueryevalConstructQueryevalServiceQueryrO   )r$   rL   r\   r+   r!   r-   )r$   r.   r0      sb    





























r0   c             c   s   i }t jd|jddt j}|r|jd}t| |}|dd}ddd	}t|d
k rftj|||d}ntj|||d}|j	dkr|j
 }	|	d d  }
|d< |	d d }t|dkrx8|D ] }xt| ||
D ]
}|V  qW qW ntd||j	d S )Nz ^service <(.*)>[ 
]*{(.*)}[ 
]*$Zservice_string r   json)queryoutputzapplication/sparql-results+jsonZrdflibForAnUser)acceptz
user-agentiX  )paramsheaders   headvarsvars_resultsbindingsr   z#Service: %s responded with code: %s)rematchgetDOTALLgroup_buildQueryStringForServiceCallr`   requestspoststatus_coderv   #_yieldBindingsFromServiceCallResultrO   )r$   rL   rU   r   Zservice_urlservice_queryZquery_settingsr{   responserv   	variablesrW   Zboundr-   r-   r.   rt     s,    



rt   c                s   |j d}ytj| W n tk
r   d| d }x: jjjj D ](}d|d  d |d j  d | }qDW  jj	}|d k	rt
|dkrd	| d
 | }Y nX  j }t
|dkrdjtdd |}djt fdd|}|d | d | d }|S )N   zSELECT REDUCED * WHERE {}zPREFIX r   :r    zBASE <z> c             S   s   | j  S )N)n3)rY   r-   r-   r.   rb   J  s    z1_buildQueryStringForServiceCall.<locals>.<lambda>c                s    j | j S )N)r   r   )rY   )r$   r-   r.   rb   K  s    zVALUES (z) {(z)})r   r   Z
parseQueryr   prologueZnamespace_managerstore
namespacesr   baser`   r   r=   map)r$   r   r   r&   r   Zsolr   Zvariables_boundr-   )r$   r.   r   :  s     
(r   c             c   s  i }x|D ]}||kr
|| r
|| d dkrHt || d |t|< q
|| d dkrrt|| d |t|< q
|| d dkrd|| krt|| d || d d|t|< q
|| d dkr
d|| kr
t|| d || d d	|t|< q
W t| |V  d S )
Ntypeurir   Zbnodeliteraldatatype)r   zxml:lang)lang)r   r   r   r   r   )r$   rW   r   Zres_dictr6   r-   r-   r.   r   P  s    
&(r   c             C   s   t | |jS )z<
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    )r0   r&   )r$   r   r-   r-   r.   ro   _  s    ro   c             #   s   t |  j} jj}tj fdd}|d krP|d }xJ|D ]|j q<W n2x0|D ](tfdd|D }|| j qVW x t|D ]}t| |j	 V  qW t
|dkrt| V  d S )Nc                  s   t  jdS )N)Zaggregations)r   Ar-   )aggr-   r.   rb   m  s    z#evalAggregateJoin.<locals>.<lambda>Tc             3   s   | ]}t | d V  qdS )FN)r   )rG   r8   )rowr-   r.   rH   x  s    z$evalAggregateJoin.<locals>.<genexpr>r   )r0   r&   r1   collectionsdefaultdictupdatetupler	   r   Zget_bindingsr`   )r$   r   r&   Z
group_exprrU   Z
aggregatorrX   r-   )r   r   r.   rp   g  s    

rp   c                sN   t | |j}x<t|jD ]. t jo, jdk}t| fdd|d}qW |S )NZDESCc                s   t t|  jddS )NT)r   )r   r   r1   )r,   )r8   r-   r.   rb     s    zevalOrderBy.<locals>.<lambda>)rc   reverse)r0   r&   reversedr1   boolorderri   )r$   rL   rU   r   r-   )r8   r.   rn     s
    rn   c             C   s2   t | |j}tj||j|jd k	r,|j|j nd S )N)r0   r&   	itertoolsislicestartlength)r$   slicerU   r-   r-   r.   rk     s    rk   c             c   st   d}t  }tj }x\t| |jD ]L}||kr8|j| n*|V  |j| t||krb|j|j  |j	| q W dS )zapply REDUCED to result

    REDUCED is not as strict as DISTINCT, but if the incoming rows were sorted
    it should produce the same result with limited extra memory and time per
    incoming row.
    r   N)
rA   r   dequer0   r&   removeaddr`   pop
appendleft)r$   rL   MAXZmru_setZ	mru_queuer   r-   r-   r.   rm     s    	
rm   c             c   s<   t | |j}t }x$|D ]}||kr|V  |j| qW d S )N)r0   r&   rA   r   )r$   rL   rU   doner,   r-   r-   r.   rl     s    
rl   c                s   t |  j} fdd|D S )Nc             3   s   | ]}|j  jV  qd S )N)projectPV)rG   r   )r   r-   r.   rH     s    zevalProject.<locals>.<genexpr>)r0   r&   )r$   r   rU   r-   )r   r.   rj     s    rj   c             C   s*   i }d|d< t | |j|d< |j|d< |S )NZSELECTtype_r   r   )r0   r&   r   )r$   rw   rU   r-   r-   r.   rq     s
    
rq   c             C   s8   i }d|d< d|d< xt | |jD ]}d|d< P q"W |S )NZASKr   FZ	askAnswerT)r0   r&   )r$   rw   rU   r,   r-   r-   r.   rr     s    rr   c             C   sV   |j }|s|jjj}t }x"t| |jD ]}|t||7 }q(W i }d|d< ||d< |S )NZ	CONSTRUCTr   r    )templater&   r!   r   r0   r   )r$   rw   r   r    r+   rU   r-   r-   r.   rs     s    
rs   c       
      C   s   t dd t|D }t| |d}|j|_|j}|jr|jd krHtd	|j }d}x`|jD ]V}|j	r|r|jj
t }|j|}d}|j|j	dd q\|jr\|j}	|j|	dd q\W t||S )
Nc             s   s   | ]\}}t ||fV  qd S )N)r   )rG   rX   rY   r-   r-   r.   rH     s    zevalQuery.<locals>.<genexpr>)initBindingsz)Non-conjunctive-graph doesn't know about z)graphs! Try a query without FROM (NAMED).FT)defaultzRNon-conjunctive-graph doesn't know about graphs! Try a query without FROM (NAMED).)dictr   r   r   ZalgebraZdatasetClauserN   rO   rP   r   rS   r   rQ   loadnamedr0   )
r    rw   r   r   r$   mainZfirstDefaultdZdggr-   r-   r.   	evalQuery  s,    
 
r   )N)D__doc__r   r   r   r   	pyparsingr   Zrdflibr   r   r   r   r   sixr   r	   Zrdflib.plugins.sparqlr
   Z!rdflib.plugins.sparql.parserutilsr   Zrdflib.plugins.sparql.sparqlr   r   r   r   r   Zrdflib.plugins.sparql.evalutilsr   r   r   r   r   r   r   r   Z rdflib.plugins.sparql.aggregatesr   Zrdflib.plugins.sparql.algebrar   r   r   r   r#   r9   r@   rB   rD   rF   rK   rM   rT   rZ   r]   r0   rt   r   r   ro   rp   rn   rk   rm   rl   rj   rq   rr   rs   r   r-   r-   r-   r.   <module>   sP   ((A%&
	