o
    Zhv                     @  s   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eZG dd deZdS )	    )annotationsN)TYPE_CHECKINGAnyIterableListOptionalTupleType)Document)
Embeddings)VectorStorec                   @  s   e Zd ZdZ	d3d4d
dZd5ddZ	d6d7ddZ	d8d9dd Z	d8d:d#d$Z	d8d;d%d&Z		d8d<d'd(Z
e		)	d=d>d,d-Zed?d/d0Zd@d1d2ZdS )A	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                 C  sd   zddl }W n ty   tdw |s| |}t|ts#t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    r    a/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/sqlitevss.py__init__%   s   


zSQLiteVSS.__init__returnNonec                 C  sb   | 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   r    r    r!   r   A   s(   z$SQLiteVSS.create_table_if_not_existsNtextsIterable[str]	metadatasOptional[List[dict]]kwargsr   	List[str]c                 K  s   | j d| j  d }|du rd}| jt|}|s%dd |D }dd t|||D }| j d| j d	| | j 	  | j d
| j d| }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                 S  s   g | ]}i qS r    r    ).0_r    r    r!   
<listcomp>v   s    z'SQLiteVSS.add_texts.<locals>.<listcomp>c                 S  s(   g | ]\}}}|t |t |fqS r    )jsondumps)r/   textmetadataZembedr    r    r!   r1   w   s    zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > c                 S  s   g | ]}|d  qS )r.   r    )r/   rowr    r    r!   r1          )
r   r%   r   Zfetchoner   Zembed_documentslistzipZexecutemanyr'   )r   r(   r*   r,   Zmax_idZembedsZ
data_inputresultsr    r    r!   	add_textsb   s,   


zSQLiteVSS.add_texts   List[float]kintList[Tuple[Document, float]]c              	   K  s   d| j  d| j  dt| d| d	}| j }|| | }g }|D ]}t|d p0i }	t|d |	d}
|	|
|d	 f q&|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)
            )
        r5   r4   )Zpage_contentr5   Zdistance)
r   r2   r3   r   cursorr%   Zfetchallloadsr
   append)r   r   r>   r,   Z	sql_queryrA   r:   	documentsr6   r5   docr    r    r!   &similarity_search_with_score_by_vector   s$   		

z0SQLiteVSS.similarity_search_with_score_by_vectorqueryList[Document]c                 K  s(   | j |}| j||d}dd |D S )"Return docs most similar to query.r   r>   c                 S     g | ]\}}|qS r    r    r/   rE   r0   r    r    r!   r1      r7   z/SQLiteVSS.similarity_search.<locals>.<listcomp>r   embed_queryrF   r   rG   r>   r,   r   rD   r    r    r!   similarity_search   s
   zSQLiteVSS.similarity_searchc                 K  s   | j |}| j||d}|S )rI   rJ   rM   rO   r    r    r!   similarity_search_with_score   s
   z&SQLiteVSS.similarity_search_with_scorec                 K  s   | j ||d}dd |D S )NrJ   c                 S  rK   r    r    rL   r    r    r!   r1      r7   z9SQLiteVSS.similarity_search_by_vector.<locals>.<listcomp>)rF   )r   r   r>   r,   rD   r    r    r!   similarity_search_by_vector   s   z%SQLiteVSS.similarity_search_by_vector	langchainclsType[SQLiteVSS]c           	      K  s,   |  |}| ||||d}|j||d |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r   r   )r(   r*   )r   r;   )	rT   r(   r   r*   r   r   r,   r   Zvssr    r    r!   
from_texts   s   
zSQLiteVSS.from_textssqlite3.Connectionc                 C  sD   dd l }dd l}|| }|j|_|d || |d |S )Nr   TF)sqlite3r   connectRowZrow_factoryZenable_load_extensionload)r   rX   r   r   r    r    r!   r      s   



zSQLiteVSS.create_connectionc                 C  s   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   rN   len)r   Z
dummy_textZdummy_embeddingr    r    r!   r&      s   zSQLiteVSS.get_dimensionality)r   )r   r   r   r   r   r   r   r   )r#   r$   )N)r(   r)   r*   r+   r,   r   r#   r-   )r<   )r   r=   r>   r?   r,   r   r#   r@   )rG   r   r>   r?   r,   r   r#   rH   )rG   r   r>   r?   r,   r   r#   r@   )r   r=   r>   r?   r,   r   r#   rH   )NrS   r   )rT   rU   r(   r-   r   r   r*   r+   r   r   r   r   r,   r   r#   r   )r   r   r#   rW   )r#   r?   )__name__
__module____qualname____doc__r"   r   r;   rF   rP   rQ   rR   classmethodrV   staticmethodr   r&   r    r    r    r!   r      s.    
$%r   )
__future__r   r2   loggingr   typingr   r   r   r   r   r   r	   Zlangchain_core.documentsr
   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   rX   	getLoggerr]   loggerr   r    r    r    r!   <module>   s    $

