o
    iV                     @  sV  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	m
Z
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 d dlmZ d dl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)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 erd dl8m9Z9 ee4e4e4f Z:dkddZ;dlddZ<dmddZ=dndd Z>dod#d$Z?dpd&d'Z@dmd(d)ZAdqd+d,ZBdqd-d.ZCdqd/d0ZDdrd1d2ZEdsd4d5ZFdrd6d7ZG	 dtd:d;ZHdud@dAZIdvdCdDZJdwdFdGZKdqdHdIZLdxdKdLZMdqdMdNZNdqdOdPZOdydRdSZPdzdVdWZQd{dYdZZRd|d\d]ZSd}d_d`ZT		d~ddidjZUdS )    )annotationsN)TYPE_CHECKINGAnyDequeDict	GeneratorIterableListMappingOptionalTupleUnion)	urlencode)Requesturlopen)ParseException)Graph)CUSTOM_EVALSparser)
Aggregator)_ebv_eval_fillTemplate_join_minus_val)	CompValuevalue)AlreadyBoundFrozenBindings
FrozenDictQueryQueryContextSPARQLError)BNode
IdentifierLiteralURIRefVariable)Pathctxr"   bgpList[_Triple]return%Generator[FrozenBindings, None, None]c              	   c  s    |s
|   V  dS |d \}}}| | }| | }| | }| j|||fD ]R\}}	}
d|||fv r7|  }n| }|du rA|||< z
|du rJ|	||< W n	 tyT   Y q&w z
|du r^|
||< W n	 tyh   Y q&w t||dd D ]}|V  qrq&dS )z
    A basic graph pattern
    Nr      )solutiongraphtriplespushr   evalBGP)r*   r+   spo_s_p_ossspsocx r@   Y/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/sparql/evaluate.pyr4   E   s@   

r4   extendr   c              	   c  sl    t | |jD ],}zt|j|j| |jd}t|tr|||j	|iV  W q ty3   |V  Y qw d S N)_except)
evalPartr6   r   exprforget_vars
isinstancer#   mergevar)r*   rB   r>   er@   r@   rA   
evalExtendt   s   

rM   joinc                 c  s@    t | |jD ]}| |}t ||jD ]}||V  qq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)rE   p1thawp2rJ   )r*   rN   ar>   br@   r@   rA   evalLazyJoin   s   	
rT   !Generator[FrozenDict, None, None]c                 C  s6   |j rt| |S t| |j}tt| |j}t||S N)lazyrT   rE   rO   setrQ   r   )r*   rN   rR   rS   r@   r@   rA   evalJoin   s
   

rY   unionIterable[FrozenBindings]c                 C  s@   g }t | |jD ]}|| qt | |jD ]}|| q|S rV   )rE   rO   appendrQ   )r*   rZ   branch1_branch2r?   r@   r@   rA   	evalUnion   s   r^   minusc                 C  s&   t | |j}tt | |j}t||S rV   )rE   rO   rX   rQ   r   )r*   r_   rR   rS   r@   r@   rA   	evalMinus   s   
r`   c              	   #  s    t |  jD ]B}d}| |}t | jD ]}t j|| r&d}|V  q|sI jj}|d u sFt fddt | |	| jD sI|V  qd S )NFTc                 3  s    | ]	}t  j|V  qd S rV   )r   rF   ).0rS   rN   r@   rA   	<genexpr>   s
    

zevalLeftJoin.<locals>.<genexpr>)
rE   rO   rP   rQ   r   rF   rG   rH   anyremember)r*   rN   rR   okr>   rS   p1_varsr@   rb   rA   evalLeftJoin   s"   
rh   partc                 c  s@    t | |jD ]}t|j|js|j| |jdn|r|V  qd S rC   )rE   r6   r   rF   no_isolated_scoperG   rH   )r*   ri   r>   r@   r@   rA   
evalFilter   s   rk   c                 c  s    | j d u r
td|  } | |j }| j}|d u rN| j  D ],}|| j jkr(q| |}| }|j|j	ig}t
t||j|D ]	}||j_|V  qAqd S trWt|trWJ | | j |}t||jD ]	}||j_|V  qfd S )NzKNon-conjunctive-graph doesn't know about graphs. Try a query without GRAPH.)dataset	Exceptionclonetermr1   contextsdefault_context	pushGraphr3   
identifierr   rE   r6   r*   r   rI   r   get_context)r*   ri   r1   
prev_graphr>   graphSolutionr?   r@   r@   rA   	evalGraph   s6   


rw   c              	   c  s`    |j jD ](}|  }z| D ]\}}|dkr|||< qW n	 ty'   Y qw | V  qd S )NUNDEF)r6   resr3   itemsr   r0   )r*   ri   rr>   kvr@   r@   rA   
evalValues   s   r~   c                 C  s"   |j jdkrt| |S t| |j S )Nvalues)r6   namer~   rE   )r*   ri   r@   r@   rA   evalMultiset  s   
r   r   c              	     s  t  D ]\}}z| |W   S  ty   Y qw |jdkr/t|j fddd}t |S |jdkr9t |S |jdkrCt |S |jdkrMt	 |S |jdkrWt
 |S |jd	krat |S |jd
krkt |S |jdkrut |S |jdkrt |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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 td|j )NBGPc                   s   t  fdd| D S )Nc                   s   g | ]
} | d u r|qS rV   r@   )ra   nr*   r@   rA   
<listcomp>  s    z.evalPart.<locals>.<lambda>.<locals>.<listcomp>)len)tr   r@   rA   <lambda>  s    zevalPart.<locals>.<lambda>)keyFilterJoinLeftJoinr   r   
ToMultiSetExtendMinusProjectSliceDistinctReducedOrderByGroupAggregateJoinSelectQueryAskQueryConstructQueryServiceGraphPatternDescribeQueryzI dont know: %s)r   rz   NotImplementedErrorr   sortedr2   r4   rk   rY   rh   rw   r^   r   rM   r`   evalProject	evalSliceevalDistinctevalReducedevalOrderBy	evalGroupevalAggregateJoinevalSelectQueryevalAskQueryevalConstructQueryevalServiceQueryevalDescribeQueryrm   )r*   ri   r   r>   r2   r@   r   rA   rE     sh   









































rE   c                 c  s   i }t d|ddt jt jB }|r|d}t| |d}|dd}dd	d
}t|dk r@tt	|d t
| |d}ntt	|t
| |d}|jdkrt| }	|	d d  }
|d< |	d d }t|dkr|D ]}t| ||
D ]}|V  qyqqd S d S td||jd S )Nz ^service <(.*)>[ 
]*{(.*)}[ 
]*$service_string r/      json)queryoutputzapplication/sparql-results+jsonrdflibForAnUser)acceptz
user-agentiX  ?)headers)datar      headvarsvars_resultsbindingsr   z#Service: %s responded with code: %s)rematchgetDOTALLIgroup_buildQueryStringForServiceCallr   r   r   r   encodestatusjloadsread#_yieldBindingsFromServiceCallResultrm   )r*   ri   ry   r   service_urlservice_queryquery_settingsr   responser   	variablesr{   boundr@   r@   rA   r   O  sP   





r   r   strc                   s   zt | W nA tyH   d| d } jjj D ]}d|d  d |d   d | }q jj}|d urFt	|dkrFd| d	 | }Y nw d
d  
 D }t	|dkrzddd |D }d fdd|D }|d | d | d }|S )NzSELECT REDUCED * WHERE {}zPREFIX r   :r/    zBASE <z> c                 S  s   g | ]	}t |tr|qS r@   )rI   r(   ra   r}   r@   r@   rA   r         z3_buildQueryStringForServiceCall.<locals>.<listcomp>c                 S  s   g | ]}|  qS r@   )n3r   r@   r@   rA   r         c                   s   g | ]	}  | qS r@   )r   r   r   r   r@   rA   r     r   zVALUES (z) {(z)})r   
parseQueryr   prologuenamespace_managerstore
namespacesr   baser   r0   rN   )r*   r   r6   r   solr   variables_boundr@   r   rA   r     s$   &r   r{   Dict[str, Dict[str, str]]r   	List[str]c                 c  s    i }|D ]g}||v rl|| rl|| }|d }|dkr&t |d |t|< q|dkr>t|d |d|dd|t|< q|dkrSt|d t |d d	|t|< q|d
krbt|d |t|< qtd|d|qt| |V  d S )Ntypeurir   literaldatatypezxml:lang)r   langztyped-literal)r   bnodezinvalid type z for variable )r'   r(   r&   r   r$   
ValueErrorr   )r*   r{   r   res_dictrK   var_bindingvar_typer@   r@   rA   r     s.   r   r   c                 C  s   t | |jS )z<
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    rE   r6   )r*   r   r@   r@   rA   r     s   r   aggc                 #  s    t |  j} jj}t fdd}|d u r'|d }|D ]| qn|D ]tfdd|D }||  q)| D ]
}t| |	 V  qBt
|dkrZt| V  d S d S )Nc                     s   t  jdS )N)aggregations)r   Ar@   )r   r@   rA   r     s    z#evalAggregateJoin.<locals>.<lambda>Tc                 3  s    | ]	}t | d V  qdS )FN)r   )ra   rL   )rowr@   rA   rc         z$evalAggregateJoin.<locals>.<genexpr>r   )rE   r6   rF   collectionsdefaultdictupdatetupler   r   get_bindingsr   )r*   r   r6   
group_exprry   
aggregatorr|   r@   )r   r   rA   r     s&   
r   c                   sJ   t | |j}t|jD ] t jo jdk}t| fdd|d}q|S )NDESCc                   s   t t|  jddS )NT)r   )r   r   rF   )r?   rL   r@   rA   r     r   zevalOrderBy.<locals>.<lambda>)r   reverse)rE   r6   reversedrF   boolorderr   )r*   ri   ry   r   r@   r   rA   r     s   r   slicec                 C  s4   t | |j}t||j|jd ur|j|j S d S rV   )rE   r6   	itertoolsislicestartlength)r*   r   ry   r@   r@   rA   r     s   r   c                 c  sr    d}t  }t }t| |jD ]&}||v r|| n|V  || t||kr1||  |	| q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)
rX   r   dequerE   r6   removeaddr   pop
appendleft)r*   ri   MAXmru_set	mru_queuer   r@   r@   rA   r     s   	
r   c                 c  s:    t | |j}t }|D ]}||vr|V  || qd S rV   )rE   r6   rX   r  )r*   ri   ry   doner?   r@   r@   rA   r   $  s   
r   projectc                   s   t |  j} fdd|D S )Nc                 3  s    | ]	}|  jV  qd S rV   )r  PV)ra   r   r  r@   rA   rc   2  r   zevalProject.<locals>.<genexpr>r   )r*   r  ry   r@   r  rA   r   0  s   r   r   >Mapping[str, Union[str, List[Variable], Iterable[FrozenDict]]]c                 C  s*   i }d|d< t | |j|d< |j|d< |S )NSELECTtype_r   r   )rE   r6   r  )r*   r   ry   r@   r@   rA   r   5  s
   
r   Mapping[str, Union[str, bool]]c                 C  s6   i }d|d< d|d< t | |jD ]}d|d<  |S |S )NASKr  F	askAnswerTr   )r*   r   ry   r?   r@   r@   rA   r   ?  s   r   Mapping[str, Union[str, Graph]]c                 C  sR   |j }|s
|jjj}t }t| |jD ]	}|t||7 }qi }d|d< ||d< |S )N	CONSTRUCTr  r1   )templater6   r2   r   rE   r   )r*   r   r  r1   r>   ry   r@   r@   rA   r   J  s   
r   Dict[str, Union[str, Graph]]c           
      C  s   t  }| j D ]
\}}||| qt }|jD ]}t|tr%|| q|j	d ur;t
| |j	}|jdd |D   |D ]
}| jj||d q=i }	d|	d< ||	d< |	S )Nc                 s  s    | ]	}t | V  qd S rV   )rX   r   )ra   bindingr@   r@   rA   rc   t  r   z$evalDescribeQuery.<locals>.<genexpr>)target_graphDESCRIBEr  r1   )r   r1   r   bindrX   r  rI   r'   r  r6   rE   r   cbd)
r*   r   r1   pfxnsto_describeirir   resourcery   r@   r@   rA   r   _  s"   



r   r1   r   r!   initBindings"Optional[Mapping[str, Identifier]]r   Optional[str]Mapping[Any, Any]c           
      C  s   t dd |pi  D }t| |d}|j|_|j}|jr[|jdu r&td| }d}|jD ]+}|j	rM|rD|j
t }||}d}|j|j	dd q/|jrZ|j}	|j|	dd q/t||S )	a  

    .. caution::

        This method can access indirectly requested network endpoints, for
        example, query processing will attempt to access network endpoints
        specified in ``SERVICE`` directives.

        When processing untrusted or potentially malicious queries, measures
        should be taken to restrict network and file access.

        For information on available security measures, see the RDFLib
        :doc:`Security Considerations </security_considerations>`
        documentation.
    c                 s  s     | ]\}}t ||fV  qd S rV   )r(   )ra   r|   r}   r@   r@   rA   rc     s    zevalQuery.<locals>.<genexpr>)r"  NzRNon-conjunctive-graph doesn't know about graphs! Try a query without FROM (NAMED).FT)default)dictrz   r"   r   algebradatasetClauserl   rm   rn   r&  rt   r$   rr   loadnamedrE   )
r1   r   r"  r   r*   mainfirstDefaultddggr@   r@   rA   	evalQuery  s.   



r1  )r*   r"   r+   r,   r-   r.   )r*   r"   rB   r   r-   r.   )r*   r"   rN   r   r-   r.   )r*   r"   rN   r   r-   rU   )r*   r"   rZ   r   r-   r[   )r*   r"   r_   r   r-   rU   )r*   r"   ri   r   r-   r.   )r*   r"   ri   r   )r*   r"   ri   r   r-   r   )r*   r"   r   r   r-   r   )r*   r"   r{   r   r   r   r-   r.   )r*   r"   r   r   )r*   r"   r   r   r-   r.   )r*   r"   r   r   )r*   r"   r  r   )r*   r"   r   r   r-   r  )r*   r"   r   r   r-   r  )r*   r"   r   r   r-   r  )r*   r"   r-   r  )NN)
r1   r   r   r!   r"  r#  r   r$  r-   r%  )V
__future__r   r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   r   urllib.parser   urllib.requestr   r   	pyparsingr   rdflib.graphr   rdflib.plugins.sparqlr   r    rdflib.plugins.sparql.aggregatesr   rdflib.plugins.sparql.evalutilsr   r   r   r   r   r   !rdflib.plugins.sparql.parserutilsr   r   rdflib.plugins.sparql.sparqlr   r   r    r!   r"   r#   rdflib.termr$   r%   r&   r'   r(   rdflib.pathsr)   _Tripler4   rM   rT   rY   r^   r`   rh   rk   rw   r~   r   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r1  r@   r@   r@   rA   <module>   sd    4  

/



	



#


B/




!



(





&