
    01i                    t   % S r SSKJr  SSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKJrJrJrJr  SSKJr  SSK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   SS	K!J"r"J#r#  SS
K$J%r%J&r&J'r'J(r(  SSK)J*r*J+r+  SSK,J-r-J.r.J/r/J0r0  SSK1J2r2J3r3J4r4J5r5J6r6J7r7J8r8  SSK9J:r:J;r;  SgS jr<ShS jr=SiS jr>SiS jr?SiS jr@SjS jrASkS jrBSlS jrCSkS jrDSmS jrESiS jrFSkS jrGSkS jrHSkS jrISkS jrJSkS jrKSlS jrLSkS  jrMSkS! jrNSkS" jrOSkS# jrPSkS$ jrQSkS% jrRSkS& jrSSkS' jrTSnS( jrUSkS) jrVSkS* jrWSkS+ jrXSkS, jrYSkS- jrZSkS. jr[SkS/ jr\SoS0 jr]SoS1 jr^SoS2 jr_SoS3 jr`SoS4 jraSoS5 jrbSoS6 jrcSoS7 jrdSoS8 jreSoS9 jrfSoS: jrgSoS; jrhSoS< jriSoS= jrjSoS> jrkSpS? jrlSoS@ jrmSoSA jrnSqSB jro\\+\-/\64   rp0 rqSC\rSD'    Sr         SsSE jjrs Sr       StSF jjrt Su     SvSG jjruSwSH jrv\t" \#R                  SISJ9\t" \#R                  SISJ9\t" \#R                  SISJ9\t" \#R                  SISJ9\t" \#R                  SISJ9\t" \#R                  SISJ9\t" \#R                  SISJ9SqSK j5       5       5       5       5       5       5       r}ShSL jr~ShSM jrShSN jr      SxSO jrSxSP jrSxSQ jr      SxSR jr      SxSS jrSyST jrSzSU jr\+" SVSW 5      rS{SX jrS|SY jrS}SZ jrS~S[ jrS|S\ jrwSS] jrSS^ jr          SS_ jr      SS` jr            SSa jr\SSb j5       r\SSc j5       r\SSd j5       rSSe jrSSf jrg)z
This contains evaluation functions for expressions

They get bound as instances-methods to the CompValue objects from parserutils
using setEvalFn
    )annotationsN)ROUND_HALF_DOWNROUND_HALF_UPDecimalInvalidOperation)reduce)AnyCallableDictNoReturnOptionalTupleUnionoverload)quote)ParseResults)RDFXSD)XSD_DateTime_DTsXSD_DTsXSD_Duration_DTstype_promotion)	CompValueExpr)FrozenBindingsQueryContextSPARQLErrorSPARQLTypeError)BNodeIdentifiedNode
IdentifierLiteralNodeURIRefVariable)Durationparse_datetimec                    U R                   n[        U[        5      (       a  U$ [        U[        5      (       a$  UR                  R                  [        U5      5      $ [        S5      e)z/
http://www.w3.org/TR/sparql11-query/#func-iri
z6IRI function only accepts URIRefs or Literals/Strings!)arg
isinstancer$   r"   prologue
absolutizer   exprctxas      Y/home/james-whalen/.local/lib/python3.13/site-packages/rdflib/plugins/sparql/operators.pyBuiltin_IRIr2   3   sS    
 	A!V!W ||&&vay11
N
OO    c                H    [        [        U R                  [        5      5      $ N)r"   r*   r)   r   r.   r/   s     r1   Builtin_isBLANKr7   D   s    :dhh.//r3   c                H    [        [        U R                  [         5      5      $ r5   )r"   r*   r)   r6   s     r1   Builtin_isLITERALr9   H   s    :dhh011r3   c                H    [        [        U R                  [        5      5      $ r5   )r"   r*   r)   r$   r6   s     r1   Builtin_isIRIr;   L   s    :dhh/00r3   c                h     [        U R                  5        [        S5      $ !   [        S5      s $ = fNTF)numericr)   r"   r6   s     r1   Builtin_isNUMERICr?   P   s.    t}u~s   " 1c                    U R                   nUc
  [        5       $ [        U[        5      (       a  UR                  U   $ [        S5      e)z1
http://www.w3.org/TR/sparql11-query/#func-bnode
z9BNode function only accepts no argument or literal/string)r)   r   r*   r"   bnodesr   r-   s      r1   Builtin_BNODErB   X   s@    
 	Ayw!Wzz!}
Q
RRr3   c                P    [        [        [        U R                  5      5      5      $ )z/
http://www.w3.org/TR/sparql11-query/#func-abs
)r"   absr>   r)   r6   s     r1   Builtin_ABSrE   h   s    
 3wtxx()**r3   c                f    [        U R                  5      (       a  U R                  $ U R                  $ )z.
http://www.w3.org/TR/sparql11-query/#func-if
)EBVarg1arg2arg3r6   s     r1   
Builtin_IFrK   p   s#    
 DII4995DII5r3   c                >    [        [        R                  " 5       5      $ )z1
http://www.w3.org/TR/sparql11-query/#idp2133952
)r"   randomr6   s     r1   Builtin_RANDrN   x   s    
 6==?##r3   c                R    [        [        R                  " 5       R                  5      $ 1
http://www.w3.org/TR/sparql11-query/#func-strdt
)r$   uuiduuid4urnr6   s     r1   Builtin_UUIDrU      s    
 $**,""##r3   c                P    [        [        [        R                  " 5       5      5      $ rP   )r"   strrR   rS   r6   s     r1   Builtin_STRUUIDrX      s    
 3tzz|$%%r3   c                    [        U R                  5      R                  S5      n[        [        R
                  " U5      R                  5       5      $ Nutf-8)stringr)   encoder"   hashlibmd5	hexdigestr.   r/   ss      r1   Builtin_MD5rc      s7    txx(A7;;q>++-..r3   c                    [        U R                  5      R                  S5      n[        [        R
                  " U5      R                  5       5      $ rZ   )r\   r)   r]   r"   r^   sha1r`   ra   s      r1   Builtin_SHA1rf      s7    txx(A7<<?,,.//r3   c                    [        U R                  5      R                  S5      n[        [        R
                  " U5      R                  5       5      $ rZ   )r\   r)   r]   r"   r^   sha256r`   ra   s      r1   Builtin_SHA256ri      8    txx(A7>>!$..011r3   c                    [        U R                  5      R                  S5      n[        [        R
                  " U5      R                  5       5      $ rZ   )r\   r)   r]   r"   r^   sha384r`   ra   s      r1   Builtin_SHA384rm      rj   r3   c                    [        U R                  5      R                  S5      n[        [        R
                  " U5      R                  5       5      $ rZ   )r\   r)   r]   r"   r^   sha512r`   ra   s      r1   Builtin_SHA512rp      rj   r3   c                    U R                  SSS9 H'  nUc  M  [        U[        [        45      (       a  M%  Us  $    [        S5      e)z4
http://www.w3.org/TR/sparql11-query/#func-coalesce
r)   T	variablesz;COALESCE got no arguments that did not evaluate to an error)getr*   r   r%   )r.   r/   xs      r1   Builtin_COALESCErv      sD     XXetX,=AX/F!G!GH - S
TTr3   c           	         U R                   n[        [        [        R                  " [        U5      5      5      UR                  S9$ )z0
http://www.w3.org/TR/sparql11-query/#func-ceil
datatype)r)   r"   intmathceilr>   ry   r.   r/   l_s      r1   Builtin_CEILr      s0    
 
B3tyy-.EEr3   c           	         U R                   n[        [        [        R                  " [        U5      5      5      UR                  S9$ )z1
http://www.w3.org/TR/sparql11-query/#func-floor
rx   )r)   r"   rz   r{   floorr>   ry   r}   s      r1   Builtin_FLOORr      s0     
B3tzz'"+./"++FFr3   c                    U R                   n[        U5      n[        [        U5      R	                  SUS:  a  [
        O[        5      5      n[        X2R                  S9$ )z1
http://www.w3.org/TR/sparql11-query/#func-round
   r   rx   )	r)   r>   rz   r   quantizer   r   r"   ry   )r.   r/   r~   vs       r1   Builtin_ROUNDr      sH     
BAGAJAE=OPA1{{++r3   c           
        [        U R                  5      n[        U R                  5      nU R                  nSnU(       ax  [	        S[
        R                  4S[
        R                  4S[
        R                  4/5      n[        [        R                  U Vs/ s H  ovR                  US5      PM     sn5      n[        [        [
        R                  " [!        U5      X%5      5      5      $ s  snf )a  
http://www.w3.org/TR/sparql11-query/#func-regex
Invokes the XPath fn:matches function to match text against a regular
expression pattern.
The regular expression language is defined in XQuery 1.0 and XPath 2.0
Functions and Operators section 7.6.1 Regular Expression Syntax
r   irb   m)r\   textpatternflagsdictre
IGNORECASEDOTALL	MULTILINEr   pyopor_rt   r"   boolsearchrW   )r.   r/   r   r   r   cFlagflagMapfs           r1   Builtin_REGEXr      s     $))DT\\"GJJEE bmm,sBII.>bll@STUtxxU!CU++a"3U!CD4		#g,<=>> "Ds   C*
c           
     P   [        U R                  5      n[        U R                  5      n[        U R                  5      nU R                  n[
        R                  " SSU5      nSnU(       ax  [        S[
        R                  4S[
        R                  4S[
        R                  4/5      n[        [        R                  U Vs/ s H  oR                  US5      PM     sn5      n[        [
        R                  " [!        U5      XBU5      UR"                  UR$                  S9$ s  snf )2
http://www.w3.org/TR/sparql11-query/#func-substr
z
\$([0-9]*)z\\\1r   r   rb   r   ry   lang)r\   r)   r   replacementr   r   subr   r   r   r   r   r   r   rt   r"   rW   ry   language)	r.   r/   r   r   r   r   r   r   r   s	            r1   Builtin_REPLACEr      s     $((DT\\"G))*KJJE &&=KE bmm,sBII.>bll@STUtxxU!CU++a"3U!CD 
s7|[6]] 	 "Ds   D#
c                P    [        [        U R                  5      U R                  S9$ )rQ   rx   )r"   rW   rH   rI   r6   s     r1   Builtin_STRDTr     s    
 3tyy>DII66r3   c                    [        U R                  5      nUR                  (       d  UR                  (       a  [	        S5      e[        [        U5      [        U R                  5      R                  5       S9$ )z3
http://www.w3.org/TR/sparql11-query/#func-strlang
z STRLANG expects a simple literal)r   )	r\   rH   r   ry   r   r"   rW   rI   lowerra   s      r1   Builtin_STRLANGr     sO    
 	tyyAzzQZZ<== 3q6DII 4 4 677r3   c                J   [        S U R                   5       5      n[        U5      S:X  a  UR                  5       OSn[        S U R                   5       5      n[        U5      S:X  a  UR                  5       OSn[	        SR                  S U R                   5       5      X#S9$ )z2
http://www.w3.org/TR/sparql11-query/#func-concat
c              3  h   #    U  H(  n[        U[        5      (       d  M  UR                  v   M*     g 7fr5   )r*   r"   ry   .0ru   s     r1   	<genexpr>!Builtin_CONCAT.<locals>.<genexpr>$  s     DAZ7-CZQZZ   22r   Nc              3  h   #    U  H(  n[        U[        5      (       d  M  UR                  v   M*     g 7fr5   )r*   r"   r   r   s     r1   r   r   (  s     F8az!W/Ezqzz8r    c              3  8   #    U  H  n[        U5      v   M     g 7fr5   )r\   r   s     r1   r   r   /  s     7h6!99h   r   )setr)   lenpopr"   join)r.   r/   dtr   s       r1   Builtin_CONCATr     s|     
DD	DBW\tBF488FFDTa488:TD
 2777dhh77"PPr3   c                    [        U 5        [        U5        UR                  (       a&  U R                  UR                  :w  a  [        S5      eg g )Nz'incompatible arguments to str functions)r\   r   r   )r0   bs     r1   _compatibleStringsr   2  s9    
1I
1IzzajjAJJ.CDD /zr3   c                |    U R                   nU R                  n[        X#5        [        UR	                  U5      5      $ )z5
http://www.w3.org/TR/sparql11-query/#func-strstarts
)rH   rI   r   r"   
startswithr.   r/   r0   r   s       r1   Builtin_STRSTARTSr   :  s1    
 			A		Aq1<<?##r3   c                |    U R                   nU R                  n[        X#5        [        UR	                  U5      5      $ )z3
http://www.w3.org/TR/sparql11-query/#func-strends
)rH   rI   r   r"   endswithr   s       r1   Builtin_STRENDSr   F  s1     			A		Aq1::a=!!r3   c                    U R                   nU R                  n[        X#5        UR                  U5      nUS:X  a  [	        S5      $ [	        USU UR
                  UR                  S9$ )z5
http://www.w3.org/TR/sparql11-query/#func-strbefore
r   Nr   ry   )rH   rI   r   findr"   r   ry   r.   r/   r0   r   r   s        r1   Builtin_STRBEFOREr   R  sY    
 			A		Aq	q	ABwr{q!u1::

CCr3   c                    U R                   nU R                  n[        X#5        UR                  U5      nUS:X  a  [	        S5      $ [	        X$[        U5      -   S UR                  UR                  S9$ )z4
http://www.w3.org/TR/sparql11-query/#func-strafter
r   r   Nr   )rH   rI   r   r   r"   r   r   ry   r   s        r1   Builtin_STRAFTERr   b  s_    
 			A		Aq	q	ABwr{qSVQZZ!**MMr3   c                b    U R                   nU R                  n[        X#5        [        X2;   5      $ )z7
http://www.w3.org/TR/sparql11-query/#func-strcontains
)rH   rI   r   r"   r   s       r1   Builtin_CONTAINSr   r  s*    
 			A		Aq16?r3   c                l    [        [        [        U R                  5      R	                  S5      SS95      $ )Nr[   r   )safe)r"   r   r\   r)   r]   r6   s     r1   Builtin_ENCODE_FOR_URIr   ~  s(    5)009CDDr3   c                    [        U R                  5      n[        U R                  5      S-
  nU R                  nUb  [        U5      U-   n[        X#U UR                  UR                  S9$ )r   r   r   )r\   r)   r>   startlengthr"   r   ry   )r.   r/   r0   r   r   s        r1   Builtin_SUBSTRr     s]    
 	txxADJJ!#E[[F5(16?ajjIIr3   c                T    [        U R                  5      n[        [        U5      5      $ r5   )r\   r)   r"   r   er/   r~   s      r1   Builtin_STRLENr     s    	B3r7r3   c                p    U R                   n[        U[        5      (       a  Ue[        [	        U5      5      $ r5   )r)   r*   r   r"   rW   )r   r/   r)   s      r1   Builtin_STRr     s,    
%%C#{##	3s8r3   c                    [        U R                  5      n[        UR                  5       UR                  UR
                  S9$ Nr   )r\   r)   r"   r   ry   r   r   s      r1   Builtin_LCASEr     ,    	B288:"++FFr3   c                    [        U R                  5      n[        U R                  5      n[        U5      S:X  a  [	        S5      $ [	        [        X25      5      $ )z9
http://www.w3.org/TR/sparql11-query/#func-langMatches


r   F)r\   rH   rI   rW   r"   _lang_range_check)r   r/   langTag	langRanges       r1   Builtin_LANGMATCHESr     sE     QVVnGqvvI
7|ru~$Y899r3   c                ,    [        UR                  5      $ )z/
http://www.w3.org/TR/sparql11-query/#func-now
)r"   now)r   r/   s     r1   Builtin_NOWr     s     377r3   c                V    [        U R                  5      n[        UR                  5      $ r5   )dater)   r"   yearr   r/   ds      r1   Builtin_YEARr     s    QUUA166?r3   c                V    [        U R                  5      n[        UR                  5      $ r5   )r   r)   r"   monthr   s      r1   Builtin_MONTHr     s    QUUA177r3   c                V    [        U R                  5      n[        UR                  5      $ r5   )r   r)   r"   dayr   s      r1   Builtin_DAYr     s    QUUA155>r3   c                V    [        U R                  5      n[        UR                  5      $ r5   )datetimer)   r"   hourr   s      r1   Builtin_HOURSr     s    A166?r3   c                V    [        U R                  5      n[        UR                  5      $ r5   )r   r)   r"   minuter   s      r1   Builtin_MINUTESr     s    A188r3   c                    [        U R                  5      n[        UR                  5      nUR                  (       a$  U[        UR                  5      [        S5      -  -  n[        U[        R                  S9$ )z3
http://www.w3.org/TR/sparql11-query/#func-seconds
i@B rx   )r   r)   r   secondmicrosecondr"   r   decimal)r   r/   r   result_values       r1   Builtin_SECONDSr     sT     	A188$L}}.1AAA<#++66r3   c                   [        U R                  5      nUR                  (       d  [        SU-  5      eUR	                  5       nUR
                  nUR                  nSnUS:  a  SU-  U-
  nSnSnUS-  nXWS-  S-  -
  S-  nXWS-  S-  -
  US-  -
  nU< SU(       a  S	U-  OS< S
U(       a  SU-  OS< U(       a  SU-  OS< U(       d  U(       d  U(       d  SU-  OS< 3n	[        U	[        R                  S9$ )z
http://www.w3.org/TR/sparql11-query/#func-timezone

Returns:
    The timezone part of arg as an xsd:dayTimeDuration.

Raises:
    An error if there is no timezone.
zdatatime has no timezone: %rr   r   i-i  <   Pz%dDTz%dHz%dMz%dSrx   )
r   r)   tzinfor   	utcoffsetdayssecondsr"   r   dayTimeDuration)
r   r/   r   deltar   rb   neghr   tzdeltas
             r1   Builtin_TIMEZONEr    s     
!%%B9982=>>LLNE 	

AA
C1uA!	WA	
Vb[BA	FRK!b& A 		B	B	B1Q	B6G 7S%8%899r3   c                   [        U R                  5      nUR                  (       d  [        S5      $ UR                  R	                  U5      nUc  SnO$US:X  a  SnOUR                  S5      (       a  USS  n[        U5      $ )Nr   UTCZ   )r   r)   r  r"   tznamer   )r   r/   r   ns       r1   
Builtin_TZr  	  sl    A88r{	Ay	
e	
e		abE1:r3   c                    [        U R                  5      n[        UR                  5       UR                  UR
                  S9$ r   )r\   r)   r"   upperry   r   r   s      r1   Builtin_UCASEr    r   r3   c                h    [        U R                  5      n[        UR                  =(       d    S5      $ )zhttp://www.w3.org/TR/sparql11-query/#func-lang

Returns the language tag of ltrl, if it has one. It returns "" if ltrl has
no language tag. Note that the RDF data model does not include literals
with an empty language tag.
r   )literalr)   r"   r   r   s      r1   Builtin_LANGr    s%     
B2;;$"%%r3   c                   U R                   n[        U[        5      (       d  [        SU-  5      eUR                  (       a  [
        R                  $ UR                  (       d!  UR                  (       d  [        R                  $ UR                  $ )Nz$Can only get datatype of literal: %r)
r)   r*   r"   r   r   r   
langStringry   r   r\   r   s      r1   Builtin_DATATYPEr  *  s[    	
Bb'""@2EFF	{{~~;;r{{zz;;r3   c                L    U R                   nU R                  n[        X#:H  5      $ r5   )rH   rI   r"   )r   r/   r0   r   s       r1   Builtin_sameTermr  5  s     	A	A16?r3   c                ^    U R                  SSS9n[        [        U[        5      (       + 5      $ )z1
http://www.w3.org/TR/sparql11-query/#func-bound
r)   Trr   )rt   r"   r*   r%   )r   r/   r  s      r1   Builtin_BOUNDr!  ;  s+     	
et$Az!X..//r3   c                    SSK Jn  U R                  S:H  nUR                  R	                  U5      nU" XR
                  5       H  n[        U5      s  $    [        U(       + 5      $ )Nr   )evalPartBuiltin_EXISTS)rdflib.plugins.sparql.evaluater#  namer/   thawgraphr"   )r   r/   r#  existsru   s        r1   r$  r$  D  sR    7VV''F '',,s
Cc77#v $v:r3   z*Dict[URIRef, Tuple[_CustomFunction, bool]]_CUSTOM_FUNCTIONSc                r    U(       d&  U [         ;   a  [        SU R                  5       -  5      eX4[         U '   g)zRegister a custom SPARQL function.

By default, the function will be passed the RDF terms in the argument list.
If raw is True, the function will be passed an Expression and a Context.

The function must return an RDF term, or raise a SparqlError.
z&A function is already registered as %sN)r*  
ValueErrorn3)urifuncoverrideraws       r1   register_custom_functionr2  W  s3     00ACFFHLMM"[cr3   c                    ^ ^^ SUUU 4S jjnU$ )z8
Decorator version of :func:`register_custom_function`.
c                    > [        TU TTS9  U $ )N)r0  r1  )r2  )r/  r0  r1  r.  s    r1   	decorator"custom_function.<locals>.decoratorm  s     dX3Gr3   )r/  _CustomFunctionreturnr7   )r.  r0  r1  r5  s   ``` r1   custom_functionr:  f  s      r3   c                    [         R                  U 5      (       a  [         U 	 g[        R                  " SU R	                  5       -  5        g)z
The 'func' argument is included for compatibility with existing code.
A previous implementation checked that the function associated with
the given uri was actually 'func', but this is not necessary as the
uri should uniquely identify the function.
z%This function is not registered as %sN)r*  rt   warningswarnr-  )r.  r/  s     r1   unregister_custom_functionr>  t  s5     S!!c"=HIr3   c                   [         R                  U R                  5      nUc  [        SU R                  -  5      eUu  p4U(       a  U" X5      $  U" U R                  6 $ ! [
         a  n[        UR                  6 eSnAff = f)z
Custom functions and casts
NzUnknown function %r)r*  rt   irir   r.   	TypeErrorargs)r   r/   pairr/  r1  exs         r1   FunctionrE    sx       'D|/!%%788ID
A|	(=  	(rww''	(s   A 
A?(A::A?T)r1  c                   U R                   (       d  [        S5      e[        U R                   5      S:  a  [        S5      eU R                   S   nU R                  [        R
                  :X  aO  [        U[        [        45      (       a  [        U[        R
                  S9$ [        SU< S[        U5      < 35      e[        U[        5      (       d  [        S5      eUR                  (       a,  UR                  [        ;  a  [        S	UR                  -  5      eU R                  [        R                  :X  au  UR                  (       aF  UR                  [        R                  [        R
                  4;  a  [        S
UR                  -  5      e [        [        U5      U R                  S9$ UR                  [        R                  :X  a  [        SU R                  -  5      eU R                  [        R                  [        R                  4;   a   [        [        U5      U R                  S9$ U R                  [        R                   :X  a8  SU;   d  SU;   a  [        SU-  5      e [        [#        U5      U R                  S9$ U R                  [        R$                  :X  a"   [        ['        U5      [        R$                  S9$ U R                  [        R(                  :X  aL  UR+                  5       S;   a  [        S5      $ UR+                  5       S;   a  [        S5      $ [        SU-  5      eg !   [        SU-  5      e= f!   [        SU-  5      e= f!   [        SU-  5      e= f!   [        SU-  5      e= f)NzNothing given to cast.r   z Cannot cast more than one thing!r   rx   zCannot cast term z	 of type z/Can only cast Literals to non-string data-typesz-Cannot cast literal with unknown datatype: %rzCannot cast %r to XSD:dateTimez!Cannot interpret '%r' as datetimezCannot cast XSD.dateTime to %rzCannot interpret '%r' as floatr   Ez Cannot interpret '%r' as decimalzCannot interpret '%r' as int)1trueT)0falseFzCannot interpret '%r' as bool)r.   r   r   r@  r   r\   r*   r$   r"   typery   r   dateTimer'   floatdoubler   r   integerrz   booleanr   )r   r/   ru   s      r1   default_castrR    s    66233
166{Q<==	q	Auu

a&'*++1szz22!T!WMNNa!!KLLzz!**/IAJJVWWuu::!**S\\3::,FF>KLL	G>!,quu== 	zzS\\!:QUUBCCuuCJJ''	D58aee44 
#++	!8sax@1DEE	F71:66 
#++		B3q6CKK88 
#++	
 779%4= 779&5>!9A=>> 
5	GAAEFF	D>BCC	F@1DEE
	B<q@AAs0   L0 M (M $ M) 0M MM&)M9c                H    [        [        U R                  5      (       + 5      $ r5   )r"   rG   r.   r6   s     r1   UnaryNotrT    s    s499~%&&r3   c                @    [        [        U R                  5      * 5      $ r5   r"   r>   r.   r6   s     r1   
UnaryMinusrW        GDII&&''r3   c                @    [        [        U R                  5      75      $ r5   rV  r6   s     r1   	UnaryPlusrZ    rX  r3   c                j   U R                   nU R                  nUc  U$  [        [        U5      5      n[	        U R
                  U5       H>  u  pV[        U5      n[        U5      [        :X  a  [        U5      nUS:X  a  XF-  nM:  XF-  nM@     [        U5      $ ! [        [        4 a    [        S5      ef = f)N*zdivide by 0)r.   otherr   r>   zipoprL  rN  r   ZeroDivisionErrorr   r"   )r   r/   r.   r]  resr_  r   s          r1   MultiplicativeExpressionrb    s     66DGGE })gdm$u%EB
AAw%CjSy & 3< /0 )-(()s   A,B B2c                   U R                   nU R                  nUc  U$ [        US5      (       GaX  UR                  [        ;   d  UR                  [
        ;   Ga/  [        U5      nUR                  n[        U R                  U5       H  u  pgU[        ;   aU  XWR                  :X  aF  US:X  a@  [        U5      S:  a  Sn[        XR                  5      e[        U5      n	[        XI5      nUs  $ U[        ;   a:  UR                  [
        ;   a&  [        U5      n	[        XEXR                  U5      nUs  $ U[
        ;   aB  UR                  [        ;   a.  US:X  a&  [        U5      n	[        XEXR                  U5      nUs  $ M  [        S5      e   g [        U5      nUR                  n[        U R                  U5       H  u  pg[        U5      n	[        U	[        5      (       a   [        U[         5      (       a  [!        U	5      n	[        U	[         5      (       a   [        U[        5      (       a  [!        U5      n[#        XWR                  5      nUS:X  a  XI-  nM  XI-  nM     [%        XES9$ )Nry   r   r   z$Can't evaluate multiple %r arguments+zInvalid DateTime Operationsrx   )r.   r]  hasattrry   r   r   dateTimeObjectsr^  r_  r   r   calculateDurationcalculateFinalDateTimer>   r*   r   rN  r   r"   )
r   r/   r.   r]  ra  r   r_  termerror_messager  s
             r1   AdditiveExpressionrk    s   66DGGE } tZ  ))T]]>N-Nd#]]ADD%(HB %%"*=") u:>$JM%m[[AA'-A+C3CJ ''DMM=M,M#D),SaK
 ''DMM=M,M9'-A0!]]BOCJ  ""?@@? )F dm]]ADD%(HBA!W%%*S%*@*@!H!U##
3(@(@CjMM2BSy ) s((r3   c                l   U R                   nU R                  nU R                  nUc  U$ [        SS 4SS 4SS 4SS 4S	S
 4SS 4S[        R
                  4SS 4/5      nUS;   aS  US:H  nSnU[        R                  :X  a  / nU H  n X:X  a  [        SU-  5      s  $ M     U(       d  [        SU-  5      $ UeUS;  aG  [        U[        5      (       d  [        SU-  5      e[        U[        5      (       d  [        SU-  5      eOF[        U[        5      (       d  [        SU-  5      e[        U[        5      (       d  [        SU-  5      e[        U[        5      (       ah  [        U[        5      (       aS  UR                  bF  UR                  [        ;  a2  UR                  b%  UR                  [        ;  a  US;  a  [        S5      e XT   " X#5      n	U	[        :X  a  [        S5      e [        U	5      $ ! [         a  n U n S n A GM  S n A ff = f! [         a  n
[        U
R                   6 eS n
A
ff = f)N>c                $    U R                  U5      $ r5   )__gt__ru   ys     r1   <lambda>&RelationalExpression.<locals>.<lambda>]      qxx{r3   <c                $    U R                  U5      $ r5   )__lt__rp  s     r1   rr  rs  ^  rt  r3   =c                $    U R                  U5      $ r5   )eqrp  s     r1   rr  rs  _  s    qttAwr3   !=c                $    U R                  U5      $ r5   )neqrp  s     r1   rr  rs  `  s    ar3   z>=c                $    U R                  U5      $ r5   )__ge__rp  s     r1   rr  rs  a      r3   z<=c                $    U R                  U5      $ r5   )__le__rp  s     r1   rr  rs  b  r  r3   INNOT INc                8    [         R                  " X5      (       + $ r5   )r   containsrp  s     r1   rr  rs  d  s    a(;$;r3   )r  r  FT)rx  r{  r  r  z8Compare other than =, != of non-literals is an error: %rz"I cannot compare this non-node: %r)rx  r{  z0Can only do =,!= comparisons of non-XSD LiteralszError when comparing)r.   r]  r_  r   r   r  r   nilr"   r   r*   r#   ry   r   NotImplementedrA  rB  )r   r/   r.   r]  r_  opsra  errorru   rtes              r1   RelationalExpressionr  Q  sL   66DGGE	
B }
*+*+&'()+,+,4==!;<		
C 
Hn*/CGGEA9"4#:..   53;'' K	,,$((JTQ  %))JUR  *
 $%%BTIJJ%&&BUJKK$  Zw%?%?MM%W,*g- $!"TUU$GD 455  1:S  N  $277##$s0   G7H 7
HH

H
H3H..H3c                z    U R                   nU R                  nUc  U$ [        [        S U/U-    5       5      5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr5   )rG   r   s     r1   r   +ConditionalAndExpression.<locals>.<genexpr>  s     6~!s1vv~r   )r.   r]  r"   all)r   r/   r.   r]  s       r1   ConditionalAndExpressionr    s>    
 66DGGE }36v~6677r3   c                    U R                   nU R                  nUc  U$ S nU/U-    H!  n [        U5      (       a  [        S5      s  $ M#     U(       a  Ue[        S5      $ ! [         a  n U n S n A MK  S n A ff = fr=   )r.   r]  rG   r"   r   )r   r/   r.   r]  r  ru   s         r1   ConditionalOrExpressionr    s    
 66DGGE } EVe^	1vvt}$   5>	  	E	s   A
A6)A11A6c                     [        S[        U S9$ )NrT  r.   )r   rT  )r)   s    r1   not_r    s    
H3//r3   c            
     h    [        U 5      S:X  a  U S   $ [        S[        U S   [        U SS  5      S9$ )Nr   r   r  )r.   r]  )r   r   r  list)rB  s    r1   and_r    s=    
4yA~Aw" !W48n	 r3   
TrueFilterc                    [        S5      $ )NT)r"   )_1_2s     r1   rr  rr    s    wt}r3   c                   [        U [        5      (       a  [        U 5      S:X  a  [        U S   5      $ [        U [        [        45      (       a  [	        [        [        U 5      5      $ [        U [        5      (       d  U $ U R                  R                  S5      (       a"  U R                  c  [        U R                  5      $ U R                  5        H  n[        X   5      X'   M     U $ )Nr   r   
Expression)r*   r   r   simplifyr  mapr   r&  r   r]  r.   keys)r.   ks     r1   r  r    s    $%%#d)q.Q  $|,--C$'((dI&&yy,''::DII&&YY[47# 
 Kr3   c                L    [        U [        5      (       d  [        SU -  5      eU $ )Nz Non-literal passed as string: %r)r*   r"   r   rb   s    r1   r  r    s%    a!!<q@AAHr3   c                    [        U [        5      (       d  [        SU -  5      eU R                  [        R
                  :X  d  [        SU -  5      eU R                  5       $ )Nz"Non-literal passed as datetime: %rz2Literal with wrong datatype passed as datetime: %r)r*   r"   r   ry   r   rM  toPython)r   s    r1   r   r     sN    a!!>BCC::%NQRRSS::<r3   c                B   [        U [        5      (       d  [        SU -  5      eU R                  [        R
                  [        R                  4;  a  [        SU -  5      eU R                  5       n[        U[        R                  5      (       a  UR                  5       $ U$ )NzNon-literal passed as date: %rz.Literal with wrong datatype passed as date: %r)
r*   r"   r   ry   r   r   rM  r  py_datetimer   )r   results     r1   r   r      sy    a!!:Q>??zz#((CLL11JQNOOZZ\F&+..//{{}Mr3   c                    [        U [        5      (       d  [        SU -  5      eU R                  (       a,  U R                  [        R
                  :w  a  [        SU -  5      eU $ )zn
Make sure the passed thing is a string literal
i.e. plain literal, xsd:string literal or lang-tagged literal
z Non-literal passes as string: %rz0Non-string datatype-literal passes as string: %r)r*   r"   r   ry   r   r\   r  s    r1   r\   r\     sN    
 a!!<q@AAzzajjCJJ.LqPQQHr3   c                   [        U [        5      (       d  [        SU -  5      eU R                  [        R
                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                   [        R"                  [        R$                  [        R&                  [        R(                  4;  a  [        SU -  5      eU R+                  5       $ )zV
return a number from a literal
http://www.w3.org/TR/xpath20/#promotion

or TypeError
z%r is not a literal!z$%r does not have a numeric datatype!)r*   r"   r   ry   r   rN  rO  r   rP  nonPositiveIntegernegativeIntegernonNegativeIntegerpositiveIntegerunsignedLongunsignedIntunsignedShortunsignedBytelongrz   shortbyter  r  s    r1   r>   r>     s     dG$$4t;<<}}		

		! $ DtKLL==?r3   c                "    U R                  5       $ )zf
return a dataTime/date/time/duration/dayTimeDuration/yearMonthDuration python objects from a literal
)r  r  s    r1   rf  rf  9  s     ==?r3   c                   U[         R                  :X  aN  U[         R                  :X  a  gU[         R                  :X  d  U[         R                  :X  a  S[        U5      ;   a  ggU[         R                  :X  aQ  U[         R                  :X  a  gU[         R                  :X  d  U[         R                  :X  a  S[        U5      S   :X  a  ggU[         R                  :X  a  gg)zd
Returns a boolean indicating if first object is compatible
with operation(+/-) over second object.
Tr  Fr   N)r   r   yearMonthDurationr  r&   rW   timerM  )obj1dt1obj2dt2s       r1   isCompatibleDateTimeDatatyper  A  s     chh#'''C'''3#,,+> c$i
chh#'''C'''3#,,+> c$il"
cll r3   c                B    U nUnX#-
  n[        U[        R                  S9$ )z3
returns the duration Literal between two datetime
rx   )r"   r   duration)r  r  date1date2
differences        r1   rg  rg  g  s&     EEJ:55r3   c                z    [        XX#5      (       a   US:X  a  X-
  n[        XQS9$ X-   n[        XQS9$ [        S5      e)z}
Calculates the final dateTime/date/time resultant after addition/
subtraction of duration/dayTimeDuration/yearMonthDuration
r   rx   z.Incompatible Data types to DateTime Operations)r  r"   r   )r  r  r  r  	operationanss         r1   rh  rh  u  sK     $Dt99+C3--+C3-- JKKr3   c                    g r5   r9  rts    r1   rG   rG     s    !r3   c                    g r5   r9  r  s    r1   rG   rG     s    MPr3   c                    g r5   r9  r  s    r1   rG   rG     s    LOr3   c                   [        U [        5      (       a  U R                  [        R                  :X  a  U R                  5       $ U R                  [        R                  :X  d  U R                  c  [        U 5      S:  $ U R                  5       n[        U[        5      (       a  [        SU -  5      e[        U5      $ [        SU -  5      e)aU  Effective Boolean Value (EBV)

* If the argument is a typed literal with a datatype of xsd:boolean,
  the EBV is the value of that argument.
* If the argument is a plain literal or a typed literal with a
  datatype of xsd:string, the EBV is false if the operand value
  has zero length; otherwise the EBV is true.
* If the argument is a numeric type or a typed literal with a datatype
  derived from a numeric type, the EBV is false if the operand value is
  NaN or is numerically equal to zero; otherwise the EBV is true.
* All other arguments, including unbound arguments, produce a type error.
r   zjhttp://www.w3.org/TR/rdf-sparql-query/#ebv - ' +                     'Could not determine the EBV for : %rzchttp://www.w3.org/TR/rdf-sparql-query/#ebv - ' +             'Only literals have Boolean values! %r)
r*   r"   ry   r   rQ  r  r\   r   r   r   )r  pyRTs     r1   rG   rG     s     "g;;#++%;;= [[CJJ&"++*=r7Q; ;;=D$((%;  Dz! 4
 	
r3   c                Z  ^ SS jmU R                  5       R                  5       R                  S5      nUR                  5       R                  5       R                  S5      nT" US   US   5      (       d  g[        U5      [        U5      :  a  g[	        U4S j[        X#5       5       5      $ )a  
Implementation of the extended filtering algorithm, as defined in point
3.3.2, of [RFC 4647](http://www.rfc-editor.org/rfc/rfc4647.txt), on
matching language ranges and language tags.
Needed to handle the `rdf:PlainLiteral` datatype.

Args:
    range: language range
    lang: language tag

Author: [Ivan Herman](http://www.w3.org/People/Ivan/)

Taken from [`RDFClosure/RestrictedDatatype.py`](http://dev.w3.org/2004/PythonLib-IH/RDFClosure/RestrictedDatatype.py)
c                "    U S:H  =(       d    X:H  $ )z
Matching of a range and language item: either range is a wildcard
or the two are equal

Args:
    r: language range item
    l_: language tag item
r\  r9  )r  r~   s     r1   _match!_lang_range_check.<locals>._match  s     Cx"17"r3   r   r   Fc              3  .   >#    U  H
  nT" U6 v   M     g 7fr5   r9  )r   ru   r  s     r1   r   $_lang_range_check.<locals>.<genexpr>  s     <#;avqz#;s   )r  rW   r~   rW   r8  r   )stripr   splitr   r  r^  )ranger   	rangeListlangListr  s       @r1   r   r     s     	# ##%++C0Izz|!!#))#.H)A,,,
9~H%<3y#;<<<r3   )r.   r   r/   r   r8  r$   )r.   r   r/   r   r8  r"   )r8  r"   )r8  r   )r.   r   r8  r"   )r.   r   )r.   r   r8  r$   )r0   r"   r   r"   r8  None)r   r   r8  r"   )r   r   r8  zOptional[str])r   r   r/   r   r8  r"   )FF)
r.  r$   r/  r7  r0  r   r1  r   r8  r  )r.  r$   r0  r   r1  r   r8  z,Callable[[_CustomFunction], _CustomFunction]r5   )r.  r$   r/  zOptional[Callable[..., Any]]r8  r  )r   r   r/   r   r8  r#   )r   r   r/   z#Union[QueryContext, FrozenBindings]r8  r"   )r8  r   )rB  r   r8  r   )r.   r	   r8  r	   )rb   r"   r8  r"   )r   r"   r8  zpy_datetime.datetime)r   r"   r8  zpy_datetime.date)r.   r"   r8  r	   )
r  -Union[py_datetime.date, py_datetime.datetime]r  r$   r  &Union[Duration, py_datetime.timedelta]r  r$   r8  r   )r  r  r  r  r8  r"   )r  r  r  r$   r  r  r  r$   r  rW   r8  r"   )r  r"   r8  r   )r  z2Union[Variable, IdentifiedNode, SPARQLError, Expr]r8  r   )r  $Union[Identifier, SPARQLError, Expr]r8  zUnion[bool, NoReturn])r  r  r8  r   )r  r"   r   r"   r8  r   )__doc__
__future__r   r   r  r^   r{   operatorr   rM   r   rR   r<  r   r   r   r   r   	functoolsr   typingr	   r
   r   r   r   r   r   r   urllib.parser   	pyparsingr   rdflib.namespacer   r   rdflib.plugins.sparql.datatypesr   r   r   r   !rdflib.plugins.sparql.parserutilsr   r   rdflib.plugins.sparql.sparqlr   r   r   r   rdflib.termr   r    r!   r"   r#   r$   r%   rdflib.xsd_datetimer&   r'   r2   r7   r9   r;   r?   rB   rE   rK   rN   rU   rX   rc   rf   ri   rm   rp   rv   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$  r7  r*  __annotations__r2  r:  r>  rE  r\   rM  rN  rO  rP  rQ  rR  rT  rW  rZ  rb  rk  r  r  r  r  r  r  r  r  r   r>   rf  r  rg  rh  rG   r   r9  r3   r1   <module>r     sA   #      	   M M  R R R  " %  >    9P"021S +6$$&/
0
2
2
2
UFG,?.:78Q*E	$	"D N 	EJ G:




7':TG	&0 D.1478@B = B MR)	)&)26)EI)	)  6;	.21 7;J	J3J	J(* &4(%&$'$'$'<? ( ( ( ' & ) '<?~'((5<F)RL^88588 560	 , <=
(	D#
7#	# 1# 
	#
 
#L6
76
76 6L
7L	L 1L 
	L
 L L4 
 ! 
 ! 
 P 
 P 
 O 
 O'
T"=r3   