o
    i$                     @  s4  d dl mZ d dl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mZ d dlmZmZmZmZ d dlmZmZmZ erFd dlmZ 	 		d.d/ddZG dd dZG dd deZG dd deZedZG dd deZ G dd de Z!G dd deZ"d0d1d'd(Z#	 	 d0d2d*d+Z$d d,lm%Z%m&Z& d-S )3    )annotations)OrderedDict)
MethodType)	TYPE_CHECKINGAnyCallableListMappingOptionalTupleTypeVarUnion)ParserElementParseResultsTokenConverteroriginalTextFor)BNode
IdentifierVariable)FrozenBindingsFctx'FrozenBindings'valr   	variablesboolerrorsreturnc                   s   t |tr
| S t |trtd| t |tr% fdd|D S t |ttfrF |}t |t	r:s:||dur@|S rD|S t
t |trZt|dkrZt |d S |S )a  
    utility function for evaluating something...

    Variables will be looked up in the context
    Normally, non-bound vars is an error,
    set variables=True to return unbound vars

    Normally, an error raises the error,
    set errors=True to return error

    z$What do I do with this CompValue? %sc                   s   g | ]	}t  |qS  )value).0xr   r   r   r   \/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/sparql/parserutils.py
<listcomp>Q   s    zvalue.<locals>.<listcomp>N   r   )
isinstanceExpreval	CompValue	Exceptionlistr   r   getSPARQLErrorNotBoundErrorr   lenr   )r   r   r   r   rr   r!   r"   r   9   s$   




r   c                   @  s$   e Zd ZdZddd	ZdddZdS )
ParamValuezq
    The result of parsing a Param
    This just keeps the name/value
    All cleverness is in the CompValue
    namestr	tokenListUnion[List[Any], ParseResults]isListr   c                 C  s8   || _ || _t|ttfrt|dkr|d }|| _d S )Nr$   r   )r5   r1   r%   r*   r   r.   r3   )selfr1   r3   r5   r   r   r"   __init__m   s
   
zParamValue.__init__r   c                 C  s   d| j | jf S )NzParam(%s, %s))r1   r3   r6   r   r   r"   __str__w      zParamValue.__str__N)r1   r2   r3   r4   r5   r   r   r2   )__name__
__module____qualname____doc__r7   r9   r   r   r   r"   r0   f   s    

r0   c                   @  s&   e Zd ZdZddddZdddZdS )Paramz
    A pyparsing token for labelling a part of the parse-tree
    if isList is true repeat occurrences of ParamList have
    their values merged in a list
    Fr1   r2   r5   r   c                 C  s,   || _ t| | | | | | j d S N)r5   r   r7   setNameaddParseAction
postParse2)r6   r1   exprr5   r   r   r"   r7      s   
zParam.__init__r3   r4   r   r0   c                 C  s   t | j|| jS rA   )r0   r1   r5   )r6   r3   r   r   r"   rD      r:   zParam.postParse2N)F)r1   r2   r5   r   )r3   r4   r   r0   )r<   r=   r>   r?   r7   rD   r   r   r   r"   r@   {   s    r@   c                   @  s   e Zd ZdZdddZdS )	ParamListz1
    A shortcut for a Param with isList=True
    r1   r2   c                 C  s   t | ||d d S )NT)r@   r7   r6   r1   rE   r   r   r"   r7         zParamList.__init__Nr1   r2   )r<   r=   r>   r?   r7   r   r   r   r"   rF      s    rF   _ValTc                   @  sv   e Zd ZdZd$ddZd%ddZd&d	d
Zd&ddZ	d'd(ddZdd Z	d'd)ddZ
d*ddZer9d+d!d"Zd#S d#S ),r(   zo
    The result of parsing a Comp
    Any included Params are available as Dict keys
    or as attributes

    r1   r2   c                 K  s   t |  || _| | d S rA   )r   r7   r1   update)r6   r1   valuesr   r   r"   r7      s   
zCompValue.__init__r   c                 C  s   t | jfi | S rA   )r(   r1   r8   r   r   r"   clone      zCompValue.clonec                 C     | j d t|  S N_)r1   r   r9   r8   r   r   r"   r9      rH   zCompValue.__str__c                 C  rO   rP   )r1   dict__repr__r8   r   r   r"   rS      rH   zCompValue.__repr__Fr   rJ   r   r   r   Union[_ValT, Any]c                 C  s   | j d urt| j ||S |S rA   )r   r   )r6   r   r   r   r   r   r"   _value   s   
zCompValue._valuec                 C  s   |  t| |S rA   )rU   r   __getitem__r6   ar   r   r"   rV      rN   zCompValue.__getitem__c                 C  s   |  t| ||||S rA   )rU   r   r+   )r6   rX   r   r   r   r   r"   r+      s   zCompValue.getrX   r   c                 C  s.   |dv rt  z| | W S  ty   Y d S w )N)_OrderedDict__root_OrderedDict__end)AttributeErrorKeyErrorrW   r   r   r"   __getattr__   s   
zCompValue.__getattr___CompValue__name_CompValue__valueNonec                 C  s   d S rA   r   )r6   r^   r_   r   r   r"   __setattr__   s   zCompValue.__setattr__NrI   )r   r(   r;   FF)r   rJ   r   r   r   r   r   rT   )r   r   r   r   )rX   r2   r   r   )r^   r2   r_   r   r   r`   )r<   r=   r>   r?   r7   rM   r9   rS   rU   rV   r+   r]   r   ra   r   r   r   r"   r(      s    





r(   c                      s4   e Zd ZdZ	dd fddZi fdddZ  ZS )r&   z)
    A CompValue that is evaluatable
    Nr1   r2   evalfn#Optional[Callable[[Any, Any], Any]]c                   s6   t t| j|fi | d | _|rt|| | _d S d S rA   )superr&   r7   _evalfnr   )r6   r1   rc   rL   	__class__r   r"   r7      s
   zExpr.__init__r   r   r   Union[SPARQLError, Any]c              
   C  sV   z&z|| _ | |W W d | _ S  ty& } z|W  Y d }~W d | _ S d }~ww d | _ w rA   )r   rf   r,   )r6   r   er   r   r"   r'      s   z	Expr.evalrA   )r1   r2   rc   rd   )r   r   r   ri   )r<   r=   r>   r?   r7   r'   __classcell__r   r   rg   r"   r&      s
    r&   c                   @  s.   e Zd ZdZdddZdddZdddZdS )Compz
    A pyparsing token for grouping together things with a label
    Any sub-tokens that are not Params will be ignored.

    Returns CompValue / Expr objects - depending on whether evalFn is set.
    r1   r2   rE   r   c                 C  s&   || _ t| | | | d | _d S rA   )rE   r   r7   rB   rc   rG   r   r   r"   r7      s   

zComp.__init__instringlocintr3   r   r   Union[Expr, CompValue]c                 C  s   | j rt| j}t| j ||_nt| j}| jdkr,t| j}||d d }||d< |D ]$}t	|t
rR|jrL|j|vrBg ||j< ||j |j q.|j||j< q.|S )NServiceGraphPatternr   service_string)rc   r&   r1   r   rf   r(   r   rE   searchStringr%   r0   r5   appendr3   )r6   rm   rn   r3   ressgprr   tr   r   r"   	postParse   s"   






zComp.postParserc   Callable[[Any, Any], Any]c                 C  s
   || _ | S rA   )rc   )r6   rc   r   r   r"   	setEvalFn  s   zComp.setEvalFnN)r1   r2   rE   r   )rm   r2   rn   ro   r3   r   r   rp   )rc   ry   r   rl   )r<   r=   r>   r?   r7   rx   rz   r   r   r   r"   rl      s
    

rl    rw   r   indentr2   depthro   c                 C  sv   g }|   D ]}|t|||d  qt|  D ]\}}|d|d| |f  |t|||d  qd|S )Nr$   
%s%s- %s:
  r{   )asListrt   _prettify_sub_parsetreesorteditemsjoin)rw   r|   r}   outrj   kvr   r   r"   prettify_parsetree  s   
r   @Union[Identifier, CompValue, set, list, dict, Tuple, bool, None]c                 C  s  g }t | tr7|d|d| | jf  |  D ]\}}|d|d|d  |f  |t|||d  qnJt | tr_|  D ]\}}|d|d|d  |f  |t|||d  q@n"t | tru| D ]}|t|||d  qfn|d|d| | f  d|S )Nz
%s%s> %s:
r   r~   r$      z	%s%s- %r
r{   )	r%   r(   rt   r1   r   r   rR   r*   r   )rw   r|   r}   r   r   r   rj   r   r   r"   r   '  s$   



r   )r-   r,   Nrb   )
r   r   r   r   r   r   r   r   r   r   )r{   r   )rw   r   r|   r2   r}   ro   r   r2   )rw   r   r|   r2   r}   ro   r   r2   )'
__future__r   collectionsr   typesr   typingr   r   r   r   r	   r
   r   r   r   	pyparsingr   r   r   r   rdflib.termr   r   r   rdflib.plugins.sparql.sparqlr   r   r0   r@   rF   rJ   r(   r&   rl   r   r   r-   r,   r   r   r   r"   <module>   s0    ,$-	72