o
    mi=                     @  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mZmZmZmZmZmZmZmZmZ d dl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 m!Z!m"Z"m#Z#m$Z$m%Z% e
rjd d	l&m'Z' e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/Z0G dd dZ1G dd dZ2G dd dZ3G dd  d Z4dS )!    )annotationsN)MappingMutableMapping)TYPE_CHECKINGAny	ContainerDict	GeneratorIterableListOptionalTupleTypeVarUnion)ConjunctiveGraphDatasetGraph)NamespaceManager)	CompValue)BNode
IdentifierLiteralNodeURIRefVariable)Path_AnyTc                   @     e Zd ZddddZdS )SPARQLErrorNmsgOptional[str]c                 C     t | | d S N)	Exception__init__selfr    r'   V/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/sparql.pyr$   $      zSPARQLError.__init__r"   r   r    __name__
__module____qualname__r$   r'   r'   r'   r(   r   #       r   c                   @  r   )NotBoundErrorNr   r    c                 C  r!   r"   r   r$   r%   r'   r'   r(   r$   )   r)   zNotBoundError.__init__r"   r*   r+   r'   r'   r'   r(   r0   (   r/   r0   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 |  d S r"   r1   r&   r'   r'   r(   r$   0      zAlreadyBound.__init__Nr,   r-   r.   __doc__r$   r'   r'   r'   r(   r2   -   s    r2   c                   @  s   e Zd ZdddZdS )SPARQLTypeErrorr   r    c                 C  r!   r"   r1   r%   r'   r'   r(   r$   5   r)   zSPARQLTypeError.__init__Nr*   r+   r'   r'   r'   r(   r7   4   s    r7   c                   @  sp   e Zd ZdZdg fd ddZd!d
dZd"ddZd#ddZd$ddZd%ddZ	d&ddZ
d'ddZd'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
    NouterOptional[Bindings]c                 C  s   t || _|| _d S r"   )dict_dr9   )r&   r9   dr'   r'   r(   r$   C   s   

zBindings.__init__keystrreturnc                 C  s*   || j v r
| j | S | jst | j| S r"   )r<   r9   KeyErrorr&   r>   r'   r'   r(   __getitem__G   s
   


zBindings.__getitem__r   boolc                 C  s$   z| |  W dS  t y   Y dS w )NTFrA   rB   r'   r'   r(   __contains__O   s   zBindings.__contains__valueNonec                 C  s   || j |< d S r"   r<   r&   r>   rG   r'   r'   r(   __setitem__V   r4   zBindings.__setitem__c                 C  s   t d)NzDelItem is not implemented!)r#   rB   r'   r'   r(   __delitem__Y      zBindings.__delitem__intc                 C  s0   d}| }|d ur|t |j7 }|j}|d us|S Nr   )lenr<   r9   )r&   ir=   r'   r'   r(   __len__\   s   zBindings.__len__Generator[str, None, None]c                 c  s0    | }|d ur|j E d H  |j}|d usd S d S r"   )r<   r9   )r&   r=   r'   r'   r(   __iter__d   s   zBindings.__iter__c                   s    dd  fdd D  d S )Nz
Bindings({z, c                 3  s    | ]	}| | fV  qd S r"   r'   ).0kr3   r'   r(   	<genexpr>l   s    z#Bindings.__str__.<locals>.<genexpr>z}))joinr3   r'   r3   r(   __str__j   s    zBindings.__str__c                 C  s   t | S r"   )r?   r3   r'   r'   r(   __repr__n   rM   zBindings.__repr__)r9   r:   )r>   r?   r@   r?   )r>   r   r@   rD   )r>   r?   rG   r   r@   rH   )r>   r?   r@   rH   r@   rN   )r@   rS   r@   r?   )r,   r-   r.   r6   r$   rC   rF   rK   rL   rR   rT   rY   rZ   r'   r'   r'   r(   r8   9   s    	






r8   c                   @  s|   e Zd ZdZd&ddZdd Zd'ddZd(ddZd'ddZd)ddZ	d*ddZ
d*ddZd+ddZd,d!d"Zd,d#d$Zd%S )-
FrozenDictz^
    An immutable hashable dict

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

    argsr   kwargsc                 O  s   t |i || _d | _d S r"   )r;   r<   _hash)r&   r^   r_   r'   r'   r(   r$   z   s   
zFrozenDict.__init__c                 C  
   t | jS r"   )iterr<   r3   r'   r'   r(   rT   ~      
zFrozenDict.__iter__r@   rN   c                 C  ra   r"   )rP   r<   r3   r'   r'   r(   rR      rc   zFrozenDict.__len__r>   r   c                 C  s
   | j | S r"   rI   rB   r'   r'   r(   rC      rc   zFrozenDict.__getitem__c                 C  sL   | j d u r#d| _ |  D ]\}}|  j t|N  _ |  j t|N  _ q| j S rO   )r`   itemshashrJ   r'   r'   r(   __hash__   s   
zFrozenDict.__hash__varsContainer[Variable]c                   s   t  fdd|  D S )Nc                 3       | ]}|d   v r|V  qdS r   Nr'   rU   xrg   r'   r(   rW          z%FrozenDict.project.<locals>.<genexpr>)r]   rd   r&   rg   r'   rm   r(   project   s   zFrozenDict.projectother!t.Mapping[Identifier, Identifier]rD   c                 C  s   t t| | S r"   )rD   setintersection)r&   rq   r'   r'   r(   disjointDomain   s   zFrozenDict.disjointDomainc              	   C  s<   | D ]}z| | || krW  dS W q t y   Y qw dS )NFTrE   )r&   rq   rV   r'   r'   r(   
compatible   s   zFrozenDict.compatiblec                 C  s   t t|  | }|S r"   )r]   	itertoolschainrd   r&   rq   resr'   r'   r(   merge   s   zFrozenDict.merger?   c                 C  ra   r"   )r?   r<   r3   r'   r'   r(   rY      rc   zFrozenDict.__str__c                 C  ra   r"   )reprr<   r3   r'   r'   r(   rZ      rc   zFrozenDict.__repr__N)r^   r   r_   r   r[   )r>   r   r@   r   )rg   rh   r@   r]   )rq   rr   r@   rD   )rq   rr   r@   r]   r\   )r,   r-   r.   r6   r$   rT   rR   rC   rf   rp   ru   rv   r{   rY   rZ   r'   r'   r'   r(   r]   r   s    









r]   c                   @  sv   e Zd Zd$ddZd%d	d
Zd&ddZd'ddZed(ddZed)ddZ	ed*ddZ
	d+d,d d!Zd-d"d#ZdS ).FrozenBindingsctxQueryContextc                 O  s"   t j| g|R i | || _d S r"   )r]   r$   r~   )r&   r~   r^   r_   r'   r'   r(   r$      s   
zFrozenBindings.__init__r>   Union[Identifier, str]r@   r   c                 C  sD   t |ts	t|}t |ttfs|S || jvr| jj| S | j| S r"   )
isinstancer   r   r   r<   r~   initBindingsrB   r'   r'   r(   rC      s   


zFrozenBindings.__getitem__rg   rh   c                      t | j fdd|  D S )Nc                 3  ri   rj   r'   rk   rm   r'   r(   rW      rn   z)FrozenBindings.project.<locals>.<genexpr>r}   r~   rd   ro   r'   rm   r(   rp      s   zFrozenBindings.projectrq   rr   c                 C  s    t | jt|  | }|S r"   )r}   r~   rw   rx   rd   ry   r'   r'   r(   r{      s   zFrozenBindings.mergedatetime.datetimec                 C     | j jS r"   )r~   nowr3   r'   r'   r(   r         zFrozenBindings.nowt.Mapping[Identifier, BNode]c                 C  r   r"   )r~   bnodesr3   r'   r'   r(   r      r   zFrozenBindings.bnodesOptional[Prologue]c                 C  r   r"   )r~   prologuer3   r'   r'   r(   r      r   zFrozenBindings.prologueNbefore_exceptOptional[Container[Variable]]c                   s*    sg  t j fdd D S )zY
        return a frozen dict only of bindings made in self
        since before
        c                 3  s@    | ]}|d   v s|d  j jv s|d   du r|V  qdS rj   )r~   r   rk   r   r   r&   r'   r(   rW      s    z(FrozenBindings.forget.<locals>.<genexpr>r   )r&   r   r   r'   r   r(   forget   s   zFrozenBindings.forgetc                   r   )z@
        return a frozen dict only of bindings in these
        c                 3  ri   rj   r'   rk   theser'   r(   rW      rn   z*FrozenBindings.remember.<locals>.<genexpr>r   )r&   r   r'   r   r(   remember   s   zFrozenBindings.remember)r~   r   )r>   r   r@   r   )rg   rh   r@   r}   )rq   rr   r@   r}   r@   r   )r@   r   )r@   r   r"   )r   r   r   r   r@   r}   )r@   r}   )r,   r-   r.   r$   rC   rp   r{   propertyr   r   r   r   r   r'   r'   r'   r(   r}      s    



r}   c                   @  s   e Zd ZdZ				d;d<d	d
Zed=ddZ	d>d?ddZed@ddZ		dAdBdd Z	dCd$d%Z
d>dDd(d)Zd>dEd-d.ZdFd0d1ZdGd2d3ZdHd4d5ZdHd6d7ZdId9d:ZdS )Jr   z@
    Query context - passed along when evaluating the query
    NgraphOptional[Graph]bindings4Optional[Union[Bindings, FrozenBindings, List[Any]]]r   "Optional[Mapping[str, Identifier]]c           	      C  s   || _ t|pg d| _|r| j| |  |  t|ttfr||rit | _t | _	|D ]=}|j
rG||j
}|  j	|7  _	|sF| j|j
dd q*|jrgt| jj|jd}||j}||7 }|sg| j|jdd q*n|| _tjjjrv| j| _	n| jj| _	nd | _|| _	d | _d | _tt| _d S )N)r=   T)default)store
identifierF)r   r8   r   updater   r   r   _datasetr   r   r   get_contextloadnameddatasetr   rdflibpluginssparqlZSPARQL_DEFAULT_GRAPH_UNIONZdefault_contextr   _nowcollectionsdefaultdictr   r   )	r&   r   r   r   ZdatasetClauser=   Z
from_graphZnamedGraphsZfrom_named_graphsr'   r'   r(   r$      sL   



zQueryContext.__init__r@   r   c                 C  s"   | j d u rtjtjj| _ | j S r"   )r   datetimer   timezoneutcr3   r'   r'   r(   r   ,  s   
zQueryContext.now4Optional[Union[FrozenBindings, Bindings, List[Any]]]c                 C  sD   t | jd ur	| jn| j|p| j| jd}| j|_| j|_| j|_|S )N)r   )r   r   r   r   r   r   r   )r&   r   rr'   r'   r(   clone2  s   zQueryContext.cloner   c                 C  s   | j du r	td| j S )z "current datasetNzwYou performed a query operation requiring a dataset (i.e. ConjunctiveGraph), but operating currently on a single graph.)r   r#   r3   r'   r'   r(   r   ?  s
   
zQueryContext.datasetFsourcer   r   rD   intoOptional[Identifier]r_   r   rH   c                   sn    fdd}t jjjs|r|  j| j|7  _dS dS |r&|| j| dS |du r,|}|| j|| dS )aP  
        Load data from the source into the query context's.

        Args:
            source: The source to load from.
            default: If `True`, triples from the source will be added
                to the default graph, otherwise it will be loaded into a
                graph with `source` URI as its name.
            into: The name of the graph to load the data into. If
                `None`, the source URI will be used as as the name of the
                graph.
            **kwargs: Keyword arguments to pass to
                [`parse`][rdflib.graph.Graph.parse].
        c                   s   z| j |fddi W S  ty   Y nw z| j |fddi W S  ty+   Y nw z| j |fddi W S  tyA   Y nw z| j |fddi W S  ty[   td| w )NformatturtlexmlZn3ntz3Could not load %s as either RDF/XML, N3 or NTriples)parser#   )r   r   r_   r'   r(   _load`  s,   z QueryContext.load.<locals>._loadN)r   r   r   ZSPARQL_LOAD_GRAPHSr   r   r   )r&   r   r   r   r_   r   r'   r   r(   r   J  s   
zQueryContext.loadr>   Union[str, Path]Optional[Union[str, Path]]c                 C  s4   t |ttfs	|S z| j| W S  ty   Y d S w r"   )r   r   r   r   rA   rB   r'   r'   r(   rC     s   zQueryContext.__getitem__r?   Optional[Any]c                 C  s"   z| | W S  t y   | Y S w r"   rE   )r&   r>   r   r'   r'   r(   get  s
   
zQueryContext.getrg   Optional[Iterable[Variable]]r}   c                   s2    rt |  fdd| j D S t | | j S )zO
        Return a static copy of the current variable bindings as dict
        c                 3  s$    | ]\}}| v r||fV  qd S r"   r'   )rU   rV   vrm   r'   r(   rW     s   " z(QueryContext.solution.<locals>.<genexpr>)r}   r   rd   ro   r'   rm   r(   solution  s
   zQueryContext.solutionrG   c                 C  s,   || j v r| j | |krt || j |< d S r"   )r   r2   rJ   r'   r'   r(   rK     s   zQueryContext.__setitem__c                 C  s   |   }||_|S r"   )r   r   )r&   r   r   r'   r'   r(   	pushGraph  s   zQueryContext.pushGraphc                 C  s   |  t| j}|S r"   )r   r8   r   )r&   r   r'   r'   r(   push  s   zQueryContext.pushc                 C  s
   |  g S r"   r   r3   r'   r'   r(   clean  rc   zQueryContext.cleanfrozenbindingsc                 C  s   |  |}|S )zO
        Create a new read/write query context from the given solution
        r   )r&   r   cr'   r'   r(   thaw  s   
zQueryContext.thaw)NNNN)r   r   r   r   r   r   r   r"   )r   r   r@   r   )r@   r   )FN)
r   r   r   rD   r   r   r_   r   r@   rH   )r>   r   r@   r   )r>   r?   r   r   r@   r   )rg   r   r@   r}   )r>   r?   rG   r?   r@   rH   )r   r   r@   r   )r@   r   )r   r}   r@   r   )r,   r-   r.   r6   r$   r   r   r   r   r   rC   r   r   rK   r   r   r   r   r'   r'   r'   r(   r      s0    1
8	



r   c                   @  s8   e Zd ZdZdddZdd
dZdddZdddZdS )ProloguezI
    A class for holding prefixing bindings and base URI information
    r@   rH   c                 C  s   d | _ tt | _d S r"   )baser   r   namespace_managerr3   r'   r'   r(   r$     s   zPrologue.__init__prefixr    	localnamer   c                 C  s6   | j j|pd}|d u rtd| t||pd S )N zUnknown namespace prefix : %s)r   r   	namespacer#   r   )r&   r   r   nsr'   r'   r(   resolvePName  s   zPrologue.resolvePNameurir   c                 C  s   | j j||dd d S )NT)replace)r   bind)r&   r   r   r'   r'   r(   r     s   zPrologue.bindiriOptional[Union[CompValue, str]]c                 C  sp   t |tr&|jdkr| |j|jS |jdkr$t|j|j| 	|j
dS |S t |tr6d|vr6t|| 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   )r   r   namer   r   r   r   stringr   
absolutizer   r   r   )r&   r   r'   r'   r(   r     s   



zPrologue.absolutizeN)r@   rH   )r   r    r   r    r@   r   )r   r    r   r   r@   rH   )r   r   r@   r   )r,   r-   r.   r6   r$   r   r   r   r'   r'   r'   r(   r     s    


r   c                   @     e Zd ZdZd	ddZdS )
Queryz'
    A parsed and translated query
    r   r   algebrar   c                 C     || _ || _|  d S r"   r   r   r&   r   r   r'   r'   r(   r$        zQuery.__init__N)r   r   r   r   r5   r'   r'   r'   r(   r         r   c                   @  r   )
Updatez(
    A parsed and translated update
    r   r   r   List[CompValue]c                 C  r   r"   r   r   r'   r'   r(   r$     r   zUpdate.__init__N)r   r   r   r   r5   r'   r'   r'   r(   r     r   r   )5
__future__r   r   r   rw   typingtcollections.abcr   r   r   r   r   r   r	   r
   r   r   r   r   r   Zrdflib.plugins.sparqlr   Zrdflib.graphr   r   r   Zrdflib.namespacer   Z!rdflib.plugins.sparql.parserutilsr   Zrdflib.termr   r   r   r   r   r   Zrdflib.pathsr   r   r#   r   r0   r2   r7   r8   r]   r}   r   r   r   r   r'   r'   r'   r(   <module>   s6    4 9>F B*