o
    iA                  
   @  s  U 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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 dddZ9dddZ:dddZ;dddZ<dddZ=ddd Z>dd!d"Z?dd#d$Z@dd%d&ZAdd'd(ZBdd)d*ZCdd+d,ZDdd-d.ZEdd/d0ZFdd1d2ZGdd3d4ZHdd5d6ZIdd7d8ZJdd9d:ZKdd;d<ZLdd=d>ZMdd?d@ZNddAdBZOddCdDZPddEdFZQddJdKZRddLdMZSddNdOZTddPdQZUddRdSZVddTdUZWddVdWZXddXdYZYdd[d\ZZdd]d^Z[dd_d`Z\ddadbZ]ddcddZ^ddedfZ_ddgdhZ`ddidjZaddkdlZbddmdnZcddodpZdddqdrZeddsdtZfddudvZgddwdxZhddzd{Zidd|d}Zjdd~dZkdddZlee+e-ge6f Zmi Zndeod< 	ddddZp	ddddZq	ddddZrdddZseqe#jtddeqe#juddeqe#jvddeqe#jwddeqe#jddeqe#jxddeqe#jydddddZzdddZ{dddZ|dddZ}dddZ~dddZdddZdddZdddZdddZdddZe+ddd ZdddZdddZdddZdddZdddZtdddZdddĄZddd̄Zddd΄Zddd҄ZedddՄZedddՄZedddՄZd ddՄZdddZdS (      )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exprr   ctxr   returnr#   c                 C  s6   | j }t|tr
|S t|tr|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   r%   r&   a r.   Z/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/sparql/operators.pyBuiltin_IRI4   s   

r0   r!   c                 C     t t| jtS N)r!   r)   r(   r   r%   r&   r.   r.   r/   Builtin_isBLANKE      r4   c                 C  s   t t| jt S r2   )r!   r)   r(   r3   r.   r.   r/   Builtin_isLITERALI   r5   r6   c                 C  r1   r2   )r!   r)   r(   r#   r3   r.   r.   r/   Builtin_isIRIM   r5   r7   c                 C  s(   z
t | j tdW S    td Y S NTF)numericr(   r!   r3   r.   r.   r/   Builtin_isNUMERICQ   s
   

r:   r   c                 C  s0   | j }|du r
t S t|tr|j| S td)z9
    http://www.w3.org/TR/sparql11-query/#func-bnode
    Nz9BNode function only accepts no argument or literal/string)r(   r   r)   r!   bnodesr   r,   r.   r.   r/   Builtin_BNODEY   s   

r<   c                 C  s   t tt| jS )z7
    http://www.w3.org/TR/sparql11-query/#func-abs
    )r!   absr9   r(   r3   r.   r.   r/   Builtin_ABSi   s   r>   c                 C  s   t | jr| jS | jS )z6
    http://www.w3.org/TR/sparql11-query/#func-if
    )EBVarg1arg2arg3r3   r.   r.   r/   
Builtin_IFq   s   rC   c                 C  s   t t S )z9
    http://www.w3.org/TR/sparql11-query/#idp2133952
    )r!   randomr3   r.   r.   r/   Builtin_RANDy   s   rE   c                 C  s   t t jS 9
    http://www.w3.org/TR/sparql11-query/#func-strdt
    )r#   uuiduuid4urnr3   r.   r.   r/   Builtin_UUID   s   rK   c                 C  s   t tt S rF   )r!   strrH   rI   r3   r.   r.   r/   Builtin_STRUUID   s   rM   c                 C  "   t | jd}tt| S Nutf-8)stringr(   encoder!   hashlibmd5	hexdigestr%   r&   sr.   r.   r/   Builtin_MD5      rX   c                 C  rN   rO   )rQ   r(   rR   r!   rS   sha1rU   rV   r.   r.   r/   Builtin_SHA1   rY   r[   c                 C  rN   rO   )rQ   r(   rR   r!   rS   sha256rU   rV   r.   r.   r/   Builtin_SHA256   rY   r]   c                 C  rN   rO   )rQ   r(   rR   r!   rS   sha384rU   rV   r.   r.   r/   Builtin_SHA384   rY   r_   c                 C  rN   rO   )rQ   r(   rR   r!   rS   sha512rU   rV   r.   r.   r/   Builtin_SHA512   rY   ra   c                 C  s:   | j dddD ]}|durt|ttfs|  S qtd)z<
    http://www.w3.org/TR/sparql11-query/#func-coalesce
    r(   T	variablesNz;COALESCE got no arguments that did not evaluate to an error)getr)   r   r$   )r%   r&   xr.   r.   r/   Builtin_COALESCE   s
   rf   c                 C  "   | j }tttt||jdS )z8
    http://www.w3.org/TR/sparql11-query/#func-ceil
    datatype)r(   r!   intmathceilr9   ri   r%   r&   l_r.   r.   r/   Builtin_CEIL   s   ro   c                 C  rg   )z9
    http://www.w3.org/TR/sparql11-query/#func-floor
    rh   )r(   r!   rj   rk   floorr9   ri   rm   r.   r.   r/   Builtin_FLOOR   s   rq   c                 C  s<   | j }t|}tt|d|dkrtnt}t||jdS )z9
    http://www.w3.org/TR/sparql11-query/#func-round
       r   rh   )	r(   r9   rj   r   quantizer   r   r!   ri   )r%   r&   rn   vr.   r.   r/   Builtin_ROUND   s   	 ru   c                   sv   t | j}t | j}| j}d}|r.tdtjfdtjfdtjfg t	t
j fdd|D }tttt|||S )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   irW   mc                      g | ]}  |d qS r   rd   .0fflagMapr.   r/   
<listcomp>       z!Builtin_REGEX.<locals>.<listcomp>)rQ   textpatternflagsdictre
IGNORECASEDOTALL	MULTILINEr   pyopor_r!   boolsearchrL   )r%   r&   r   r   r   cFlagr.   r~   r/   Builtin_REGEX   s   
	
 r   c                   s   t | j}t | j}t | j}| j}tdd|}d}|r:tdtjfdtj	fdtj
fg ttj fdd|D }ttt|||||j|jd	S )
:
    http://www.w3.org/TR/sparql11-query/#func-substr
    z
\$([0-9]*)z\\\1r   rv   rW   rw   c                   rx   ry   rz   r{   r~   r.   r/   r      r   z#Builtin_REPLACE.<locals>.<listcomp>ri   lang)rQ   r(   r   replacementr   r   subr   r   r   r   r   r   r   r!   rL   ri   language)r%   r&   r   r   r   r   r   r.   r~   r/   Builtin_REPLACE   s   


 r   c                 C  s   t t| j| jdS )rG   rh   )r!   rL   r@   rA   r3   r.   r.   r/   Builtin_STRDT  s   r   c                 C  s8   t | j}|js|jrtdtt|t| j dS )z;
    http://www.w3.org/TR/sparql11-query/#func-strlang
    z STRLANG expects a simple literal)r   )	rQ   r@   r   ri   r   r!   rL   rA   lowerrV   r.   r.   r/   Builtin_STRLANG  s   
r   c                 C  sx   t dd | jD }t|dkr| nd}t dd | jD }t|dkr*| nd}tddd | jD ||dS )	z:
    http://www.w3.org/TR/sparql11-query/#func-concat
    c                 s       | ]}t |tr|jV  qd S r2   )r)   r!   ri   r|   re   r.   r.   r/   	<genexpr>%      z!Builtin_CONCAT.<locals>.<genexpr>rr   Nc                 s  r   r2   )r)   r!   r   r   r.   r.   r/   r   )  r    c                 s      | ]}t |V  qd S r2   )rQ   r   r.   r.   r/   r   0      r   )setr(   lenpopr!   join)r%   r&   dtr   r.   r.   r/   Builtin_CONCAT  s
    r   r-   bNonec                 C  s2   t |  t | |jr| j|jkrtdd S d S )Nz'incompatible arguments to str functions)rQ   r   r   )r-   r   r.   r.   r/   _compatibleStrings3  s
   r   c                 C  $   | j }| j}t|| t||S )z=
    http://www.w3.org/TR/sparql11-query/#func-strstarts
    )r@   rA   r   r!   
startswithr%   r&   r-   r   r.   r.   r/   Builtin_STRSTARTS;  s   
r   c                 C  r   )z;
    http://www.w3.org/TR/sparql11-query/#func-strends
    )r@   rA   r   r!   endswithr   r.   r.   r/   Builtin_STRENDSG  s   
r   c                 C  sJ   | j }| j}t|| ||}|dkrtdS t|d| |j|jdS )z=
    http://www.w3.org/TR/sparql11-query/#func-strbefore
    r   Nr   ri   )r@   rA   r   findr!   r   ri   r%   r&   r-   r   rv   r.   r.   r/   Builtin_STRBEFORES  s   

r   c                 C  sR   | j }| j}t|| ||}|dkrtdS t||t| d |j|jdS )z<
    http://www.w3.org/TR/sparql11-query/#func-strafter
    r   r   Nr   )r@   rA   r   r   r!   r   r   ri   r   r.   r.   r/   Builtin_STRAFTERc  s   

"r   c                 C  s"   | j }| j}t|| t||v S )z?
    http://www.w3.org/TR/sparql11-query/#func-strcontains
    )r@   rA   r   r!   r   r.   r.   r/   Builtin_CONTAINSs  s   
r   c                 C  s   t tt| jdddS )NrP   r   )safe)r!   r   rQ   r(   rR   r3   r.   r.   r/   Builtin_ENCODE_FOR_URI  s   r   c                 C  sL   t | j}t| jd }| j}|durt|| }t||| |j|jdS )r   rr   Nr   )rQ   r(   r9   startlengthr!   r   ri   )r%   r&   r-   r   r   r.   r.   r/   Builtin_SUBSTR  s   
r   ec                 C  s   t | j}tt|S r2   )rQ   r(   r!   r   r   r&   rn   r.   r.   r/   Builtin_STRLEN  s   
r   c                 C  s    | j }t|tr
|tt|S r2   )r(   r)   r   r!   rL   )r   r&   r(   r.   r.   r/   Builtin_STR  s   
r   c                 C      t | j}t| |j|jdS Nr   )rQ   r(   r!   r   ri   r   r   r.   r.   r/   Builtin_LCASE     
r   c                 C  s6   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)rQ   r@   rA   rL   r!   _lang_range_check)r   r&   langTag	langRanger.   r.   r/   Builtin_LANGMATCHES  s
   

r   c                 C  s
   t |jS )z7
    http://www.w3.org/TR/sparql11-query/#func-now
    )r!   now)r   r&   r.   r.   r/   Builtin_NOW  s   
r   c                 C     t | j}t|jS r2   )dater(   r!   yearr   r&   dr.   r.   r/   Builtin_YEAR     

r   c                 C  r   r2   )r   r(   r!   monthr   r.   r.   r/   Builtin_MONTH  r   r   c                 C  r   r2   )r   r(   r!   dayr   r.   r.   r/   Builtin_DAY  r   r   c                 C  r   r2   )datetimer(   r!   hourr   r.   r.   r/   Builtin_HOURS  r   r   c                 C  r   r2   )r   r(   r!   minuter   r.   r.   r/   Builtin_MINUTES  r   r   c                 C  s>   t | j}t|j}|jr|t|jtd 7 }t|tjdS )z;
    http://www.w3.org/TR/sparql11-query/#func-seconds
    i@B rh   )r   r(   r   secondmicrosecondr!   r   decimal)r   r&   r   result_valuer.   r.   r/   Builtin_SECONDS  s
   

r   c           
      C  s   t | j}|jstd| | }|j}|j}d}|dk r(d| | }d}d}|d }||d d  d }||d d  |d  }d||rJd	| nd|rQd
| nd|rXd| nd|sc|sc|scd| ndf }	t|	tj	d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  <   z%sP%sT%s%s%sz%dDz%dHz%dMz%dSrh   )
r   r(   tzinfor   	utcoffsetdayssecondsr!   r   dayTimeDuration)
r   r&   r   deltar   rW   neghrw   tzdeltar.   r.   r/   Builtin_TIMEZONE  s,   
r   c                 C  s8   t | j}|jstdS |j|}|dkrd}t|S )Nr   UTCZ)r   r(   r   r!   tzname)r   r&   r   nr.   r.   r/   
Builtin_TZ  s   
r   c                 C  r   r   )rQ   r(   r!   upperri   r   r   r.   r.   r/   Builtin_UCASE  r   r   c                 C  s   t | j}t|jp
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   r.   r.   r/   Builtin_LANG  s   
	r   Optional[str]c                 C  s@   | j }t|tstd| |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   
langStringri   r   rQ   r   r.   r.   r/   Builtin_DATATYPE$  s   
r   c                 C  s   | j }| j}t||kS r2   )r@   rA   r!   )r   r&   r-   r   r.   r.   r/   Builtin_sameTerm/  s   r   c                 C  s   | j ddd}tt|t S )z9
    http://www.w3.org/TR/sparql11-query/#func-bound
    r(   Trb   )rd   r!   r)   r$   )r   r&   r   r.   r.   r/   Builtin_BOUND5  s   r   c                 C  sH   ddl m} | jdk}|j|}||| jD ]}t|  S t| S )Nr   )evalPartBuiltin_EXISTS)rdflib.plugins.sparql.evaluater   namer&   thawgraphr!   )r   r&   r   existsre   r.   r.   r/   r   >  s   

r   z*Dict[URIRef, Tuple[_CustomFunction, bool]]_CUSTOM_FUNCTIONSFurifunc_CustomFunctionoverrider   rawc                 C  s,   |s| t v rtd|   ||ft | < dS )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)r  r  r  r  r.   r.   r/   register_custom_functionQ  s   r  ,Callable[[_CustomFunction], _CustomFunction]c                   s   d fdd}|S )z@
    Decorator version of :func:`register_custom_function`.
    r  r  r'   c                   s   t |  d | S )N)r  r  )r  )r  r  r  r  r.   r/   	decoratorh  s   z"custom_function.<locals>.decoratorN)r  r  r'   r  r.   )r  r  r  r  r.   r
  r/   custom_functiona  s   r  Optional[Callable[..., Any]]c                 C  s*   t | r
t | = dS td|    dS )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   rd   warningswarnr  )r  r  r.   r.   r/   unregister_custom_functiono  s   
	
r  r"   c              
   C  sh   t | j}|du rtd| j |\}}|r|| |S z|| j W S  ty3 } zt|j d}~ww )z$
    Custom functions and casts
    NzUnknown function %r)r   rd   irir   r%   	TypeErrorargs)r   r&   pairr  r  exr.   r.   r/   Function~  s   

r  T)r  c                 C  s  | j stdt| j dkrtd| j d }| jtjkr5t|ttfr+t|tjdS td|t	|f t|ts>td|j
rM|j
tvrMtd|j
 | jtjkr{|j
rf|j
tjtjfvrftd	|j
 ztt|| jdW S    td
| |j
tjkrtd| j | jtjtjfv rz
tt|| jdW S    td| | jtjkrd|v sd|v rtd| z
tt|| jdW S    td| | jtjkrz
tt|tjdW S    td| | jtjkr	| dv rtdS | dv rtdS td| d S )NzNothing given to cast.rr   z Cannot cast more than one thing!r   rh   zCannot cast term %r of type %rz/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   rQ   r)   r#   r!   typeri   r   dateTimeisodateparse_datetimefloatdoubler   r   integerrj   booleanr   )r   r&   re   r.   r.   r/   default_cast  s\   

r$  c                 C  s   t t| j S r2   )r!   r?   r%   r3   r.   r.   r/   UnaryNot  r5   r%  c                 C  s   t t| j S r2   r!   r9   r%   r3   r.   r.   r/   
UnaryMinus  r5   r'  c                 C  s   t t| j
 S r2   r&  r3   r.   r.   r/   	UnaryPlus  r5   r(  #Union[QueryContext, FrozenBindings]c              	   C  s   | j }| j}|d u r|S z1tt|}t| j|D ]\}}t|}t|tkr+t|}|dkr4||9 }q|| }qW t|S  tt	fyJ   t
dw )N*zdivide by 0)r%   otherr   r9   zipopr  r   r   ZeroDivisionErrorr   r!   )r   r&   r%   r+  resr-  r}   r.   r.   r/   MultiplicativeExpression  s$   

r0  c           
      C  s  | j }| j}|d u r|S t|dr|jtv s|jtv rt|}|j}t| j|D ]h\}}|tv rT||jkrT|dkrTt	|dkrGd}t
||jt|}	t||	}|  S |tv rn|jtv rnt|}	t|||	|j|}|  S |tv r|jtv r|dkrt|}	t|||	|j|}|  S q(t
dd S t|}|j}t| j|D ]7\}}t|}	t|	trt|trt|	}	t|	trt|trt|}t||j}|dkr||	7 }q||	8 }qt||dS )Nri   r   rr   z$Can't evaluate multiple %r arguments+zInvalid DateTime Operationsrh   )r%   r+  hasattrri   r   r   dateTimeObjectsr,  r-  r   r   calculateDurationcalculateFinalDateTimer9   r)   r   r   r   r!   )
r   r&   r%   r+  r/  r   r-  termerror_messager   r.   r.   r/   AdditiveExpression  sR   

#

r8  c                 C  s  | j }| j}| j}|d u r|S tddd fddd fddd fdd	d fd
dd fddd fdtjfddd fg}|dv r}|dk}d}|tjkrKg }|D ]%}z||kr]td|A W   S W qM t	yr }  z| }W Y d } ~ qMd } ~ ww |s{td|A S ||dvrt
|tst	d| t
|tst	d| nt
|tst	d| t
|tst	d| t
|trt
|tr|jd ur|jtvr|jd ur|jtvr|dvrt	dz|| ||}	|	tkrt	dW t|	S  ty }
 zt	|
j d }
~
ww )N>c                 S  
   |  |S r2   )__gt__re   yr.   r.   r/   <lambda>X     
 z&RelationalExpression.<locals>.<lambda><c                 S  r:  r2   )__lt__r<  r.   r.   r/   r>  Y  r?  =c                 S  r:  r2   )eqr<  r.   r.   r/   r>  Z  r?  !=c                 S  r:  r2   )neqr<  r.   r.   r/   r>  [  r?  z>=c                 S  r:  r2   )__ge__r<  r.   r.   r/   r>  \  r?  z<=c                 S  r:  r2   )__le__r<  r.   r.   r/   r>  ]  r?  INNOT INc                 S  s   t | | S r2   )r   containsr<  r.   r.   r/   r>  _  s    )rH  rI  FT)rB  rD  rH  rI  z8Compare other than =, != of non-literals is an error: %rz"I cannot compare this non-node: %r)rB  rD  z0Can only do =,!= comparisons of non-XSD LiteralszError when comparing)r%   r+  r-  r   r   rJ  r   nilr!   r   r)   r"   ri   r   NotImplementedr  r  )r   r&   r%   r+  r-  opsr/  errorre   rter.   r.   r/   RelationalExpressionL  s   
















rQ  c                 C  s4   | j }| j}|d u r|S ttdd |g| D S )Nc                 s  r   r2   )r?   r   r.   r.   r/   r     r   z+ConditionalAndExpression.<locals>.<genexpr>)r%   r+  r!   all)r   r&   r%   r+  r.   r.   r/   ConditionalAndExpression  s
   rS  c                 C  s~   | j }| j}|d u r|S d }|g| D ]#}zt|r!tdW   S W q ty6 }  z| }W Y d } ~ qd } ~ ww |r;|tdS r8   )r%   r+  r?   r!   r   )r   r&   r%   r+  rN  re   r.   r.   r/   ConditionalOrExpression  s"   rT  c                 C  s   t dt| dS )Nr%  r%   )r   r%  )r(   r.   r.   r/   not_  s   rV  r  c                  G  s4   t | dkr
| d S tdt| d t| dd  dS )Nrr   r   rS  )r%   r+  )r   r   rS  list)r  r.   r.   r/   and_  s   rX  
TrueFilterc                 C  s   t dS )NT)r!   )_1_2r.   r.   r/   r>    s    r>  r   c                 C  s   t | trt| dkrt| d S t | ttfrttt| S t | ts&| S | jdr6| j	d u r6t| j
S |  D ]
}t| | | |< q:| S )Nrr   r   
Expression)r)   r   r   simplifyrW  mapr   r   r   r+  r%   keys)r%   kr.   r.   r/   r]    s   


r]  rW   c                 C  s   t | tstd|  | S )Nz Non-literal passed as string: %r)r)   r!   r   rW   r.   r.   r/   r     s   
r   py_datetime.datetimec                 C  s6   t | tstd|  | jtjkstd|  |  S )Nz"Non-literal passed as datetime: %rz2Literal with wrong datatype passed as datetime: %r)r)   r!   r   ri   r   r  toPython)r   r.   r.   r/   r     s
   
r   py_datetime.datec                 C  sT   t | tstd|  | jtjtjfvrtd|  |  }t |tj	r(| S |S )NzNon-literal passed as date: %rz.Literal with wrong datatype passed as date: %r)
r)   r!   r   ri   r   r   r  rc  py_datetimer   )r   resultr.   r.   r/   r     s   
r   c                 C  s8   t | tstd|  | jr| jtjkrtd|  | 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   ri   r   rQ   ra  r.   r.   r/   rQ     s
   
rQ   c                 C  st   t | tstd|  | 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r6td|  |  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   ri   r   r   r!  r   r"  nonPositiveIntegernegativeIntegernonNegativeIntegerpositiveIntegerunsignedLongunsignedIntunsignedShortunsignedBytelongrj   shortbyterc  rU  r.   r.   r/   r9     s,   
r9   c                 C  s   |   S )zo
    return a dataTime/date/time/duration/dayTimeDuration/yearMonthDuration python objects from a literal

    )rc  rU  r.   r.   r/   r3  5  s   r3  obj1-Union[py_datetime.date, py_datetime.datetime]dt1obj2.Union[isodate.Duration, py_datetime.timedelta]dt2c                 C  s   |t jkr |t jkrdS |t jks|t jkr dt|v rdS dS |t jkrB|t jkr,dS |t jks6|t jkrBdt|d kr@dS dS |t jkrIdS dS )zq
    Returns a boolean indicating if first object is compatible
    with operation(+/-) over second object.

    TTFrr   N)r   r   yearMonthDurationr   DurationrL   timer  )rr  rt  ru  rw  r.   r.   r/   isCompatibleDateTimeDatatype>  s"   




r|  c                 C  s   | }|}|| }t |tjdS )z<
    returns the duration Literal between two datetime

    rh   )r!   r   duration)rr  ru  date1date2
differencer.   r.   r/   r4  e  s   r4  	operationrL   c                 C  sF   t | |||r|dkr| | }t||dS | | }t||dS td)z
    Calculates the final dateTime/date/time resultant after addition/
    subtraction of duration/dayTimeDuration/yearMonthDuration
    r   rh   z.Incompatible Data types to DateTime Operations)r|  r!   r   )rr  rt  ru  rw  r  ansr.   r.   r/   r5  t  s   r5  rtc                 C     d S r2   r.   r  r.   r.   r/   r?        r?   2Union[Variable, IdentifiedNode, SPARQLError, Expr]r   c                 C  r  r2   r.   r  r.   r.   r/   r?     r  $Union[Identifier, SPARQLError, Expr]Union[bool, NoReturn]c                 C  r  r2   r.   r  r.   r.   r/   r?     r  c                 C  sr   t | tr3| jtjkr|  S | jtjks| jdu r t| dkS |  }t |tr/td|  t	|S td|  )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.

    Nr   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!   ri   r   r#  rc  rQ   r   r   r   )r  pyRTr.   r.   r/   r?     s$   

ranger   c                   st   ddd |    d}|   d} |d	 |d	 s"d
S t|t|kr,d
S t fd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

    rO  rL   rn   r'   r   c                 S  s   | dkp| |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
        r*  r.   )rO  rn   r.   r.   r/   _match  s   z!_lang_range_check.<locals>._matchr   r   Fc                 3  s    | ]} | V  qd S r2   r.   r   r  r.   r/   r     r   z$_lang_range_check.<locals>.<genexpr>N)rO  rL   rn   rL   r'   r   )stripr   splitr   rR  r,  )r  r   	rangeListlangListr.   r  r/   r     s   

r   )r%   r   r&   r   r'   r#   )r%   r   r&   r   r'   r!   )r'   r!   )r'   r   )r%   r   r'   r!   )r%   r   )r%   r   r'   r#   )r-   r!   r   r!   r'   r   )r   r   r'   r!   )r   r   r'   r   )r   r   r&   r   r'   r!   )FF)
r  r#   r  r  r  r   r  r   r'   r   )r  r#   r  r   r  r   r'   r	  r2   )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   )rW   r!   r'   r!   )r   r!   r'   rb  )r   r!   r'   rd  )r%   r!   r'   r   )
rr  rs  rt  r#   ru  rv  rw  r#   r'   r   )rr  rs  ru  rs  r'   r!   )rr  rs  rt  r#   ru  rv  rw  r#   r  rL   r'   r!   )r  r!   r'   r   )r  r  r'   r   )r  r  r'   r  )r  r  r'   r   )r  r!   r   r!   r'   r   )
__future__r   r   re  rS   rk   operatorr   rD   r   rH   r  r   r   r   r   r   	functoolsr   typingr   r	   r
   r   r   r   r   r   urllib.parser   r  	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$   r0   r4   r6   r7   r:   r<   r>   rC   rE   rK   rM   rX   r[   r]   r_   ra   rf   ro   rq   ru   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   __annotations__r  r  r  r  rQ   r  r   r!  r"  r#  r$  r%  r'  r(  r0  r8  rQ  rS  rT  rV  rX  rY  r]  r   r   r9   r3  r|  r4  r5  r?   r   r.   r.   r.   r/   <module>   s    ($



















	


























'






	

?




I
O









"
	
'
,