o
    i39                     @  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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$m%Z% e
rld 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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&   W/var/www/edux/Edux_v2/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'   r/   *   r.   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 |  d S r!   r0   r%   r&   r&   r'   r#   2      zAlreadyBound.__init__Nr+   r,   r-   __doc__r#   r&   r&   r&   r'   r1   /   s    r1   c                   @  s   e Zd ZdddZdS )SPARQLTypeErrorr   r   c                 C  r    r!   r0   r$   r&   r&   r'   r#   7   r(   zSPARQLTypeError.__init__Nr)   r*   r&   r&   r&   r'   r6   6   s    r6   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_dr8   )r%   r8   dr&   r&   r'   r#   F   s   

zBindings.__init__keystrreturnc                 C  s*   || j v r
| j | S | jst | j| S r!   )r;   r8   KeyErrorr%   r=   r&   r&   r'   __getitem__J   s
   


zBindings.__getitem__r   boolc                 C  s$   z| |  W dS  t y   Y dS w )NTFr@   rA   r&   r&   r'   __contains__R   s   zBindings.__contains__valueNonec                 C  s   || j |< d S r!   r;   r%   r=   rF   r&   r&   r'   __setitem__Y   r3   zBindings.__setitem__c                 C  s   t d)NzDelItem is not implemented!)r"   rA   r&   r&   r'   __delitem__\      zBindings.__delitem__intc                 C  s0   d}| }|d ur|t |j7 }|j}|d us|S Nr   )lenr;   r8   )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;   r8   )r%   r<   r&   r&   r'   __iter__g   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kr2   r&   r'   	<genexpr>o   s    z#Bindings.__str__.<locals>.<genexpr>z}))joinr2   r&   r2   r'   __str__m   s    zBindings.__str__c                 C  s   t | S r!   )r>   r2   r&   r&   r'   __repr__q   rL   zBindings.__repr__)r8   r9   )r=   r>   r?   r>   )r=   r   r?   rC   )r=   r>   rF   r   r?   rG   )r=   r>   r?   rG   r?   rM   )r?   rR   r?   r>   )r+   r,   r-   r5   r#   rB   rE   rJ   rK   rQ   rS   rX   rY   r&   r&   r&   r'   r7   ;   s    	






r7   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#   }   s   
zFrozenDict.__init__c                 C  
   t | jS r!   )iterr;   r2   r&   r&   r'   rS         
zFrozenDict.__iter__r?   rM   c                 C  r`   r!   )rO   r;   r2   r&   r&   r'   rQ      rb   zFrozenDict.__len__r=   r   c                 C  s
   | j | S r!   rH   rA   r&   r&   r'   rB      rb   zFrozenDict.__getitem__c                 C  sL   | j d u r#d| _ |  D ]\}}|  j t|N  _ |  j t|N  _ q| j S rN   )r_   itemshashrI   r&   r&   r'   __hash__   s   
zFrozenDict.__hash__varsContainer[Variable]'FrozenDict'c                   s   t  fdd|  D S )Nc                 3       | ]}|d   v r|V  qdS r   Nr&   rT   xrf   r&   r'   rV          z%FrozenDict.project.<locals>.<genexpr>)r\   rc   r%   rf   r&   rm   r'   project   s   zFrozenDict.projectother!t.Mapping[Identifier, Identifier]rC   c                 C  s   t t| | S r!   )rC   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 )NFTrD   )r%   rq   rU   r&   r&   r'   
compatible   s   zFrozenDict.compatiblec                 C  s   t t|  | }|S r!   )r\   	itertoolschainrc   r%   rq   resr&   r&   r'   merge   s   zFrozenDict.merger>   c                 C  r`   r!   )r>   r;   r2   r&   r&   r'   rX      rb   zFrozenDict.__str__c                 C  r`   r!   )reprr;   r2   r&   r&   r'   rY      rb   zFrozenDict.__repr__N)r]   r   r^   r   rZ   )r=   r   r?   r   )rf   rg   r?   rh   )rq   rr   r?   rC   )rq   rr   r?   rh   r[   )r+   r,   r-   r5   r#   rS   rQ   rB   re   rp   ru   rv   r{   rX   rY   r&   r&   r&   r'   r\   u   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'QueryContext'c                 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~   initBindingsrA   r&   r&   r'   rB      s   


zFrozenBindings.__getitem__rf   rg   'FrozenBindings'c                      t | j fdd|  D S )Nc                 3  ri   rj   r&   rk   rm   r&   r'   rV      rn   z)FrozenBindings.project.<locals>.<genexpr>r}   r~   rc   ro   r&   rm   r'   rp      s   zFrozenBindings.projectrq   rr   c                 C  s    t | jt|  | }|S r!   )r}   r~   rw   rx   rc   ry   r&   r&   r'   r{      s   zFrozenBindings.mergedatetime.datetimec                 C     | j jS r!   )r~   nowr2   r&   r&   r'   r         zFrozenBindings.nowt.Mapping[Identifier, BNode]c                 C  r   r!   )r~   bnodesr2   r&   r&   r'   r      r   zFrozenBindings.bnodesOptional['Prologue']c                 C  r   r!   )r~   prologuer2   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'   rV      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'   rV      rn   z*FrozenBindings.remember.<locals>.<genexpr>r   )r%   r   r&   r   r'   remember   s   zFrozenBindings.remember)r~   r   )r=   r   r?   r   )rf   rg   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#   rB   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d@dAddZ	dBd#d$Z
d=dCd'd(Zd=dDd,d-ZdEd/d0ZdFd1d2ZdGd3d4ZdGd5d6ZdHd8d9ZdS )IQueryContextz@
    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r/|| _tjj	j
r)| j| _n| jj| _nd | _|| _d | _d | _tt| _d S )N)r<   )r   r7   r   updater   r   _datasetrdflibpluginssparqlSPARQL_DEFAULT_GRAPH_UNIONdatasetr   default_contextr   _nowcollectionsdefaultdictr   r   )r%   r   r   r   r&   r&   r'   r#      s$   



zQueryContext.__init__r?   r   c                 C  s"   | j d u rtjtjj| _ | j S r!   )r   datetimer   isodatetzinfoUTCr2   r&   r&   r'   r     s   
zQueryContext.now4Optional[Union[FrozenBindings, Bindings, List[Any]]]r   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'   clone"  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"   r2   r&   r&   r'   r   /  s
   
zQueryContext.datasetFsourcer   defaultrC   r^   r   rG   c                   sb    fdd}t jjjs|r|  j| j|7  _dS dS |r&|| j| dS || j|| dS )a  
        Load data from the source into the query context's.

        :param source: The source to load from.
        :param 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.
        :param kwargs: Keyword arguments to pass to
            :meth:`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xmln3ntz3Could not load %s as either RDF/XML, N3 or NTriples)parser"   )r   r   r^   r&   r'   _loadF  s,   z QueryContext.load.<locals>._loadN)r   r   r   SPARQL_LOAD_GRAPHSr   r   get_context)r%   r   r   r^   r   r&   r   r'   load:  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   r@   rA   r&   r&   r'   rB   f  s   zQueryContext.__getitem__r>   Optional[Any]c                 C  s"   z| | W S  t y   | Y S w r!   rD   )r%   r=   r   r&   r&   r'   geto  s
   
zQueryContext.getrf   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&   )rT   rU   vrm   r&   r'   rV   {  s   " z(QueryContext.solution.<locals>.<genexpr>)r}   r   rc   ro   r&   rm   r'   solutionu  s
   zQueryContext.solutionrF   c                 C  s,   || j v r| j | |krt || j |< d S r!   )r   r1   rI   r&   r&   r'   rJ     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   r7   r   )r%   r   r&   r&   r'   push  s   zQueryContext.pushc                 C  s
   |  g S r!   r   r2   r&   r&   r'   clean  rb   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)NNN)r   r   r   r   r   r   r   r!   )r   r   r?   r   )r?   r   )F)r   r   r   rC   r^   r   r?   rG   )r=   r   r?   r   )r=   r>   r   r   r?   r   )rf   r   r?   r}   )r=   r>   rF   r>   r?   rG   )r   r   r?   r   )r?   r   )r   r}   r?   r   )r+   r,   r-   r5   r#   r   r   r   r   r   rB   r   r   rJ   r   r   r   r   r&   r&   r&   r'   r      s*    

,	



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?   rG   c                 C  s   d | _ tt | _d S r!   )baser   r   namespace_managerr2   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   store	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
        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?   rG   )r   r   r   r   r?   r   )r   r   r   r   r?   rG   )r   r   r?   r   )r+   r,   r-   r5   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   r4   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   r4   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   r   rdflib.plugins.sparqlr   rdflib.graphr   r   rdflib.namespacer   !rdflib.plugins.sparql.parserutilsr   rdflib.termr   r   r   r   r   r   rdflib.pathsr   r   r"   r   r/   r1   r6   r7   r\   r}   r   r   r   r   r&   r&   r&   r'   <module>   s8    4 :>F #*