o
    i                     @  sP  d dl mZ 	 d dlZd dlZd dlZd dl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mZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlmZ d d	l m!Z!m"Z" d d
l#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, dddZ-dddZ.dddZ/dddZ0dddZ1dd"d#Z2	ddd&d'Z3dd(d)Z4dd+d,Z5dd0d1Z6dd4d5Z7dd8d9Z8ddd;d<Z9ddDdEZ:ddIdJZ;ddMd$Z<ddRdSZ=eddVdWZ>eddYdWZ>dd\dWZ>dd_d`Z?ddcddZ@ddfdgZAddhdiZBddjdkZCddldmZDG dndo doeEZFdpdq drdq fddwdxZGdydq fdd|d}ZHd~dq ddq dfdddZIdddZJdddZKdddZLdddZMddddZNdddZOdddZPdddZQdddZRdddZSdddZdddZT		ddddZUdddZVdddZW		ddddZX		ddddZYG dd deEZZG dd dZ[dddńZ\dddǄZ]dS )    )annotationsN)reduce)AnyCallableDefaultDictDictIterableListMappingOptionalSetTupleoverload)ParseResults)AlternativePathInvPathMulPathNegatedPathPathSequencePath)
TrueFilterand_)simplify)	CompValueExpr)PrologueQueryUpdate)BNode
IdentifierLiteralURIRefVariablepr   exprList[CompValue]returnc                 C     t d| |dS )NOrderByr#   r$   r   r)    r+   X/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/sparql/algebra.pyr(   1      r(   2typing.Union[List[Dict[Variable, str]], CompValue]c                 C     t d| dS )N
ToMultiSetr#   r*   r1   r+   r+   r,   r0   5      r0   p1p2c                 C  r'   )NUnionr3   r4   r*   r6   r+   r+   r,   r5   9   r-   r5   Optional[CompValue]c                 C  r'   )NJoinr6   r*   r6   r+   r+   r,   r8   =   r-   r8   c                 C  r'   )NMinusr6   r*   r6   r+   r+   r,   r9   A   r-   r9   termr   graphc                 C  r'   )NGraph)r:   r#   r*   )r:   r;   r+   r+   r,   r<   E   r-   r<   triples9Optional[List[Tuple[Identifier, Identifier, Identifier]]]c                 C  s   t d| pg dS )NBGPr=   r*   r@   r+   r+   r,   r?   I      r?   c                 C     t d| ||dS )NLeftJoinr3   r4   r$   r*   rD   r+   r+   r,   rC   O   s   rC   r   c                 C  r'   )NFilterr$   r#   r*   rF   r+   r+   r,   rE   S   r-   rE   typing.Union[Identifier, Expr]varr"   c                 C  rB   )NExtendr#   r$   rH   r*   rJ   r+   r+   r,   rI   W   rA   rI   resList[Dict[Variable, str]]c                 C  r/   )NvaluesrK   r*   rN   r+   r+   r,   Values]   r2   rO   PVList[Variable]c                 C  r'   )NProjectr#   rP   r*   rS   r+   r+   r,   rR   a   r-   rR   Optional[List[Variable]]c                 C  r'   )NGroupr)   r*   r)   r+   r+   r,   rU   e   r-   rU   triple)Tuple[Identifier, Identifier, Identifier]	varsknown"Set[typing.Union[BNode, Variable]]	varscountDict[Identifier, int]Tuple[int, int, bool]c                   s<   t fdd| D t fdd| D  t| d t fS )Nc                   s&   g | ]}| vrt |ttfr|qS r+   )
isinstancer"   r   .0x)rX   r+   r,   
<listcomp>p   s
    z_knownTerms.<locals>.<listcomp>c                 3  s    | ]	}  |d V  qdS )r   N)getr^   )rZ   r+   r,   	<genexpr>v       z_knownTerms.<locals>.<genexpr>   )lensumr]   r    )rV   rX   rZ   r+   rZ   rX   r,   _knownTermsi   s   
ri   l_3Iterable[Tuple[Identifier, Identifier, Identifier]]/List[Tuple[Identifier, Identifier, Identifier]]c                   sD  ddd}dd | D } t  tt | D ]}|d	 D ]}t|ttfr- |  d	7  < qqd
}|t| k rt fdd| |d D | |d< | | d
 d
 }d
}|| t| k r| ||  d
 d
 |kr| ||  d	 D ]}|| qq|d	7 }|| t| k r| ||  d
 d
 |ksi|d	7 }|t| k s7dd | D S )zZ
    Reorder triple patterns so that we execute the
    ones with most bindings first
    r:   strrX   "Set[typing.Union[Variable, BNode]]c                 S  s    t | ttfr||  d S d S N)r]   r"   r   add)r:   rX   r+   r+   r,   _addvar   s   zreorderTriples.<locals>._addvarc                 S  s   g | ]}d |fqS ro   r+   r^   r+   r+   r,   ra          z"reorderTriples.<locals>.<listcomp>   r   c                 3  s(    | ]}t |d   |d  fV  qdS )rs   N)ri   r^   rh   r+   r,   rc      s   & z!reorderTriples.<locals>.<genexpr>Nc                 S  s   g | ]}|d  qS )rs   r+   r^   r+   r+   r,   ra      rr   )r:   rm   rX   rn   )	setcollectionsdefaultdictintr]   r"   r   rf   sorted)rj   rq   tcijr+   rh   r,   reorderTriples{   s.   

	(((r}   lUtyping.Union[List[List[Identifier]], List[Tuple[Identifier, Identifier, Identifier]]]c                   sH   t dd   t d dkrtdt fddtdt dD S )Nc                 S  s   | | S ro   r+   )r`   yr+   r+   r,   <lambda>   s    ztriples.<locals>.<lambda>   r   zthese aint triplesc                 3  s.    | ]} |  |d    |d  fV  qdS )rs   re   Nr+   r^   r~   r+   r,   rc      s   , ztriples.<locals>.<genexpr>)r   rf   	Exceptionr}   ranger   r+   r   r,   r=      s   "typing.Union[CompValue, str]prologuer   Optional[Identifier]c                 C  s^   t | tr#| jdkr|| S | jdkr!t| j| j|| jdS dS t | tr-|| S dS )z'
    Expand prefixed/relative URIs
    pnameliteral)langdatatypeN)	r]   r   name
absolutizer    stringr   r   r!   )r#   r   r+   r+   r,   translatePName   s   





r   r!   Nonec                 C     d S ro   r+   r1   r+   r+   r,   translatePath      r   'Path'c                 C  r   ro   r+   r1   r+   r+   r,   r      r   typing.Union[CompValue, URIRef]Optional['Path']c                 C  s4  t | tr| jdkrt| jdkr| jd S t| j S | jdkr1t| jdkr,| jd S t| j S | jdkr]| js<| jS t | jtrVt| jdkrMt	dt
| jd | jS t
| j| jS | jdkrt | jtrzt| jdkrst	dt| jd S t| jS | jdkrt | jtrtt| j S t| jS d	S d	S )
z,
    Translate PropertyPath expressions
    PathAlternativers   r   PathSequencePathEltzDenkfehler!PathEltOrInversePathNegatedPropertySetN)r]   r   r   rf   partr   r   modlistr   r   r   r   r1   r+   r+   r,   r      s:   











!e-typing.Union[Expr, Literal, Variable, URIRef]c                 C  s   dd }t | |d} | S )z
    Translate the graph pattern used by EXISTS and NOT EXISTS
    http://www.w3.org/TR/sparql11-query/#sparqlCollectFilters
    c                 S  sD   t | tr| jdv rt| j| _| jjdkr d| j_d S d S d S d S )N)Builtin_EXISTSBuiltin_NOTEXISTSrE   T)r]   r   r   translateGroupGraphPatternr;   no_isolated_scopenr+   r+   r,   _c  s   

ztranslateExists.<locals>._c	visitPost)traverse)r   r   r+   r+   r,   translateExists  s   r   partsOptional[Expr]c                 C  sf   g }d}|t | k r+| | }|jdkr!|t|j | | n|d7 }|t | k s
|r1t| S dS )z

    FILTER expressions apply to the whole group graph pattern in which
    they appear.

    http://www.w3.org/TR/sparql11-query/#sparqlCollectFilters
    r   rE   rs   N)rf   r   appendr   r$   popr   )r   filtersr{   r#   r+   r+   r,   collectAndRemoveFilters  s   	
r   graphPatternc                 C  s0   d }| j D ]}t|}|s|}qt||}q|S ro   )r;   r   r5   )r   Agr+   r+   r,   !translateGroupOrUnionGraphPattern8  s   
r   c                 C  s   t | jt| jS ro   )r<   r:   r   r;   r   r+   r+   r,   translateGraphGraphPatternD  s   r   c                 C  s   t t| S ro   )r0   translateValuesr   r+   r+   r,   translateInlineDataH  r2   r   c                 C  s  | j dkrtt| d S | jsg | _t| j}g }| jD ])}|j dkrA|r-|d j dks3|t  |d d  t|j7  < q|| qt }|D ]}|j dkrmt|j	}|j dkrft
||j|j}qLt
||t}qL|j d	kr|t|t|j	d
}qL|j dkrt|t|d
}qL|j dkrt|t|d
}qL|j dkrt|t|d
}qL|j dkrt||d
}qL|j dv rt||d
}qL|j dkrt|t|j|j}qLtdt||j f |rt||d}|S )zB
    http://www.w3.org/TR/sparql11-query/#convertGraphPattern
    	SubSelectr   TriplesBlockr?   r=   OptionalGraphPatternrE   MinusGraphPatternr6   GroupOrUnionGraphPatternGraphGraphPattern
InlineDataServiceGraphPattern)r?   rI   Bindz*Unknown part in GroupGraphPattern: %s - %srF   )r   r0   	translater   r   r   r?   r=   r   r;   rC   r#   r$   r   r9   r8   r   r   r   rI   r   rH   r   typerE   )r   r   r   r#   Gr   r+   r+   r,   r   L  sN   













r   c                   @  s   e Zd ZdddZdS )StopTraversalrvboolc                 C  s
   || _ d S ro   )r   )selfr   r+   r+   r,   __init__  s   
zStopTraversal.__init__N)r   r   )__name__
__module____qualname__r   r+   r+   r+   r,   r     s    r   c                 C  r   ro   r+   r   r+   r+   r,   r         r   c                 C  r   ro   r+   r   r+   r+   r,   r     r   r   visitPreCallable[[Any], Any]r   c                   s   | }|dur
|S | du rdS t | ttfr! fdd| D S t | tr2t fdd| D S t | trH|  D ]\}}t| | |< q; | }|durR|S | S )m
    Traverse a parse-tree, visit each node

    if visit functions return a value, replace current node
    Nc                      g | ]}t | qS r+   	_traverser^   r   r   r+   r,   ra         z_traverse.<locals>.<listcomp>c                   r   r+   r   r^   r   r+   r,   ra     r   )r]   r   r   tupler   itemsr   )r   r   r   _ekvalr+   r   r,   r     s    


r   c                 C  r   ro   r+   )r   vr+   r+   r,   r     r   visitorCallable[[Any, Any], Any]c                   sf   g }t | tttfr fdd| D }nt | tr.|  D ]\}}|dur-|t|  q | |S )r   c                   s   g | ]}t | qS r+   )_traverseAggr^   r   r+   r,   ra         z _traverseAgg.<locals>.<listcomp>N)r]   r   r   r   r   r   r   r   )r   r   rK   r   r   r+   r   r,   r     s   

r   c                 C  r   ro   r+   r   r+   r+   r,   r     r   c                 C  r   ro   r+   r   r+   r+   r,   r     r   completeOptional[bool]c              
   C  sL   zt | ||}|dur|W S |W S  ty% } z	|jW  Y d}~S d}~ww )z
    Traverse tree, visit each node with visit function
    visit function may raise StopTraversal to stop traversal
    if complete!=None, it is returned on complete traversal,
    otherwise the transformed tree is returned
    N)r   r   r   )treer   r   r   rstr+   r+   r,   r     s   r   c                 C  s&   t | tr| jdrtddS dS )zL
    Traverse parse(sub)Tree
    return true if any aggregates are used
    
Aggregate_TN)r]   r   r   
startswithr   )r`   r+   r+   r,   _hasAggregate  s
   
r   Optional[Variable]c                 C  sD   t | tr| jdr ||  tdt| }|| d< |S dS dS )zR
    Collect Aggregates in A
    replaces aggregates with variable references
    r   
__agg_%d__rK   N)r]   r   r   r   r   r"   rf   )r   r   aggvarr+   r+   r,   _aggs  s   
r   Set[Variable]c                 C  sj   t | tr
||  t | tr1| jdkr|| j | S | jdkr3| jr/|dd | jD  | S dS dS )z&
    Find all variables in a tree
    r   r   c                 s      | ]	}|j p	|jV  qd S ro   rH   evarr_   r   r+   r+   r,   rc     rd   z_findVars.<locals>.<genexpr>N)r]   r"   rp   r   r   rH   
projectionupdate)r`   rK   r+   r+   r,   	_findVars  s   




r   childrenList[Set[Variable]]c                 C  s   t | tr
t| gS t | tra| jdkrt | d< | d S | jdkr8ttjdd t|| D t | d< | d S tttj|t | d< | jdkr]| j	rXtdd | j	D }|S t }|S | d S ttj|t S )	zE
    find which variables may be bound by this part of the query
    RelationalExpression_varsrI   c                 S  s   g | ]
\}}|d kr|qS )r$   r+   )r_   childr   r+   r+   r,   ra     s    z_addVars.<locals>.<listcomp>r   c                 s  r   ro   r   r   r+   r+   r,   rc      rd   z_addVars.<locals>.<genexpr>)
r]   r"   rt   r   r   r   operatoror_zipr   )r`   r   sr+   r+   r,   _addVars
  s,   






r  >typing.Union[CompValue, List[Expr], Expr, List[str], Variable]r   c                 C  s@   t | tr| jdr| S t | tr|| krtd| dS dS dS )zO
    For each unaggregated variable V in expr
    Replace V with Sample(V)
    r   Aggregate_SamplevarsN)r]   r   r   r   r"   )r   r   r+   r+   r,   _sample,  s
   r  c                 C  s   t | tr	t| S d S ro   )r]   r   simplifyFilters)r   r+   r+   r,   _simplifyFilters7  s   
r  qM1Tuple[CompValue, List[Tuple[Variable, Variable]]]c                 C  s  g }g }| j r)| j D ]}|jr(t|jtjt|jd|_t|jtjt|d|_q
t| jt	ddrCt| jt| _t| jtjt|d t| j
t	ddr]t| j
t| _
t| j
tjt|d | j r| j D ]"}|jrtdt|d  }|td|j|d	 |||jf qctd
||d|fS )N)r   )r   Tr   Fr   rs   r  )r  rK   AggregateJoin)r   r#   )r   r   r   r$   	functoolspartialr  r   havingr   orderbyrH   r"   rf   r   r   )r	  r
  Er   r   r   r+   r+   r,   translateAggregates<  s,   

r  c                 C  sz   g }| j s|S | js|S t| jd ts(| jD ]}|| j d |i qt|S | jD ]}|tt| j | q+t|S )Nr   )rH   valuer]   r   r   dictr   rO   )r   rK   r   valsr+   r+   r,   r   `  s   

r   *Tuple[Optional[CompValue], List[Variable]]c                 C  s  t | t t| jtd| _t }| jdkr)t| j}| jdu r%dt|fS d| _	nt| jt
jt|d t| j}d}| jrjg }| jjD ]}t|tr[|jdkr[t||j|j}|j}|| qDt||d}d	}n#t| jtdd
st| jtdd
stdd | jpg D rt|d}d	}|rt| |\}}ng }|D ]
\}}t|||}q| jrtt| jj |d}| jrt|t t!| jd}| jst"|D ]	}	|t|	j#O }qt|}
nCt }t }
| jD ]+}|jr||
vr|
|j q|j$r||
vr|
|j$ ||j|j$f qt%d|D ]\}}t|||}q| jr*t&|dd | jjD }t'||
}| j	rL| j	dkr@td|d}n| j	dkrLtd|d}| j(r}d}| j(j)dur_| j(j)* }| j(j+durvtd||| j(j+* d}||
fS td||d}||
fS )z=
    http://www.w3.org/TR/sparql11-query/#convertSolMod

    r   DescribeQueryNDISTINCTrN   FGroupAsr)   Tr  c                 s  s&    | ]}|j rt|jtd dV  qdS )Fr  N)r   r   r$   r   r^   r+   r+   r,   rc     s    
ztranslate.<locals>.<genexpr>r1   rF   r6   zI expected a var or evar here!c                 S  s   g | ]}t d |j|jdqS )OrderCondition)r$   order)r   r$   r  )r_   rz   r+   r+   r,   ra     s    ztranslate.<locals>.<listcomp>DistinctREDUCEDReducedr   Slice)r#   startlength)r#   r!  ),r   r  r   wherer   rt   r   rH   r   modifierr  r  r   r   groupby	conditionr]   r   rI   r$   r   rU   r  r   r  anyr   r  rE   r   valuesClauser8   r0   r   _find_first_child_projectionsrP   r   r   r(   rR   limitoffsetoffsettoPythonlimit)r	  VSr
  	aggregate
conditionsrz   aggregateAliasesaliasrH   child_projectionrP   r  r   r   r+  r+   r+   r,   r   u  s   









	r   Iterable[CompValue]c                 c  sD    |   D ]}t|tr|jdkr|V  qt|D ]}|V  qqdS )z
    Recursively find the first child instance of a Projection operation in each of
      the branches of the query execution plan/tree.
    rR   N)rM   r]   r   r   r)  )r
  child_opr3  r+   r+   r,   r)    s   

r)  r   c                 C  s   t | tr>| jdkr0| jjdkrt| jjdkr| jS | jjdkr,t| jjdkr.| jS dS dS | jdkr@t| j| d< | S dS dS )zRemove joins to empty BGPsr8   r?   r   r=   N)r]   r   r   r3   rf   r=   r4   r}   r   r+   r+   r,   r     s   


r   r   c                 C  s>   t | tr| jdkrt|| d< dS | jdv rdS t|S dS )z
    Some things can be lazily joined.
    This propegates whether they can up the tree
    and sets lazy flags for all joins
    r8   lazyF)r   r  T)r]   r   r   all)r   r   r+   r+   r,   analyse  s   


r8  r   baseOptional[str]initNsOptional[Mapping[str, Any]]Optional[Prologue]c                 C  s   |d u r
t  }d|_|r||_|r | D ]
\}}||| q| D ]}|jdkr.|j|_q"|jdkr>||j||j q"|S )N Base
PrefixDecl)r   r9  r   bindr   iriprefixr   )r#   r9  r;  r   r   r   r`   r+   r+   r,   translatePrologue1  s   


rD  quadsyTuple[List[Tuple[Identifier, Identifier, Identifier]], DefaultDict[str, List[Tuple[Identifier, Identifier, Identifier]]]]c                 C  sX   | j r	t | j }ng }tt}| jr(| jD ]}|j r'||j  t |j 7  < q||fS ro   )r=   ru   rv   r   quadsNotTriplesr:   )rE  
alltriplesallquadsr	  r+   r+   r,   translateQuadsJ  s   
rJ  uc                 C  s   | j dv rnV| j dv rnP| j dv r't| j\}}|| d< || d< | j dv r&	 n5| j dkrV| jr=t| jj\| jd< | jd< | jrNt| jj\| jd< | jd< t| j| d< ntd	|  || _| S )
N)LoadClearDropCreate)AddMoveCopy)
InsertData
DeleteDataDeleteWhererE  r=   )rU  rT  Modifyr#  z$Unknown type of update operation: %s)	r   rJ  rE  deleteinsertr   r#  r   r   )rK  r   ry   r	  r+   r+   r,   translateUpdate1a  s(   




rY  r   c                 C  s~   g }d}| j s	|S t| j| j D ])\}}t||||}t|tjt|dd}t|t	}t|t
d}|t|| qt||S )z=
    Returns a list of SPARQL Update Algebra expressions
    Nr   r   )requestr   r   rD  r   r  r  r   r   r  r   r   rY  r   )r	  r9  r;  rK   r   r#   rK  r+   r+   r,   translateUpdatey  s   	

r\  r   c           	      C  s   t | d ||}t| d tjt|dd| d< t| d \}}| d j}| d jdkrE| d jr7t	| d jnd}t
| d j|||d}nt
| d j|||d}t|td}t|td	 t|t t||S )
z|
    Translate a query-parsetree to a SPARQL Algebra Expression

    Return a rdflib.plugins.sparql.sparql.Query object
    r   rs   rZ  r   ConstructQueryN)r#   templatedatasetClause)r#   r_  rP   r   )rD  r   r  r  r   r   r_  r   r^  r=   r   r   r   r8  r  r   )	r	  r9  r;  r   PrP   r_  r^  rK   r+   r+   r,   translateQuery  s   



ra  c                   @  s   e Zd ZdS )ExpressionNotCoveredExceptionN)r   r   r   r+   r+   r+   r,   rb    s    rb  c                   @  sH   e Zd ZdZdddZ			ddddZdddZdd ZdddZdS )_AlgebraTranslatora  
    Translator of a Query's algebra to its equivalent SPARQL (string).

    Coded as a class to support storage of state during the translation process,
    without use of a file.

    Anticipated Usage:

    .. code-block:: python

        translated_query = _AlgebraTranslator(query).translateAlgebra()

    An external convenience function which wraps the above call,
    `translateAlgebra`, is supplied, so this class does not need to be
    referenced by client code at all in normal use.
    query_algebrar   c                 C  s   || _ tt| _d| _d S )Nr>  )rd  ru   rv   r   	aggr_vars_alg_translation)r   rd  r+   r+   r,   r     s   
z_AlgebraTranslator.__init__Nrs   oldrm   newsearch_from_matchsearch_from_match_occurrencerw   countc           
      C  sh   dd }|r)|r)|| j ||}| j d | }| j |d  |||}	||	 | _ d S | j |||| _ d S )Nc                 S  sR   |   |}|dkr'|dkr'|   ||t| }|d8 }|dkr'|dks|S )Nr   rs   )lowerfindrf   )haystackneedler   r!  r+   r+   r,   find_nth  s   z-_AlgebraTranslator._replace.<locals>.find_nth)rf  replace)
r   rg  rh  ri  rj  rk  rp  positionfiledata_prefiledata_postr+   r+   r,   _replace  s   z_AlgebraTranslator._replacenode_arg.typing.Union[Identifier, CompValue, Expr, str]r&   c                 C  s   t |tr|| j v r| j| d }|S | S t |tr(d|j d S t |tr4d|j d S t |t	r;|S t
d|)Nr   {},The expression {0} might not be covered yet.)r]   r   re  keysr   n3r   r   r   rm   rb  format)r   rv  grp_varr+   r+   r,   convert_node_arg  s   



z#_AlgebraTranslator.convert_node_argc           '   	     s  t |t
rY|jdkrd|jj d  _dES |jdkrFddd |jD } d|  jd	d
dd  jdddd  jdddd dES |jdkr_ dd|jj d |j	j d  dES |jdkrx dd|jj d |j	j d  dES |jdkrt |j
tr|j
j}ntd|jr|jjdkr dd|jj d   dd| d  dES  dd| d |jj d  dES  dd| d  dES |jdkr d d!|jj d" |j	j d  dES |jd#krd$|j  d% |jj d } d&| dES |jd'kr: j }|d(} j|j d) |j
 d* |j  d+ d(|d,  d-d|jj d  dES |jd.krVd|jj d/ |j	j d } d0| dES |jd1krg }|j
r|j
D ]}t |trv||  qetd d2d|jj d   dd3d4| d4  dES  d2d|jj d  dES |jdkr- d5d|jj d  |jD ]r}t |jtr|j }	ntd j|j |j |jd6d7 }
d}|jr|jd4 }|
d8kr |	d9| |j  d: |j  d+  n |	|
 d) |  |j d+   d; |j |j qdES |jd<krF d<d4 fd=d>|jD  dES |jd?kratd@  dAddBd |jD  dES |jdCkrktd|jdDkrg }|j
D ]*}t |j
tr|j
 }|jdEur|jd) | d+ }n|}|| qvtd dFd|jj d   dGd4|d4  dES |jdHkrg }|j D ]}t |tr||  qtdd}|jjdDkrdI} dJd4|d! |jj d d | d  dES |jdKkr dLdM|jj d  dES |jdNkr& dOdP|jj d  dES |jdQkrJdRt!|j" dS t!|j# } dTd|jj d |  dES |jdUkru|jjdVkre dWd!|jj d  dES  dWdX|jj d d  dES |jdYkr |j
}|j$}t t%t&|j'rd)dZ fd[d|j'D  d+ }n |j'}d\j|||d]} d^| dES |jd_krd` fdad>|j'D } db |j
d` |  dES |jdckrdd fded>|j'D } dfd) |j
 dd | d+  dES |jdgkr0 |j
}|}t(|j$D ]\}}||d4  |j'|  d4 7 }q dh| dES |jdikra |j
}|}t(|j$D ]\}}||d4  |j'|  d4 7 }qC dj| dES |jdkkru dldm |j
  dES |j)dnr |j*} dodp| d+  dES |j)dqr |j+} |j,}dr|j-j ds | dZ | d+ } dt| dES |j)dur׈ dvdwdZ fdxd|j*D  d+  dES |j)dyr dzd{|j.j d  t/|j. j0d| |j.S |j)d}rt|j.j  d~d|j.j d  t/|j. j0d| |j.S |j)dr8 dd |j- dZ  |j+ d+  dES |j)drO dd |j* d+  dES |j)drf dd |j* d+  dES |j)dr} dd |j* d+  dES |j)dr dd |j* d+  dES |j)dr dd |j* d+  dES |j)dr dd |j* d+  dES |j)drو dd |j* d+  dES |j)dr dd |j* d+  dES |j)dr dd |j* d+  dES |j)dr& dd |j- dZ  |j+ d+  dES |j)drE dd |j- dZ  |j+ d+  dES |j)drT dd dES |j)drc dd dES |j)drz dd |j* d+  dES |j)dr |j*|j"g}|j#r||j# ddZ| d+ } d| dES |j)dr dd |j* d+  dES |j)drӈ dd |j* d+  dES |j)dr dd |j- dZ  |j+ d+  dES |j)dr dd |j- dZ  |j+ d+  dES |j)dr0 dd |j- dZ  |j+ d+  dES |j)drO dd |j- dZ  |j+ d+  dES |j)d¡rn ddĈ |j- dZ  |j+ d+  dES |j)dšr ddǈ |j* d+  dES |j)dȡrdjdZ fdd|j*D dˍ} d| dES |j)d͡rĈ ddψ |j- dZ  |j+ d+  dES |j)dСr |j1 |j2g}ddZ| d+ } d| dES |j)dӡr ddՈ |j* dZ  |j2 dZ  |j3 d+  dES |jdkr% dd؈ |j* d+  dES |jdkr; ddۈ |j* d+  dES |jdkrQ ddވ |j* d+  dES |jdkrg dd |j* d+  dES |jdkru dd dES |jdkr dd dES |jdkr dd |j* d+  dES |jdkr dd |j* d+  dES |jdkrň dd |j* d+  dES |jdkrۈ dd |j* d+  dES |jdkr dd |j* d+  dES |jdk	r dd |j* d+  dES |jdk	r dd |j* d+  dES |jdk	r3 dd |j* d+  dES |jd k	rL dd |j* d+  dES |jdk	re dd |j* d+  dES |jdk	r~ dd |j* d+  dES |jd	k	r d
d |j* d+  dES |jdk	r dd |j* d+  dES |jdVk
r1g } |jd 4 D ]}!t |!t	r| |!  	qtd|!dd4|  d+ }"d}#|jD ]:}$g }%|$5 D ]%}&t |&t
r|%|&  	qt |&t!
r|%|& 	qtd|&|#d)d4|% d+ 7 }#	q dV|"d |# d  dES |jdk
r[ dd |j d |j.j d  t/|j. j0d| |j.S dES dES (  zl
         https://www.w3.org/TR/sparql11-query/#sparqlSyntax

        :param node:
        :return:
        SelectQueryz-*-SELECT-*- {ry  r?   r>  c                 s  @    | ]}|d    d |d    d |d    d V  qdS r    rs   re   .Nr|  r_   rV   r+   r+   r,   rc     s
    .
z7_AlgebraTranslator.sparql_query_text.<locals>.<genexpr>z{BGP}z-*-SELECT-*-SELECTr   )rk  z	{GroupBy}z{Having}r8   z{Join}rx  z}{rC   z
{LeftJoin}z}OPTIONAL{{z}}rE   z)This expression might not be covered yet.r  z{Filter}zHAVING({z})zFILTER({z}) {r5   z{Union}z{{z	}}UNION{{r<   zGRAPH z {{z{Graph}rI   z-*-select-*-(z as ))ri  rj  z{Extend}r9   z}MINUS{{z{Minus}rU   z{Group}z	GROUP BY r  z{AggregateJoin}_rs   GroupConcatzGROUP_CONCAT(z;SEPARATOR=z(SAMPLE({0}) as {0})GroupGraphPatternSubc                      g | ]}  |qS r+   r  )r_   patternr   r+   r,   ra     r   z8_AlgebraTranslator.sparql_query_text.<locals>.<listcomp>r   triplesblockz{TriplesBlock}c                 s  r  r  r  r  r+   r+   r,   rc     s    



ToListr(   Nz	{OrderBy}z{OrderConditions}rR   zORDER BY {OrderConditions}z	{Project}r  z
{Distinct}z
DISTINCT {r  z	{Reduced}z	REDUCED {r   zOFFSET z LIMIT z{Slice}r0   rM   z{ToMultiSet}z{-*-SELECT-*- {r   z, c                 3      | ]}  |V  qd S ro   r  r_   r$   r  r+   r,   rc         z{left} {operator} {right})leftr   rightz{RelationalExpression}ConditionalAndExpressionz && c                   r  r+   r  r  r  r+   r,   ra     r   z{ConditionalAndExpression}ConditionalOrExpressionz || c                   r  r+   r  r  r  r+   r,   ra     r   z{ConditionalOrExpression}MultiplicativeExpressionz{MultiplicativeExpression}AdditiveExpressionz{AdditiveExpression}UnaryNotz
{UnaryNot}!BOUNDz{Builtin_BOUND}zbound(IFzIF({z}, z{Builtin_IF}COALESCEz{Builtin_COALESCE}z	COALESCE(c                 3  r  ro   r  )r_   argr  r+   r,   rc   )  r  r   z{Builtin_EXISTS}z	EXISTS {{r   r   z{Builtin_NOTEXISTS}zNOT EXISTS {{sameTermz{Builtin_sameTerm}z	SAMETERM(Builtin_isIRIz{Builtin_isIRI}zisIRI(Builtin_isBLANKz{Builtin_isBLANK}zisBLANK(Builtin_isLITERALz{Builtin_isLITERAL}z
isLITERAL(Builtin_isNUMERICz{Builtin_isNUMERIC}z
isNUMERIC(Builtin_STRz{Builtin_STR}zSTR(Builtin_LANGz{Builtin_LANG}zLANG(Builtin_DATATYPEz{Builtin_DATATYPE}z	DATATYPE(Builtin_IRIz{Builtin_IRI}zIRI(Builtin_BNODEz{Builtin_BNODE}zBNODE(STRDTz{Builtin_STRDT}zSTRDT(Builtin_STRLANGz{Builtin_STRLANG}zSTRLANG(Builtin_UUIDz{Builtin_UUID}zUUID()Builtin_STRUUIDz{Builtin_STRUUID}z	STRUUID()Builtin_STRLENz{Builtin_STRLEN}zSTRLEN(Builtin_SUBSTRzSUBSTR(z{Builtin_SUBSTR}Builtin_UCASEz{Builtin_UCASE}zUCASE(Builtin_LCASEz{Builtin_LCASE}zLCASE(Builtin_STRSTARTSz{Builtin_STRSTARTS}z
STRSTARTS(Builtin_STRENDSz{Builtin_STRENDS}zSTRENDS(Builtin_CONTAINSz{Builtin_CONTAINS}z	CONTAINS(Builtin_STRBEFOREz{Builtin_STRBEFORE}z
STRBEFORE(Builtin_STRAFTERz{Builtin_STRAFTER}z	STRAFTER(Builtin_ENCODE_FOR_URIz{Builtin_ENCODE_FOR_URI}zENCODE_FOR_URI(Builtin_CONCATzCONCAT({vars})c                 3  r  ro   r  )r_   elemr  r+   r,   rc     r  r  z{Builtin_CONCAT}Builtin_LANGMATCHESz{Builtin_LANGMATCHES}zLANGMATCHES(REGEXzREGEX(z{Builtin_REGEX}REPLACEz{Builtin_REPLACE}zREPLACE(Builtin_ABSz{Builtin_ABS}zABS(Builtin_ROUNDz{Builtin_ROUND}zROUND(Builtin_CEILz{Builtin_CEIL}zCEIL(Builtin_FLOORz{Builtin_FLOOR}zFLOOR(Builtin_RANDz{Builtin_RAND}zRAND()Builtin_NOWz{Builtin_NOW}zNOW()Builtin_YEARz{Builtin_YEAR}zYEAR(Builtin_MONTHz{Builtin_MONTH}zMONTH(Builtin_DAYz{Builtin_DAY}zDAY(Builtin_HOURSz{Builtin_HOURS}zHOURS(Builtin_MINUTESz{Builtin_MINUTES}zMINUTES(Builtin_SECONDSz{Builtin_SECONDS}zSECONDS(Builtin_TIMEZONEz{Builtin_TIMEZONE}z	TIMEZONE(
Builtin_TZz{Builtin_TZ}zTZ(Builtin_MD5z{Builtin_MD5}zMD5(Builtin_SHA1z{Builtin_SHA1}zSHA1(Builtin_SHA256z{Builtin_SHA256}zSHA256(Builtin_SHA384z{Builtin_SHA384}zSHA384(Builtin_SHA512z{Builtin_SHA512}zSHA512(r   rz  zVALUES (r   z{ServiceGraphPattern}zSERVICE )6r]   r   r   r#   rf  joinr=   ru  r3   r4   r$   rb  r:   r|  rl  rk  rH   r  r   r   r   rK   re  r  splitdistinct	separatorupperr}  r   printr  rP   rm   r!  r"  opr   r   other	enumerateendswithr  arg2arg3arg1r;   r   sparql_query_texttextr  replacementr{  rM   )'r   noder=   r$   query_stringselect_occurrencesgroup_by_varsrH   agg_func
identifieragg_func_namer  order_conditionsrz   condproject_variablesorder_by_patternslicer  r  r&  inner_nodes	left_sidemultiplicationr{   r   addition	bound_varr  r  if_expressionargscolumnskeyrM   rowsr  rowr:   r+   r  r,   r    s  


















+




 

























        `z$_AlgebraTranslator.sparql_query_textc                 C  s   t | jj| jd | jS )Nr  )r   rd  algebrar  rf  r  r+   r+   r,   translateAlgebrax  s   z#_AlgebraTranslator.translateAlgebra)rd  r   )NNrs   )
rg  rm   rh  rm   ri  rm   rj  rw   rk  rw   )rv  rw  r&   rm   )r&   rm   )	r   r   r   __doc__r   ru  r  r  r  r+   r+   r+   r,   rc    s    

    vrc  rd  rm   c                 C  s   t | d }|S )z
    Translates a SPARQL 1.1 algebra tree into the corresponding query string.

    :param query_algebra: An algebra returned by `translateQuery`.
    :return: The query form generated from the SPARQL 1.1 algebra tree for
        SELECT queries.
    )rd  )rc  r  )rd  query_from_algebrar+   r+   r,   r  }  s   r  c                   sF   d fdd	 z | j  W d S  ty"   | D ]} | qY d S w )N    c                   sf   t | tst|  d S td| jf  | D ]}td||f dd  | | |d  qtd|  d S )Nz%s(z%s%s =r  )endr  z%s))r]   r   r  r   )r#   indr   ppr+   r,   r    s   
zpprintAlgebra.<locals>.pp)r  )r  AttributeError)r	  r`   r+   r  r,   pprintAlgebra  s   
r  )r#   r   r$   r%   r&   r   )r#   r.   r&   r   )r3   r   r4   r   r&   r   )r3   r   r4   r7   r&   r   )r:   r   r;   r   r&   r   ro   )r=   r>   r&   r   )r$   r   r#   r   r&   r   )r#   r   r$   rG   rH   r"   r&   r   )rK   rL   r&   r   )r#   r   rP   rQ   r&   r   )r#   r   r$   rT   r&   r   )rV   rW   rX   rY   rZ   r[   r&   r\   )rj   rk   r&   rl   )r~   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%   r&   r   )r   r   r&   r7   )r   r   r&   r   )r   r   r   r   r   r   )r   r   )r   r   r   r   r   r   r&   r   )r&   r   )r&   r   )rK   r   r&   r7   )r   r   r&   r   )r   r  r   r   r&   r7   )r   r   r&   r   )r	  r   r
  r   r&   r  )r   r   r&   r.   )r	  r   r&   r  )r
  r   r&   r4  )r   r   r&   r7   )r   r   r   r   r&   r   )NN)
r#   r   r9  r:  r;  r<  r   r=  r&   r   )rE  r   r&   rF  )rK  r   r   r   r&   r   )r	  r   r9  r:  r;  r<  r&   r   )r	  r   r9  r:  r;  r<  r&   r   )rd  r   r&   rm   )^
__future__r   ru   r  r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   	pyparsingr   rdflib.pathsr   r   r   r   r   r   rdflib.plugins.sparql.operatorsr   r   r   r  !rdflib.plugins.sparql.parserutilsr   r   rdflib.plugins.sparql.sparqlr   r   r   rdflib.termr   r   r    r!   r"   r(   r0   r5   r8   r9   r<   r?   rC   rE   rI   rO   rR   rU   ri   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)  r8  rD  rJ  rY  r\  ra  rb  rc  r  r  r+   r+   r+   r,   <module>   s    4 













1


-




@#



"


$
 




$     
D