
    i                        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 	 ddlZdZ G d	 d
e      Z G d de      Z G d de      ZddZ	 	 	 	 	 	 ddZy# e$ r dZdZY ;w xY w)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                      e Zd ZdddZy)JSONResultParserNc                0   |j                         }t        r!	 t        j                  |      }t        |      S t        |t              r|j                  d      }t        j                  |      }t        |      S # t        $ r}t        d|       d }~ww xY w)NzFailed to parse result: utf-8)read_HAS_ORJSONorjsonloads	Exceptionr   
isinstancebytesdecodejson
JSONResult)selfsourcecontent_typeinploadedes         XC:\Projects\mas-dev\.venv\Lib\site-packages\rdflib/plugins/sparql/results/jsonresults.pyparsezJSONResultParser.parse   s    kkmFc* &!! #u%jj)ZZ_F&!!  F%(@&DEEFs   A9 9	BBBN)r"   r   r#   zOptional[str]returnr
   )__name__
__module____qualname__r(        r'   r   r      s    "r/   r   c                  &    e Zd ZddZdddZddZy)	JSONResultSerializerc                0    t        j                  | |       y r)   )r   __init__)r!   results     r'   r3   zJSONResultSerializer.__init__.   s    !!$/r/   Nc                   i }| j                   j                  dk(  ri |d<   | j                   j                  |d<   n_i |d<   i |d<   | j                   j                  |d   d<   | j                   j                  D cg c]  }| j                  |       c}|d   d<   t        r\	 t        j                  |t        j                        }|	 |j                  |       y |j                  |j                  d	             y t!        j                  |d
d
      }|"	 |j                  |j#                  |             y |j                  |       y c c}w # t        $ r}t        d|       d }~ww xY w# t        t        f$ r# |j                  |j                  d	             Y y w xY w# t        t        f$ r |j                  |       Y y w xY w)NASKheadbooleanresultsvarsbindings)optionzFailed to serialize result: r   F)	allow_nanensure_ascii)r4   type	askAnswerr:   r;   _bindingToJSONr   r   dumpsOPT_NON_STR_KEYSr   r   write	TypeError
ValueErrorr   r   encode)r!   streamencodingresxr_bytesr&   r_strs           r'   	serializezJSONResultSerializer.serialize2   s    ;;u$CK![[22C	N  C	NCK"&++"2"2CK040D0D*0D1##A&0D*C	N:& J ,,s63J3JK #:LL) W^^G45JJse%HE#(LLh!78 U#3*  J%(DQC&HIIJ ":. :LL!89: ":. (LL'(sB   9E
!%E 	E.  F# 	E+E&&E+./F F # GGc                `    i }|D ]&  }t        | ||         }|t        | ||         ||<   ( |S r)   )
termToJSON)r!   brJ   varjs        r'   rA   z#JSONResultSerializer._bindingToJSONW   sA    C43(A}%dAcF3C  
r/   )r4   r
   r)   )rH   r   rI   strr*   None)rQ   zMapping[Variable, Identifier]r*   zDict[Variable, Any])r+   r,   r-   r3   rN   rA   r.   r/   r'   r1   r1   -   s    0#$Jr/   r1   c                      e Zd ZddZddZy)r    c                   || _         d|v rd}nd|v rd}nt        d      t        j                  | |       |dk(  rt	        |d         | _        y | j                         | _        |d   d   D cg c]  }t        |       c}| _	        y c c}w )Nr8   r6   r9   SELECTzNo boolean or results in json!r7   r:   )
r   r   r
   r3   boolr@   _get_bindingsr;   r   r:   )r!   r   type_rK   s       r'   r3   zJSONResult.__init__a   s    	E$E!"BCCe$E>!$y/2DN ..0DM.26l6.BC.B!.BCDICs   /B
c                    g }| j                   d   d   D ]D  }i }|j                         D ]  \  }}t        |      |t        |      <    |j	                  |       F |S )Nr9   r;   )r   itemsparseJsonTermr   append)r!   retrowoutRowkvs         r'   rZ   zJSONResult._get_bindingsr   s^    >@99Y'
3C13F		1&3A&6x{# $JJv	 4
 
r/   N)r   zDict[str, Any])r*   z.MutableSequence[Mapping[Variable, Identifier]])r+   r,   r-   r3   rZ   r.   r/   r'   r    r    `   s    D"r/   r    c                   | d   }|dk(  rt        | d         S |dk(  r/t        | d   | j                  d      | j                  d            S |dk(  rt        | d   t        | d         	      S |d
k(  rt        | d         S t	        d|z        )zrdflib object (Literal, URIRef, BNode) for the given json-format dict.

    input is like:
      { 'type': 'uri', 'value': 'http://famegame.com/2006/01/username' }
      { 'type': 'literal', 'value': 'drewp' }
    r?   urivalueliteraldatatypexml:lang)ri   langztyped-literal)ri   bnodezjson term type %r)r   r   getr   NotImplementedError)dts     r'   r^   r^   |   s     	
&	AEzaj!!	
iqzAEE*,=AEE*DUVV	
o	qzF1Z=,ABB	
gQwZ  !"5"9::r/   c                t   t        |t              rdt        |      dS t        |t              rOdt        |      d}|j                  t        |j                        |d<   |j
                  |j
                  |d<   |S t        |t              rdt        |      dS |y t        d|dt        |      d	      )
Nrf   )r?   rg   rh   ri   rj   rl   zUnknown term type: z ())	r   r   rT   r   ri   languager   r   r?   )r!   termrs      r'   rP   rP      s     $D	22	D'	"T3==$.AjM==$ MMAjM	D%	 #d)44	dDJOPPr/   )ro   zDict[str, str]r*   r   )r!   r1   rt   zOptional[Identifier]r*   zOptional[Dict[str, str]])__doc__
__future__r   r   typingr   r   r   r   r   r	   rdflib.queryr
   r   r   r   rdflib.termr   r   r   r   r   r   r   ImportErrorr   r1   r    r^   rP   r.   r/   r'   <module>r|      s   	 #  D D P P D DK"| " 0+ 0f 8;*Q
Q&:QQs  FKs   A. .	A:9A: