o
    
i&                     @  s   d Z ddlmZ ddlZddl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mZmZ zddlZdZW n eyK   dZdZY nw G d	d
 d
eZG dd deZG dd deZdddZdddZdS )zA Serializer for SPARQL results in JSON:

http://www.w3.org/TR/rdf-sparql-json-res/

Bits and pieces borrowed from:
http://projects.bigasterisk.com/sparqlhttp/

Authors: Drew Perttula, Gunnar Aastrand Grimnes
    )annotationsN)IOAnyDictMappingMutableSequenceOptional)ResultResultExceptionResultParserResultSerializer)BNode
IdentifierLiteralURIRefVariableTFc                   @  s   e Zd ZdZddd	d
ZdS )JSONResultParserz0Parses SPARQL JSON results into a Result object.Nsourcer   content_typeOptional[str]returnr	   c              
   C  sn   |  }tr$z
t|}W t
|S  ty# } ztd| d }~ww t|tr.|d}t	|}t
|S )NzFailed to parse result: utf-8)read_HAS_ORJSONorjsonloads	Exceptionr
   
isinstancebytesdecodejson
JSONResult)selfr   r   inploadede r&   ]/home/ubuntu/.local/lib/python3.10/site-packages/rdflib/plugins/sparql/results/jsonresults.pyparse    s   


zJSONResultParser.parseN)r   r   r   r   r   r	   )__name__
__module____qualname____doc__r(   r&   r&   r&   r'   r      s    r   c                   @  s0   e Zd ZdZdddZddddZdddZdS )JSONResultSerializerz)Serializes SPARQL results to JSON format.resultr	   c                 C  s   t | | d S r)   )r   __init__)r"   r/   r&   r&   r'   r0   1   s   zJSONResultSerializer.__init__Nstreamr   encodingstrr   Nonec              
     sZ  i } j jdkri |d<  j j|d< ni |d< i |d<  j j|d d<  fdd j jD |d d< tr}z
tj|tjd	}W n t	yQ } zt
d
| d }~ww |d ursz|| W d S  ttfyr   ||d Y d S w ||d d S tj|ddd}|d urz||| W d S  ttfy   || Y d S w || d S )NASKheadbooleanresultsvarsc                   s   g | ]}  |qS r&   )_bindingToJSON.0xr"   r&   r'   
<listcomp>?   s    
z2JSONResultSerializer.serialize.<locals>.<listcomp>bindings)optionzFailed to serialize result: r   F)	allow_nanensure_ascii)r/   type	askAnswerr9   r@   r   r   dumpsOPT_NON_STR_KEYSr   r
   write	TypeError
ValueErrorr   r    encode)r"   r1   r2   resr_bytesr%   r_strr&   r>   r'   	serialize5   s@   
zJSONResultSerializer.serializebMapping[Variable, Identifier]Dict[Variable, Any]c                 C  s:   i }|D ]}t | || }|d urt | || ||< q|S r)   )
termToJSON)r"   rP   rL   varjr&   r&   r'   r:   Z   s   z#JSONResultSerializer._bindingToJSON)r/   r	   r)   )r1   r   r2   r3   r   r4   )rP   rQ   r   rR   )r*   r+   r,   r-   r0   rO   r:   r&   r&   r&   r'   r.   .   s
    
%r.   c                   @  s    e Zd Zd
ddZdddZd	S )r!   r    Dict[str, Any]c                 C  sv   || _ d|v r
d}nd|v rd}ntdt| | |dkr(t|d | _d S |  | _dd |d d	 D | _d S )
Nr7   r5   r8   SELECTzNo boolean or results in json!c                 S  s   g | ]}t |qS r&   )r   r;   r&   r&   r'   r?   s   s    z'JSONResult.__init__.<locals>.<listcomp>r6   r9   )	r    r
   r	   r0   boolrE   _get_bindingsr@   r9   )r"   r    type_r&   r&   r'   r0   d   s   
zJSONResult.__init__r   .MutableSequence[Mapping[Variable, Identifier]]c                 C  sL   g }| j d d D ]}i }| D ]\}}t||t|< q|| q	|S )Nr8   r@   )r    itemsparseJsonTermr   append)r"   retrowoutRowkvr&   r&   r'   rY   u   s   zJSONResult._get_bindingsN)r    rV   )r   r[   )r*   r+   r,   r0   rY   r&   r&   r&   r'   r!   c   s    
r!   dDict[str, str]r   r   c                 C  s   | d }|dkrt | d S |dkr!t| d | d| ddS |dkr1t| d t | d d	S |d
kr;t| d S td| )zrdflib object (Literal, URIRef, BNode) for the given json-format dict.

    input is like:

    ```json
    { 'type': 'uri', 'value': 'http://famegame.com/2006/01/username' }
    { 'type': 'literal', 'value': 'drewp' }
    ```
    rD   urivalueliteraldatatypexml:lang)ri   langztyped-literal)ri   bnodezjson term type %r)r   r   getr   NotImplementedError)rd   tr&   r&   r'   r]      s   r]   r"   termOptional[Identifier]Optional[Dict[str, str]]c                 C  s   t |trdt|dS t |tr0dt|d}|jd ur$t|j|d< |jd ur.|j|d< |S t |tr<dt|dS |d u rBd S td|t|f )Nrf   )rD   rg   rh   ri   rj   rl   zUnknown term type: %s (%s))	r   r   r3   r   ri   languager   r
   rD   )r"   rp   rr&   r&   r'   rS      s   





rS   )rd   re   r   r   )r"   r.   rp   rq   r   rr   )r-   
__future__r   r    typingr   r   r   r   r   r   rdflib.queryr	   r
   r   r   rdflib.termr   r   r   r   r   r   r   ImportErrorr   r.   r!   r]   rS   r&   r&   r&   r'   <module>   s$    
 5
