3
d+                 @   s<  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dl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#G dd de"Z$G dd de"Z%dS )    )absolute_importN)	text_type	iteritems)MappingMutableMapping)NamespaceManager)VariableBNodeGraphConjunctiveGraphURIRefLiteral)Node)	CompValuec               @   s   e Zd ZdddZdS )SPARQLErrorNc             C   s   t j| | d S )N)	Exception__init__)selfmsg r   >/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/sparql/sparql.pyr      s    zSPARQLError.__init__)N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd ZdddZdS )NotBoundErrorNc             C   s   t j| | d S )N)r   r   )r   r   r   r   r   r      s    zNotBoundError.__init__)N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdd ZdS )AlreadyBoundz<Raised when trying to bind a variable that is already bound!c             C   s   t j|  d S )N)r   r   )r   r   r   r   r   !   s    zAlreadyBound.__init__N)r   r   r   __doc__r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd ZdS )SPARQLTypeErrorc             C   s   t j| | d S )N)r   r   )r   r   r   r   r   r   &   s    zSPARQLTypeError.__init__N)r   r   r   r   r   r   r   r   r   %   s   r   c               @   s^   e Zd ZdZdg fddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )Bindingsz

    A single level of a stack of variable-value bindings.
    Each dict keeps a reference to the dict below it,
    any failed lookup is propegated back

    In python 3.3 this could be a collections.ChainMap
    Nc             C   s   t || _|| _d S )N)dict_douter)r   r!   dr   r   r   r   5   s    
zBindings.__init__c             C   s2   y
| j | S  tk
r,   | js" | j| S X d S )N)r    KeyErrorr!   )r   keyr   r   r   __getitem__9   s    
zBindings.__getitem__c             C   s&   y| |  dS  t k
r    dS X d S )NTF)r#   )r   r$   r   r   r   __contains__A   s
    zBindings.__contains__c             C   s   || j |< d S )N)r    )r   r$   valuer   r   r   __setitem__H   s    zBindings.__setitem__c             C   s   t dd S )NzDelItem is not implemented!)r   )r   r$   r   r   r   __delitem__K   s    zBindings.__delitem__c             C   s   d}x| D ]}|d7 }q
W |S )Nr      r   )r   ixr   r   r   __len__N   s    
zBindings.__len__c             c   s8   | }x.|d k	r2xt j|jD ]
}|V  qW |j}qW d S )N)r   __iter__r    r!   )r   r"   r+   r   r   r   r.   T   s
    

zBindings.__iter__c                s    ddj  fdd D  d S )Nz
Bindings({z, c             3   s   | ]}| | fV  qd S )Nr   ).0k)r   r   r   	<genexpr>\   s    z#Bindings.__str__.<locals>.<genexpr>z}))join)r   r   )r   r   __str__[   s    zBindings.__str__c             C   s   t | S )N)r   )r   r   r   r   __repr__^   s    zBindings.__repr__)r   r   r   r   r   r%   r&   r(   r)   r-   r.   r3   r4   r   r   r   r   r   *   s   	r   c               @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )
FrozenDictz^
    An immutable hashable dict

    Taken from http://stackoverflow.com/a/2704866/81121

    c             O   s   t ||| _d | _d S )N)r   r    _hash)r   argskwargsr   r   r   r   j   s    zFrozenDict.__init__c             C   s
   t | jS )N)iterr    )r   r   r   r   r.   n   s    zFrozenDict.__iter__c             C   s
   t | jS )N)lenr    )r   r   r   r   r-   q   s    zFrozenDict.__len__c             C   s
   | j | S )N)r    )r   r$   r   r   r   r%   t   s    zFrozenDict.__getitem__c             C   sP   | j d krJd| _ x8t| D ],\}}|  j t|N  _ |  j t|N  _ qW | j S )Nr   )r6   r   hash)r   r$   r'   r   r   r   __hash__w   s    
zFrozenDict.__hash__c                s   t  fddt| D S )Nc             3   s   | ]}|d   kr|V  qdS )r   Nr   )r/   r,   )varsr   r   r1      s    z%FrozenDict.project.<locals>.<genexpr>)r5   r   )r   r=   r   )r=   r   project   s    zFrozenDict.projectc             C   s   t t| j| S )N)boolsetintersection)r   otherr   r   r   disjointDomain   s    zFrozenDict.disjointDomainc             C   s@   x:| D ]2}y| | || kr dS W q t k
r6   Y qX qW dS )NFT)r#   )r   rB   r0   r   r   r   
compatible   s    

zFrozenDict.compatiblec             C   s   t tjt| t|}|S )N)r5   	itertoolschainr   )r   rB   resr   r   r   merge   s    zFrozenDict.mergec             C   s
   t | jS )N)strr    )r   r   r   r   r3      s    zFrozenDict.__str__c             C   s
   t | jS )N)reprr    )r   r   r   r   r4      s    zFrozenDict.__repr__N)r   r   r   r   r   r.   r-   r%   r<   r>   rC   rD   rH   r3   r4   r   r   r   r   r5   b   s   
r5   c               @   sn   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	e
e	Ze
eZe
eZdddZdd ZdS )FrozenBindingsc             O   s   t j| f|| || _d S )N)r5   r   ctx)r   rL   r7   r8   r   r   r   r      s    zFrozenBindings.__init__c             C   sJ   t |tst|}t|ttfkr&|S || jkr<| jj| S | j| S d S )N)
isinstancer   r   typer	   r    rL   initBindings)r   r$   r   r   r   r%      s    

zFrozenBindings.__getitem__c                s   t | j fddt| D S )Nc             3   s   | ]}|d   kr|V  qdS )r   Nr   )r/   r,   )r=   r   r   r1      s    z)FrozenBindings.project.<locals>.<genexpr>)rK   rL   r   )r   r=   r   )r=   r   r>      s    zFrozenBindings.projectc             C   s    t | jtjt| t|}|S )N)rK   rL   rE   rF   r   )r   rB   rG   r   r   r   rH      s    zFrozenBindings.mergec             C   s   | j jS )N)rL   now)r   r   r   r   _now   s    zFrozenBindings._nowc             C   s   | j jS )N)rL   bnodes)r   r   r   r   _bnodes   s    zFrozenBindings._bnodesc             C   s   | j jS )N)rL   prologue)r   r   r   r   	_prologue   s    zFrozenBindings._prologueNc                s*    sg  t j fddtD S )zY
        return a frozen dict only of bindings made in self
        since before
        c             3   s>   | ]6}|d   ks2|d  j jks2|d   dkr|V  qdS )r   N)rL   rO   )r/   r,   )_exceptbeforer   r   r   r1      s    z(FrozenBindings.forget.<locals>.<genexpr>)rK   rL   r   )r   rW   rV   r   )rV   rW   r   r   forget   s
    zFrozenBindings.forgetc                s   t | j fddt| D S )z@
        return a frozen dict only of bindings in these
        c             3   s   | ]}|d   kr|V  qdS )r   Nr   )r/   r,   )theser   r   r1      s    z*FrozenBindings.remember.<locals>.<genexpr>)rK   rL   r   )r   rY   r   )rY   r   remember   s    zFrozenBindings.remember)N)r   r   r   r   r%   r>   rH   rQ   rS   rU   propertyrT   rR   rP   rX   rZ   r   r   r   r   rK      s   
rK   c               @   s   e Zd ZdZdddZdddZdd Zeed	d
Zd ddZ	dd Z
d!ddZd"ddZdd Zdd Zdd Zdd Zdd ZdS )#QueryContextz@
    Query context - passed along when evaluating the query
    Nc             C   s   || _ t|pg d| _|r&| jj| t|trV|| _tjj	j
rJ| j| _qb| jj| _nd | _|| _d | _tjjtjj| _tjt| _d S )N)r"   )rO   r   bindingsupdaterM   r   _datasetrdflibpluginssparqlZSPARQL_DEFAULT_GRAPH_UNIONdatasetgraphZdefault_contextrT   datetimerP   isodatetzinfoUTCcollectionsdefaultdictr	   rR   )r   rd   r]   rO   r   r   r   r      s    


zQueryContext.__init__c             C   sD   t | jd k	r| jn| j|p| j| jd}| j|_| j|_| j|_|S )N)rO   )r\   r_   rd   r]   rO   rT   rR   )r   r]   rr   r   r   clone   s    &zQueryContext.clonec             C   s   | j d krtd| j S )Nz*You performed a query operation requiring z'a dataset (i.e. ConjunctiveGraph), but z&operating currently on a single graph.zQYou performed a query operation requiring a dataset (i.e. ConjunctiveGraph), but zwYou performed a query operation requiring a dataset (i.e. ConjunctiveGraph), but operating currently on a single graph.)r_   r   )r   r   r   r   _get_dataset  s
    
 zQueryContext._get_datasetzcurrent dataset)docFc                sT    fdd}t jjjs2|rP|  j| jj|7  _n|rD|| j| n|| j| d S )Nc                st   y| j |f S    Y nX y| j |fddi S    Y nX y| j |fddi S    td| Y nX d S )NformatZn3ntz3Could not load %s as either RDF/XML, N3 or NTriples)loadr   )rd   source)r8   r   r   _load  s    z QueryContext.load.<locals>._load)r`   ra   rb   ZSPARQL_LOAD_GRAPHSrd   rc   Zget_context)r   rr   defaultr8   rs   r   )r8   r   rq     s    
zQueryContext.loadc             C   s8   t |ttfkr|S y
| j| S  tk
r2   d S X d S )N)rN   r	   r   r]   r#   )r   r$   r   r   r   r%   /  s    
zQueryContext.__getitem__c             C   s"   y| | S  t k
r   |S X d S )N)r#   )r   r$   rt   r   r   r   get8  s    zQueryContext.getc                s6    r"t |  fddt| jD S t | t| jS dS )zO
        Return a static copy of the current variable bindings as dict
        c             3   s"   | ]\}}| kr||fV  qd S )Nr   )r/   r0   v)r=   r   r   r1   D  s   z(QueryContext.solution.<locals>.<genexpr>N)rK   r   r]   )r   r=   r   )r=   r   solution>  s
    zQueryContext.solutionc             C   s,   || j kr| j | |krt || j |< d S )N)r]   r   )r   r$   r'   r   r   r   r(   J  s    zQueryContext.__setitem__c             C   s   | j  }||_|S )N)rl   rd   )r   rd   rk   r   r   r   	pushGraphP  s    zQueryContext.pushGraphc             C   s   | j t| j}|S )N)rl   r   r]   )r   rk   r   r   r   pushU  s    zQueryContext.pushc             C   s
   | j g S )N)rl   )r   r   r   r   cleanY  s    zQueryContext.cleanc             C   s   | j |}|S )zO
        Create a new read/write query context from the given solution
        )rl   )r   Zfrozenbindingscr   r   r   thawa  s    
zQueryContext.thaw)NNN)N)F)N)N)r   r   r   r   r   rl   rm   r[   rc   rq   r%   ru   rw   r(   rx   ry   rz   r|   r   r   r   r   r\      s   


	

r\   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ProloguezI
    A class for holding prefixing bindings and base URI information
    c             C   s   d | _ tt | _d S )N)baser   r
   namespace_manager)r   r   r   r   r   p  s    zPrologue.__init__c             C   s6   | j jj|pd}|d kr&td| t||p0d S )N zUnknown namespace prefix : %s)r   store	namespacer   r   )r   prefix	localnamensr   r   r   resolvePNameu  s    zPrologue.resolvePNamec             C   s   | j j||dd d S )NT)replace)r   bind)r   r   urir   r   r   r   {  s    zPrologue.bindc             C   sn   t |trJ|jdkr$| j|j|jS |jdkrjt|j|j| j	|j
dS n t |trjd|krjt|| jdS |S )z
        Apply BASE / PREFIXes to URIs
        (and to datatypes in Literals)

        TODO: Move resolving URIs to pre-processing
        Zpnameliteral)langdatatype:)r~   )rM   r   namer   r   r   r   stringr   
absolutizer   r   r~   )r   Zirir   r   r   r   ~  s    


zPrologue.absolutizeN)r   r   r   r   r   r   r   r   r   r   r   r   r}   j  s
   r}   c               @   s   e Zd ZdZdd ZdS )Queryz'
    A parsed and translated query
    c             C   s   || _ || _d S )N)rT   algebra)r   rT   r   r   r   r   r     s    zQuery.__init__N)r   r   r   r   r   r   r   r   r   r     s   r   )&
__future__r   ri   rE   re   rf   sixr   r   Zrdflib.compatr   r   Zrdflib.namespacer   r`   r   r	   r
   r   r   r   Zrdflib.termr   Z!rdflib.plugins.sparql.parserutilsr   Zrdflib.plugins.sparqlr   r   r   r   r   r   r5   rK   objectr\   r}   r   r   r   r   r   <module>   s,    8@B )