
    i6U                       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rddl7m8Z8 ddl9Z9	 ddl:Z:dZ;ee3e3e3f   Z=	 	 	 	 	 	 d-dZ>	 	 	 	 	 	 d.dZ?	 	 	 	 	 	 d/dZ@d0dZAd1dZBd2dZC	 	 	 	 	 	 d/dZD	 	 	 	 	 	 d3dZE	 	 	 	 	 	 d3dZF	 	 	 	 	 	 d3dZGd4dZHd5dZId4dZJ	 d6dZK	 	 	 	 	 	 	 	 d7d ZLd8d!ZM	 	 	 	 	 	 d9d"ZN	 	 	 	 	 	 d3d#ZOd:d$ZP	 	 	 	 	 	 d3d%ZQ	 	 	 	 	 	 d3d&ZRd;d'ZS	 	 	 	 	 	 d<d(ZTd=d)ZU	 	 	 	 	 	 d>d*ZVd?d+ZW	 	 d@	 	 	 	 	 	 	 	 	 dAd,ZXy# e<$ r dZ:dZ;Y w xY w)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              #    K   |s| j                          y|d   \  }}}| |   }| |   }| |   }| j                  j                  |||f      D ]O  \  }}	}
d|||fv r| j                         }n| }||||<   	 ||	||<   	 ||
||<   t        ||dd       D ]  }|  Q y# t        $ r Y ^w xY w# t        $ r Y mw xY ww)z
    A basic graph pattern
    Nr      )solutiongraphtriplespushr   evalBGP)ctxbgpspo_s_p_ossspsocxs                MC:\Projects\mas-dev\.venv\Lib\site-packages\rdflib/plugins/sparql/evaluate.pyr1   r1   N   s     lln!fGAq!	QB	QB	QB ii''R5
BBB<
AA:AaD	z!	z! CG$AG %1 6  		  		sH   A4B?7B!?B0B?!	B-*B?,B--B?0	B<9B?;B<<B?c              #  .  K   t        | |j                        D ]e  }	 t        |j                  |j	                  | |j
                              }t        |t              r||j                  |j                  |i       g y # t        $ r | Y xw xY wwN)_except)
evalPartr5   r   exprforget_vars
isinstancer$   mergevar)r2   extendr=   es       r?   
evalExtendrL   }   s~     
 c688$	fkk188C8#FGA![)''6::q/** %  	G	s)   BA"B?BBBBBc              #     K   t        | |j                        D ]A  }| j                  |      }t        ||j                        D ]  }|j	                  |        C yw)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      sM      c477#HHQK!TWW%A''!* & $s   AAc                    |j                   rt        | |      S t        | |j                        }t	        t        | |j
                              }t        ||      S N)lazyrT   rC   rN   setrP   r   )r2   rQ   rR   rS   s       r?   evalJoinrY      sI     yyC&&S$''"dgg&'Q{    c                    g }t        | |j                        D ]  }|j                  |        t        | |j                        D ]  }|j                  |        |S rV   )rC   rN   appendrP   )r2   unionbranch1_branch2r>   s       r?   	evalUnionr_      sS    Oc588$q! %c588$q! %rZ   c                    t        | |j                        }t        t        | |j                              }t	        ||      S rV   )rC   rN   rX   rP   r   )r2   minusrR   rS   s       r?   	evalMinusrb      s3    ehhAHS%((#$A!Q<rZ   c              #    K   t        | j                        D ]  }d}| j                  |      }t        |j                        D ].  }t	        j
                  |j                  |             s)d}| 0 |r`j                  j                  }|Gt        fdt        | j                  |j                  |            j                        D              r|  y w)NFTc              3  J   K   | ]  }t        j                  |        y wrV   )r   rD   ).0rS   rQ   s     r?   	<genexpr>zevalLeftJoin.<locals>.<genexpr>   s$      *IA TYY"Is    #)
rC   rN   rO   rP   r   rD   rE   rF   anyremember)r2   rQ   rR   okr=   rS   p1_varss    `     r?   evalLeftJoinrk      s      c477#HHQK!TWW%ADIIqxx}- &  ggmmGc *!#((1::g+>"?I* ' % $s   A+C /
C :AC C c              #     K   t        | |j                        D ]F  }t        |j                  |j                  s|j                  | |j                        n|      sC| H y wrA   )rC   r5   r   rD   no_isolated_scoperE   rF   )r2   partr=   s      r?   
evalFilterro      sR      c466"II595K5KAHHS$**H-QR
 G #s   AA#A#c              #    K   | j                   t        d      | j                         } | |j                     }| j                  }|| j                   j                         D ]  }|| j                   j                  k(  r| j                  |      }|j                         }|j                  |j                  ig}t        t        ||j                        |      D ]  }||j                  _        |   y t        rt        |t               rJ | j                  | j                   j#                  |            }t        ||j                        D ]  }||j                  _        |  y w)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   rn   r.   
prev_graphr=   graphSolutionr>   s          r?   	evalGraphr|      s+     {{3
 	

 ))+C+.tyy>EJ}[[))+E333e$AA"ii)9)9:;M8Atvv.>( ? , !%///MM#++11%89!TVV$A$AEEKG %s   E&E(c              #     K   |j                   j                  D ]I  }| j                         }	 |j                         D ]  \  }}|dk7  s|||<    	 |j                          K y # t        $ r Y Xw xY ww)NUNDEF)r5   resr0   itemsr   r-   )r2   rn   rr=   kvs         r?   
evalValuesr      so      VVZZHHJ		1<AaD " jjl   		s.   *A5A&	A&A5&	A2/A51A22A5c                x    |j                   j                  dk(  rt        | |      S t        | |j                         S )Nvalues)r5   namer   rC   )r2   rn   s     r?   evalMultisetr     s0    vv{{h#t$$C  rZ   c                D    t        j                         D ]  \  }}	  | |      c S  |j                  dk(  r&t	        |j
                   fd      }t         |      S |j                  dk(  rt         |      S |j                  dk(  rt         |      S |j                  dk(  rt         |      S |j                  dk(  rt         |      S |j                  dk(  rt         |      S |j                  d	k(  rt         |      S |j                  d
k(  rt         |      S |j                  dk(  rt         |      S |j                  dk(  rt         |      S |j                  dk(  rt!         |      S |j                  dk(  rt#         |      S |j                  dk(  rt%         |      S |j                  dk(  rt'         |      S |j                  dk(  rt)         |      S |j                  dk(  rt+         |      S |j                  dk(  rt-         |      S |j                  dk(  rt/         |      S |j                  dk(  rt1         |      S |j                  dk(  rt3         |      S |j                  dk(  rt5         |      S t7        d|j                  z        # t        $ r Y w xY w)NBGPc                L    t        | D cg c]
  }|   	| c}      S c c}w rV   )len)tnr2   s     r?   <lambda>zevalPart.<locals>.<lambda>"  s$    ,L1SV^Q,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   ro   rY   rk   r|   r_   r   rL   rb   evalProject	evalSliceevalDistinctevalReducedevalOrderBy	evalGroupevalAggregateJoinevalSelectQueryevalAskQueryevalConstructQueryevalServiceQueryevalDescribeQueryrr   )r2   rn   r   r=   r/   s   `    r?   rC   rC     s   %%'a	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	JJc              #  <  K   i }t        j                  d|j                  dd      t         j                  t         j                  z        }|rM|j                  d      }t        | |j                  d            }|dd}dd	d
}t        |      dk  r&t        t        |dz   t        |      z   |            }n.t        t        |t        |      j                         |            }|j                  dk(  rt        r$t        j                  |j!                               }	n#t#        j                  |j!                               }	|	d   d   x}
|d<   |	d   d   }t        |      dkD  r|D ]  }t%        | ||
      D ]  }|   y y t'        d||j                        y w)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   #_yieldBindingsFromServiceCallResultrr   )r2   rn   r   r   service_urlservice_queryquery_settingsr   response	json_dict	variablesr   bounds                r?   r   r   X  s    
CHH,!2&
		BDD	E kk!n7U[[^L#0FC7+

 }#c)In,EEwWH ">299;#H ??c!"LL9	 JJx}}7	'0'8'@@IGI&z2C3x!|A!DS!Y!W# "X   5{HOO I s   FFc                   	 t        j                  |       | j                         D cg c]  }t        |t              s| }}t        |      dkD  rzdj                  |D cg c]  }|j                          c}      }dj                  |D cg c]!  }| j                  |      j                         # c}      }|d
z   |z   dz   |z   dz   }|S # t        $ r d|z   dz   }| j                  j                  j
                  j                         D ]'  }d|d   z   dz   |d   j                         z   dz   |z   }) | j                  j                  }|t        |      dkD  rd|z   d	z   |z   }Y Uw xY wc c}w c c}w c c}w )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     sp   C-( lln
@n
1h(?1nC
@
3x!|HHc2caddfc23	((S#ASCGGAJMMOS#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 E0E0"E5&E:BE-,E-c              #    K   i }|D ]  }||v s||   s||   }|d   }|dk(  rt        |d         |t        |      <   8|dk(  r<t        |d   |j                  d      |j                  d            |t        |      <   y|dk(  r)t        |d   t        |d         	      |t        |      <   |d
k(  rt	        |d         |t        |      <   t        d|d|       t        | |       y w)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#C&K"6*H5 *0W1E*F#'Y&*1((__Z8$4+#' _,*1(6+j:Q3R+#' W$*/G0D*E#' =N3'!RSS+ , h
''s   C/C/CC/c                .    t        | |j                        S )z<
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    rC   r5   )r2   r   s     r?   r   r     s    
 C!!rZ   c              #    K   t        | j                        }j                  j                  }t        j                  fd      }||d   }|D ]  |j                          n/|D ]*  t        fd|D              }||   j                         , |j                         D ]  }t        | |j                                  t        |      dk(  rt        |        y y w)Nc                 0    t         j                        S )N)aggregations)r   A)aggs   r?   r   z#evalAggregateJoin.<locals>.<lambda>  s    
.rZ   Tc              3  8   K   | ]  }t        |d         yw)FN)r   )re   rK   rows     r?   rf   z$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                    t        | |j                        }t        |j                        D ]9  t	        j
                  xr j
                  dk(        }t        |fd|      }; |S )NDESCc                F    t        t        | j                  d            S )NT)r   )r   r   rD   )r>   rK   s    r?   r   zevalOrderBy.<locals>.<lambda>  s    tE!QVVt$DErZ   )r   reverse)rC   r5   reversedrD   boolorderr   )r2   rn   r   r  rK   s       @r?   r   r     s]     3
Cdii qww4177f#45Ew
 ! JrZ   c                    t        | |j                        }t        j                  ||j                  |j
                  |j                  |j
                  z         S d       S rV   )rC   r5   	itertoolsislicestartlength)r2   slicer   s      r?   r   r     sY    
3
 C&+ll&>ell"  EI rZ   c              #  T  K   d}t               }t        j                         }t        | |j                        D ]k  }||v r|j                  |       nB| |j                  |       t        |      |kD  r|j                  |j                                |j                  |       m yw)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   rn   MAXmru_set	mru_queuer   s         r?   r   r     s      C eG'--/ITVV$'>S! IKK7|c!y}}/S! %s   B&B(c              #     K   t        | |j                        }t               }|D ]  }||vs| |j                  |        y wrV   )rC   r5   rX   r  )r2   rn   r   doner>   s        r?   r   r   0  s@      3
C5DD=GHHQK s
   *AAc                F    t        | j                        }fd|D        S )Nc              3  T   K   | ]  }|j                  j                         ! y wrV   )projectPV)re   r   r  s     r?   rf   zevalProject.<locals>.<genexpr>>  s     3sCKK

#ss   %(r   )r2   r  r   s    ` r?   r   r   <  s    
3		
"C3s33rZ   c                d    i }d|d<   t        | |j                        |d<   |j                  |d<   |S )NSELECTtype_r   r   )rC   r5   r  )r2   r   r   s      r?   r   r   A  s:     HJCCLsEGG,C
O88CLJrZ   c                b    i }d|d<   d|d<   t        | |j                        D ]	  }d|d<    |S  |S )NASKr  F	askAnswerTr   )r2   r   r   r>   s       r?   r   r   K  sH    ')CCLCc577#KJ	 $ JrZ   c                    |j                   }|s |j                  j                  j                  }t               }t	        | |j                        D ]  }|t        ||      z  } i }d|d<   ||d<   |S )N	CONSTRUCTr  r.   )templater5   r/   r   rC   r   )r2   r   r$  r.   r=   r   s         r?   r   r   V  sn     ~~H7799$$GEc577#x++ $ )+CCLCLJrZ   c                   t               }| j                  j                         D ]  \  }}|j                  ||        t	               }|j
                  D ]$  }t        |t              s|j                  |       & |j                  ,t        | |j                        } |j                  d |D          |D ]  }| j                  j                  ||       ! i }	d|	d<   ||	d<   |	S )Nc              3  N   K   | ]  }t        |j                                 y wrV   )rX   r   )re   bindings     r?   rf   z$evalDescribeQuery.<locals>.<genexpr>  s     K(wS!1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   k  s    GE99'')R

3 * %K xxc6"OOC   wwC)K(KL  		hU3   )+CCLCLJrZ   c                    |j                   }t        d |xs i j                         D              }t        | ||j                        }|j
                  |_        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              3  <   K   | ]  \  }}t        |      |f  y wrV   )r)   )re   r   r   s      r?   rf   zevalQuery.<locals>.<genexpr>  s      R5QTQ!a(5Qs   )initBindingsdatasetClause)algebradictr   r#   r4  r   rC   )r.   r   r3  r   mainr2   s         r?   	evalQueryr8    s\    * ==DRl6Hb5O5O5QRRL
L8J8JC >>CLCrZ   )r2   r#   r3   zList[_Triple]return%Generator[FrozenBindings, None, None])r2   r#   rJ   r   r9  r:  )r2   r#   rQ   r   r9  r:  )r2   r#   rQ   r   r9  !Generator[FrozenDict, None, None])r2   r#   r]   r   r9  z	List[Any])r2   r#   ra   r   r9  r;  )r2   r#   rn   r   r9  r:  )r2   r#   rn   r   )r2   r#   rn   r   r9  r   )r2   r#   r   strr9  r<  )r2   r#   r   zDict[str, Dict[str, str]]r   z	List[str]r9  r:  )r2   r#   r   r   )r2   r#   r   r   r9  r:  )r2   r#   r  r   )r2   r#   r  r   )r2   r#   r   r   r9  z>Mapping[str, Union[str, List[Variable], Iterable[FrozenDict]]])r2   r#   r   r   r9  zMapping[str, Union[str, bool]])r2   r#   r   r   r9  zMapping[str, Union[str, Graph]])r2   r#   r9  zDict[str, Union[str, Graph]])NN)
r.   r   r   r"   r3  z"Optional[Mapping[str, Identifier]]r   zOptional[str]r9  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   rk   ro   r|   r   r   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   rZ   r?   <module>rN     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   E8 8	FF