3
d                 @   s   d 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
 ddlmZm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d Zdd  Zi fd!d"Zd#S )$z+

Code for carrying out Update Operations

    )GraphVariable)	iteritems)QueryContext)_fillTemplate_join)evalBGPevalPartc             C   s   |dkr| j S | jj|S d S )NDEFAULT)graphdatasetget_context)ctxg r   >/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/sparql/update.py_graphOrDefault   s    r   c                sX   |dkr j gS |dkr0 fdd jj D S |dkrFt jj S  jj|gS dS )z!
    return a list of graphs
    r
   ZNAMEDc                s   g | ]}|j  jj kr|qS r   )
identifierr   ).0c)r   r   r   
<listcomp>   s    z_graphAll.<locals>.<listcomp>ALLN)r   r   Zcontextslistr   )r   r   r   )r   r   	_graphAll   s    r   c             C   s0   |j r| j|jd|j d n| j|jdd dS )z4
    http://www.w3.org/TR/sparql11-update/#load
    F)defaultZpublicIDT)r   N)graphiriloadZiri)r   ur   r   r   evalLoad&   s    r   c             C   s4   | j j|j}t|dkr(td|j tddS )z6
    http://www.w3.org/TR/sparql11-update/#create
    r   zGraph %s already exists.zCreate not implemented!N)r   r   r   len	Exceptionr   )r   r   r   r   r   r   
evalCreate1   s    r!   c             C   s$   xt | |jD ]}|jd qW dS )z5
    http://www.w3.org/TR/sparql11-update/#clear
    N)NNN)r   r   remove)r   r   r   r   r   r   	evalClear;   s    r#   c             C   s>   | j jjr0x.t| |jD ]}| j jj| qW n
t| | dS )z4
    http://www.w3.org/TR/sparql11-update/#drop
    N)r   storegraph_awarer   r   remove_graphr#   )r   r   r   r   r   r   evalDropD   s    
r'   c             C   s>   | j }||j7 }x(|jD ]}| jj|}||j| 7 }qW dS )z:
    http://www.w3.org/TR/sparql11-update/#insertData
    N)r   triplesquadsr   r   )r   r   r   cgr   r   r   evalInsertDataO   s
    
r+   c             C   s>   | j }||j8 }x(|jD ]}| jj|}||j| 8 }qW dS )z:
    http://www.w3.org/TR/sparql11-update/#deleteData
    N)r   r(   r)   r   r   )r   r   r   r*   r   r   r   evalDeleteData^   s
    
r,   c             C   s   t | |j}x>|jD ]4}| jj|}| j|}t|tt ||j| }qW xX|D ]P}| j}|t	|j|8 }x4|jD ]*}| jj|j
|}|t	|j| |8 }qtW qRW dS )z;
    http://www.w3.org/TR/sparql11-update/#deleteWhere
    N)r   r(   r)   r   r   	pushGraphr   r   r   r   get)r   r   resr   r*   r   r   r   r   evalDeleteWherem   s    

r0   c             C   s  | }|j rhd}xX|j D ]N}|jrJ|s8t }| j|} d}| j|jdd q|jr|j}| j|dd qW |j  r|jr| jj|j}| j|} t	| |j
}|j r|r|} |jr| jj|j}| j|} x|D ]}| j}|jr,|t|jj|8 }x:t|jjD ]*\}}	| jj|j|}
|
t|	|8 }
 qW |jr|t|jj|7 }x:t|jjD ]*\}}	| jj|j|}
|
t|	|7 }
qRW qW d S )NFT)r   )Zusingr   r   r-   r   namedZ
withClauser   r   r	   wherer   deleter   r(   r   r)   r.   insert)r   r   ZoriginalctxZotherDefaultdZdgr   r/   r   qr*   r   r   r   
evalModify   sF    



r7   c             C   s:   |j \}}t| |}t| |}|j|jkr.dS ||7 }dS )zY

    add all triples from src to dst

    http://www.w3.org/TR/sparql11-update/#add
    N)r   r   r   )r   r   srcdstsrcgdstgr   r   r   evalAdd   s    


r<   c             C   sh   |j \}}t| |}t| |}|j|jkr.dS |jd ||7 }| jjjrZ| jjj| n
|jd dS )z

    remove all triples from dst
    add all triples from src to dst
    remove all triples from src

    http://www.w3.org/TR/sparql11-update/#move
    N)NNN)NNN)r   r   r   r"   r   r$   r%   r&   )r   r   r8   r9   r:   r;   r   r   r   evalMove   s    





r=   c             C   sD   |j \}}t| |}t| |}|j|jkr.dS |jd ||7 }dS )zz

    remove all triples from dst
    add all triples from src to dst

    http://www.w3.org/TR/sparql11-update/#copy
    N)NNN)r   r   r   r"   )r   r   r8   r9   r:   r;   r   r   r   evalCopy   s    	



r>   c          
   C   sd  x\|D ]R}t dd t|D }t| |d}|j|_y
|jdkrRt|| n|jdkrht|| n|jdkr~t|| n|jdkrt|| n|jdkrt	|| n|jd	krt
|| n|jd
krt|| nl|jdkrt|| nV|jdkrt|| n>|jdkrt|| n&|jdkr4t|| ntd|f W q   |jsV Y qX qW dS )ad  

    http://www.w3.org/TR/sparql11-update/#updateLanguage

    'A request is a sequence of operations [...] Implementations MUST
    ensure that operations of a single request are executed in a
    fashion that guarantees the same effects as executing them in
    lexical order.

    Operations all result either in success or failure.

    If multiple operations are present in a single request, then a
    result of failure from any operation MUST abort the sequence of
    operations, causing the subsequent operations to be ignored.'

    This will return None on success and raise Exceptions on error

    c             s   s   | ]\}}t ||fV  qd S )N)r   )r   kvr   r   r   	<genexpr>  s    zevalUpdate.<locals>.<genexpr>)initBindingsLoadZClearZDropZCreateAddZMoveZCopyZ
InsertDataZ
DeleteDataZDeleteWhereZModifyzUnknown update operation: %sN)dictr   r   Zprologuenamer   r#   r'   r!   r<   r=   r>   r+   r,   r0   r7   r    Zsilent)r   updaterB   r   r   r   r   r   
evalUpdate  s>    







rH   N)__doc__Zrdflibr   r   sixr   Zrdflib.plugins.sparql.sparqlr   Zrdflib.plugins.sparql.evalutilsr   r   Zrdflib.plugins.sparql.evaluater   r	   r   r   r   r!   r#   r'   r+   r,   r0   r7   r<   r=   r>   rH   r   r   r   r   <module>   s&   
	=