o
    mi                     @  s   d Z ddlmZ ddlZddlZddlmZmZ ddl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 ddlmZmZmZmZmZ G d	d
 d
eZG dd deZdS )z
This module implements a parser and serializer for the CSV SPARQL result
formats

http://www.w3.org/TR/sparql11-results-csv-tsv/
    )annotationsN)BufferedIOBase
TextIOBase)IODictListOptionalUnioncast)SPARQLResult)ResultResultParserResultSerializer)BNode
IdentifierLiteralURIRefVariablec                   @  s8   e Zd ZdZdd ZddddZdddZdddZdS )CSVResultParserz/Parses SPARQL CSV results into a Result object.c                 C  s
   d| _ d S )N,)delimself r   b/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/results/csvresults.py__init__   s   
zCSVResultParser.__init__Nsourcer   content_typeOptional[str]returnr   c                 C  st   t d}t|dtrtd|}tj|| jd}dd t	|D |_
g |_|D ]}|j| ||j
 q*|S )NSELECTr   utf-8	delimiterc                 S  s   g | ]}t |qS r   )r   ).0xr   r   r   
<listcomp>%   s    z)CSVResultParser.parse.<locals>.<listcomp>)r   
isinstancereadbytescodecs	getreadercsvreaderr   nextvarsbindingsappendparseRow)r   r   r   rr-   rowr   r   r   parse   s   zCSVResultParser.parser4   	List[str]vList[Variable]-Dict[Variable, Union[BNode, URIRef, Literal]]c                   s&   t dd t| fdd|D D S )Nc                 s  s$    | ]\}}|d ur||fV  qd S Nr   )r$   varvalr   r   r   	<genexpr>0   s    z+CSVResultParser.parseRow.<locals>.<genexpr>c                   s   g | ]}  |qS r   )convertTerm)r$   tr   r   r   r&   2   s    z,CSVResultParser.parseRow.<locals>.<listcomp>)dictzip)r   r4   r7   r   r   r   r2   -   s   zCSVResultParser.parseRowr?   str'Optional[Union[BNode, URIRef, Literal]]c                 C  sB   |dkrd S | drt|S | ds| drt|S t|S )N _:zhttp://zhttps://)
startswithr   r   r   )r   r?   r   r   r   r>   6   s   
zCSVResultParser.convertTermr:   )r   r   r   r   r   r   )r4   r6   r7   r8   r   r9   )r?   rB   r   rC   )__name__
__module____qualname____doc__r   r5   r2   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 )CSVResultSerializerz*Serializes SPARQL results into CSV format.resultr   c                 C  s(   t | | d| _|jdkrtdd S )Nr   r    z5CSVSerializer can only serialize select query results)r   r   r   type	Exception)r   rL   r   r   r   r   C   s
   
zCSVResultSerializer.__init__r!   streamr   encodingrB   r   Nonec           
        s   dd l }ttttf |}t|tr|}ntt|}tt| |}tj|j	d} fddj
jD }	||	 j
jD ]| fddj
jD  qAd S )Nr   r"   c                   s   g | ]} | qS r   )serializeTermr$   r7   )rP   r   r   r   r&   [   s    z1CSVResultSerializer.serialize.<locals>.<listcomp>c                   s   g | ]} | qS r   )rR   getrS   rP   r4   r   r   r   r&   _   s    )r*   r
   r	   r   r   r'   	getwriterr,   writerr   rL   r/   writerowr0   )
r   rO   rP   kwargsr*   Zwritable_streamZstring_streamZbyte_streamoutvsr   rU   r   	serializeJ   s   


zCSVResultSerializer.serializetermOptional[Identifier]Union[str, Identifier]c                 C  s$   |d u rdS t |trd| S |S )NrD   rE   )r'   r   )r   r]   rP   r   r   r   rR   b   s
   

z!CSVResultSerializer.serializeTermN)rL   r   )r!   )rO   r   rP   rB   r   rQ   )r]   r^   rP   rB   r   r_   )rG   rH   rI   rJ   r   r\   rR   r   r   r   r   rK   @   s
    
rK   )rJ   
__future__r   r*   r,   ior   r   typingr   r   r   r   r	   r
   Zrdflib.plugins.sparql.processorr   Zrdflib.queryr   r   r   Zrdflib.termr   r   r   r   r   r   rK   r   r   r   r   <module>   s     ,