o
    mi
                     @  sR  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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Z0dddZ1dddZ2dd#d$Z3	ddd'd(Z4dd)d*Z5dd,d-Z6dd1d2Z7dd5d6Z8dd9d:Z9ddd<d=Z:ddEdFZ;ddJdKZ<ddNd%Z=ddSdTZ>eddWdXZ?eddZdXZ?dd]dXZ?dd`daZ@ddddeZAddgdhZBddidjZCddkdlZDddmdnZEG dodp dpeFZGdqdr dsdr fddxdyZHdzdr fdd}d~ZIddr ddr dfdddZJdddZKdddZLdddZMdddZNddddZOdddZPdddZQdddZRdddZSdddZTdddZdddZU		ddddZVdddZWdddZX		ddddZY		ddddZZG dd deFZ[G dd dZ\dddƄZ]dddȄZ^dS )z
Converting the 'parse-tree' output of pyparsing to a SPARQL Algebra expression

http://www.w3.org/TR/sparql11-query/#sparqlQuery
    )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+   W/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/algebra.pyr(   0      r(   2typing.Union[List[Dict[Variable, str]], CompValue]c                 C     t d| dS )N
ToMultiSetr#   r*   r1   r+   r+   r,   r0   4      r0   p1p2c                 C  r'   )NUnionr3   r4   r*   r6   r+   r+   r,   r5   8   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   @   r-   r9   termr   graphc                 C  r'   )NGraph)r:   r#   r*   )r:   r;   r+   r+   r,   r<   D   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?   H      r?   c                 C     t d| ||dS )NLeftJoinr3   r4   r$   r*   rD   r+   r+   r,   rC   N   s   rC   r   c                 C  r'   )NFilterr$   r#   r*   rF   r+   r+   r,   rE   R   r-   rE   typing.Union[Identifier, Expr]varr"   c                 C  rB   )NExtendr#   r$   rH   r*   rJ   r+   r+   r,   rI   V   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   `   r-   rR   Optional[List[Variable]]c                 C  r'   )NGroupr)   r*   r)   r+   r+   r,   rU   d   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>o   s
    z_knownTerms.<locals>.<listcomp>c                 3  s    | ]	}  |d V  qdS )r   N)getr^   )rZ   r+   r,   	<genexpr>u       z_knownTerms.<locals>.<genexpr>   )lensumr]   r    )rV   rX   rZ   r+   rZ   rX   r,   _knownTermsh   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,   reorderTriplesz   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^   Z_lr+   r,   rc      s   , ztriples.<locals>.<genexpr>)r   rf   	Exceptionr}   range)r~   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
    Z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   r   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
    ZPathAlternativers   r   ZPathSequenceZPathEltzDenkfehler!ZPathEltOrInverseZ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;   Z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 )zFILTER 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,   !translateGroupOrUnionGraphPattern/  s   
r   c                 C  s   t | jt| jS ro   )r<   r:   r   r;   r   r+   r+   r,   translateGraphGraphPattern;  s   r   c                 C  s   t t| S ro   )r0   translateValuesr   r+   r+   r,   translateInlineData?  r2   r   c                 C  s  | j r| S | jdkrtt| d S | jsg | _t| j}g }| jD ])}|jdkrF|r2|d jdks8|t  |d d  t|j7  < q"|| q"t }|D ]}|jdkrrt	|j
}|jdkrkt||j|j}qQt||t}qQ|jd	krt|t	|j
d
}qQ|jdkrt|t|d
}qQ|jdkrt|t|d
}qQ|jdkrt|t|d
}qQ|jdkrt||d
}qQ|jdv rt||d
}qQ|jdkrt|t|j|j}qQtdt||jf |rt||d}d|_ |S )zB
    http://www.w3.org/TR/sparql11-query/#convertGraphPattern
    	SubSelectr   TriplesBlockr?   r=   ZOptionalGraphPatternrE   ZMinusGraphPatternr6   ZGroupOrUnionGraphPatternZGraphGraphPatternZ
InlineDataServiceGraphPattern)r?   rI   Bindz*Unknown part in GroupGraphPattern: %s - %srF   T)Z
translatedr   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   C  sT   













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 )zhTraverse 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 )zm
    Traverse a parse-tree, visit each node

    if visit functions return a value, replace current node
    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   Z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
    RelationalExpressionZ_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,   _simplifyFilters2  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,   translateAggregates7  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   ZDescribeQueryNZDISTINCTrN   FZ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 )ZOrderCondition)r$   order)r   r$   r  )r_   rz   r+   r+   r,   ra     s    ztranslate.<locals>.<listcomp>DistinctZ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   ZvaluesClauser8   r0   r   _find_first_child_projectionsrP   r   r   r(   rR   ZlimitoffsetoffsetZtoPythonlimit)r   ZVSr   Z	aggregate
conditionsrz   ZaggregateAliasesaliasrH   child_projectionrP   r  r   r   r  r+   r+   r,   r   p  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   Zchild_opr  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   ZlazyF)r  r	  T)r]   r   r   all)r   r   r+   r+   r,   analyse  s   


r  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 ZBaseZ
PrefixDecl)r   r  r   bindr   Ziriprefixr   )r#   r  r  r   r   r   r`   r+   r+   r,   translatePrologue+  s   


r$  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   ZquadsNotTriplesr:   )r%  Z
alltriplesZallquadsr   r+   r+   r,   translateQuadsD  s   
r'  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)LoadZClearZDropZCreate)AddZMoveZCopy)Z
InsertData
DeleteDataDeleteWherer%  r=   )r,  r+  ZModifyr  z$Unknown type of update operation: %s)	r   r'  r%  deleteinsertr   r  r   r   )r(  r   ry   r   r+   r+   r,   translateUpdate1[  s(   




r/  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   r$  r   r   r   r   r   r   r   r   r/  r   )r   r  r  rK   r   r#   r(  r+   r+   r,   translateUpdates  s   	

r2  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   r0  r   ZConstructQueryN)r#   templatedatasetClause)r#   r4  rP   r   )r$  r   r   r   r   r   r4  r   r3  r=   r   r   r   r  r   r   )	r   r  r  r   PrP   r4  r3  rK   r+   r+   r,   translateQuery  s   



r6  c                   @  s   e Zd ZdS )ExpressionNotCoveredExceptionN)r   r   r   r+   r+   r+   r,   r7    s    r7  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:

    ```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!  )r9  ru   rv   r   	aggr_vars_alg_translation)r   r9  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   )Zhaystackneedler   r  r+   r+   r,   find_nth  s   z-_AlgebraTranslator._replace.<locals>.find_nth)r;  replace)
r   r<  r=  r>  r?  r@  rD  positionZfiledata_preZfiledata_postr+   r+   r,   _replace  s   z_AlgebraTranslator._replacenode_arg.typing.Union[Identifier, CompValue, Expr, str]r&   c                 C  sl   t |tr|| j v r| j| d }|S | S t |tr(d|j d S t |tr/|S t	d
|)Nr   {},The expression {0} might not be covered yet.)r]   r   r:  keysr   n3r   r   rm   r7  format)r   rH  Zgrp_varr+   r+   r,   convert_node_arg  s   


z#_AlgebraTranslator.convert_node_argc           '   	     s  t |t
rN|jdkrd|jj d  _dDS |jdkrFddd |jD } d|  jd	d
dd  jdddd  jdddd dDS |jdkr_ dd|jj d |j	j d  dDS |jdkrx dd|jj d |j	j d  dDS |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  dDS  dd| d |jj d  dDS  dd| d  dDS |jdkr d d!|jj d" |j	j d  dDS |jd#krd$|j  d% |jj d } d&| dDS |jd'kr: j }|d(} j|j d) |j
 d* |j  d+ d(|d,  d-d|jj d  dDS |jd.krVd|jj d/ |j	j d } d0| dDS |jd1krg }|j
r|j
D ]}t |trv||  qetd d2d|jj d   dd3d4| d4  dDS  d2d|jj d  dDS |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 qdDS |jd<krF d<d4 fd=d>|jD  dDS |jd?kr] d@ddAd |jD  dDS |jdBkrgtd|jdCkrg }|j
D ]*}t |j
tr|j
 }|jdDur|jd) | d+ }n|}|| qrtd dEd|jj d   dFd4|d4  dDS |jdGkrg }|jD ]}t |tr||  qtdd}|jjdCkrdH} dId4|d! |jj d d | d  dDS |jdJkr dKdL|jj d  dDS |jdMkr" dNdO|jj d  dDS |jdPkrFdQt |j! dR t |j" } dSd|jj d |  dDS |jdTkrq|jjdUkra dVd!|jj d  dDS  dVdW|jj d d  dDS |jdXkr |j
}|j#}t t$t%|j&rd)dY fdZd|j&D  d+ }n |j&}d[j|||d\} d]| dDS |jd^krd_ fd`d>|j&D } da |j
d_ |  dDS |jdbkrdc fddd>|j&D } ded) |j
 dc | d+  dDS |jdfkr, |j
}|}t'|j#D ]\}}||d4  |j&|  d4 7 }q dg| dDS |jdhkr] |j
}|}t'|j#D ]\}}||d4  |j&|  d4 7 }q? di| dDS |jdjkrq dkdl |j
  dDS |j(dmr |j)} dndo| d+  dDS |j(dpr |j*} |j+}dq|j,j dr | dY | d+ } ds| dDS |j(dtrӈ dudvdY fdwd|j)D  d+  dDS |j(dxr dydz|j-j d  t.|j- j/d{ |j-S |j(d|r d}d~|j-j d  t.|j- j/d{ |j-S |j(dr. dd |j, dY  |j* d+  dDS |j(drE dd |j) d+  dDS |j(dr\ dd |j) d+  dDS |j(drs dd |j) d+  dDS |j(dr dd |j) d+  dDS |j(dr dd |j) d+  dDS |j(dr dd |j) d+  dDS |j(drψ dd |j) d+  dDS |j(dr dd |j) d+  dDS |j(dr dd |j) d+  dDS |j(dr dd |j, dY  |j* d+  dDS |j(dr; dd |j, dY  |j* d+  dDS |j(drJ dd dDS |j(drY dd dDS |j(drp dd |j) d+  dDS |j(dr |j)|j!g}|j"r||j" ddY| d+ } d| dDS |j(dr dd |j) d+  dDS |j(drɈ dd |j) d+  dDS |j(dr dd |j, dY  |j* d+  dDS |j(dr dd |j, dY  |j* d+  dDS |j(dr& dd |j, dY  |j* d+  dDS |j(drE dd |j, dY  |j* d+  dDS |j(drd ddÈ |j, dY  |j* d+  dDS |j(dġr{ ddƈ |j) d+  dDS |j(dǡrdjdY fdd|j)D dʍ} d| dDS |j(d̡r ddΈ |j, dY  |j* d+  dDS |j(dϡrވ |j0 |j1g}ddY| d+ } d| dDS |j(dҡr ddԈ |j) dY  |j1 dY  |j2 d+  dDS |jdkr dd׈ |j) d+  dDS |jdkr1 ddڈ |j) d+  dDS |jdkrG dd݈ |j) d+  dDS |jdkr] dd |j) d+  dDS |jdkrk dd dDS |jdkry dd dDS |jdkr dd |j) d+  dDS |jdkr dd |j) d+  dDS |jdkr dd |j) d+  dDS |jdkrш dd |j) d+  dDS |jdkr dd |j) d+  dDS |jdkr dd |j) d+  dDS |jdk	r dd |j) d+  dDS |jdk	r) dd |j) d+  dDS |jdk	rA d d |j) d+  dDS |jdk	rZ dd |j) d+  dDS |jdk	rs dd |j) d+  dDS |jdk	r d	d
 |j) d+  dDS |jdk	r dd |j) d+  dDS |jdUk
r&g } |jd 3 D ]}!t |!t	r| |!  	qtd|!dd4|  d+ }"d}#|jD ]:}$g }%|$4 D ]%}&t |&t	r|%|&  	qt |&t 
r|%|& 	qtd|&|#d)d4|% d+ 7 }#	q݈ dU|"d |# d  dDS |jdk
rP dd |j d |j-j d  t.|j- j/d{ |j-S dDS dDS (  z4<https://www.w3.org/TR/sparql11-query/#sparqlSyntax>ZSelectQueryz-*-SELECT-*- {rK  r?   r!  c                 s  @    | ]}|d    d |d    d |d    d V  qdS r    rs   re   .NrN  r_   rV   r+   r+   r,   rc     s
    .
z7_AlgebraTranslator.sparql_query_text.<locals>.<genexpr>z{BGP}z-*-SELECT-*-ZSELECTr   )r@  z	{GroupBy}z{Having}r8   z{Join}rJ  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 ))r>  r?  z{Extend}r9   z}MINUS{{z{Minus}rU   z{Group}z	GROUP BY rS  z{AggregateJoin}_rs   ZGroupConcatzGROUP_CONCAT(z;SEPARATOR=z(SAMPLE({0}) as {0})ZGroupGraphPatternSubc                      g | ]}  |qS r+   rP  )r_   patternr   r+   r,   ra     r   z8_AlgebraTranslator.sparql_query_text.<locals>.<listcomp>r   z{TriplesBlock}c                 s  rQ  rR  rU  rV  r+   r+   r,   rc     s    



Z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}ZConditionalAndExpressionz && c                   rZ  r+   r[  r_  r]  r+   r,   ra     r   z{ConditionalAndExpression}ZConditionalOrExpressionz || c                   rZ  r+   r[  r_  r]  r+   r,   ra     r   z{ConditionalOrExpression}ZMultiplicativeExpressionz{MultiplicativeExpression}ZAdditiveExpressionz{AdditiveExpression}ZUnaryNotz
{UnaryNot}!ZBOUNDz{Builtin_BOUND}zbound(ZIFzIF({z}, z{Builtin_IF}Z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 {{ZsameTermz{Builtin_sameTerm}z	SAMETERM(ZBuiltin_isIRIz{Builtin_isIRI}zisIRI(ZBuiltin_isBLANKz{Builtin_isBLANK}zisBLANK(ZBuiltin_isLITERALz{Builtin_isLITERAL}z
isLITERAL(ZBuiltin_isNUMERICz{Builtin_isNUMERIC}z
isNUMERIC(ZBuiltin_STRz{Builtin_STR}zSTR(ZBuiltin_LANGz{Builtin_LANG}zLANG(ZBuiltin_DATATYPEz{Builtin_DATATYPE}z	DATATYPE(ZBuiltin_IRIz{Builtin_IRI}zIRI(ZBuiltin_BNODEz{Builtin_BNODE}zBNODE(ZSTRDTz{Builtin_STRDT}zSTRDT(ZBuiltin_STRLANGz{Builtin_STRLANG}zSTRLANG(ZBuiltin_UUIDz{Builtin_UUID}zUUID()ZBuiltin_STRUUIDz{Builtin_STRUUID}z	STRUUID()ZBuiltin_STRLENz{Builtin_STRLEN}zSTRLEN(ZBuiltin_SUBSTRzSUBSTR(z{Builtin_SUBSTR}ZBuiltin_UCASEz{Builtin_UCASE}zUCASE(ZBuiltin_LCASEz{Builtin_LCASE}zLCASE(ZBuiltin_STRSTARTSz{Builtin_STRSTARTS}z
STRSTARTS(ZBuiltin_STRENDSz{Builtin_STRENDS}zSTRENDS(ZBuiltin_CONTAINSz{Builtin_CONTAINS}z	CONTAINS(ZBuiltin_STRBEFOREz{Builtin_STRBEFORE}z
STRBEFORE(ZBuiltin_STRAFTERz{Builtin_STRAFTER}z	STRAFTER(ZBuiltin_ENCODE_FOR_URIz{Builtin_ENCODE_FOR_URI}zENCODE_FOR_URI(ZBuiltin_CONCATzCONCAT({vars})c                 3  r^  ro   r[  )r_   elemr]  r+   r,   rc     r`  r   z{Builtin_CONCAT}ZBuiltin_LANGMATCHESz{Builtin_LANGMATCHES}zLANGMATCHES(REGEXzREGEX(z{Builtin_REGEX}ZREPLACEz{Builtin_REPLACE}zREPLACE(ZBuiltin_ABSz{Builtin_ABS}zABS(ZBuiltin_ROUNDz{Builtin_ROUND}zROUND(ZBuiltin_CEILz{Builtin_CEIL}zCEIL(ZBuiltin_FLOORz{Builtin_FLOOR}zFLOOR(ZBuiltin_RANDz{Builtin_RAND}zRAND()ZBuiltin_NOWz{Builtin_NOW}zNOW()ZBuiltin_YEARz{Builtin_YEAR}zYEAR(ZBuiltin_MONTHz{Builtin_MONTH}zMONTH(ZBuiltin_DAYz{Builtin_DAY}zDAY(ZBuiltin_HOURSz{Builtin_HOURS}zHOURS(ZBuiltin_MINUTESz{Builtin_MINUTES}zMINUTES(ZBuiltin_SECONDSz{Builtin_SECONDS}zSECONDS(ZBuiltin_TIMEZONEz{Builtin_TIMEZONE}z	TIMEZONE(Z
Builtin_TZz{Builtin_TZ}zTZ(ZBuiltin_MD5z{Builtin_MD5}zMD5(ZBuiltin_SHA1z{Builtin_SHA1}zSHA1(ZBuiltin_SHA256z{Builtin_SHA256}zSHA256(ZBuiltin_SHA384z{Builtin_SHA384}zSHA384(ZBuiltin_SHA512z{Builtin_SHA512}zSHA512(r   rL  zVALUES (r   z{ServiceGraphPattern}zSERVICE )5r]   r   r   r#   r;  joinr=   rG  r3   r4   r$   r7  r:   rN  rA  r@  rH   rP  r   r   r   rK   r:  r   splitdistinct	separatorupperrO  r   r  rP   rm   r  r  opr   r   other	enumerateendswithrd  arg2arg3Zarg1r;   r   sparql_query_texttextr\  replacementrM  rM   )'r   noder=   r$   Zquery_stringZselect_occurrencesZgroup_by_varsrH   Zagg_func
identifierZagg_func_namerj  Zorder_conditionsrz   ZcondZproject_variablesZorder_by_patternslicerm  rn  r  Zinner_nodesZ	left_sideZmultiplicationr{   r   ZadditionZ	bound_varrq  rr  Zif_expressionargscolumnskeyrM   rowsrf  rowr:   r+   r]  r,   rs    s  


















+




 

























        ^z$_AlgebraTranslator.sparql_query_textc                 C  s   t | jj| jd | jS )Nre  )r   r9  algebrars  r;  r]  r+   r+   r,   translateAlgebraf  s   z#_AlgebraTranslator.translateAlgebra)r9  r   )NNrs   )
r<  rm   r=  rm   r>  rm   r?  rw   r@  rw   )rH  rI  r&   rm   )r&   rm   )	r   r   r   __doc__r   rG  rP  rs  r  r+   r+   r+   r,   r8    s    

    or8  r9  rm   c                 C  s   t | d }|S )a  
    Translates a SPARQL 1.1 algebra tree into the corresponding query string.

    Args:
        query_algebra: An algebra returned by `translateQuery`.

    Returns:
        The query form generated from the SPARQL 1.1 algebra tree for
            SELECT queries.
    )r9  )r8  r  )r9  Zquery_from_algebrar+   r+   r,   r  k  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 =rS  )endr  z%s))r]   r   printr   )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   )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&   r  )r   r   r&   r7   )r   r   r   r   r&   r   )NN)
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   )r9  r   r&   rm   )_r  
__future__r   ru   r   r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   Z	pyparsingr   Zrdflib.pathsr   r   r   r   r   r   Zrdflib.plugins.sparql.operatorsr   r   r   r   Z!rdflib.plugins.sparql.parserutilsr   r   Zrdflib.plugins.sparql.sparqlr   r   r   Z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  r  r$  r'  r/  r2  r6  r7  r8  r  r  r+   r+   r+   r,   <module>   s    4 













1


-




H 



"


$
 




$     
8