
    3fiB                        d dl mZ d dlZd dlmZ 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 d dlmZmZ d	d
lmZ  ed      Z G d de      Ze G d d             Z G d d      Zy)    )annotationsN)	dataclass)Thread)Any	AwaitableOptional	TypedDictTypeVarUnion)text)URL)AsyncEnginecreate_async_engine   )HybridSearchConfigTc                  ,    e Zd ZU ded<   ded<   ded<   y)
ColumnDictstrname	data_typeboolnullableN)__name__
__module____qualname____annotations__     Z/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_postgres/v2/engine.pyr   r      s    
INNr   r   c                  8    e Zd ZU ded<   ded<   dZded<   d	dZy)
Columnr   r   r   Tr   r   c                    t        | j                  t              st        d      t        | j                  t              st        d      y)zCheck if initialization parameters are valid.

        Raises:
            ValueError: If Column name is not string.
            ValueError: If data_type is not type string.
        zColumn name must be type stringz$Column data_type must be type stringN)
isinstancer   r   
ValueErrorr   selfs    r    __post_init__zColumn.__post_init__   s=     $))S)>??$..#.CDD /r   NreturnNone)r   r   r   r   r   r(   r   r   r    r"   r"      s    
INHdEr   r"   c            
         e Zd ZU dZdZded<   dZded<    e       Z	 	 	 	 	 	 	 	 	 	 ddZ	e
	 d	 	 	 	 	 	 	 d d       Ze
	 	 	 	 	 	 d!d	       Zd"d
Zd"dZd#dZd$dZd%dZdddddddddd		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZdddddddddd		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZdddddddddd		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZdd	 	 	 	 	 d'dZdd	 	 	 	 	 d'dZdd	 	 	 	 	 d'dZy)(PGEnginez8A class for managing connections to a Postgres database.N#Optional[asyncio.AbstractEventLoop]_default_loopOptional[Thread]_default_threadc                j    |t         j                  k7  rt        d      || _        || _        || _        y)a  PGEngine constructor.

        Args:
            key (object): Prevent direct constructor usage.
            pool (AsyncEngine): Async engine connection pool.
            loop (Optional[asyncio.AbstractEventLoop]): Async event loop used to create the engine.
            thread (Optional[Thread]): Thread used to create the engine async.

        Raises:
            Exception: If the constructor is called directly by the user.
        zLOnly create class through 'from_connection_string' or 'from_engine' methods!N)r-   _PGEngine__create_key	Exception_pool_loop_thread)r'   keypoolloopthreads        r    __init__zPGEngine.__init__2   s9    & ('''^  

r   c                ,     | | j                   ||d      S )z0Create an PGEngine instance from an AsyncEngine.N)r3   )clsenginer:   s      r    from_enginezPGEngine.from_engineM   s     3##VT488r   c                6   | j                   Yt        j                         | _         t        | j                   j                  d      | _        | j
                  j                          t        |fi |} | | j                  || j                   | j
                        S )a*  Create an PGEngine instance from arguments

        Args:
            url (Optional[str]): the URL used to connect to a database. Use url or set other arguments.

        Raises:
            ValueError: If not all database url arguments are specified

        Returns:
            PGEngine
        T)targetdaemon)	r/   asyncionew_event_loopr   run_foreverr1   startr   r3   )r>   urlkwargsr?   s       r    from_connection_stringzPGEngine.from_connection_stringV   s    & $ ' 6 6 8C"(((44T#C %%'$S3F33##VS->->@S@STTr   c                   K   | j                   s
| d{   S t        j                  t        j                  || j                                d{   S 7 ?7 w)z%Run an async coroutine asynchronouslyN)r6   rD   wrap_futurerun_coroutine_threadsafer'   coros     r    _run_as_asynczPGEngine._run_as_asyncs   sN      zz:((,,T4::>
 
 	
 
s!   AA:AAAAc                    | j                   st        d      t        j                  || j                         j	                         S )z$Run an async coroutine synchronouslyzNEngine was initialized without a background loop and cannot call sync methods.)r6   r4   rD   rM   resultrN   s     r    _run_as_synczPGEngine._run_as_sync}   s;    zz`  //djjAHHJJr   c                r   K   | j                  | j                  j                                d{    y7 w)zDispose of connection poolN)rP   r5   disposer&   s    r    closezPGEngine.close   s'       !3!3!5666s   -757c                &    |j                  dd      S )N"z"")replace)r'   r   s     r    _escape_postgres_identifierz$PGEngine._escape_postgres_identifier   s    ||C&&r   c                    t        |j                  d      t              st        d      t        |j                  d      t              st        d      t        |j                  d      t              st        d      y )Nr   z"The 'name' field must be a string.r   z'The 'data_type' field must be a string.r   z'The 'nullable' field must be a boolean.)r$   getr   	TypeErrorr   )r'   cols     r    _validate_column_dictzPGEngine._validate_column_dict   sc    #''&/3/@AA#''+.4EFF#''*-t4EFF 5r   publiccontent	embeddinglangchain_metadatalangchain_idFT	schema_namecontent_columnembedding_columnmetadata_columnsmetadata_json_column	id_columnoverwrite_existingstore_metadatahybrid_search_configc       	        8  K   | j                  |      }| j                  |      }|dz   }| j                  |      }| j                  |      }|g }nq|D ]l  }t        |t              r!| j                  |j                        |_        4t        |t              sE| j                  |       | j                  |d         |d<   n t        |t              r| j                  |      }nYt        |t              r!| j                  |j                        |_        n(| j                  |       | j                  |d         |d<   | j                  j                         4 d{   }|j                  t        d             d{    |j                          d{    ddd      d{    |	rt| j                  j                         4 d{   }|j                  t        d| d| d             d{    |j                          d{    ddd      d{    t        |t              rd}|}n3t        |t              r|j                  }|j                  }n
|d	   }|d   }d
}|r=|j                  xs |}| j                  |      }||_        d| j                  |       d}d| d| d| d| d| d| d| d| }|D ]s  }t        |t              r3|j                  sdnd
}|d|j                   d|j                   d| z  }Ft        |t              sW|d   sdnd
}|d|d    d|d	    d| z  }u |
r	|d| dz  }|dz  }| j                  j                         4 d{   }|j                  t        |             d{    |j                          d{    ddd      d{    y7 ^7 ?7 *7 # 1 d{  7  sw Y   .xY w7 7 7 7 # 1 d{  7  sw Y   xY w7 7 s7 ]7 O# 1 d{  7  sw Y   yxY ww)aQ  
        Create a table for saving of vectors to be used with PGVectorStore.

        Args:
            table_name (str): The database table name.
            vector_size (int): Vector size for the embedding model to be used.
            schema_name (str): The schema name.
                Default: "public".
            content_column (str): Name of the column to store document content.
                Default: "page_content".
            embedding_column (str) : Name of the column to store vector embeddings.
                Default: "embedding".
            metadata_columns (Optional[list[Union[Column, ColumnDict]]]): A list of Columns to create for custom
                metadata. Default: None. Optional.
            metadata_json_column (str): The column to store extra metadata in JSON format.
                Default: "langchain_metadata". Optional.
            id_column (Union[str, Column, ColumnDict]) :  Column to store ids.
                Default: "langchain_id" column name with data type UUID. Optional.
            overwrite_existing (bool): Whether to drop existing table. Default: False.
            store_metadata (bool): Whether to store metadata in the table.
                Default: True.
            hybrid_search_config (HybridSearchConfig): Hybrid search configuration.
                Default: None.

        Raises:
            :class:`DuplicateTableError <asyncpg.exceptions.DuplicateTableError>`: if table already exists.
            :class:`UndefinedObjectError <asyncpg.exceptions.UndefinedObjectError>`: if the data type of the id column is not a postgreSQL data type.
        _tsvNr   z%CREATE EXTENSION IF NOT EXISTS vectorDROP TABLE IF EXISTS ""."rX   UUIDr    z,"z" TSVECTOR NOT NULLzCREATE TABLE "z"(
            "z" z PRIMARY KEY,
            "z" TEXT NOT NULL,
            "z	" vector(z) NOT NULL
            zNOT NULLz,
" r   z" JSONz
);)rZ   r$   r"   r   dictr_   r   r5   connectexecuter   commitr   
tsv_columnr   )r'   
table_namevector_sizerf   rg   rh   ri   rj   rk   rl   rm   rn   !hybrid_search_default_column_namer^   connid_data_typeid_column_namehybrid_search_columnhybrid_search_column_namequerycolumnr   s                         r    _ainit_vectorstore_tablez!PGEngine._ainit_vectorstore_table   sD    X 66{C55jA
,:V,C)99.I;;<LM#!' Pc6*#??ICHT*..s3"&"B"B3v;"OCKP i%88CI	6*!==innMIN&&y1 $ @ @6AR SIf::%%' 	  	 4,,t$KLMMM++-	  	  zz))+ $ $tll1+c*QOP   kkm##	$ $ i%!L&N	6*$..L&^^N$[1L&v.N!$//T3T & )-(H(H))% /H +%'(H(HIb(c'ddw#x ";-s:, ?R~ . y 6!"	&
 ' 	SF&&)-3__:"4}Bv/?/?.@(LLFD)-3J-?:R4v/r&2E1FazRR	S 236<<E::%%' 	  	 4,,tE{+++++-	  	  	 a	 M	  	  	  	 
$ $	$ $ $ $V	 +	  	  	  	 sG  BPCPN9PO=N<>ON?OP%O&$P
OP%O'3O4O'O!O'PO$C?PAP)O=*P-PO?P#P$P(P3P4P<O?OPOOO	PO'!O'$P'O:-O0.O:5	P?PPPPPPPc       	        v   K   | j                  | j                  |||||||||	|
|             d{    y7 wa  
        Create a table for saving of vectors to be used with PGVectorStore.

        Args:
            table_name (str): The database table name.
            vector_size (int): Vector size for the embedding model to be used.
            schema_name (str): The schema name.
                Default: "public".
            content_column (str): Name of the column to store document content.
                Default: "page_content".
            embedding_column (str) : Name of the column to store vector embeddings.
                Default: "embedding".
            metadata_columns (Optional[list[Union[Column, ColumnDict]]]): A list of Columns to create for custom
                metadata. Default: None. Optional.
            metadata_json_column (str): The column to store extra metadata in JSON format.
                Default: "langchain_metadata". Optional.
            id_column (Union[str, Column, ColumnDict]) :  Column to store ids.
                Default: "langchain_id" column name with data type UUID. Optional.
            overwrite_existing (bool): Whether to drop existing table. Default: False.
            store_metadata (bool): Whether to store metadata in the table.
                Default: True.
            hybrid_search_config (HybridSearchConfig): Hybrid search configuration.
                Note that queries might be slow if the hybrid search column does not exist.
                For best hybrid search performance, consider creating a TSV column and adding GIN index.
                Default: None.
        re   N)rP   r   r'   r{   r|   rf   rg   rh   ri   rj   rk   rl   rm   rn   s               r    ainit_vectorstore_tablez PGEngine.ainit_vectorstore_table
  sU     R   ))'-!1!1%9##5-%9 * 
 	
 	
s   /979c       	        Z    | j                  | j                  |||||||||	|
|             yr   )rS   r   r   s               r    init_vectorstore_tablezPGEngine.init_vectorstore_tableC  sG    R 	))'-!1!1%9##5-%9 * 	
r   )rf   c               2  K   d| d| d}| j                   j                         4 d{   }|j                  t        |             d{    |j	                          d{    ddd      d{    y7 O7 /7 7 # 1 d{  7  sw Y   yxY ww)zDrop the vector store tablerq   rr   z";N)r5   rw   rx   r   ry   )r'   r{   rf   r   r~   s        r    _adrop_tablezPGEngine._adrop_table|  s      )SBG::%%' 	  	 4,,tE{+++++-	  	  	 +	  	  	  	 sh   (BA:BBA<B$A>%B)B4B 5B<B>B BBB	BBc               d   K   | j                  | j                  ||             d {    y 7 wN)r{   rf   )rP   r   r'   r{   rf   s      r    adrop_tablezPGEngine.adrop_table  s3        M
 	
 	
s   &0.0c               H    | j                  | j                  ||             y r   )rS   r   r   s      r    
drop_tablezPGEngine.drop_table  s%     	M	
r   )
r8   objectr9   r   r:   r.   r;   r0   r*   r+   )N)r>   ztype[PGEngine]r?   r   r:   r.   r*   r-   )rH   z	str | URLrI   r   r*   r-   )rO   zAwaitable[T]r*   r   r)   )r   r   r*   r   )r^   r   r*   r+   )r{   r   r|   intrf   r   rg   r   rh   r   ri   z)Optional[list[Union[Column, ColumnDict]]]rj   r   rk   zUnion[str, Column, ColumnDict]rl   r   rm   r   rn   zOptional[HybridSearchConfig]r*   r+   )r{   r   rf   r   r*   r+   )r   r   r   __doc__r/   r   r1   r   r3   r<   classmethodr@   rJ   rP   rS   rV   rZ   r_   r   r   r   r   r   r   r   r   r    r-   r-   +   s1   B9=M6=(,O%,8L  2	
 ! 
6  59999 29 
	9 9 UU U 
	U U8
K7'G $' +FJ$84B#(#=At t  t 
 t  t  t  Dt  "t  2t  !t  t  ;t  
t v $' +FJ$84B#(#=A7
7
 7

 7
 7
 7
 D7
 "7
 27
 !7
 7
 ;7
 
7
| $' +FJ$84B#(#=A7
7
 7

 7
 7
 7
 D7
 "7
 27
 !7
 7
 ;7
 
7
z $	
 
  	
 
 

   $	

 	

 

 $	

 	

 

r   r-   )
__future__r   rD   dataclassesr   	threadingr   typingr   r   r   r	   r
   r   
sqlalchemyr   sqlalchemy.enginer   sqlalchemy.ext.asyncior   r   rn   r   r   r   r"   r-   r   r   r    <module>r      s`    "  !  F F  ! C 4CL  E E E&o
 o
r   