
    01inU                    T   S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	J
r
JrJrJrJrJrJrJr  SSKJr  SSKJrJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSK J!r!J"r"J#r#J$r$J%r%J&r&  SSK'J(r(J)r)  SSK*J+r+J,r,J-r-J.r.J/r/J0r0  SSK1J2r2J3r3J4r4J5r5J6r6  \(       a  SSK7J8r8  SSK9r9 SSK:r:Sr;\\3\3\34   r=      S-S jr>      S.S jr?      S/S jr@S0S jrAS1S jrBS2S jrC      S/S jrD      S3S jrE      S3S jrF      S3S jrGS4S jrHS5S jrIS4S jrJ S6S jrK        S7S  jrLS8S! jrM      S9S" jrN      S3S# jrOS:S$ jrP      S3S% jrQ      S3S& jrRS;S' jrS      S<S( jrTS=S) jrU      S>S* jrVS?S+ jrW  S@         SAS, jjrXg! \< a    Sr:Sr; GNf = f)Ba  
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)PathTFc              #    #    U(       d  U R                  5       v   gUS   u  p#nX   nX   nX   nU R                  R                  XVU45       HQ  u  pn
SXVU4;   a  U R                  5       nOU nUc  XU'    Uc  XU'    Uc  XU'   [        XSS 5       H  nUv   M	     MS     g! [         a     Mc  f = f! [         a     Mt  f = f7f)z
A basic graph pattern
Nr      )solutiongraphtriplespushr   evalBGP)ctxbgpspo_s_p_ossspsocxs                X/home/james-whalen/.local/lib/python3.13/site-packages/rdflib/plugins/sparql/evaluate.pyr1   r1   M   s      lln!fGA!	B	B	B ii''5
BB<
AA:aD	z!	z! G$AG %1 6  		  		sH   A4C7B$?B5C$
B2.C1B22C5
C?CCCc           	   #  6  #    [        XR                  5       Hg  n [        UR                  UR	                  XR
                  S95      n[        U[        5      (       a  UeUR                  UR                  U05      v   Mi     g ! [         a    Uv    M}  f = f7fN)_except)
evalPartr5   r   exprforget_vars
isinstancer$   mergevar)r2   extendr=   es       r?   
evalExtendrL   |   s|     
 c88$	fkk188C8#FGA![))''6::q/** %  	G	s)   BA#B?BBBBBc              #     #    [        XR                  5       HC  nU R                  U5      n[        X1R                  5       H  nUR	                  U5      v   M     ME     g7f)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)rC   p1thawp2rH   )r2   joinar=   bs        r?   evalLazyJoinrT      sH      c77#HHQK!WW%A''!* & $s   AA c                    UR                   (       a  [        X5      $ [        XR                  5      n[	        [        XR
                  5      5      n[        X#5      $ N)lazyrT   rC   rN   setrP   r   )r2   rQ   rR   rS   s       r?   evalJoinrY      sA     yyC&&S''"gg&'Q{    c                    / n[        XR                  5       H  nUR                  U5        M     [        XR                  5       H  nUR                  U5        M     U$ rV   )rC   rN   appendrP   )r2   unionbranch1_branch2r>   s       r?   	evalUnionr_      sO    Oc88$q! %c88$q! %rZ   c                ~    [        XR                  5      n[        [        XR                  5      5      n[	        X#5      $ rV   )rC   rN   rX   rP   r   )r2   minusrR   rS   s       r?   	evalMinusrb      s-    hhAHS((#$A!<rZ   c              #    ^#    [        U TR                  5       H  nSnU R                  U5      n[        UTR                  5       HD  n[	        TR
                  UR                  U 5      5      (       d  M/  SnUR                  U5      v   MF     U(       a  M}  TR                  R                  nUbN  [        U4S j[        U R                  UR                  U5      5      TR                  5       5       5      (       a  M  Uv   M     g 7f)NFTc              3  P   >#    U  H  n[        TR                  U5      v   M     g 7frV   )r   rD   ).0rS   rQ   s     r?   	<genexpr>evalLeftJoin.<locals>.<genexpr>   s&      *IA TYY""Is   #&)rC   rN   rO   rP   r   rD   rE   rH   rF   anyremember)r2   rQ   rR   okr=   rS   p1_varss    `     r?   evalLeftJoinrl      s      c477#HHQK!TWW%ADIIqxx}--ggaj  & r ggmmGc *!#((1::g+>"?I* ' ' % $s   A.D5DA#D>	Dc           	   #     #    [        XR                  5       HN  n[        UR                  UR                  (       d  UR                  XR                  S9OU5      (       d  MJ  Uv   MP     g 7frA   )rC   r5   r   rD   no_isolated_scoperE   rF   )r2   partr=   s      r?   
evalFilterrp      sR      c66"II595K5KAHHS**H-QR
 
 G #s   AA+"	A+c              #    #    U R                   c  [        S5      eU R                  5       n XR                     nU R                  nUc  U R                   R                  5        H  nX R                   R                  :X  a  M  U R                  U5      nUR                  5       nUR                  UR                  0/n[        [        XAR                  5      U5       H  nX6R                  l        Uv   M     M     g [        (       a  [        U[         5      (       a   eU R                  U R                   R#                  U5      5      n[        XAR                  5       H  nX6R                  l        Uv   M     g 7f)NzKNon-conjunctive-graph doesn't know about graphs. Try a query without GRAPH.)dataset	Exceptionclonetermr.   contextsdefault_context	pushGraphr0   
identifierr   rC   r5   r2   r   rG   r   get_context)r2   ro   r.   
prev_graphr=   graphSolutionr>   s          r?   	evalGraphr}      s#     {{3
 	

 ))+C+.yy>EJ}[[))+E333e$AA"ii)9)9:;M8Avv.>( ? , =!%////MM#++11%89!VV$A$EEKG %s   E4E6c              #     #    UR                   R                   HK  nU R                  5       n UR                  5        H  u  pEUS:w  d  M  XSU'   M     UR                  5       v   MM     g ! [         a     M]  f = f7f)NUNDEF)r5   resr0   itemsr   r-   )r2   ro   rr=   kvs         r?   
evalValuesr      sj      VVZZHHJ		<aD " jjl   		s.   *A:A)
A)A:)
A73A:6A77A:c                v    UR                   R                  S:X  a  [        X5      $ [        XR                   5      $ )Nvalues)r5   namer   rC   )r2   ro   s     r?   evalMultisetr     s,    vv{{h#$$C  rZ   c                p  ^  [         R                  " 5        H  u  p# U" T U5      s  $    UR                  S:X  a$  [	        UR
                  U 4S jS9n[        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S	:X  a  [        T U5      $ UR                  S
:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [        T U5      $ UR                  S:X  a  [!        T U5      $ UR                  S:X  a  [#        T U5      $ UR                  S:X  a  [%        T U5      $ UR                  S:X  a  ['        T U5      $ UR                  S:X  a  [)        T U5      $ UR                  S:X  a  [+        T U5      $ UR                  S:X  a  [-        T U5      $ UR                  S:X  a  [/        T U5      $ UR                  S:X  a  [1        T U5      $ UR                  S:X  a  [3        T U5      $ UR                  S:X  a  [5        T U5      $ [7        SUR                  -  5      e! [         a     GM  f = f)NBGPc                V   > [        U  Vs/ s H  nTU   b  M  UPM     sn5      $ s  snf rV   )len)tnr2   s     r?   <lambda>evalPart.<locals>.<lambda>!  s"    ,L1SVQ,L(M,Ls   
&&)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   r   NotImplementedErrorr   sortedr/   r1   rp   rY   rl   r}   r_   r   rL   rb   evalProject	evalSliceevalDistinctevalReducedevalOrderBy	evalGroupevalAggregateJoinevalSelectQueryevalAskQueryevalConstructQueryevalServiceQueryevalDescribeQueryrs   )r2   ro   r   r=   r/   s   `    r?   rC   rC     s~   %%'	S$< ( yyE LLM
 sG$$	h	#t$$	f	T""	j	 C&&	g	d##	g	d##	l	"C&&	h	#t$$	g	d##	i	3%%	g	d##	j	 C&&	i	3%%	i	3%%	g	d##	o	% d++	m	#sD))	j	 C&&	&	&!#t,,	+	+T**	o	% d++ )DII566u # 		s   J&&
J54J5c              #  P  #    0 n[         R                  " SUR                  SS5      [         R                  [         R                  -  5      nU(       GaQ  UR                  S5      n[        XR                  S5      5      nUSS.nSS	S
.n[        U5      S:  a#  [        [        US-   [        U5      -   US95      nO+[        [        U[        U5      R                  5       US95      nUR                  S:X  a  [        (       a%  [        R                  " UR!                  5       5      n	O$["        R                  " UR!                  5       5      n	U	S   S   =oS'   U	S   S   n[        U5      S:  a!  U H  n[%        XU
5       H  nUv   M	     M     g g ['        SXHR                  5      eg 7f)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_HAS_ORJSONorjsonloadsreadr   #_yieldBindingsFromServiceCallResultrs   )r2   ro   r   r   service_urlservice_queryquery_settingsr   response	json_dict	variablesr   bounds                r?   r   r   W  s    
CHH,!2&
		BDD	E kk!n7[[^L#0FC7+

 }#c)In,EEwWH ">299;#H ??c!{"LL9	 JJx}}7	'0'8'@@IGI&z2C3x!|A!DSY!W# "X   5{OO I s   F$F&c                &    [         R                  " U5        U R                  5        Vs/ s H  n[        U[        5      (       d  M  UPM     nn[        U5      S:  a~  SR                  U Vs/ s H  oDR                  5       PM     sn5      nSR                  U Vs/ s H!  o@R                  U5      R                  5       PM#     sn5      nUS
-   U-   S-   U-   S-   nU$ ! [         a    SU-   S-   nU R                  R                  R
                  R                  5        H(  nSUS   -   S-   US   R                  5       -   S-   U-   nM*     U R                  R                  nUb  [        U5      S:  a  SU-   S	-   U-   n GNhf = fs  snf s  snf s  snf )NzSELECT REDUCED * WHERE {}zPREFIX r   :r,    zBASE <z> zVALUES (z) {(z)})r   
parseQueryr   prologuenamespace_managerstore
namespacesn3baser   r-   rG   r)   rQ   r   )r2   r   r5   r   r   solr   variables_bounds           r?   r   r     sl   C-( lln
@n
1h(?1nC
@
3x!|HHc2cddfc23	((S#ASGGAJMMOS#ABJ&2V;oMPTT 	 %  
C2]BSH//55@@BA%!,s2QqTWWY>D}TM C ||  D	A$tOd2]BM
C A2#As)   C FF-F	(FBF Fc              #    #    0 nU H  nXA;   d  M
  X   (       d  M  X   nUS   nUS:X  a  [        US   5      U[        U5      '   M@  US:X  a:  [        US   UR                  S5      UR                  S5      S9U[        U5      '   M  US:X  a'  [        US   [        US   5      S	9U[        U5      '   M  US
:X  a  [	        US   5      U[        U5      '   M  [        SU< SU< 35      e   [        X5      v   g 7f)Ntypeurir   literaldatatypezxml:lang)r   langztyped-literal)r   bnodezinvalid type z for variable )r(   r)   r'   r   r%   
ValueErrorr    )r2   r   r   res_dictrI   var_bindingvar_types          r?   r   r     s     ,.H8&K"6*H5 *0W1E*F#'Y&*1((__Z8$4+#' _,*1(6+j:Q3R+#' W$*/G0D*E#' =N3'!RSS+ , 
''s   C9C9CC9c                ,    [        XR                  5      $ )z4
http://www.w3.org/TR/sparql11-query/#defn_algGroup
rC   r5   )r2   r   s     r?   r   r     s    
 C!!rZ   c              #    ^^#    [        U TR                  5      nTR                  R                  n[        R                  " U4S j5      nUc   US   nU H  mUR                  T5        M     O1U H+  m[        U4S jU 5       5      nXF   R                  T5        M-     UR                  5        H  n[        XR                  5       5      v   M      [        U5      S:X  a  [        U 5      v   g g 7f)Nc                 *   > [        T R                  S9$ )N)aggregations)r   A)aggs   r?   r   #evalAggregateJoin.<locals>.<lambda>  s    
.rZ   Tc              3  >   >#    U  H  n[        UTS 5      v   M     g7f)FN)r   )re   rK   rows     r?   rf   $evalAggregateJoin.<locals>.<genexpr>  s     ?JqeAsE**Js   r   )rC   r5   rD   collectionsdefaultdictupdatetupler   r    get_bindingsr   )r2   r   r5   
group_exprr   
aggregatorr   r   s    `     @r?   r   r     s      	ceeA J%11.C  Y
Cc"  C?J??AFMM#  jjl
S"9"9";<< # 3x1}S!! s   C+C/c                   ^ [        XR                  5      n[        UR                  5       H=  m[	        TR
                  =(       a    TR
                  S:H  5      n[        UU4S jUS9nM?     U$ )NDESCc                @   > [        [        U TR                  SS95      $ )NT)r   )r   r   rD   )r>   rK   s    r?   r   evalOrderBy.<locals>.<lambda>  s    tE!QVVt$DErZ   )r   reverse)rC   r5   reversedrD   boolorderr   )r2   ro   r   r  rK   s       @r?   r   r     s[     3
Cdii qww4177f#45Ew
 ! JrZ   c                    [        XR                  5      n[        R                  " UUR                  UR
                  b  UR                  UR
                  -   5      $ S 5      $ rV   )rC   r5   	itertoolsislicestartlength)r2   slicer   s      r?   r   r     sW    
3
 C&+ll&>ell"  EI rZ   c              #  \  #    Sn[        5       n[        R                  " 5       n[        XR                  5       Hn  nXS;   a  UR                  U5        OCUv   UR                  U5        [        U5      U:  a  UR                  UR                  5       5        UR                  U5        Mp     g7f)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   dequerC   r5   removeaddr   pop
appendleft)r2   ro   MAXmru_set	mru_queuer   s         r?   r   r     s      C eG'--/IVV$>S! IKK7|c!y}}/S! %s   B*B,c              #     #    [        XR                  5      n[        5       nU H  nXC;  d  M
  Uv   UR                  U5        M!     g 7frV   )rC   r5   rX   r  )r2   ro   r   doner>   s        r?   r   r   /  s;      3
C5D=GHHQK s
   (AAc                H   ^ [        U TR                  5      nU4S jU 5       $ )Nc              3  X   >#    U  H  oR                  TR                  5      v   M!     g 7frV   )projectPV)re   r   r  s     r?   rf   evalProject.<locals>.<genexpr>=  s     3sKK

##ss   '*r   )r2   r  r   s    ` r?   r   r   ;  s    
3		
"C3s33rZ   c                b    0 nSUS'   [        XR                  5      US'   UR                  US'   U$ )NSELECTtype_r   r   )rC   r5   r   )r2   r   r   s      r?   r   r   @  s8     HJCCLsGG,C
O88CLJrZ   c                b    0 nSUS'   SUS'   [        XR                  5       H	  nSUS'     U$    U$ )NASKr$  F	askAnswerTr   )r2   r   r   r>   s       r?   r   r   J  sF    ')CCLCc77#KJ	 $ JrZ   c                    UR                   nU(       d   UR                  R                  R                  n[        5       n[	        XR                  5       H  nU[        X$5      -  nM     0 nSUS'   X5S'   U$ )N	CONSTRUCTr$  r.   )templater5   r/   r   rC   r   )r2   r   r*  r.   r=   r   s         r?   r   r   U  sh     ~~H7799$$GEc77#x++ $ )+CCLLJrZ   c                   [        5       nU R                  R                  5        H  u  p4UR                  X45        M     [	        5       nUR
                   H+  n[        U[        5      (       d  M  UR                  U5        M-     UR                  b+  [        XR                  5      nUR                  " S U 5       6   U H  nU R                  R                  XS9  M     0 n	SU	S'   X)S'   U	$ )Nc              3  T   #    U  H  n[        UR                  5       5      v   M      g 7frV   )rX   r   )re   bindings     r?   rf   $evalDescribeQuery.<locals>.<genexpr>  s     K(wS!122(s   &()target_graphDESCRIBEr$  r.   )r   r.   r   bindrX   r   rG   r(   r  r5   rC   r   cbd)
r2   r   r.   pfxnsto_describeirir   resourcer   s
             r?   r   r   j  s    GE99'')

3 * %K xxc6""OOC   wwC)K(KL  		h3   )+CCLLJrZ   c                    UR                   n[        S U=(       d    0 R                  5        5       5      n[        XUR                  S9nUR
                  Ul        [        XT5      $ )a  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              3  @   #    U  H  u  p[        U5      U4v   M     g 7frV   )r)   )re   r   r   s      r?   rf   evalQuery.<locals>.<genexpr>  s     R5QTQ!a(5Qs   )initBindingsdatasetClause)algebradictr   r#   r<  r   rC   )r.   r   r;  r   mainr2   s         r?   	evalQueryr@    sX    * ==DRl6Hb5O5O5QRRL
8J8JC >>CLCrZ   )r2   r#   r3   zList[_Triple]return%Generator[FrozenBindings, None, None])r2   r#   rJ   r   rA  rB  )r2   r#   rQ   r   rA  rB  )r2   r#   rQ   r   rA  !Generator[FrozenDict, None, None])r2   r#   r]   r   rA  z	List[Any])r2   r#   ra   r   rA  rC  )r2   r#   ro   r   rA  rB  )r2   r#   ro   r   )r2   r#   ro   r   rA  r   )r2   r#   r   strrA  rD  )r2   r#   r   zDict[str, Dict[str, str]]r   z	List[str]rA  rB  )r2   r#   r   r   )r2   r#   r   r   rA  rB  )r2   r#   r  r   )r2   r#   r  r   )r2   r#   r   r   rA  z>Mapping[str, Union[str, List[Variable], Iterable[FrozenDict]]])r2   r#   r   r   rA  zMapping[str, Union[str, bool]])r2   r#   r   r   rA  zMapping[str, Union[str, Graph]])r2   r#   rA  zDict[str, Union[str, Graph]])NN)
r.   r   r   r"   r;  z"Optional[Mapping[str, Identifier]]r   zOptional[str]rA  zMapping[Any, Any])Y__doc__
__future__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*   r   r   r   ImportError_Tripler1   rL   rT   rY   r_   rb   rl   rp   r}   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   rZ   r?   <module>rV     s   #   	    # + $  6 7  ?  E D! K
 
J
2
3,	,),*,^	(*"	&*		&*2			&	*	 	 & * F	&*!?7D/d0(	(3(@I(*(:""	"%"*"B	&*%"	%"&%"*%"P			&	*	4
	'C	'$* L 8<	 5 	
 O  FKs   F 
F'&F'