o
    minU                     @  s  d Z ddlm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.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 erddl7m8Z8 ddl9Z9zddl:Z:dZ;W n e<y   dZ:dZ;Y nw ee3e3e3f Z=dnddZ>doddZ?dpdd Z@dqd"d#ZAdrd&d'ZBdsd)d*ZCdpd+d,ZDdtd.d/ZEdtd0d1ZFdtd2d3ZGdud4d5ZHdvd7d8ZIdud9d:ZJ	 dwd=d>ZKdxdCdDZLdydFdGZMdzdIdJZNdtdKdLZOd{dNdOZPdtdPdQZQdtdRdSZRd|dUdVZSd}dYdZZTd~d\d]ZUdd_d`ZVddbdcZW		dddldmZXdS )a  
These method recursively evaluate the SPARQL Algebra

evalQuery is the entry-point, it will setup context and
return the SPARQLResult object

evalPart is called on each level and will delegate to the right method

A `rdflib.plugins.sparql.sparql.QueryContext` is passed along, keeping
information needed for evaluation

A list of dicts (solution mappings) is returned, apart from GroupBy which may
also return a dict of list of dicts
    )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)PathTF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oZ_s_pZ_ossspsocx r>   X/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/evaluate.pyr4   M   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)Z_except)
evalPartr6   r   exprforget_vars
isinstancer#   mergevar)r*   r@   r<   er>   r>   r?   
evalExtend|   s   

rJ   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)rB   p1thawp2rG   )r*   rK   ar<   br>   r>   r?   evalLazyJoin   s   	
rQ   !Generator[FrozenDict, None, None]c                 C  s6   |j rt| |S t| |j}tt| |j}t||S N)ZlazyrQ   rB   rL   setrN   r   )r*   rK   rO   rP   r>   r>   r?   evalJoin   s
   

rU   union	List[Any]c                 C  s@   g }t | |jD ]}|| qt | |jD ]}|| q|S rS   )rB   rL   appendrN   )r*   rV   Zbranch1_branch2r=   r>   r>   r?   	evalUnion   s   rY   minusc                 C  s&   t | |j}tt | |j}t||S rS   )rB   rL   rT   rN   r   )r*   rZ   rO   rP   r>   r>   r?   	evalMinus   s   
r[   c              	   #  s    t |  jD ]E}d}| |}t | jD ]}t j|| r)d}||V  q|sL jj}|d u sIt	 fddt | |
| jD sL|V  qd S )NFTc                 3  s    | ]	}t  j|V  qd S rS   )r   rC   ).0rP   rK   r>   r?   	<genexpr>   s
    

zevalLeftJoin.<locals>.<genexpr>)rB   rL   rM   rN   r   rC   rD   rG   rE   anyZremember)r*   rK   rO   okr<   rP   Zp1_varsr>   r]   r?   evalLeftJoin   s"   
ra   partc                 c  s@    t | |jD ]}t|j|js|j| |jdn|r|V  qd S rA   )rB   r6   r   rC   Zno_isolated_scoperD   rE   )r*   rb   r<   r>   r>   r?   
evalFilter   s   rc   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.)Zdataset	Exceptionclonetermr1   ZcontextsZdefault_contextZ	pushGraphr3   
identifierr   rB   r6   r*   r   rF   r   Zget_context)r*   rb   r1   Z
prev_graphr<   ZgraphSolutionr=   r>   r>   r?   	evalGraph   s6   


rh   c              	   c  s`    |j jD ](}|  }z| D ]\}}|dkr|||< qW n	 ty'   Y qw | V  qd S )NZUNDEF)r6   resr3   itemsr   r0   )r*   rb   rr<   kvr>   r>   r?   
evalValues   s   rn   c                 C  s"   |j jdkrt| |S t| |j S )Nvalues)r6   namern   rB   )r*   rb   r>   r>   r?   evalMultiset  s   
rq   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 )NZBGPc                   s   t  fdd| D S )Nc                   s   g | ]
} | d u r|qS rS   r>   )r\   nr*   r>   r?   
<listcomp>!  s    z.evalPart.<locals>.<lambda>.<locals>.<listcomp>)len)trs   r>   r?   <lambda>!  s    zevalPart.<locals>.<lambda>)keyFilterZJoinZLeftJoinr   r   Z
ToMultiSetZExtendZMinusZProjectSliceZDistinctZReducedZOrderByGroupZAggregateJoinZSelectQueryZAskQueryZConstructQueryZServiceGraphPatternZDescribeQueryzI dont know: %s)r   rj   NotImplementedErrorrp   sortedr2   r4   rc   rU   ra   rh   rY   rq   rJ   r[   evalProject	evalSliceevalDistinctevalReducedevalOrderBy	evalGroupevalAggregateJoinevalSelectQueryevalAskQueryevalConstructQueryevalServiceQueryevalDescribeQueryrd   )r*   rb   rp   r<   r2   r>   rs   r?   rB     sh   









































rB   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r\t| }	nt| }	|	d d  }
|d< |	d d }t|dkr|D ]}t| ||
D ]}|V  qq{d S d S td||jd S )Nz ^service <(.*)>[ 
]*{(.*)}[ 
]*$Zservice_string r/      json)queryoutputzapplication/sparql-results+jsonZrdflibForAnUser)acceptz
user-agentiX  ?)headers)datar      headvarsvars_resultsbindingsr   z#Service: %s responded with code: %s)rematchgetDOTALLIgroup_buildQueryStringForServiceCallru   r   r   r   encodestatus_HAS_ORJSONorjsonloadsreadr   #_yieldBindingsFromServiceCallResultrd   )r*   rb   ri   r   Zservice_urlservice_queryZquery_settingsr   responseZ	json_dict	variablesrk   boundr>   r>   r?   r   W  sT   





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>   )rF   r(   r\   rm   r>   r>   r?   rt         z3_buildQueryStringForServiceCall.<locals>.<listcomp>c                 S  s   g | ]}|  qS r>   )n3r   r>   r>   r?   rt         c                   s   g | ]	}  | qS r>   )r   r   r   rs   r>   r?   rt     r   zVALUES (z) {(z)})r   Z
parseQueryr   prologueZnamespace_managerstore
namespacesr   baseru   r0   rK   )r*   r   r6   r   Zsolr   Zvariables_boundr>   rs   r?   r     s$   &r   rk   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   Zbnodezinvalid type z for variable )r'   r(   r&   r   r$   
ValueErrorr   )r*   rk   r   Zres_dictrH   Zvar_bindingZvar_typer>   r>   r?   r     s.   r   r   c                 C  s   t | |jS )z<
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    rB   r6   )r*   r   r>   r>   r?   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)Zaggregations)r   Ar>   )r   r>   r?   rw     s    z#evalAggregateJoin.<locals>.<lambda>Tc                 3  s    | ]	}t | d V  qdS )FN)r   )r\   rI   )rowr>   r?   r^         z$evalAggregateJoin.<locals>.<genexpr>r   )rB   r6   rC   collectionsdefaultdictupdatetuplero   r   Zget_bindingsru   )r*   r   r6   Z
group_exprri   Z
aggregatorrl   r>   )r   r   r?   r     s&   
r   c                   sJ   t | |j}t|jD ] t jo jdk}t| fdd|d}q|S )NZDESCc                   s   t t|  jddS )NT)r   )r   r   rC   )r=   rI   r>   r?   rw     r   zevalOrderBy.<locals>.<lambda>)rx   reverse)rB   r6   reversedrC   boolorderr}   )r*   rb   ri   r   r>   r   r?   r     s   r   slicec                 C  s4   t | |j}t||j|jd ur|j|j S d S rS   )rB   r6   	itertoolsislicestartlength)r*   r   ri   r>   r>   r?   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)
rT   r   dequerB   r6   removeaddru   pop
appendleft)r*   rb   MAXZmru_setZ	mru_queuer   r>   r>   r?   r     s   	
r   c                 c  s:    t | |j}t }|D ]}||vr|V  || qd S rS   )rB   r6   rT   r   )r*   rb   ri   doner=   r>   r>   r?   r   /  s   
r   projectc                   s   t |  j} fdd|D S )Nc                 3  s    | ]	}|  jV  qd S rS   )r   PV)r\   r   r   r>   r?   r^   =  r   zevalProject.<locals>.<genexpr>r   )r*   r   ri   r>   r   r?   r~   ;  s   r~   r   >Mapping[str, Union[str, List[Variable], Iterable[FrozenDict]]]c                 C  s*   i }d|d< t | |j|d< |j|d< |S )NZSELECTtype_r   r   )rB   r6   r   )r*   r   ri   r>   r>   r?   r   @  s
   
r   Mapping[str, Union[str, bool]]c                 C  s6   i }d|d< d|d< t | |jD ]}d|d<  |S |S )NZASKr   FZ	askAnswerTr   )r*   r   ri   r=   r>   r>   r?   r   J  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 )NZ	CONSTRUCTr   r1   )templater6   r2   r   rB   r   )r*   r   r   r1   r<   ri   r>   r>   r?   r   U  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 rS   )rT   ro   )r\   Zbindingr>   r>   r?   r^     r   z$evalDescribeQuery.<locals>.<genexpr>)Ztarget_graphZDESCRIBEr   r1   )r   r1   r   bindrT   r   rF   r'   r   r6   rB   r   Zcbd)
r*   r   r1   pfxnsZto_describeZirir   resourceri   r>   r>   r?   r   j  s"   



r   r1   r   r!   initBindings"Optional[Mapping[str, Identifier]]r   Optional[str]Mapping[Any, Any]c                 C  sB   |j }tdd |p
i  D }t| ||jd}|j|_t||S )a5  Evaluate a SPARQL query against a graph.

    !!! warning "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
        [Security Considerations](../security_considerations.md)
        documentation.
    c                 s  s     | ]\}}t ||fV  qd S rS   )r(   )r\   rl   rm   r>   r>   r?   r^     s    zevalQuery.<locals>.<genexpr>)r   datasetClause)Zalgebradictrj   r"   r   r   rB   )r1   r   r   r   mainr*   r>   r>   r?   	evalQuery  s   
r   )r*   r"   r+   r,   r-   r.   )r*   r"   r@   r   r-   r.   )r*   r"   rK   r   r-   r.   )r*   r"   rK   r   r-   rR   )r*   r"   rV   r   r-   rW   )r*   r"   rZ   r   r-   rR   )r*   r"   rb   r   r-   r.   )r*   r"   rb   r   )r*   r"   rb   r   r-   r   )r*   r"   r   r   r-   r   )r*   r"   rk   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   )Y__doc__
__future__r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   r   urllib.parser   urllib.requestr   r   Z	pyparsingr   Zrdflib.graphr   Zrdflib.plugins.sparqlr   r   Z rdflib.plugins.sparql.aggregatesr   Zrdflib.plugins.sparql.evalutilsr   r   r   r   r   r   Z!rdflib.plugins.sparql.parserutilsr   r   Zrdflib.plugins.sparql.sparqlr   r   r    r!   r"   r#   Zrdflib.termr$   r%   r&   r'   r(   Zrdflib.pathsr)   r   r   r   ImportErrorZ_Tripler4   rJ   rQ   rU   rY   r[   ra   rc   rh   rn   rq   rB   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   r   r>   r>   r>   r?   <module>   sr    4  

/



	



#


B2




!



(





&