U
    h                     @   sf   d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	 d dl
mZ eeZG dd deZdS )    N)AnyDictListOptional)Document)
BaseLoaderc                   @   sZ   e Zd ZdZdee eddddZddddZe	e
 dd	d
Ze	e
 dddZdS )SurrealDBLoaderzLoad SurrealDB documents.N)filter_criteriakwargsreturnc              
   K   s   zddl m} W n, tk
r< } ztd|W 5 d }~X Y nX |dd| _| jdd dkrl|| j| _ntd|pzi | _d	| jkrtd
|dd| _|dd| _	|d	d| _
|| j| _|| _d S )Nr   )SurrealzZCannot import from surrealdb.
                please install with `pip install surrealdb`.dburlzws://localhost:8000/rpc   wsz6Only websocket connections are supported at this time.tablezCkey `table` is not a valid criteria for `filter_criteria` argument.nsZ	langchaindbZdatabaseZ	documents)Z	surrealdbr   ImportErrorpopr   sdb
ValueErrorr	   r   r   r   r
   )selfr	   r
   r   e r   R/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/document_loaders/surrealdb.py__init__   s,    

zSurrealDBLoader.__init__r   c                    sp   | j  I dH  d| jkrTd| jkrT| jd}| jd}| j ||dI dH  | j | j| jI dH  dS )zr
        Initialize connection to surrealdb database
        and authenticate if credentials are provided
        NZdb_userZdb_pass)userpass)r   connectr
   getZsigninZuser   r   )r   r   passwordr   r   r   
initialize1   s    zSurrealDBLoader.initializec                    s"   t t d fdd}t| S )Nr   c                      s      I d H    I d H S )N)r"   aloadr   r   r   r   _load?   s    z#SurrealDBLoader.load.<locals>._load)r   r   asynciorun)r   r%   r   r$   r   load>   s    zSurrealDBLoader.loadc                    s   d}| j dk	r^t| j dkr^|d7 }t| j D ].\}}|d|dkrFdnd d| d| 7 }q.| j| j| jd	 | j|d
| ji| j I dH } fdd|d d D S )z Load data into Document objects.z!SELECT * FROM type::table($table)Nr   z WHERE  AND z = $)r   r   r   r   c                    s0   g | ](}t t|d |d  i|d  dqS )idmetadata)Zpage_contentr-   )r   jsondumps).0resultr-   r   r   
<listcomp>W   s
   z)SurrealDBLoader.aload.<locals>.<listcomp>r1   )r	   len	enumerater   r   r   r   query)r   r6   idxkeyresultsr   r2   r   r#   E   s     ( 


zSurrealDBLoader.aload)N)__name__
__module____qualname____doc__r   r   r   r   r"   r   r   r(   r#   r   r   r   r   r      s    !r   )r&   r.   loggingtypingr   r   r   r   Zlangchain_core.documentsr   Z)langchain_community.document_loaders.baser   	getLoggerr:   loggerr   r   r   r   r   <module>   s   
