§
    šŠtjï†  ã                  óâ   — d dl mZ d dlZd dlZ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 d dlmZmZmZ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 erd d	lmZ d d
lmZ   G d„ de¦  «        Z!dS )é    )ÚannotationsN)Úcontextmanager)ÚStringIO)	ÚTYPE_CHECKINGÚAnyÚDictÚ	GeneratorÚIterableÚListÚOptionalÚTupleÚType)Ú
Embeddings)ÚVectorStore)ÚDocument)Ú
connection)Úcursorc                  óˆ  — e Zd ZdZ G d„ deej        ¦  «        Z G d„ d¦  «        ZddddœdXd„Z	 G d„ d¦  «        Z
dYd„ZdYd„Z	 	 dZd[d„Z	 d\d]d„Zd^d „Z	 d\d_d(„Zd`d,„Ze	 	 	 	 	 dadbd2„¦   «         Z	 	 dZdcd7„Z	 ddded9„Zdfd=„Z	 dgdhdB„Z	 dgdidE„Z	 dgdjdF„Z	 dgdkdG„Z	 d\dldJ„ZdmdM„ZdndO„ZdYdP„ZdYdQ„ZdodT„Z dodU„Z!dpdV„Z"dqdW„Z#dS )rÚYellowbrickzöYellowbrick as a vector database.
    Example:
        .. code-block:: python
            from langchain_community.vectorstores import Yellowbrick
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            ...
    c                  ó   — e Zd ZdZdZdZdS )úYellowbrick.IndexTypez<Enumerator for the supported Index types within Yellowbrick.ÚnoneÚlshN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNONEÚLSH© ó    új/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/yellowbrick.pyÚ	IndexTyper   *   s   € € € € € ØJÐJàˆØˆˆˆr!   r#   c                  ó*   — e Zd ZdZ	 	 ddd„Zddd„ZdS )úYellowbrick.IndexParamsz/Parameters for configuring a Yellowbrick index.NÚ
index_typeú!Optional['Yellowbrick.IndexType']ÚparamsúOptional[Dict[str, Any]]c                óL   — |€t           j        j        }|| _        |pi | _        d S ©N)r   r#   r   r&   r(   )Úselfr&   r(   s      r"   Ú__init__z Yellowbrick.IndexParams.__init__3   s+   € ð
 Ð!Ý(Ô2Ô7�
Ø(ˆDŒOØ ˜, BˆDŒKˆKˆKr!   ÚkeyÚstrÚdefaultr   Úreturnc                ó8   — | j                              ||¦  «        S r+   )r(   Úget)r,   r.   r0   s      r"   Ú	get_paramz!Yellowbrick.IndexParams.get_param=   s   € Ø”;—?’? 3¨Ñ0Ô0Ð0r!   ©NN)r&   r'   r(   r)   r+   )r.   r/   r0   r   r1   r   )r   r   r   r   r-   r4   r    r!   r"   ÚIndexParamsr%   0   sU   € € € € € Ø=Ð=ð =AØ/3ð	'ð 	'ð 	'ð 	'ð 	'ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1r!   r6   NF)ÚschemaÚloggerÚdropÚ	embeddingr   Úconnection_stringr/   Útabler7   úOptional[str]r8   úOptional[logging.Logger]r9   Úboolr1   ÚNonec               óº  — ddl m} |                     ¦   «          |r|| _        n·t	          j        t          ¦  «        | _        | j                             t          j        ¦  «         t	          j	        ¦   «         }|                     t          j
        ¦  «         t	          j        d¦  «        }	|                     |	¦  «         | j                             |¦  «         t          |t          ¦  «        s| j                             d¦  «         dS d| _        d| _        d| _        || _        t*                               || j        ¦  «        | _        t1          j        | j        j        ¦  «         || _        || _        || _        d| _        |                      ¦   «          | j                              ¦   «         5 }
|ra|  !                    | j        | j        |
¬	¦  «         |  !                    | j        | j        z   | j        |
¬	¦  «         |  "                    |
¦  «         |  #                    |
¦  «         |  $                    |
¦  «         ddd¦  «         dS # 1 swxY w Y   dS )
zþInitialize with yellowbrick client.
        Args:
            embedding: Embedding operator
            connection_string: Format 'postgres://username:password@host:port/database'
            table: Table used to store / retrieve embeddings from
        r   )Úextrasz)%(asctime)s - %(levelname)s - %(message)sz+embeddings input must be Embeddings object.NÚ
_lsh_indexÚ_lsh_hyperplaneÚ_content)r<   r7   r   )%Úpsycopg2rB   Úregister_uuidr8   ÚloggingÚ	getLoggerr   ÚsetLevelÚERRORÚStreamHandlerÚDEBUGÚ	FormatterÚsetFormatterÚ
addHandlerÚ
isinstancer   ÚerrorÚLSH_INDEX_TABLEÚLSH_HYPERPLANE_TABLEÚCONTENT_TABLEr;   r   ÚDatabaseConnectionr   ÚatexitÚregisterÚclose_connectionÚ_schemaÚ_tableÚ
_embeddingÚ_max_embedding_lenÚ_check_database_utf8Ú
get_cursorr9   Ú_drop_lsh_index_tablesÚ_create_schemaÚ_create_table)r,   r:   r;   r<   r7   r8   r9   rB   ÚhandlerÚ	formatterr   s              r"   r-   zYellowbrick.__init__@   su  € ð  	$Ð#Ð#Ð#Ð#Ð#à×ÒÑÔÐàð 		,Ø ˆDŒKˆKå!Ô+­HÑ5Ô5ˆDŒKØŒK× Ò ¥¤Ñ/Ô/Ð/ÝÔ+Ñ-Ô-ˆGØ×Ò�Wœ]Ñ+Ô+Ð+ÝÔ)Ð*UÑVÔVˆIØ× Ò  Ñ+Ô+Ð+ØŒK×"Ò" 7Ñ+Ô+Ð+å˜)¥ZÑ0Ô0ð 	ØŒK×ÒÐKÑLÔLÐLØˆFà$0ˆÔØ):ˆÔ!Ø",ˆÔà!2ˆÔÝ%×8Ò8Ð9JÈDÌKÑXÔXˆŒÝŒ˜œÔ8Ñ9Ô9Ð9àˆŒØˆŒØ#ˆŒØ"&ˆÔØ×!Ò!Ñ#Ô#Ð#àŒ_×'Ò'Ñ)Ô)ð 	'¨VØð 4Ø—	’	 ¤°D´LÈ�	ÑPÔPÐPØ—	’	Øœ+¨Ô(:Ñ:Øœ<Ø!ð ñ ô ð ð
 ×+Ò+¨FÑ3Ô3Ð3à×Ò Ñ'Ô'Ð'Ø×Ò˜vÑ&Ô&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	's   Æ5BIÉIÉIc                  óˆ   ‡ — e Zd ZU dZded<   dZded<   ded<   dˆ fd„Zdd„Zdd„Ze	dd„¦   «         Z
e	dd„¦   «         Zˆ xZS )úYellowbrick.DatabaseConnectionNr/   Ú_connection_stringzOptional['PgConnection']Ú_connectionúlogging.LoggerÚ_loggerr;   r8   r1   ú 'Yellowbrick.DatabaseConnection'c                óœ   •— | j         €>t          ¦   «                              | ¦  «        | _         || j         _        || j         _        | j         S r+   )Ú	_instanceÚsuperÚ__new__rg   rj   )Úclsr;   r8   Ú	__class__s      €r"   ro   z&Yellowbrick.DatabaseConnection.__new__„   s@   ø€ ð Œ}Ð$Ý %¡¤§¢°Ñ 4Ô 4�”Ø3D�”Ô0Ø(.�”Ô%Ø”=Ð r!   r@   c                ót   — | j         r.| j         j        s$| j                              ¦   «          d | _         d S d S d S r+   )rh   ÚclosedÚclose)r,   s    r"   rY   z/Yellowbrick.DatabaseConnection.close_connection�   sQ   € ØÔð (¨Ô(8Ô(?ð (ØÔ ×&Ò&Ñ(Ô(Ð(Ø#'�Ô Ð Ð ð(ð (ð (ð (r!   ú'PgConnection'c                ó”   — dd l }| j        r| j        j        r+|                     | j        ¦  «        | _        d| j        _        | j        S )Nr   F)rF   rh   rs   Úconnectrg   Ú
autocommit)r,   rF   s     r"   Úget_connectionz-Yellowbrick.DatabaseConnection.get_connection’   sP   € ØˆOˆOˆOàÔ#ð 4 tÔ'7Ô'>ð 4Ø#+×#3Ò#3°DÔ4KÑ#LÔ#L�Ô Ø.3�Ô Ô+àÔ#Ð#r!   ú%Generator['PgConnection', None, None]c              #  ó
  K  — ddl m} |                      ¦   «         }	 |V — |                     ¦   «          d S # |$ rE}|                     ¦   «          | j                             dd¬¦  «         t          d¦  «        |‚d }~ww xY w)Nr   )ÚDatabaseErrorz2Database error occurred, rolling back transaction.T)Úexc_infozDatabase transaction failed.)rF   r|   ry   ÚcommitÚrollbackrj   rR   ÚRuntimeError)r,   r|   ÚconnÚes       r"   Úget_managed_connectionz5Yellowbrick.DatabaseConnection.get_managed_connection›   s´   è è € à.Ð.Ð.Ð.Ð.Ð.à×&Ò&Ñ(Ô(ˆDð	Ø�
�
�
ð —’‘”���øð !ð Jð Jð JØ—’‘”�Ø”×"Ò"ØHÐSWð #ñ ô ð õ #Ð#AÑBÔBÈÐIøøøøðJøøøs   ž8 ¸B½A A=Á=Bú!Generator['PgCursor', None, None]c              #  óô   K  — |                       ¦   «         5 }|                     ¦   «         }	 |V — |                     ¦   «          n# |                     ¦   «          w xY w	 d d d ¦  «         d S # 1 swxY w Y   d S r+   )rƒ   r   rt   )r,   r�   r   s      r"   r_   z)Yellowbrick.DatabaseConnection.get_cursor«   s·   è è € à×,Ò,Ñ.Ô.ð #°$ØŸš™œ�ð#Ø �L�L�Là—L’L‘N”N�N�Nø�F—L’L‘N”N�N�Nøøø�Nð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s'   —A-­A±A-ÁAÁA-Á-A1Á4A1)r;   r/   r8   ri   r1   rk   ©r1   r@   )r1   ru   )r1   rz   )r1   r„   )r   r   r   rm   Ú__annotations__rh   ro   rY   ry   r   rƒ   r_   Ú__classcell__)rq   s   @r"   rV   rf   ~   sÕ   ø€ € € € € € Øˆ	ØÐÐÑØ04ˆÐ4Ð4Ð4Ñ4ØÐÐÑð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð	(ð 	(ð 	(ð 	(ð
	$ð 	$ð 	$ð 	$ð 
ð	ð 	ð 	ñ 
Œð	ð 
ð	#ð 	#ð 	#ñ 
Œð	#ð 	#ð 	#ð 	#ð 	#r!   rV   r   ú
'PgCursor'c                óÌ   — ddl m} | j        rV|                     |                     d¦  «                             |                     | j        ¦  «        ¬¦  «        ¦  «         dS dS )z>
        Helper function: create schema if not exists
        r   ©ÚsqlzE
                    CREATE SCHEMA IF NOT EXISTS {s}
                )ÚsN)rF   rŒ   rZ   ÚexecuteÚSQLÚformatÚ
Identifier)r,   r   rŒ   s      r"   ra   zYellowbrick._create_schema´   s‡   € ð 	!Ð Ð Ð Ð Ð àŒ<ð 		Ø�NŠNØ—’ðñô ÷ ’&Ø—n’n T¤\Ñ2Ô2ð ñ ô ñô ð ð ð ð		ð 		r!   c                óÄ  — ddl m} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž }|                     | j        | j        z   dz   ¦  «        }|                     |                     d¦  «                             ||¬¦  «        ¦  «         | j        r| j        fnd} |j        g |¢| j        ‘R Ž } |j        g |¢| j        | j        z   ‘R Ž }|                     | j        | j        z   dz   ¦  «        }|                     | j        | j        z   dz   ¦  «        }	|                     |                     d	¦  «                             ||||	¬
¦  «        ¦  «         dS )z=
        Helper function: create table if not exists
        r   r‹   r    Ú
_pk_doc_ida0  
                CREATE TABLE IF NOT EXISTS {t} (
                doc_id UUID NOT NULL,
                text VARCHAR(60000) NOT NULL,
                metadata VARCHAR(1024) NOT NULL,
                CONSTRAINT {c} PRIMARY KEY (doc_id))
                DISTRIBUTE ON (doc_id) SORT ON (doc_id)
            ©ÚtÚcÚ_pk_doc_id_embedding_idÚ
_fk_doc_ida‰  
                CREATE TABLE IF NOT EXISTS {t1} (
                doc_id UUID NOT NULL,
                embedding_id SMALLINT NOT NULL,
                embedding FLOAT NOT NULL,
                CONSTRAINT {c1} PRIMARY KEY (doc_id, embedding_id),
                CONSTRAINT {c2} FOREIGN KEY (doc_id) REFERENCES {t2}(doc_id))
                DISTRIBUTE ON (doc_id) SORT ON (doc_id)
            ©Út1Út2Úc1Úc2N)	rF   rŒ   rZ   r‘   r[   rU   rŽ   r�   r�   )
r,   r   rŒ   Úschema_prefixr•   r–   rš   r›   rœ   r�   s
             r"   rb   zYellowbrick._create_tableÅ   s²  € ð 	!Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØˆCŒNÐL˜MÐL¨4¬;¸Ô9KÑ+KÐLÐLÐLˆØ�NŠN˜4œ;¨Ô);Ñ;¸lÑJÑKÔKˆØ�ŠØ�GŠGðñ	ô 	÷ ŠfØØð ñ ô ñ	
ô 	
ð 	
ð  ,0¬<Ð?˜œ˜˜¸RˆØˆSŒ^Ð8˜]Ð8¨D¬KÐ8Ð8Ð8ˆØˆSŒ^ÐM˜]ÐM¨D¬K¸$Ô:LÑ,LÐMÐMÐMˆØ�^Š^ØŒK˜$Ô,Ñ,Ð/HÑHñ
ô 
ˆð �^Š^˜DœK¨$Ô*<Ñ<¸|ÑKÑLÔLˆØ�ŠØ�GŠGðñ
ô 
÷ ŠfØØØØð	 ñ ô ñ	
ô 	
ð 	
ð 	
ð 	
r!   úOptional['PgCursor']c                óÒ   — |€L| j                              ¦   «         5 }|                      |||¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS |                      |||¬¦  «         dS )zˆ
        Helper function: Drop data. If a cursor is provided, use it;
        otherwise, obtain a new cursor for the operation.
        N)r7   )r   r_   Ú_drop_table)r,   r<   r7   r   s       r"   r9   zYellowbrick.dropø   s¼   € ð ˆ>Ø”×+Ò+Ñ-Ô-ð ?°Ø× Ò  ¨°vÐ Ñ>Ô>Ð>ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð ?ð ?ð ×Ò˜V U°6ÐÑ:Ô:Ð:Ð:Ð:s   œAÁAÁ	Ac                óè   — ddl m} |r|                     ||¦  «        }n|                     |¦  «        }|                     d¦  «                             |¦  «        }|                     |¦  «         dS )zI
        Executes the drop table command using the given cursor.
        r   r‹   z1
        DROP TABLE IF EXISTS {} CASCADE
        N)rF   rŒ   r‘   r�   r�   rŽ   )r,   r   r<   r7   rŒ   Ú
table_nameÚdrop_table_querys          r"   r¡   zYellowbrick._drop_table  s‰   € ð 	!Ð Ð Ð Ð Ð àð 	/ØŸš¨°Ñ6Ô6ˆJˆJàŸš¨Ñ.Ô.ˆJàŸ7š7ðñ
ô 
÷ Š&�Ñ
Ô
ð	 	ð
 	�ŠÐ'Ñ(Ô(Ð(Ð(Ð(r!   c                óH  — | j                              ¦   «         5 }d}|                     |¦  «         |                     ¦   «         d         }ddd¦  «         n# 1 swxY w Y   |                     ¦   «         dk    s|                     ¦   «         dk    rdS t          d¦  «        ‚)zE
        Helper function: Test the database is UTF-8 encoded
        z—
                SELECT pg_encoding_to_char(encoding)
                FROM pg_database
                WHERE datname = current_database();
            r   NÚutf8zutf-8TzDatabase encoding is not UTF-8)r   r_   rŽ   ÚfetchoneÚlowerÚ	Exception)r,   r   ÚqueryÚencodings       r"   r^   z Yellowbrick._check_database_utf8  sØ   € ð Œ_×'Ò'Ñ)Ô)ð 	,¨VðˆEð
 �NŠN˜5Ñ!Ô!Ð!Ø—’Ñ(Ô(¨Ô+ˆHð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð �>Š>ÑÔ˜vÒ%Ð%¨¯ªÑ)9Ô)9¸WÒ)DÐ)DØ�4åÐ<Ñ=Ô=Ð=s   š2AÁAÁAÚtextsúIterable[str]Ú	metadatasúOptional[List[dict]]Úkwargsr   ú	List[str]c           
     ó$  — d}t          |¦  «        }| j                             t          |¦  «        ¦  «        }g }|sd„ |D ¦   «         }|                     d¦  «        pt                               ¦   «         }| j                             ¦   «         5 }t          ¦   «         }	t          ¦   «         }
t          j
        |	ddt          j        ¬¦  «        }t          j
        |
ddt          j        ¬¦  «        }d}t          |¦  «        D �]\  }}t          t          j        ¦   «         ¦  «        }|                     |¦  «         |                     ||t%          j        ||         ¦  «        g¦  «         t          ||         ¦  «        D ]\  }}|                     |||g¦  «         Œ|dz  }||k    rm|                      ||	|
¦  «         |	                     d¦  «         |	                     d¦  «         |
                     d¦  «         |
                     d¦  «         d}�Œ|dk    r|                      ||	|
¦  «         d d d ¦  «         n# 1 swxY w Y   |j        t          j        j        k    r(|                      |t          j        |¦  «        ¦  «         |S )	Ni'  c                ó   — g | ]}i ‘ŒS r    r    )Ú.0Ú_s     r"   ú
<listcomp>z)Yellowbrick.add_texts.<locals>.<listcomp>?  s   € Ð+Ð+Ð+ ˜Ð+Ð+Ð+r!   Úindex_paramsú	ú")Ú	delimiterÚ	quotecharÚquotingr   é   )Úlistr\   Úembed_documentsr3   r   r6   r   r_   r   ÚcsvÚwriterÚQUOTE_MINIMALÚ	enumerater/   ÚuuidÚuuid4ÚappendÚwriterowÚjsonÚdumpsÚ_copy_to_dbÚseekÚtruncater&   r#   r   Ú_update_indexÚUUID)r,   r¬   r®   r°   Ú
batch_sizeÚ
embeddingsÚresultsr·   r   Ú
content_ioÚembeddings_ioÚcontent_writerÚembeddings_writerÚcurrent_batch_sizeÚiÚtextÚdoc_uuidÚembedding_idr:   s                      r"   Ú	add_textszYellowbrick.add_texts3  sÔ  € ð ˆ
å�U‘”ˆØ”_×4Ò4µT¸%±[´[ÑAÔAˆ
ØˆØð 	,Ø+Ð+ UÐ+Ñ+Ô+ˆIà—z’z .Ñ1Ô1ÐNµ[×5LÒ5LÑ5NÔ5NˆàŒ_×'Ò'Ñ)Ô)ð  	D¨VÝ!™œˆJÝ$™JœJˆMÝ œZØ d°cÅ3ÔCTðñ ô ˆNõ !$¤
Ø¨¸ÅcÔFWð!ñ !ô !Ðð "#Ðå$ UÑ+Ô+ð +ñ +‘��4Ý�tœz™|œ|Ñ,Ô,�Ø—’˜xÑ(Ô(Ð(à×'Ò'¨°4½¼ÀIÈaÄLÑ9QÔ9QÐ(RÑSÔSÐSå/8¸ÀA¼Ñ/GÔ/Gð Tð TÑ+�L )Ø%×.Ò.°¸,È	Ð/RÑSÔSÐSÐSà" aÑ'Ð"à%¨Ò3Ð3Ø×$Ò$ V¨Z¸ÑGÔGÐGà—O’O AÑ&Ô&Ð&Ø×'Ò'¨Ñ*Ô*Ð*Ø!×&Ò& qÑ)Ô)Ð)Ø!×*Ò*¨1Ñ-Ô-Ð-Ø)*Ð&ùà! AÒ%Ð%Ø× Ò  ¨°]ÑCÔCÐCðA 	Dð  	Dð  	Dñ  	Dô  	Dð  	Dð  	Dð  	Dð  	Dð  	Dð  	Døøøð  	Dð  	Dð  	Dð  	DðD Ô"¥kÔ&;Ô&?Ò?Ð?Ø×Ò˜|­T¬Y°xÑ-@Ô-@ÑAÔAÐAàˆs   ÂF'IÉIÉ
IrÒ   r   rÓ   c                ó  — |                      d¦  «         |                      d¦  «         ddlm} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž }|                     d¦  «                             |¬¦  «        }| 	                    ||¦  «         | j        r| j        fnd} |j        g |¢| j        ‘R Ž }|                     d¦  «                             |¬¦  «        }| 	                    ||¦  «         d S )Nr   r‹   r    z�
            COPY {table} (doc_id, text, metadata) FROM 
            STDIN WITH (FORMAT CSV, DELIMITER E'\t', QUOTE '"')
        )r<   zŠ
            COPY {table} (doc_id, embedding_id, embedding) FROM 
            STDIN WITH (FORMAT CSV, DELIMITER E'\t', QUOTE '"')
        )
rË   rF   rŒ   rZ   r‘   r[   rU   r�   r�   Úcopy_expert)	r,   r   rÒ   rÓ   rŒ   rž   r<   Úcontent_copy_queryÚembeddings_copy_querys	            r"   rÊ   zYellowbrick._copy_to_dbj  s8  € ð 	�Š˜ÑÔÐØ×Ò˜1ÑÔÐà Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØ�”ÐP ÐP¨t¬{¸TÔ=OÑ/OÐPÐPÐPˆØ ŸWšWðñ
ô 
÷
 Š&�uˆ&Ñ
Ô
ð 	ð 	×ÒÐ-¨zÑ:Ô:Ð:à+/¬<Ð?˜œ˜˜¸RˆØ�”Ð; Ð;¨t¬{Ð;Ð;Ð;ˆØ #§¢ðñ!
ô !
÷
 Š&�uˆ&Ñ
Ô
ð 	ð 	×ÒÐ0°-Ñ@Ô@Ð@Ð@Ð@r!   Ú Ú	langchainÚpublicrp   úType[Yellowbrick]c                óF   —  | |||||¬¦  «        }	 |	j         d||dœ|¤Ž |	S )a�  Add texts to the vectorstore index.
        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            connection_string: URI to Yellowbrick instance
            embedding: Embedding function
            table: table to store embeddings
            kwargs: vectorstore specific parameters
        )r:   r;   r<   r7   r9   )r¬   r®   r    )rÛ   )
rp   r¬   r:   r®   r;   r<   r7   r9   r°   Úvsss
             r"   Ú
from_textszYellowbrick.from_texts†  sO   € ð* ˆcØØ/ØØØð
ñ 
ô 
ˆð 	ˆŒÐA˜E¨YÐAÐA¸&ÐAÐAÐAØˆ
r!   ÚidsúOptional[List[str]]Ú
delete_allúOptional[bool]c                ó  ‡— ddl mŠ |r‰                     d¦  «        }n~|�mt          ˆfd„|D ¦   «         ¦  «        }‰                     d¦  «                             |¦  «        }‰                     d¦  «                             |¬¦  «        }nt          d	¦  «        ‚| j        r| j        fnd
}| j         	                    ¦   «         5 } ‰j
        g |¢| j        | j        z   ‘R Ž }	‰                     d¦  «                             |	|¬¦  «        }
|                     |
¦  «          ‰j
        g |¢| j        ‘R Ž }	‰                     d¦  «                             |	|¬¦  «        }
|                     |
¦  «          | j        || j        | j        z   g|¢R Ž r[ ‰j
        g |¢| j        | j        z   ‘R Ž }	‰                     d¦  «                             |	|¬¦  «        }
|                     |
¦  «         ddd¦  «         n# 1 swxY w Y   dS )zxDelete vectors by uuids.

        Args:
            ids: List of ids to delete, where each id is a uuid string.
        r   r‹   z'
                WHERE 1=1
            Nc              3  óB   •K  — | ]}‰                      |¦  «        V — Œd S r+   )ÚLiteral)r´   ÚidrŒ   s     €r"   ú	<genexpr>z%Yellowbrick.delete.<locals>.<genexpr>¹  s-   øè è € Ð8Ð8¨b˜#Ÿ+š+ b™/œ/Ð8Ð8Ð8Ð8Ð8Ð8r!   z, z5
                WHERE doc_id IN ({ids})
            )rç   z*Either ids or delete_all must be provided.r    zDELETE FROM {table} {where_sql})r<   Ú	where_sql)rF   rŒ   r�   ÚtupleÚjoinr�   Ú
ValueErrorrZ   r   r_   r‘   r[   rU   rŽ   Ú_table_existsrS   )r,   rç   ré   r°   rð   ÚuuidsÚids_formattedrž   r   Útable_identifierrª   rŒ   s              @r"   ÚdeletezYellowbrick.delete¥  sÉ  ø€ ð 	!Ð Ð Ð Ð Ð àð 	KØŸšðñô ˆIˆIð
 ˆ_ÝÐ8Ð8Ð8Ð8°CÐ8Ñ8Ô8Ñ8Ô8ˆEØŸGšG D™MœM×.Ò.¨uÑ5Ô5ˆMØŸšðñô ÷ ŠfØ!ð ñ ô ð	 ˆIõ ÐIÑJÔJÐJà+/¬<Ð?˜œ˜˜¸RˆØŒ_×'Ò'Ñ)Ô)ð 	&¨VØ-˜sœ~ð  Øð Ø $¤¨dÔ.@Ñ @ð ð  ð  Ðð —G’GÐ=Ñ>Ô>×EÒEØ&°)ð Fñ ô ˆEð �NŠN˜5Ñ!Ô!Ð!à-˜sœ~ÐJ¨}ÐJ¸d¼kÐJÐJÐJÐØ—G’GÐ=Ñ>Ô>×EÒEØ&°)ð Fñ ô ˆEð �NŠN˜5Ñ!Ô!Ð!à!ˆtÔ!Ø˜œ dÔ&:Ñ:ðØ=Jðð ð ð 	&ð $2 3¤>ð $Ø"ð$Ø$(¤K°$Ô2FÑ$Fð$ð $ð $Ð ð ŸšÐ AÑBÔB×IÒIØ*°ið Jñ ô �ð —’˜uÑ%Ô%Ð%ð1	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð4 ˆts   ÃD&G:Ç:G>ÈG>r£   c                ó  — ddl m} |                     |¦  «        }|                     |¦  «        }|                     |                     d¦  «                             ||¬¦  «        ¦  «         |                     ¦   «         d         dk    S )z>
        Checks if a table exists in the given schema
        r   r‹   zÅ
                SELECT COUNT(*)
                FROM sys.table t INNER JOIN sys.schema s ON t.schema_id = s.schema_id
                WHERE s.name = {schema} AND t.name = {table_name}
            )r7   r£   )rF   rŒ   rí   rŽ   r�   r�   r§   )r,   r   r£   r7   rŒ   s        r"   rô   zYellowbrick._table_existsâ  sœ   € ð 	!Ð Ð Ð Ð Ð à—’˜VÑ$Ô$ˆØ—[’[ Ñ,Ô,ˆ
Ø�ŠØ�GŠGðñô ÷ ŠfØØ%ð ñ ô ñ	
ô 	
ð 	
ð �ŠÑ Ô  Ô# aÒ'Ð'r!   ÚvectorúList[float]ú	uuid.UUIDc                ó  — dd l }d                     t          t          |¦  «        ¦  «        }|                     |                     ¦   «         ¦  «        }|                     ¦   «         }t          j        |d d…         ¬¦  «        }|S )Nr   ú,é   )Úbytes)	Úhashlibrò   Úmapr/   Úsha1ÚencodeÚdigestrÄ   rÎ   )r,   rú   r  Ú
vector_strÚhash_objectÚhash_digestÚvector_uuids          r"   Ú_generate_vector_uuidz!Yellowbrick._generate_vector_uuidú  su   € Øˆˆˆà—X’X�c¥# vÑ.Ô.Ñ/Ô/ˆ
Ø—l’l :×#4Ò#4Ñ#6Ô#6Ñ7Ô7ˆØ!×(Ò(Ñ*Ô*ˆÝ”i k°#°2°#Ô&6Ð7Ñ7Ô7ˆØÐr!   é   ÚkÚintúList[Tuple[Document, float]]c                ó„  ‡— ddl m} ddlm} |                     d¦  «        pt
                               ¦   «         }| j                             ¦   «         5 }d| j	        z   }|  
                    |¦  «        Š|                     d¦  «                             |                     |¦  «        ¦  «        }	|                     |	¦  «         ˆfd„t          |¦  «        D ¦   «         }
|                     d¦  «                             |                     |¦  «        ¦  «        } ||||
¦  «         |                     |¦  «        }| j        r| j        fnd	} |j        g |¢| j	        ‘R Ž } |j        g |¢| j	        | j        z   ‘R Ž }|j        t
          j        j        k    rä| j	        d
z   }|                      |||¦  «         | j        r| j        fnd	} |j        g |¢| j	        | j        z   ‘R Ž }|                     |¦  «        }|                     d¦  «                             ||||||                     |                     dd¦  «        ¦  «        ¬¦  «        }|                     ||f¦  «         |                     ¦   «         }nV|                     d¦  «                             |||¬¦  «        }|                     ||f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   g }|D ]R}t5          j        |d         ¦  «        pi }t9          |d         |¬¦  «        }|                     ||d         f¦  «         ŒS|S )a’  Perform a similarity search with Yellowbrick with vector

        Args:
            embedding (List[float]): query embedding
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.

            NOTE: Please do not let end-user fill this and always be aware
                  of SQL injection.

        Returns:
            List[Document, float]: List of Documents and scores
        r   r‹   )Úexecute_valuesr·   Útmp_zã 
                CREATE TEMPORARY TABLE {} (
                doc_id UUID,
                embedding_id SMALLINT,
                embedding FLOAT)
                ON COMMIT DROP
                DISTRIBUTE REPLICATE
            c                ó:   •— g | ]\  }}t          ‰¦  «        ||f‘ŒS r    )r/   )r´   rÚ   Úembedding_valueÚ
tmp_doc_ids      €r"   r¶   zFYellowbrick.similarity_search_with_score_by_vector.<locals>.<listcomp>%  s:   ø€ ð ð ð á1�L /õ �Z‘” ,°Ð@ðð ð r!   z:INSERT INTO {} (doc_id, embedding_id, embedding) VALUES %sr    Ú	_tmp_hasha/  
                    WITH index_docs AS (
                    SELECT
                        t1.doc_id,
                        SUM(ABS(t1.hash-t2.hash)) as hamming_distance
                    FROM
                        {lsh_index} t1
                    INNER JOIN
                        {input_hash_table} t2
                    ON t1.hash_index = t2.hash_index
                    GROUP BY t1.doc_id
                    HAVING hamming_distance <= {hamming_distance}
                    )
                    SELECT
                        text,
                        metadata,
                       SUM(v1.embedding * v2.embedding) /
                        (SQRT(SUM(v1.embedding * v1.embedding)) *
                       SQRT(SUM(v2.embedding * v2.embedding))) AS score
                    FROM
                        {v1} v1
                    INNER JOIN
                        {v2} v2
                    ON v1.embedding_id = v2.embedding_id
                    INNER JOIN
                        {v3} v3
                    ON v2.doc_id = v3.doc_id
                    INNER JOIN
                        index_docs v4
                    ON v2.doc_id = v4.doc_id
                    GROUP BY v3.doc_id, v3.text, v3.metadata
                    ORDER BY score DESC
                    LIMIT %s
                Úhamming_distance)Úv1Úv2Úv3Ú	lsh_indexÚinput_hash_tabler  aš  
                    SELECT 
                        text,
                        metadata,
                        score
                    FROM
                        (SELECT
                            v2.doc_id doc_id,
                            SUM(v1.embedding * v2.embedding) /
                            (SQRT(SUM(v1.embedding * v1.embedding)) *
                            SQRT(SUM(v2.embedding * v2.embedding))) AS score
                        FROM
                            {v1} v1
                        INNER JOIN
                            {v2} v2
                        ON v1.embedding_id = v2.embedding_id
                        GROUP BY v2.doc_id
                        ORDER BY score DESC LIMIT %s
                        ) v4
                    INNER JOIN
                        {v3} v3
                    ON v4.doc_id = v3.doc_id
                    ORDER BY score DESC
                )r  r  r  Nr½   )Úpage_contentÚmetadataé   )rF   rŒ   Úpsycopg2.extrasr  r3   r   r6   r   r_   r[   r
  r�   r�   r‘   rŽ   rÃ   rZ   rU   r&   r#   r   Ú_generate_tmp_lsh_hashesrS   rí   r4   ÚfetchallrÈ   Úloadsr   rÆ   )r,   r:   r  r°   rŒ   r  r·   r   Útmp_embeddings_tableÚcreate_table_queryÚ
data_inputÚinsert_queryr  rž   r  r  Útmp_hash_tabler  r  Ú	sql_queryrÑ   Ú	documentsÚresultr  Údocr  s                            @r"   Ú&similarity_search_with_score_by_vectorz2Yellowbrick.similarity_search_with_score_by_vector  s  ø€ ð 	!Ð Ð Ð Ð Ð Ø2Ð2Ð2Ð2Ð2Ð2à—z’z .Ñ1Ô1ÐNµ[×5LÒ5LÑ5NÔ5NˆàŒ_×'Ò'Ñ)Ô)ð z	,¨VØ#)¨D¬KÑ#7Ð Ø×3Ò3°IÑ>Ô>ˆJØ!$§¢ðñ	"ô 	"÷ Šf�S—^’^Ð$8Ñ9Ô9Ñ:Ô:ð ð �NŠNÐ-Ñ.Ô.Ð.ðð ð ð å5>¸yÑ5IÔ5Iðñ ô ˆJð Ÿ7š7ØLñô çŠf�S—^’^Ð$8Ñ9Ô9Ñ:Ô:ð ð ˆN˜6 <°Ñ<Ô<Ð<à—’Ð 4Ñ5Ô5ˆBØ/3¬|ÐC˜Tœ\˜O˜OÀˆMØ�”Ð< Ð<°´Ð<Ð<Ð<ˆBØ�”ÐQ ÐQ°´¸dÔ>PÑ0PÐQÐQÐQˆBØÔ&­+Ô*?Ô*CÒCÐCØ!%¤¨{Ñ!:�Ø×-Ò-ØØ(Ø"ñô ð ð 48´<Ð G ¤  ÀR�Ø*˜CœNð Ø"ðØ$(¤K°$Ô2FÑ$Fðð ð �	ð $'§>¢>°.Ñ#AÔ#AÐ ØŸGšGð!ñ#ô #÷F ’&ØØØØ'Ø%5Ø%(§[¢[Ø$×.Ò.Ð/AÀ1ÑEÔEñ&ô &ð ñ 	ô 	ðG ðZ —’ØØ�Dñô ð ð !Ÿ/š/Ñ+Ô+��àŸGšGðñô ÷2 ’&ØØØð ñ ô ð3 ð< —’˜y¨1¨$Ñ/Ô/Ð/Ø Ÿ/š/Ñ+Ô+�ðuz	,ð z	,ð z	,ñ z	,ô z	,ð z	,ð z	,ð z	,ð z	,ð z	,ð z	,øøøð z	,ð z	,ð z	,ð z	,ðx 35ˆ	Øð 	/ð 	/ˆFÝ”z &¨¤)Ñ,Ô,Ð2°ˆHÝ¨¨q¬	¸HÐEÑEÔEˆCØ×Ò˜c 6¨!¤9Ð-Ñ.Ô.Ð.Ð.àÐs   ÁI=KËK"Ë%K"rª   úList[Document]c                ón   — | j                              |¦  «        } | j        d||dœ|¤Ž}d„ |D ¦   «         S )ae  Perform a similarity search with Yellowbrick

        Args:
            query (str): query string
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.

            NOTE: Please do not let end-user fill this and always be aware
                  of SQL injection.

        Returns:
            List[Document]: List of Documents
        ©r:   r  c                ó   — g | ]\  }}|‘ŒS r    r    ©r´   r+  rµ   s      r"   r¶   z1Yellowbrick.similarity_search.<locals>.<listcomp>®  ó   € Ð,Ð,Ð,™˜˜Q�Ð,Ð,Ð,r!   r    ©r\   Úembed_queryr,  ©r,   rª   r  r°   r:   r)  s         r"   Úsimilarity_searchzYellowbrick.similarity_search›  sZ   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø?�DÔ?ð 
Ø 1ð
ð 
Ø(.ð
ð 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r!   c                óZ   — | j                              |¦  «        } | j        d||dœ|¤Ž}|S )ar  Perform a similarity search with Yellowbrick

        Args:
            query (str): query string
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.

            NOTE: Please do not let end-user fill this and always be aware
                  of SQL injection.

        Returns:
            List[Document]: List of (Document, similarity)
        r/  r    r3  r5  s         r"   Úsimilarity_search_with_scorez(Yellowbrick.similarity_search_with_score°  sL   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø?�DÔ?ð 
Ø 1ð
ð 
Ø(.ð
ð 
ˆ	ð Ðr!   c                ó:   —  | j         d||dœ|¤Ž}d„ |D ¦   «         S )a  Perform a similarity search with Yellowbrick by vectors

        Args:
            embedding (List[float]): query embedding
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.

            NOTE: Please do not let end-user fill this and always be aware
                  of SQL injection.

        Returns:
            List[Document]: List of documents
        r/  c                ó   — g | ]\  }}|‘ŒS r    r    r1  s      r"   r¶   z;Yellowbrick.similarity_search_by_vector.<locals>.<listcomp>×  r2  r!   r    )r,  )r,   r:   r  r°   r)  s        r"   Úsimilarity_search_by_vectorz'Yellowbrick.similarity_search_by_vectorÅ  sF   € ð @�DÔ?ð 
Ø 1ð
ð 
Ø(.ð
ð 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r!   Údoc_idúOptional[uuid.UUID]c                óŠ  — ddl m} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž } |j        g |¢| j        | j        z   ‘R Ž } |j        g |¢| j        ‘R Ž }|                     d¦  «                             |¦  «        }|rI|                     d¦  «                             | 	                    t          |¦  «        ¦  «        ¬¦  «        n|                     d¦  «        }	|                     d¦  «        }
|                     d	¦  «                             ||||	|
¬
¦  «        }|                     |¦  «         dS )zAdd hashes to LSH indexr   r‹   r    zINSERT INTO {}zWHERE e.doc_id = {doc_id})r<  rà   zGROUP BY 1, 2av  
            {query_prefix}
            SELECT
                e.doc_id as doc_id,
                h.id as hash_index,
                CASE WHEN SUM(e.embedding * h.hyperplane) > 0 THEN 1 ELSE 0 END as hash
            FROM {embedding_table} e
            INNER JOIN {hyperplanes} h ON e.embedding_id = h.hyperplane_id
            {condition}
            {group_by}
        )Úquery_prefixÚembedding_tableÚhyperplanesÚ	conditionÚgroup_byN)rF   rŒ   rZ   r‘   r[   rT   rS   r�   r�   rí   r/   rŽ   )r,   r   r<  rŒ   rž   Úlsh_hyperplane_tableÚlsh_index_table_idÚembedding_table_idÚquery_prefix_idrB  rC  Úinput_querys               r"   Ú_update_lsh_hasheszYellowbrick._update_lsh_hashesÙ  s’  € ð 	!Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØ-˜sœ~ð  
Øð 
Ø œK¨$Ô*CÑCð 
ð  
ð  
Ðð ,˜Sœ^ð 
Øð
Ø œK¨$Ô*>Ñ>ð
ð 
ð 
Ðð ,˜Sœ^ÐH¨]ÐH¸D¼KÐHÐHÐHÐØŸ'š'Ð"2Ñ3Ô3×:Ò:Ð;MÑNÔNˆð ðˆC�GŠGÐ/Ñ0Ô0×7Ò7¸s¿{º{Í3ÈvÉ;Ì;Ñ?WÔ?WÐ7ÑXÔXÐXà—’˜‘”ð 	ð
 —7’7˜?Ñ+Ô+ˆà—g’gð
ñ
ô 
÷ Š&Ø(Ø.Ø,ØØð ñ 
ô 
ð 	ð& 	�Š�{Ñ#Ô#Ð#Ð#Ð#r!   Útmp_embedding_tabler'  c                ó¼  — ddl m} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž }|                     |¦  «        }|                     |¦  «        }|                     d¦  «                             |¦  «        }	|                     d¦  «        }
|                     d¦  «                             |	|||
¬¦  «        }|                     |¦  «         dS )	zGenerate temp LSHr   r‹   r    z+CREATE TEMPORARY TABLE {} ON COMMIT DROP ASz
GROUP BY 1a[  
            {query_prefix}
            SELECT
                h.id as hash_index,
                CASE WHEN SUM(e.embedding * h.hyperplane) > 0 THEN 1 ELSE 0 END as hash
            FROM {embedding_table} e
            INNER JOIN {hyperplanes} h ON e.embedding_id = h.hyperplane_id
            {group_by}
            DISTRIBUTE REPLICATE
        )r?  r@  rA  rC  N)	rF   rŒ   rZ   r‘   r[   rT   r�   r�   rŽ   )r,   r   rJ  r'  rŒ   rž   rD  Útmp_embedding_table_idÚtmp_hash_table_idr?  rC  rH  s               r"   r   z$Yellowbrick._generate_tmp_lsh_hashes  s  € ð 	!Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØ-˜sœ~ð  
Øð 
Ø œK¨$Ô*CÑCð 
ð  
ð  
Ðð "%§¢Ð0CÑ!DÔ!DÐØŸNšN¨>Ñ:Ô:ÐØ—w’wÐLÑMÔM×TÒTØñ
ô 
ˆð —7’7˜<Ñ(Ô(ˆà—g’gð	ñ
ô 
÷ Š&Ø%Ø2Ø,Øð	 ñ 
ô 
ð 	ð" 	�Š�{Ñ#Ô#Ð#Ð#Ð#r!   Únum_hyperplanesc                óÎ  — ddl m} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž }|                     |                     d¦  «                             |¬¦  «        ¦  «         | 	                    ¦   «         d         dk    rdS  |j        g |¢| j        ‘R Ž }|                     |                     d¦  «                             |¬¦  «        ¦  «         | 	                    ¦   «         d         }|dz  }|                     d	¦  «                             | 
                    |¦  «        | 
                    |¦  «        |¬
¦  «        }|                     |¦  «         dS )z4Generate random hyperplanes and store in Yellowbrickr   r‹   r    zSELECT COUNT(*) FROM {t})r•   Nz!SELECT MAX(embedding_id) FROM {t}r½   a2  
            WITH parameters AS (
                SELECT {num_hyperplanes} AS num_hyperplanes,
                    {dims_per_hyperplane} AS dims_per_hyperplane
            )
            INSERT INTO {hyperplanes_table} (id, hyperplane_id, hyperplane)
                SELECT id, hyperplane_id, (random() * 2 - 1) AS hyperplane
                FROM
                (SELECT range-1 id FROM sys.rowgenerator
                    WHERE range BETWEEN 1 AND
                    (SELECT num_hyperplanes FROM parameters) AND
                    worker_lid = 0 AND thread_id = 0) a,
                (SELECT range-1 hyperplane_id FROM sys.rowgenerator
                    WHERE range BETWEEN 1 AND
                    (SELECT dims_per_hyperplane FROM parameters) AND
                    worker_lid = 0 AND thread_id = 0) b
        )rN  Údims_per_hyperplaneÚhyperplanes_table)rF   rŒ   rZ   r‘   r[   rT   rŽ   r�   r�   r§   rí   )	r,   r   rN  rŒ   rž   rQ  r•   Únum_dimensionsr&  s	            r"   Ú_populate_hyperplanesz!Yellowbrick._populate_hyperplanes*  s…  € à Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØ*˜CœNð 
Øð
Ø œK¨$Ô*CÑCð
ð 
ð 
Ðð 	�Š�s—w’wÐ9Ñ:Ô:×AÒAÐDUÐAÑVÔVÑWÔWÐWØ�?Š?ÑÔ˜QÔ !Ò#Ð#ØˆFàˆCŒNÐ7˜MÐ7¨4¬;Ð7Ð7Ð7ˆØ�Š�s—w’wÐBÑCÔC×JÒJÈQÐJÑOÔOÑPÔPÐPØŸšÑ*Ô*¨1Ô-ˆØ˜!Ñˆà—w’wðñ
ô 
÷$ Š&ØŸKšK¨Ñ8Ô8Ø #§¢¨NÑ ;Ô ;Ø/ð ñ 
ô 
ð% 	ð. 	�Š�|Ñ$Ô$Ð$Ð$Ð$r!   c                óÔ  — ddl m} | j        r| j        fnd} |j        g |¢| j        | j        z   ‘R Ž } |j        g |¢| j        | j        z   ‘R Ž }|                     | j        | j        z   dz   ¦  «        }|                     | j        | j        z   dz   ¦  «        }|                     |                     d¦  «         	                    ||||¬¦  «        ¦  «         | j        r| j        fnd} |j        g |¢| j        | j
        z   ‘R Ž }|                     | j        | j
        z   dz   ¦  «        }	|                     |                     d	¦  «         	                    ||	¬
¦  «        ¦  «         dS )z&Create LSH index and hyperplane tablesr   r‹   r    r“   r˜   aƒ  
                CREATE TABLE IF NOT EXISTS {t1} (
                doc_id UUID NOT NULL,
                hash_index SMALLINT NOT NULL,
                hash SMALLINT NOT NULL,
                CONSTRAINT {c1} PRIMARY KEY (doc_id, hash_index),
                CONSTRAINT {c2} FOREIGN KEY (doc_id) REFERENCES {t2}(doc_id))
                DISTRIBUTE ON (doc_id) SORT ON (doc_id)
            r™   Ú_pk_id_hp_ida2  
                CREATE TABLE IF NOT EXISTS {t} (
                id SMALLINT NOT NULL,
                hyperplane_id SMALLINT NOT NULL,
                hyperplane FLOAT NOT NULL,
                CONSTRAINT {c} PRIMARY KEY (id, hyperplane_id))
                DISTRIBUTE REPLICATE SORT ON (id)
            r”   N)rF   rŒ   rZ   r‘   r[   rS   rU   rŽ   r�   r�   rT   )
r,   r   rŒ   rž   rš   r›   rœ   r�   r•   r–   s
             r"   Ú_create_lsh_index_tablesz$Yellowbrick._create_lsh_index_tablesT  s°  € à Ð Ð Ð Ð Ð à+/¬<Ð?˜œ˜˜¸RˆØˆSŒ^ÐO˜]ÐO¨D¬K¸$Ô:NÑ,NÐOÐOÐOˆØˆSŒ^ÐM˜]ÐM¨D¬K¸$Ô:LÑ,LÐMÐMÐMˆØ�^Š^˜DœK¨$Ô*>Ñ>ÀÑMÑNÔNˆØ�^Š^˜DœK¨$Ô*>Ñ>ÀÑMÑNÔNˆØ�ŠØ�GŠGðñ
ô 
÷ ŠfØØØØð	 ñ ô ñ	
ô 	
ð 	
ð& ,0¬<Ð?˜œ˜˜¸RˆØˆCŒNÐS˜MÐS¨4¬;¸Ô9RÑ+RÐSÐSÐSˆØ�NŠN˜4œ;¨Ô)BÑBÀ^ÑSÑTÔTˆØ�ŠØ�GŠGðñ	ô 	÷ ŠfØØð ñ ô ñ	
ô 	
ð 	
ð 	
ð 	
r!   c                ó®   — |                       | j        | j        | j        z   |¬¦  «         |                       | j        | j        | j        z   |¬¦  «         dS )zDrop LSH index tables)r7   r<   r   N)r9   rZ   r[   rS   rT   )r,   r   s     r"   r`   z"Yellowbrick._drop_lsh_index_tablesƒ  sm   € à�	Š	Ø”< t¤{°TÔ5IÑ'IÐRXð 	ñ 	
ô 	
ð 	
ð 	�	Š	Ø”<Ø”+ Ô 9Ñ9Øð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r!   r·   r%   c                ót  — |j         t          j        j        k    r�| j                             ¦   «         5 }|                      |¦  «         |                      |¦  «         |                      || 	                    dd¦  «        ¦  «         |  
                    |¦  «         ddd¦  «         dS # 1 swxY w Y   dS dS )z"Create index from existing vectorsrN  é€   N)r&   r   r#   r   r   r_   r`   rV  rS  r4   rI  ©r,   r·   r   s      r"   Úcreate_indexzYellowbrick.create_indexŽ  s   € àÔ"¥kÔ&;Ô&?Ò?Ð?Ø”×+Ò+Ñ-Ô-ð 0°Ø×+Ò+¨FÑ3Ô3Ð3Ø×-Ò-¨fÑ5Ô5Ð5Ø×*Ò*Ø˜L×2Ò2Ð3DÀcÑJÔJñô ð ð ×'Ò'¨Ñ/Ô/Ð/ð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0ð 0ð 0ð @Ð?s   ´A*B+Â+B/Â2B/c                óÌ   — |j         t          j        j        k    rI| j                             ¦   «         5 }|                      |¦  «         ddd¦  «         dS # 1 swxY w Y   dS dS )zDrop an indexN)r&   r   r#   r   r   r_   r`   rZ  s      r"   Ú
drop_indexzYellowbrick.drop_index™  s¨   € àÔ"¥kÔ&;Ô&?Ò?Ð?Ø”×+Ò+Ñ-Ô-ð 4°Ø×+Ò+¨FÑ3Ô3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4ð @Ð?s   ´AÁAÁAc                óÎ   — |j         t          j        j        k    rJ| j                             ¦   «         5 }|                      ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS dS )zHUpdate an index with a new or modified embedding in the embeddings tableN)r&   r   r#   r   r   r_   rI  )r,   r·   r<  r   s       r"   rÍ   zYellowbrick._update_indexŸ  s¬   € ð Ô"¥kÔ&;Ô&?Ò?Ð?Ø”×+Ò+Ñ-Ô-ð 8°Ø×'Ò'¨°Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð 8ð 8ð @Ð?s   ´AÁAÁAc                ó  — ddl m} 	 | j                             ¦   «         5 }| j        r| j        fnd} |j        g |¢| j        ‘R Ž } |j        g |¢| j        dz   ‘R Ž } |j        g |¢| j        | j        z   ‘R Ž }|                     d¦  «         	                    ||¬¦  «        }| 
                    |¦  «         |                      |¦  «         |                     d¦  «         	                    ||¬¦  «        }| 
                    |¦  «         |                     d¦  «         	                    ||¬¦  «        }	| 
                    |	¦  «         d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r}
t          d	|
› �¦  «        |
‚d }
~
ww xY w)
Nr   r‹   r    Ú_v1zALTER TABLE {t1} RENAME TO {t2})rš   r›   zš
                    INSERT INTO {t1} (doc_id, embedding_id, embedding) 
                    SELECT id, embedding_id, embedding FROM {t2}
                z‘
                    INSERT INTO {t1} (doc_id, text, metadata) 
                    SELECT DISTINCT id, text, metadata FROM {t2}
                zFailed to migrate schema: )rF   rŒ   r   r_   rZ   r‘   r[   rU   r�   r�   rŽ   rb   r©   r€   )r,   rŒ   r   rž   rÐ   Úold_embeddingsÚcontentÚalter_table_queryr&  Úinsert_content_queryr‚   s              r"   Úmigrate_schema_v1_to_v2z#Yellowbrick.migrate_schema_v1_to_v2§  s>  € Ø Ð Ð Ð Ð Ð ð#	HØ”×+Ò+Ñ-Ô-ð  5°Ø37´<Ð G ¤  ÀR�Ø+˜Sœ^ÐH¨]ÐH¸D¼KÐHÐHÐH�
Ø!/ ¤Ð!T°Ð!TÀÄÈeÑ@SÐ!TÐ!TÐ!T�Ø(˜#œ.ð Ø"ðØ$(¤K°$Ô2DÑ$Dðð ð �ð %(§G¢GÐ,MÑ$NÔ$N×$UÒ$UØ!Ø%ð %Vñ %ô %Ð!ð —’Ð0Ñ1Ô1Ð1à×"Ò" 6Ñ*Ô*Ð*à"Ÿwšwðñ ô  ÷
 ’&Ø!Ø%ð ñ ô ð ð —’˜|Ñ,Ô,Ð,à'*§w¢wðñ(ô (÷
 ’&˜G¨�&Ñ7Ô7ð %ð —’Ð3Ñ4Ô4Ð4ðA 5ð  5ð  5ñ  5ô  5ð  5ð  5ð  5ð  5ð  5ð  5ð  5øøøð  5ð  5ð  5ð  5ð  5ð  5øõB ð 	Hð 	Hð 	HÝÐ?¸AÐ?Ð?Ñ@Ô@ÀaÐGøøøøð	Høøøs;   ˆE& ¡D+EÅE& ÅEÅE& Å EÅ!E& Å&
FÅ0FÆF)r:   r   r;   r/   r<   r/   r7   r=   r8   r>   r9   r?   r1   r@   )r   r‰   r1   r@   r5   )r<   r/   r7   r=   r   rŸ   r1   r@   r+   )r   r‰   r<   r/   r7   r=   r1   r@   )r1   r?   )r¬   r­   r®   r¯   r°   r   r1   r±   )r   r‰   rÒ   r   rÓ   r   r1   r@   )Nrà   rá   râ   F)rp   rã   r¬   r±   r:   r   r®   r¯   r;   r/   r<   r/   r7   r/   r9   r?   r°   r   r1   r   )rç   rè   ré   rê   r°   r   r1   r@   )râ   )r   r‰   r£   r/   r7   r/   r1   r?   )rú   rû   r1   rü   )r  )r:   rû   r  r  r°   r   r1   r  )rª   r/   r  r  r°   r   r1   r-  )rª   r/   r  r  r°   r   r1   r  )r:   rû   r  r  r°   r   r1   r-  )r   r‰   r<  r=  r1   r@   )r   r‰   rJ  r/   r'  r/   r1   r@   )r   r‰   rN  r  r1   r@   )r·   r%   r1   r@   )r·   r%   r<  rü   r1   r@   r†   )$r   r   r   r   r/   ÚenumÚEnumr#   r6   r-   rV   ra   rb   r9   r¡   r^   rÛ   rÊ   Úclassmethodræ   rø   rô   r
  r,  r6  r8  r;  rI  r   rS  rV  r`   r[  r]  rÍ   re  r    r!   r"   r   r   !   sM  € € € € € ðð ðð ð ð ð �C˜œñ ô ð ð1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð, !%Ø+/Øð<'ð <'ð <'ð <'ð <'ð <'ð|4#ð 4#ð 4#ð 4#ð 4#ñ 4#ô 4#ð 4#ðlð ð ð ð"1
ð 1
ð 1
ð 1
ðl !%Ø'+ð	;ð ;ð ;ð ;ð ;ð( !%ð	)ð )ð )ð )ð )ð.ð ð ð ð. +/ð5ð 5ð 5ð 5ð 5ðnAð Að Að Að8 ð
 +/Ø!#Ø ØØðð ð ð ñ „[ðð@ $(Ø%)ð;ð ;ð ;ð ;ð ;ð| BJð(ð (ð (ð (ð (ð0ð ð ð ð 01ðVð Vð Vð Vð Vðr $%ð-ð -ð -ð -ð -ð, $%ðð ð ð ð ð, 01ð-ð -ð -ð -ð -ð. '+ð+$ð +$ð +$ð +$ð +$ðZ"$ð "$ð "$ð "$ðH(%ð (%ð (%ð (%ðT-
ð -
ð -
ð -
ð^	
ð 	
ð 	
ð 	
ð	0ð 	0ð 	0ð 	0ð4ð 4ð 4ð 4ð8ð 8ð 8ð 8ð&Hð &Hð &Hð &Hð &Hð &Hr!   r   )"Ú
__future__r   rW   rÀ   rf  rÈ   rH   rÄ   Ú
contextlibr   Úior   Útypingr   r   r   r	   r
   r   r   r   r   Úlangchain_core.embeddingsr   Úlangchain_core.vectorstoresr   Ú%langchain_community.docstore.documentr   Úpsycopg2.extensionsr   ÚPgConnectionr   ÚPgCursorr   r    r!   r"   ú<module>rs     s‹  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 1Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à :Ð :Ð :Ð :Ð :Ð :àð 7Ø>Ð>Ð>Ð>Ð>Ð>Ø6Ð6Ð6Ð6Ð6Ð6ðlHð lHð lHð lHð lH�+ñ lHô lHð lHð lHð lHr!   