o
    0iN                  
   @   s(  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	 ddl
mZ ddlmZ er2d dlZeddG d	d
 d
Zdddede	eedf deeeef  fddZdeddfddZde	eedf de	d fddZeG dd dZeG dd dZde	eedf dee fddZdS )    N)	dataclass)TYPE_CHECKINGAnyUnion   )	constants)	get_tokenT)frozenc                   @   s2   e Zd ZU dZeed< eed< eed< eed< dS )DatasetParquetEntryzDRepresents a single parquet file available for a dataset on the Hub.configspliturlsizeN)__name__
__module____qualname____doc__str__annotations__int r   r   Y/home/kim/smarthome/.venv/lib/python3.10/site-packages/huggingface_hub/_dataset_viewer.pyr
      s   
 r
   token	sql_queryr   returnc                   s   |   d  }t| d }zMt|d}||}|d u r"tdt|tr5| W |d ur4|	  S S t
dd |jD  t
dd | D } fdd|D W |d ur\|	  S S |d urf|	  w w )	N;r   zSQL query must return rows.c                 s   s    | ]}|d  V  qdS )r   Nr   ).0columnr   r   r   	<genexpr>8       z(execute_raw_sql_query.<locals>.<genexpr>c                 s   s    | ]}t |V  qd S N)tupler   rowr   r   r   r   9   r    c                    s   g | ]	}t t |qS r   )dictzipr#   columnsr   r   
<listcomp>:   s    z)execute_raw_sql_query.<locals>.<listcomp>)striprstrip_raise_on_forbidden_query_get_duckdb_connectionsql
ValueError
isinstance_DuckDBCliRelationexecutecloser"   descriptionZfetchall)r   r   Znormalized_query
connectionZrelationrowsr   r'   r   execute_raw_sql_query(   s*   






r7   queryc                 C   sP   t | dkr
td|  D ]}| }|dr%|dd  r%tdqd S )Nr   zSQL query cannot be empty..r      z8DuckDB CLI meta-commands are not allowed in SQL queries.)lenr/   
splitlineslstrip
startswithisalpha)r8   linestrippedr   r   r   r,   @   s   r,   )zduckdb.DuckDBPyConnection_DuckDBCliConnectionc              
   C   s   zdd l }W n& ty, } ztd}|d u rtd|t|| dW  Y d }~S d }~ww | }zt| D ]}|| q6|W S  tyL   |	   w )Nr   duckdbzDuckDB is required for `hf datasets sql`. Install the Python package with `pip install duckdb` or install the DuckDB CLI binary (for example `brew install duckdb`).)binary_pathr   )
rC   ImportErrorshutilwhichrB   connect_build_duckdb_secret_statementsr2   	Exceptionr3   )r   rC   errorZduckdb_binaryr5   Z	statementr   r   r   r-   L   s,   
r-   c                   @   sR   e Zd ZU dZeed< eeedf ed< dddZdedd	fd
dZ	dddZ
dS )rB   zjDuckDB connection.

    Mimics the DuckDB Python API, but runs the queries via the DuckDB CLI binary.
    rD   Nr   r   c                 C   s   t | j| _d S r!   )rI   r   _setup_statementsselfr   r   r   __post_init__q   s   z"_DuckDBCliConnection.__post_init__r8   r1   c                 C   s   t | j| j|dS )N)rD   setup_statementsr8   )r1   rD   rL   )rN   r8   r   r   r   r.   t   s   z_DuckDBCliConnection.sqlc                 C   s   d S r!   r   rM   r   r   r   r3   w   s   z_DuckDBCliConnection.close)r   N)r   r   r   r   r   r   r   boolrO   r.   r3   r   r   r   r   rB   g   s   
 
rB   c                   @   sH   e Zd ZU dZeed< ee ed< eed< deeeef  fddZ	dS )	r1   zhDuckDB relation.

    Mimics the DuckDB Python API, but runs the queries via the DuckDB CLI binary.
    rD   rP   r8   r   c                 C   s   g }| j rdtj gdd | j D d}d|| jd g }tj| jdg|ddd	d
}|jdkrC|j	
 p>|j
 p>d}t|t|j
 S )Nz.output c                 s   s    | ]}| d V  qdS )r   Nr   )r   stmtr   r   r   r      s    z-_DuckDBCliRelation.execute.<locals>.<genexpr>z.output
r   z-jsonTF)inputcapture_outputtextcheckr   zDuckDB CLI command failed.)rP   osdevnulljoinr8   
subprocessrunrD   
returncodestderrr*   stdoutRuntimeErrorjsonloads)rN   setupZ
full_queryresulterror_messager   r   r   r2      s(   

z_DuckDBCliRelation.executeN)
r   r   r   r   r   r   listr%   r   r2   r   r   r   r   r1   {   s   
 r1   c                 C   sV   | d u s| du rt  } | sg S | dd}tjdd}d| d| dd| dgS )NT'z''z@CREATE OR REPLACE SECRET hf_hub_token (TYPE HTTP, BEARER_TOKEN 'z
', SCOPE 'z')z<CREATE OR REPLACE SECRET hf_token (TYPE HUGGINGFACE, TOKEN ')r   replacer   ZENDPOINT)r   Zescaped_tokenZescaped_endpointr   r   r   rI      s   
rI   )ra   rX   rF   r[   dataclassesr   typingr   r   r    r   utilsr   rC   r
   r   rQ   rf   r%   r7   r,   r-   rB   r1   rI   r   r   r   r   <module>   s0   2	
$%