§
    šŠtjv  ã                  óº   — d dl mZ d dlZd dlZd dlZd dl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Z ej        e¦  «        Z G d„ de¦  «        ZdS )	é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚIterableÚListÚOptionalÚTupleÚType)ÚDocument)Ú
Embeddings)ÚVectorStorec                  ó¢   — e Zd ZdZ	 d)d*d
„Zd+d„Z	 d,d-d„Z	 d.d/d„Z	 d.d0d„Z	 d.d1d „Z		 d.d2d!„Z
e	 	 	 d3d4d%„¦   «         Zed5d'„¦   «         Zd6d(„ZdS )7Ú	SQLiteVSSaL  SQLite with VSS extension as a vector database.

    To use, you should have the ``sqlite-vss`` python package installed.
    Example:
        .. code-block:: python
            from langchain_community.vectorstores import SQLiteVSS
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            ...
    úvss.dbÚtableÚstrÚ
connectionúOptional[sqlite3.Connection]Ú	embeddingr   Údb_filec                ó  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|s|                      |¦  «        }t          |t          ¦  «        st          j        d¦  «         || _        || _        || _	        |  
                    ¦   «          dS )z1Initialize with sqlite client with vss extension.r   Nz\Could not import sqlite-vss python package. Please install it with `pip install sqlite-vss`.z+embeddings input must be Embeddings object.)Ú
sqlite_vssÚImportErrorÚcreate_connectionÚ
isinstancer   ÚwarningsÚwarnÚ_connectionÚ_tableÚ
_embeddingÚcreate_table_if_not_exists)Úselfr   r   r   r   r   s         úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/sqlitevss.pyÚ__init__zSQLiteVSS.__init__%   s¸   € ð	ØÐÐÐÐøÝð 	ð 	ð 	ÝðCñô ð ð	øøøð ð 	9Ø×/Ò/°Ñ8Ô8ˆJå˜)¥ZÑ0Ô0ð 	IÝŒMÐGÑHÔHÐHà%ˆÔØˆŒØ#ˆŒà×'Ò'Ñ)Ô)Ð)Ð)Ð)s   ‚ ‡!ÚreturnÚNonec                óD  — | j                              d| j        › d�¦  «         | j                              d| j        › d|                      ¦   «         › d�¦  «         | j                              d| j        › d| j        › d�¦  «         | j                              ¦   «          d S )	Nz(
            CREATE TABLE IF NOT EXISTS zÆ
            (
              rowid INTEGER PRIMARY KEY AUTOINCREMENT,
              text TEXT,
              metadata BLOB,
              text_embedding BLOB
            )
            ;
            z8
                CREATE VIRTUAL TABLE IF NOT EXISTS vss_z. USING vss0(
                  text_embedding(z!)
                );
            zZ
                CREATE TRIGGER IF NOT EXISTS embed_text 
                AFTER INSERT ON z;
                BEGIN
                    INSERT INTO vss_z‹(rowid, text_embedding)
                    VALUES (new.rowid, new.text_embedding) 
                    ;
                END;
            )r   Úexecuter   Úget_dimensionalityÚcommit)r"   s    r#   r!   z$SQLiteVSS.create_table_if_not_existsA   sé   € ØÔ× Ò ð	Ø(,¬ð	ð 	ð 	ñ	
ô 	
ð 	
ð 	Ô× Ò ðØ8<¼ðð à"&×"9Ò"9Ñ";Ô";ðð ð ñ	
ô 	
ð 	
ð 	Ô× Ò ðà!%¤ðð ð &*¤[ð	ð ð ñ
	
ô 
	
ð 
	
ð 	Ô×ÒÑ!Ô!Ð!Ð!Ð!ó    NÚtextsúIterable[str]Ú	metadatasúOptional[List[dict]]Úkwargsr   ú	List[str]c                óú  — | j                              d| j        › �¦  «                             ¦   «         d         }|€d}| j                             t          |¦  «        ¦  «        }|sd„ |D ¦   «         }d„ t          |||¦  «        D ¦   «         }| j                              d| j        › d�|¦  «         | j          	                    ¦   «          | j                              d	| j        › d
|› �¦  «        }d„ |D ¦   «         S )a  Add more texts to the vectorstore index.
        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            kwargs: vectorstore specific parameters
        z SELECT max(rowid) as rowid FROM ÚrowidNr   c                ó   — g | ]}i ‘ŒS © r5   )Ú.0Ú_s     r#   ú
<listcomp>z'SQLiteVSS.add_texts.<locals>.<listcomp>v   s   € Ð+Ð+Ð+ ˜Ð+Ð+Ð+r+   c                óh   — g | ]/\  }}}|t          j        |¦  «        t          j        |¦  «        f‘Œ0S r5   )ÚjsonÚdumps)r6   ÚtextÚmetadataÚembeds       r#   r8   z'SQLiteVSS.add_texts.<locals>.<listcomp>w   sI   € ð 
ð 
ð 
á%��h ð •4”:˜hÑ'Ô'­¬°EÑ):Ô):Ð;ð
ð 
ð 
r+   zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > c                ó   — g | ]
}|d          ‘ŒS )r3   r5   )r6   Úrows     r#   r8   z'SQLiteVSS.add_texts.<locals>.<listcomp>„   s   € Ð0Ð0Ð0 ��G”Ð0Ð0Ð0r+   )
r   r(   r   Úfetchoner    Úembed_documentsÚlistÚzipÚexecutemanyr*   )r"   r,   r.   r0   Úmax_idÚembedsÚ
data_inputÚresultss           r#   Ú	add_textszSQLiteVSS.add_textsb   s/  € ð Ô!×)Ò)Ø<¨t¬{Ð<Ð<ñ
ô 
ç
Š(‰*Œ*�Wôˆð ˆ>ØˆFà”×0Ò0µ°e±´Ñ=Ô=ˆØð 	,Ø+Ð+ UÐ+Ñ+Ô+ˆIð
ð 
å),¨U°I¸vÑ)FÔ)Fð
ñ 
ô 
ˆ
ð 	Ô×$Ò$ØW˜4œ;ÐWÐWÐWØñ	
ô 	
ð 	
ð 	Ô×ÒÑ!Ô!Ð!àÔ"×*Ò*ØE ¤ÐEÐE¸VÐEÐEñ
ô 
ˆð 1Ð0¨Ð0Ñ0Ô0Ð0r+   é   úList[float]ÚkÚintúList[Tuple[Document, float]]c           	     óŽ  — d| j         › d| j         › dt          j        |¦  «        › d|› d�	}| j                             ¦   «         }|                     |¦  «         |                     ¦   «         }g }|D ]R}t          j        |d         ¦  «        pi }	t          |d         |	¬¦  «        }
| 	                    |
|d	         f¦  «         ŒS|S )
Nzo
            SELECT 
                text,
                metadata,
                distance
            FROM z e
            INNER JOIN vss_zy v on v.rowid = e.rowid  
            WHERE vss_search(
              v.text_embedding,
              vss_search_params('z', z)
            )
        r=   r<   )Úpage_contentr=   Údistance)
r   r:   r;   r   Úcursorr(   ÚfetchallÚloadsr   Úappend)r"   r   rM   r0   Ú	sql_queryrS   rI   Ú	documentsr@   r=   Údocs              r#   Ú&similarity_search_with_score_by_vectorz0SQLiteVSS.similarity_search_with_score_by_vector†   s÷   € ðð
 ”+ðð ð !œKðð õ #'¤*¨YÑ"7Ô"7ðð ð =>ðð ð ˆ	ð Ô!×(Ò(Ñ*Ô*ˆØ�Š�yÑ!Ô!Ð!Ø—/’/Ñ#Ô#ˆàˆ	Øð 	5ð 	5ˆCÝ”z # j¤/Ñ2Ô2Ð8°bˆHÝ¨¨F¬¸hÐGÑGÔGˆCØ×Ò˜c 3 z¤?Ð3Ñ4Ô4Ð4Ð4àÐr+   ÚqueryúList[Document]c                ó|   — | j                              |¦  «        }|                      ||¬¦  «        }d„ |D ¦   «         S )ú"Return docs most similar to query.©r   rM   c                ó   — g | ]\  }}|‘ŒS r5   r5   ©r6   rY   r7   s      r#   r8   z/SQLiteVSS.similarity_search.<locals>.<listcomp>©   ó   € Ð,Ð,Ð,™˜˜Q�Ð,Ð,Ð,r+   ©r    Úembed_queryrZ   ©r"   r[   rM   r0   r   rX   s         r#   Úsimilarity_searchzSQLiteVSS.similarity_search¡   sO   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r+   c                óh   — | j                              |¦  «        }|                      ||¬¦  «        }|S )r^   r_   rc   re   s         r#   Úsimilarity_search_with_scorez&SQLiteVSS.similarity_search_with_score«   sA   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð Ðr+   c                óH   — |                       ||¬¦  «        }d„ |D ¦   «         S )Nr_   c                ó   — g | ]\  }}|‘ŒS r5   r5   ra   s      r#   r8   z9SQLiteVSS.similarity_search_by_vector.<locals>.<listcomp>»   rb   r+   )rZ   )r"   r   rM   r0   rX   s        r#   Úsimilarity_search_by_vectorz%SQLiteVSS.similarity_search_by_vectorµ   s:   € ð ×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r+   Ú	langchainÚclsúType[SQLiteVSS]c                ó|   — |                       |¦  «        } | ||||¬¦  «        }|                     ||¬¦  «         |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r   r   )r,   r.   )r   rJ   )	rm   r,   r   r.   r   r   r0   r   Úvsss	            r#   Ú
from_textszSQLiteVSS.from_texts½   sS   € ð ×*Ò*¨7Ñ3Ô3ˆ
ØˆcØ J¸È9ð
ñ 
ô 
ˆð 	�Š˜E¨YˆÑ7Ô7Ð7Øˆ
r+   úsqlite3.Connectionc                óÌ   — dd l }dd l} |j        | ¦  «        }|j        |_        |                     d¦  «         |                     |¦  «         |                     d¦  «         |S )Nr   TF)Úsqlite3r   ÚconnectÚRowÚrow_factoryÚenable_load_extensionÚload)r   rt   r   r   s       r#   r   zSQLiteVSS.create_connectionÏ   sr   € àˆˆˆàÐÐÐà$�W”_ WÑ-Ô-ˆ
Ø!(¤ˆ
ÔØ×(Ò(¨Ñ.Ô.Ð.Ø�Š˜
Ñ#Ô#Ð#Ø×(Ò(¨Ñ/Ô/Ð/ØÐr+   c                óX   — d}| j                              |¦  «        }t          |¦  «        S )z£
        Function that does a dummy embedding to figure out how many dimensions
        this embedding function returns. Needed for the virtual table DDL.
        zThis is a dummy text)r    rd   Úlen)r"   Ú
dummy_textÚdummy_embeddings      r#   r)   zSQLiteVSS.get_dimensionalityÜ   s,   € ð
 ,ˆ
Øœ/×5Ò5°jÑAÔAˆÝ�?Ñ#Ô#Ð#r+   )r   )r   r   r   r   r   r   r   r   )r%   r&   )N)r,   r-   r.   r/   r0   r   r%   r1   )rK   )r   rL   rM   rN   r0   r   r%   rO   )r[   r   rM   rN   r0   r   r%   r\   )r[   r   rM   rN   r0   r   r%   rO   )r   rL   rM   rN   r0   r   r%   r\   )Nrl   r   )rm   rn   r,   r1   r   r   r.   r/   r   r   r   r   r0   r   r%   r   )r   r   r%   rr   )r%   rN   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r!   rJ   rZ   rf   rh   rk   Úclassmethodrq   Ústaticmethodr   r)   r5   r+   r#   r   r      sL  € € € € € ðð ð  ð*ð *ð *ð *ð *ð8"ð "ð "ð "ðH +/ð"1ð "1ð "1ð "1ð "1ðJ 01ðð ð ð ð ð8 $%ð-ð -ð -ð -ð -ð $%ðð ð ð ð ð 01ð-ð -ð -ð -ð -ð ð
 +/Ø Øðð ð ð ñ „[ðð" ð
ð 
ð 
ñ „\ð
ð$ð $ð $ð $ð $ð $r+   r   )Ú
__future__r   r:   Úloggingr   Útypingr   r   r   r   r   r	   r
   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.vectorstoresr   rt   Ú	getLoggerr~   Úloggerr   r5   r+   r#   ú<module>rŒ      s%  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3àð Ø€N€N€Nà	ˆÔ	˜8Ñ	$Ô	$€ðI$ð I$ð I$ð I$ð I$�ñ I$ô I$ð I$ð I$ð I$r+   