o
    Zh}                     @  sX   d dl 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 G dd deZdS )    )annotations)AnyDictIteratorListOptionalTuple)Document)
BaseLoaderc                   @  s@   e Zd ZdZ			ddddZd ddZd!ddZd"ddZdS )#SnowflakeLoaderaS  Load from `Snowflake` API.

    Each document represents one row of the result. The `page_content_columns`
    are written into the `page_content` of the document. The `metadata_columns`
    are written into the `metadata` of the document. By default, all columns
    are written into the `page_content` and none into the `metadata`.

    Nquerystruserpasswordaccount	warehouseroledatabaseschema
parametersOptional[Dict[str, Any]]page_content_columnsOptional[List[str]]metadata_columnsc                 C  sf   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
dur!|
ndg| _	|dur.|| _
dS g | _
dS )aj  Initialize Snowflake document loader.

        Args:
            query: The query to run in Snowflake.
            user: Snowflake user.
            password: Snowflake password.
            account: Snowflake account.
            warehouse: Snowflake warehouse.
            role: Snowflake role.
            database: Snowflake database
            schema: Snowflake schema
            parameters: Optional. Parameters to pass to the query.
            page_content_columns: Optional. Columns written to Document `page_content`.
            metadata_columns: Optional. Columns written to Document `metadata`.
        N*)r   r   r   r   r   r   r   r   r   r   r   )selfr   r   r   r   r   r   r   r   r   r   r    r   l/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/document_loaders/snowflake_loader.py__init__   s   zSnowflakeLoader.__init__returnList[Dict[str, Any]]c              
     s"  zdd l }W n ty } ztd|d }~ww |jj| j| j| j| j| j| j	| j
| jd}z]z3| }|d| j	  |d| j
  || j| j | }dd |jD   fdd|D }W n ty} } ztd	|  g }W Y d }~nd }~ww W |  |S W |  |S |  w )
Nr   zuCould not import snowflake-connector-python package. Please install it with `pip install snowflake-connector-python`.)r   r   r   r   r   r   r   r   zUSE DATABASE zUSE SCHEMA c                 S  s   g | ]}|d  qS )r   r   ).0columnr   r   r   
<listcomp>X   s    z2SnowflakeLoader._execute_query.<locals>.<listcomp>c                   s   g | ]	}t t |qS r   )dictzip)r!   rowZcolumn_namesr   r   r#   Y   s    zAn error occurred: )Zsnowflake.connectorImportErrorZ	connectorconnectr   r   r   r   r   r   r   r   cursorexecuter   Zfetchalldescription	Exceptionprintclose)r   	snowflakeexconncurquery_resulter   r'   r   _execute_query?   sP   

zSnowflakeLoader._execute_queryr4   Tuple[List[str], List[str]]c                 C  sT   | j r| j ng }| jr| jng }|d u r|rt|d  }|d u r$g }|p'g |fS )Nr   )r   r   listkeys)r   r4   r   r   r   r   r   _get_columnsa   s   zSnowflakeLoader._get_columnsIterator[Document]c                 #  s    |   }t|trtd|  g S | |\ dv r&t|d  |D ]$}dfdd| D } fdd| D }t	||d	}|V  q(d S )
Nz$An error occurred during the query: r   r   
c                 3  s*    | ]\}}| v r| d | V  qdS )z: Nr   r!   kv)r   r   r   	<genexpr>w   s     z,SnowflakeLoader.lazy_load.<locals>.<genexpr>c                   s   i | ]\}}| v r||qS r   r   r=   )r   r   r   
<dictcomp>z   s    z-SnowflakeLoader.lazy_load.<locals>.<dictcomp>)page_contentmetadata)
r6   
isinstancer-   r.   r:   r8   r9   joinitemsr	   )r   r4   r&   rB   rC   docr   )r   r   r   	lazy_loadn   s    
zSnowflakeLoader.lazy_load)NNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r    )r4   r    r   r7   )r   r;   )__name__
__module____qualname____doc__r   r6   r:   rH   r   r   r   r   r   
   s    
+
"r   N)
__future__r   typingr   r   r   r   r   r   Zlangchain_core.documentsr	   Z)langchain_community.document_loaders.baser
   r   r   r   r   r   <module>   s
     