
    iӏ              
         U d Z ddlmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZmZmZmZ ddlmZ ddl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  dd	l!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z; dgdZ<dhdZ=didZ>didZ?didZ@djdZAdkdZBdldZCdkdZDdmdZEdidZFdkdZGdkdZHdkdZIdkdZJdkdZKdldZLdkd ZMdkd!ZNdkd"ZOdkd#ZPdkd$ZQdkd%ZRdkd&ZSdkd'ZTdnd(ZUdkd)ZVdkd*ZWdkd+ZXdkd,ZYdkd-ZZdkd.Z[dkd/Z\dod0Z]dod1Z^dod2Z_dod3Z`dod4Zadod5Zbdod6Zcdod7Zddod8Zedod9Zfdod:Zgdod;Zhdod<Zidod=Zjdod>Zkdpd?Zldod@ZmdodAZndqdBZoee+e-ge6f   Zpi ZqdCerdD<   	 dr	 	 	 	 	 	 	 	 	 dsdEZs	 dr	 	 	 	 	 	 	 dtdFZt	 du	 	 	 	 	 dvdGZudwdHZv ete#j                  dIJ       ete#j                  dIJ       ete#j                  dIJ       ete#j                  dIJ       ete#j                  dIJ       ete#j                  dIJ       ete#j                  dIJ      dqdK                                                 Z}dhdLZ~dhdMZdhdNZ	 	 	 	 	 	 dxdOZdxdPZdxdQZ	 	 	 	 	 	 dxdRZ	 	 	 	 	 	 dxdSZdydTZdzdUZ e+dVdW       Zd{dXZd|dYZd}dZZd~d[Zd|d\Zwdd]Zdd^Z	 	 	 	 	 	 	 	 	 	 dd_Z	 	 	 	 	 	 dd`Z	 	 	 	 	 	 	 	 	 	 	 	 ddaZeddb       Zeddc       Zeddd       ZddeZddfZy)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                    | j                   }t        |t              r|S t        |t              r$|j                  j                  t        |            S t        d      )z7
    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      NC:\Projects\mas-dev\.venv\Lib\site-packages\rdflib/plugins/sparql/operators.pyBuiltin_IRIr2   4   sM    
 	A!V!W ||&&vay11
N
OO    c                H    t        t        | j                  t                    S N)r"   r*   r)   r   r.   r/   s     r1   Builtin_isBLANKr7   E   s    :dhh.//r3   c                H    t        t        | j                  t                     S r5   )r"   r*   r)   r6   s     r1   Builtin_isLITERALr9   I   s    :dhh011r3   c                H    t        t        | j                  t                    S r5   )r"   r*   r)   r$   r6   s     r1   Builtin_isIRIr;   M   s    :dhh/00r3   c                h    	 t        | j                         t        d      S #  t        d      cY S xY wNTF)numericr)   r"   r6   s     r1   Builtin_isNUMERICr?   Q   s.    t}u~s   " 1c                    | j                   }|
t               S t        |t              r|j                  |   S t        d      )z9
    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   Y   s=    
 	Ayw!Wzz!}
Q
RRr3   c                P    t        t        t        | j                                    S )z7
    http://www.w3.org/TR/sparql11-query/#func-abs
    )r"   absr>   r)   r6   s     r1   Builtin_ABSrE   i   s    
 3wtxx()**r3   c                \    t        | j                        r| j                  S | j                  S )z6
    http://www.w3.org/TR/sparql11-query/#func-if
    )EBVarg1arg2arg3r6   s     r1   
Builtin_IFrK   q   s!    
 DII4995DII5r3   c                <    t        t        j                               S )z9
    http://www.w3.org/TR/sparql11-query/#idp2133952
    )r"   randomr6   s     r1   Builtin_RANDrN   y   s    
 6==?##r3   c                P    t        t        j                         j                        S 9
    http://www.w3.org/TR/sparql11-query/#func-strdt
    )r$   uuiduuid4urnr6   s     r1   Builtin_UUIDrU      s    
 $**,""##r3   c                N    t        t        t        j                                     S rP   )r"   strrR   rS   r6   s     r1   Builtin_STRUUIDrX      s    
 3tzz|$%%r3   c                    t        | j                        j                  d      }t        t	        j
                  |      j                               S Nutf-8)stringr)   encoder"   hashlibmd5	hexdigestr.   r/   ss      r1   Builtin_MD5rc      s7    txx(A7;;q>++-..r3   c                    t        | j                        j                  d      }t        t	        j
                  |      j                               S rZ   )r\   r)   r]   r"   r^   sha1r`   ra   s      r1   Builtin_SHA1rf      s7    txx(A7<<?,,.//r3   c                    t        | j                        j                  d      }t        t	        j
                  |      j                               S rZ   )r\   r)   r]   r"   r^   sha256r`   ra   s      r1   Builtin_SHA256ri      8    txx(A7>>!$..011r3   c                    t        | j                        j                  d      }t        t	        j
                  |      j                               S rZ   )r\   r)   r]   r"   r^   sha384r`   ra   s      r1   Builtin_SHA384rm      rj   r3   c                    t        | j                        j                  d      }t        t	        j
                  |      j                               S rZ   )r\   r)   r]   r"   r^   sha512r`   ra   s      r1   Builtin_SHA512rp      rj   r3   c                    | j                  dd      D ]  }|t        |t        t        f      r|c S  t        d      )z<
    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      sA     XXetX,=AX/F!GH - S
TTr3   c           	         | j                   }t        t        t        j                  t        |                  |j                        S )z8
    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           	         | j                   }t        t        t        j                  t        |                  |j                        S )z9
    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                    | j                   }t        |      }t        t        |      j	                  d|dkD  rt
        nt                    }t        ||j                        S )z9
    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      sJ     
BAGAJAE=OPA1r{{++r3   c           
        t        | j                        }t        | j                        }| j                  }d}|rvt	        dt
        j                  fdt
        j                  fdt
        j                  fg      }t        t        j                  |D cg c]  }|j                  |d       c}      }t        t        t        j                  t!        |      ||                  S c c}w )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,e<=>> "Ds   C#
c           
     F   t        | j                        }t        | j                        }t        | j                        }| j                  }t        j                  dd|      }d}|rvt        dt
        j                  fdt
        j                  fdt
        j                  fg      }t        t        j                  |D cg c]  }|j                  |d       c}      }t        t        j                  t!        |      |||      |j"                  |j$                        S c c}w ):
    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                V    t        t        | j                        | j                        S )rQ   rx   )r"   rW   rH   rI   r6   s     r1   Builtin_STRDTr     s    
 3tyy>DII66r3   c                    t        | j                        }|j                  s|j                  rt	        d      t        t        |      t        | j                        j                               S )z;
    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                N   t        d | j                  D              }t        |      dk(  r|j                         nd}t        d | j                  D              }t        |      dk(  r|j                         nd}t	        dj                  d | j                  D              ||      S )z:
    http://www.w3.org/TR/sparql11-query/#func-concat
    c              3  V   K   | ]!  }t        |t              s|j                   # y wr5   )r*   r"   ry   .0ru   s     r1   	<genexpr>z!Builtin_CONCAT.<locals>.<genexpr>%  s     DAZ7-CQZZ   ))r   Nc              3  V   K   | ]!  }t        |t              s|j                   # y wr5   )r*   r"   r   r   s     r1   r   z!Builtin_CONCAT.<locals>.<genexpr>)  s     F8az!W/Eqzz8r    c              3  2   K   | ]  }t        |        y wr5   )r\   r   s     r1   r   z!Builtin_CONCAT.<locals>.<genexpr>0  s     7h6!9h   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"4PPr3   c                    t        |        t        |       |j                  r%| j                  |j                  k7  rt        d      y y )Nz'incompatible arguments to str functions)r\   r   r   )r0   bs     r1   _compatibleStringsr   3  s9    
1I
1IzzajjAJJ.CDD /zr3   c                ~    | j                   }| j                  }t        ||       t        |j	                  |            S )z=
    http://www.w3.org/TR/sparql11-query/#func-strstarts
    )rH   rI   r   r"   
startswithr.   r/   r0   r   s       r1   Builtin_STRSTARTSr   ;  s3    
 			A		Aq!1<<?##r3   c                ~    | j                   }| j                  }t        ||       t        |j	                  |            S )z;
    http://www.w3.org/TR/sparql11-query/#func-strends
    )rH   rI   r   r"   endswithr   s       r1   Builtin_STRENDSr   G  s3     			A		Aq!1::a=!!r3   c                    | j                   }| j                  }t        ||       |j                  |      }|dk(  rt	        d      S t	        |d| |j
                  |j                        S )z=
    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   S  s[    
 			A		Aq!	q	ABwr{q!u1::

CCr3   c                    | j                   }| j                  }t        ||       |j                  |      }|dk(  rt	        d      S t	        ||t        |      z   d |j                  |j                        S )z<
    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   c  sc    
 			A		Aq!	q	ABwr{qSVQZZ!**MMr3   c                d    | j                   }| j                  }t        ||       t        ||v       S )z?
    http://www.w3.org/TR/sparql11-query/#func-strcontains
    )rH   rI   r   r"   r   s       r1   Builtin_CONTAINSr   s  s.    
 			A		Aq!16?r3   c                r    t        t        t        | j                        j	                  d      d            S )Nr[   r   )safe)r"   r   r\   r)   r]   r6   s     r1   Builtin_ENCODE_FOR_URIr     s(    5)009CDDr3   c                    t        | j                        }t        | j                        dz
  }| j                  }|t        |      |z   }t        ||| |j                  |j                        S )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(1U6?ajjIIr3   c                T    t        | j                        }t        t        |            S r5   )r\   r)   r"   r   er/   r~   s      r1   Builtin_STRLENr     s    	B3r7r3   c                f    | j                   }t        |t              r|t        t	        |            S r5   )r)   r*   r   r"   rW   )r   r/   r)   s      r1   Builtin_STRr     s)    
%%C#{#	3s8r3   c                    t        | j                        }t        |j                         |j                  |j
                        S Nr   )r\   r)   r"   r   ry   r   r   s      r1   Builtin_LCASEr     ,    	B288:"++FFr3   c                    t        | j                        }t        | j                        }t        |      dk(  rt	        d      S t	        t        ||            S )zA
    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     sG     QVVnGqvvI
7|ru~$Y899r3   c                ,    t        |j                        S )z7
    http://www.w3.org/TR/sparql11-query/#func-now
    )r"   now)r   r/   s     r1   Builtin_NOWr     s     377r3   c                V    t        | j                        }t        |j                        S r5   )dater)   r"   yearr   r/   ds      r1   Builtin_YEARr     s    QUUA166?r3   c                V    t        | j                        }t        |j                        S r5   )r   r)   r"   monthr   s      r1   Builtin_MONTHr     s    QUUA177r3   c                V    t        | j                        }t        |j                        S r5   )r   r)   r"   dayr   s      r1   Builtin_DAYr     s    QUUA155>r3   c                V    t        | j                        }t        |j                        S r5   )datetimer)   r"   hourr   s      r1   Builtin_HOURSr     s    A166?r3   c                V    t        | j                        }t        |j                        S r5   )r   r)   r"   minuter   s      r1   Builtin_MINUTESr     s    A188r3   c                    t        | j                        }t        |j                        }|j                  r$|t        |j                        t        d      z  z  }t        |t        j                        S )z;
    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                   t        | j                        }|j                  st        d|z        |j	                         }|j
                  }|j                  }d}|dk  rd|z  |z
  }d}d}|dz  }||dz  dz  z
  dz  }||dz  dz  z
  |dz  z
  }|d|rd	|z  ndd
|rd|z  nd|rd|z  nd|s	|s|sd|z  nd}	t        |	t        j                        S )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	
QVb[BA	AFRK!b& A 		B	B	B1Q	B6G 7S%8%899r3   c                   t        | j                        }|j                  st        d      S |j                  j	                  |      }|d}t        |      S |dk(  rd}t        |      S |j                  d      r|dd  }t        |      S )Nr   UTCZ   )r   r)   r  r"   tznamer   )r   r/   r   ns       r1   
Builtin_TZr    s    A88r{	Ay 1: 
e 1: 
e	abE1:r3   c                    t        | j                        }t        |j                         |j                  |j
                        S r   )r\   r)   r"   upperry   r   r   s      r1   Builtin_UCASEr    r   r3   c                ^    t        | j                        }t        |j                  xs d      S )z
    http://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                    | j                   }t        |t              st        d|z        |j                  rt
        j                  S |j                  s|j                  st        j                  S |j                  S )Nz$Can only get datatype of literal: %r)
r)   r*   r"   r   r   r   
langStringry   r   r\   r   s      r1   Builtin_DATATYPEr  )  sX    	
Bb'"@2EFF	{{~~;;r{{zz;;r3   c                N    | j                   }| j                  }t        ||k(        S r5   )rH   rI   r"   )r   r/   r0   r   s       r1   Builtin_sameTermr  4  s"    	A	A16?r3   c                \    | j                  dd      }t        t        |t                     S )z9
    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                    ddl m} | j                  dk(  }|j                  j	                  |      } ||| j
                        D ]  }t        |      c S  t        |       S )Nr   )evalPartBuiltin_EXISTS)rdflib.plugins.sparql.evaluater"  namer/   thawgraphr"   )r   r/   r"  existsru   s        r1   r#  r#  C  sT    7VV''F '',,s
Cc177#v $v:r3   z*Dict[URIRef, Tuple[_CustomFunction, bool]]_CUSTOM_FUNCTIONSc                f    |s$| t         v rt        d| j                         z        ||ft         | <   y)a  
    Register 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_functionr1  V  s5     00ACFFHLMM"C[cr3   c                     d fd}|S )z@
    Decorator version of :func:`register_custom_function`.
    c                &    t        |        | S )N)r/  r0  )r1  )r.  r/  r0  r-  s    r1   	decoratorz"custom_function.<locals>.decoratorm  s     dX3Gr3   )r.  _CustomFunctionreturnr5   )r-  r/  r0  r4  s   ``` r1   custom_functionr8  f  s     r3   c                    t         j                  |       rt         | = yt        j                  d| j	                         z         y)a  
    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  s2     S!c"=HIr3   c                    t         j                  | j                        }|t        d| j                  z        |\  }}|r	 || |      S 	  || j                   S # t
        $ r}t        |j                   d}~ww xY w)z$
    Custom functions and casts
    NzUnknown function %r)r)  rt   irir   r.   	TypeErrorargs)r   r/   pairr.  r0  exs         r1   FunctionrC    s|       'D|/!%%788ID#
As|	(=  	(rww''	(s   A 	A:#A55A:T)r0  c                   | j                   st        d      t        | j                         dkD  rt        d      | j                   d   }| j                  t        j
                  k(  rKt        |t        t        f      rt        |t        j
                        S t        d|dt        |            t        |t              st        d      |j                  r*|j                  t        vrt        d	|j                  z        | j                  t        j                  k(  rq|j                  rD|j                  t        j                  t        j
                  fvrt        d
|j                  z        	 t        t        |      | j                        S |j                  t        j                  k(  rt        d| j                  z        | j                  t        j                  t        j                  fv r!	 t        t        |      | j                        S | j                  t        j                   k(  r7d|v sd|v rt        d|z        	 t        t#        |      | j                        S | j                  t        j$                  k(  r%	 t        t'        |      t        j$                        S | j                  t        j(                  k(  rH|j+                         dv rt        d      S |j+                         dv rt        d      S t        d|z        y #  t        d|z        xY w#  t        d|z        xY w#  t        d|z        xY w#  t        d|z        xY w)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_castrP    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   1L 3L" L5 #M L"L25MMc                @    t        t        | j                               S r5   )r"   rG   r.   r6   s     r1   UnaryNotrR    s    s499~%&&r3   c                @    t        t        | j                               S r5   r"   r>   r.   r6   s     r1   
UnaryMinusrU        GDII&&''r3   c                @    t        t        | j                              S r5   rT  r6   s     r1   	UnaryPlusrX    rV  r3   c                d   | j                   }| j                  }||S 	 t        t        |            }t	        | j
                  |      D ]=  \  }}t        |      }t        |      t        k(  rt        |      }|dk(  r||z  }9||z  }? 	 t        |      S # t        t        f$ r t        d      w xY w)N*zdivide by 0)r.   otherr   r>   zipoprJ  rL  r   ZeroDivisionErrorr   r"   )r   r/   r.   r[  resr]  r   s          r1   MultiplicativeExpressionr`    s     66DGGE })gdm$u%EB
AAw%CjSyqq & 3< /0 )-(()s   A*B B/c                ~   | j                   }| j                  }||S t        |d      rL|j                  t        v s|j                  t
        v r't        |      }|j                  }t        | j                  |      D ]  \  }}|t        v rU||j                  k(  rF|dk(  rAt        |      dkD  rd}t        ||j                        t        |      }	t        ||	      }|c S |t        v r:|j                  t
        v r(t        |      }	t        |||	|j                  |      }|c S |t
        v r@|j                  t        v r.|dk(  st        |      }	t        |||	|j                  |      }|c S t        d       y t        |      }|j                  }t        | j                  |      D ]  \  }}t        |      }	t        |	t              rt        |t               rt!        |	      }	t        |	t               rt        |t              rt!        |      }t#        ||j                        }|dk(  r||	z  }||	z  } t%        ||      S )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   rL  r   r"   )
r   r/   r.   r[  r_  r   r]  termerror_messager  s
             r1   AdditiveExpressionri    s   66DGGE } tZ ))T]]>N-Nd#]]ADD%(HB %%"*=") u:>$JM%mR[[AA'-A+C3CJ ''DMM=M,M#D),S"aK
 ''DMM=M,M9'-A0b!T]]BOCJ ""?@@? )F dm]]ADD%(HBA!W%*S%*@!H!U#
3(@CjDMM2BSyqq ) sR((r3   c                    | j                   }| j                  }| j                  }||S t        dd fdd fdd fdd fd	d
 fdd fdt        j
                  fdd fg      }|dv rK|dk(  }d}|t        j                  k(  rg }|D ]  }	 ||k(  rt        d|z        c S  |st        d|z        S ||dvr<t        |t              st        d|z        t        |t              sJt        d|z        t        |t              st        d|z        t        |t              st        d|z        t        |t              r[t        |t              rK|j                  ?|j                  t        vr-|j                  !|j                  t        vr|dvrt        d      	  ||   ||      }	|	t        k(  rt        d      	 t        |	      S # t        $ r} | }Y d } ~ Rd } ~ ww xY w# t        $ r}
t        |
j                    d }
~
ww xY w)N>c                $    | j                  |      S r5   )__gt__ru   ys     r1   <lambda>z&RelationalExpression.<locals>.<lambda>]      qxx{r3   <c                $    | j                  |      S r5   )__lt__rn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>^  rq  r3   =c                $    | j                  |      S r5   )eqrn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>_  s    qttAwr3   !=c                $    | j                  |      S r5   )neqrn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>`  s    ar3   z>=c                $    | j                  |      S r5   )__ge__rn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>a      r3   z<=c                $    | j                  |      S r5   )__le__rn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>b  r}  r3   INNOT INc                0    t        j                  | |       S r5   )r   containsrn  s     r1   rp  z&RelationalExpression.<locals>.<lambda>d  s    a(;$;r3   )r  r  FT)ru  rx  r  r  z8Compare other than =, != of non-literals is an error: %rz"I cannot compare this non-node: %r)ru  rx  z0Can only do =,!= comparisons of non-XSD LiteralszError when comparing)r.   r[  r]  r   r   r  r   nilr"   r   r*   r#   ry   r   NotImplementedr?  r@  )r   r/   r.   r[  r]  opsr_  errorru   rtes              r1   RelationalExpressionr  Q  s=   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$CGD% 455  1:S  N  $277##$s0   G G 	GGG	G=&G88G=c                x    | j                   }| j                  }||S t        t        d |g|z   D                    S )Nc              3  2   K   | ]  }t        |        y wr5   )rG   r   s     r1   r   z+ConditionalAndExpression.<locals>.<genexpr>  s     6~!s1v~r   )r.   r[  r"   all)r   r/   r.   r[  s       r1   ConditionalAndExpressionr    s>    
 66DGGE }36v~6677r3   c                    | j                   }| j                  }||S d }|g|z   D ]  }	 t        |      rt        d      c S  |r|t        d      S # t        $ r} | }Y d } ~ =d } ~ ww xY wr=   )r.   r[  rG   r"   r   )r   r/   r.   r[  r  ru   s         r1   ConditionalOrExpressionr    s    
 66DGGE } EVe^	1vt}$   5>	  	E	s   A	A'A""A'c                &    t        dt        |       S )NrR  r.   )r   rR  )r)   s    r1   not_r    s    
H3//r3   c            
     l    t        |       dk(  r| d   S t        dt        | d   t        | dd              S )Nr   r   r  )r.   r[  )r   r   r  list)r@  s    r1   and_r    s=    
4yA~Aw" !W48n	 r3   
TrueFilterc                    t        d      S )NT)r"   )_1_2s     r1   rp  rp    s    wt}r3   c                   t        | t              rt        |       dk(  rt        | d         S t        | t        t        f      rt	        t        t        |             S t        | t              s| S | j                  j                  d      r!| j                  t        | j                        S | j                         D ]  }t        | |         | |<    | S )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[47#Q 
 Kr3   c                B    t        | t              st        d| z        | S )Nz Non-literal passed as string: %r)r*   r"   r   rb   s    r1   r  r    s"    a!<q@AAHr3   c                    t        | t              st        d| z        | j                  t        j
                  k(  st        d| z        | j                         S )Nz"Non-literal passed as datetime: %rz2Literal with wrong datatype passed as datetime: %r)r*   r"   r   ry   r   rK  toPython)r   s    r1   r   r     sK    a!>BCC::%NQRRSS::<r3   c                *   t        | t              st        d| z        | j                  t        j
                  t        j                  fvrt        d| z        | j                         }t        |t        j                        r|j                         S |S )NzNon-literal passed as date: %rz.Literal with wrong datatype passed as date: %r)
r*   r"   r   ry   r   r   rK  r  py_datetimer   )r   results     r1   r   r      ss    a!:Q>??zz#((CLL11JQNOOZZ\F&+../{{}Mr3   c                    t        | t              st        d| z        | j                  r+| j                  t        j
                  k7  rt        d| z        | S )zz
    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\     sK    
 a!<q@AAzzajjCJJ.LqPQQHr3   c                v   t        | t              st        d| z        | j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                   t        j"                  t        j$                  t        j&                  t        j(                  fvrt        d| z        | j+                         S )zf
    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   rL  rM  r   rN  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                "    | j                         S )zo
    return a dataTime/date/time/duration/dayTimeDuration/yearMonthDuration python objects from a literal

    )r  r  s    r1   rd  rd  9  s    
 ==?r3   c                   |t         j                  k(  rI|t         j                  k(  ry|t         j                  k(  s|t         j                  k(  rdt        |      v ryy|t         j                  k(  rM|t         j                  k(  ry|t         j                  k(  s|t         j                  k(  rdt        |      d   k(  ryy|t         j                  k(  ryy)zq
    Returns a boolean indicating if first object is compatible
    with operation(+/-) over second object.

    Tr  Fr   N)r   r   yearMonthDurationr  r&   rW   timerK  )obj1dt1obj2dt2s       r1   isCompatibleDateTimeDatatyper  B  s     chh#'''C'''3#,,+> c$i
chh#'''C'''3#,,+> c$il"
cll r3   c                J    | }|}||z
  }t        |t        j                        S )z<
    returns the duration Literal between two datetime

    rx   )r"   r   duration)r  r  date1date2
differences        r1   re  re  i  s(     EEJ:55r3   c                    t        | |||      r)|dk(  r| |z
  }t        ||      S | |z   }t        ||      S t        d      )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   rf  rf  x  sT     $D#tS9+C3--+C3-- JKKr3   c                     y r5   r7  rts    r1   rG   rG     s    !r3   c                     y r5   r7  r  s    r1   rG   rG     s    MPr3   c                     y r5   r7  r  s    r1   rG   rG     s    LOr3   c                x   t        | t              r| j                  t        j                  k(  r| j                         S | j                  t        j                  k(  s| j                  t        |       dkD  S | j                         }t        |t              rt        d| z        t        |      S t        d| z        )a  
    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   rO  r  r\   r   r   r   )r  pyRTs     r1   rG   rG     s      "g;;#++%;;= [[CJJ&"++*=r7Q; ;;=D$(%;  Dz! 4
 	
r3   c                L   dd| j                         j                         j                  d      }|j                         j                         j                  d      } |d   |d         syt        |      t        |      kD  ryt	        fdt        ||      D              S )a(  
    Implementation of the extended filtering algorithm, as defined in point
    3.3.2, of U{RFC 4647<http://www.rfc-editor.org/rfc/rfc4647.txt>}, on
    matching language ranges and language tags.
    Needed to handle the C{rdf:PlainLiteral} datatype.
    @param range: language range
    @param lang: language tag
    @rtype: boolean

        @author: U{Ivan Herman<a href="http://www.w3.org/People/Ivan/">}

        Taken from `RDFClosure/RestrictedDatatype.py`__

    .. __:http://dev.w3.org/2004/PythonLib-IH/RDFClosure/RestrictedDatatype.py

    c                    | dk(  xs | |k(  S )z
        Matching of a range and language item: either range is a wildcard
        or the two are equal
        @param r: language range item
        @param l_: language tag item
        @rtype: boolean
        rZ  r7  )r  r~   s     r1   _matchz!_lang_range_check.<locals>._match  s     Cx"17"r3   r   r   Fc              3  (   K   | ]	  } |   y wr5   r7  )r   ru   r  s     r1   r   z$_lang_range_check.<locals>.<genexpr>  s     <#;avqz#;s   )r  rW   r~   rW   r6  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   r6  r$   )r.   r   r/   r   r6  r"   )r6  r"   )r6  r   )r.   r   r6  r"   )r.   r   )r.   r   r6  r$   )r0   r"   r   r"   r6  None)r   r   r6  r"   )r   r   r6  zOptional[str])r   r   r/   r   r6  r"   )FF)
r-  r$   r.  r5  r/  r   r0  r   r6  r  )r-  r$   r/  r   r0  r   r6  z,Callable[[_CustomFunction], _CustomFunction]r5   )r-  r$   r.  zOptional[Callable[..., Any]]r6  r  )r   r   r/   r   r6  r#   )r   r   r/   z#Union[QueryContext, FrozenBindings]r6  r"   )r6  r   )r@  r   r6  r   )r.   r	   r6  r	   )rb   r"   r6  r"   )r   r"   r6  zpy_datetime.datetime)r   r"   r6  zpy_datetime.date)r.   r"   r6  r	   )
r  -Union[py_datetime.date, py_datetime.datetime]r  r$   r  &Union[Duration, py_datetime.timedelta]r  r$   r6  r   )r  r  r  r  r6  r"   )r  r  r  r$   r  r  r  r$   r  rW   r6  r"   )r  r"   r6  r   )r  z2Union[Variable, IdentifiedNode, SPARQLError, Expr]r6  r   )r  $Union[Identifier, SPARQLError, Expr]r6  zUnion[bool, NoReturn])r  r  r6  r   )r  r"   r   r"   r6  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#  r5  r)  __annotations__r1  r8  r<  rC  r\   rK  rL  rM  rN  rO  rP  rR  rU  rX  r`  ri  r  r  r  r  r  r  r  r  r   r>   rd  r  re  rf  rG   r   r7  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$:N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$ 
	$
 
$N6
76
76 6L
7L	L 1L 
	L
 L L4 
 ! 
 ! 
 P 
 P 
 O 
 O)
X#=r3   