a
    bg                     @  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rxd 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d/dddddddZd	d
ddZd0dddddddZd1dddddddZd2dddddddZd3dddddd d!Z	d4dddddd"d#Z
ed5d%ddddddd d&d'd(Zedd)d*d+d,Zdd
d-d.ZdS )6	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strzOptional[sqlite3.Connection]r   )table
connection	embeddingdb_filec                 C  sh   zddl }W n ty&   tdY n0 |s6| |}t|tsJt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   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/sqlitevss.py__init__%   s    



zSQLiteVSS.__init__None)returnc                 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_existsNzIterable[str]zOptional[List[dict]]r   z	List[str])texts	metadataskwargsr#   c                 K  s   | j d| j  d }|du r(d}| jt|}|sJd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       z'SQLiteVSS.add_texts.<locals>.<listcomp>c                 S  s(   g | ] \}}}|t |t |fqS r   )jsondumps)r+   textmetadataZembedr   r   r    r-   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    r-      r.   )
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   zList[float]intzList[Tuple[Document, float]])r   kr)   r#   c              	   K  s   d| j  d| j  dt| d| d	}| j }|| | }g }|D ]8}t|d p`i }	t|d |	d}
|	|
|d	 f qL|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)
            )
        r2   r1   )Zpage_contentr2   Zdistance)
r   r/   r0   r   cursorr$   Zfetchallloadsr
   append)r   r   r:   r)   Z	sql_queryr;   r6   	documentsr3   r2   docr   r   r    &similarity_search_with_score_by_vector   s$    		

z0SQLiteVSS.similarity_search_with_score_by_vectorzList[Document])queryr:   r)   r#   c                 K  s(   | j |}| j||d}dd |D S )"Return docs most similar to query.r   r:   c                 S  s   g | ]\}}|qS r   r   r+   r?   r,   r   r   r    r-      r.   z/SQLiteVSS.similarity_search.<locals>.<listcomp>r   embed_queryr@   r   rA   r:   r)   r   r>   r   r   r    similarity_search   s
    zSQLiteVSS.similarity_searchc                 K  s   | j |}| j||d}|S )rB   rC   rE   rG   r   r   r    similarity_search_with_score   s
    z&SQLiteVSS.similarity_search_with_scorec                 K  s   | j ||d}dd |D S )NrC   c                 S  s   g | ]\}}|qS r   r   rD   r   r   r    r-      r.   z9SQLiteVSS.similarity_search_by_vector.<locals>.<listcomp>)r@   )r   r   r:   r)   r>   r   r   r    similarity_search_by_vector   s    z%SQLiteVSS.similarity_search_by_vector	langchainzType[SQLiteVSS])clsr'   r   r(   r   r   r)   r#   c           	      K  s,   |  |}| ||||d}|j||d |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r   r   )r'   r(   )r   r7   )	rL   r'   r   r(   r   r   r)   r   Zvssr   r   r    
from_texts   s    
zSQLiteVSS.from_textszsqlite3.Connection)r   r#   c                 C  sD   dd l }dd l}|| }|j|_|d || |d |S )Nr   TF)sqlite3r   connectRowZrow_factoryZenable_load_extensionload)r   rN   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   rF   len)r   Z
dummy_textZdummy_embeddingr   r   r    r%      s    zSQLiteVSS.get_dimensionality)r   )N)r8   )r8   )r8   )r8   )NrK   r   )__name__
__module____qualname____doc__r!   r   r7   r@   rH   rI   rJ   classmethodrM   staticmethodr   r%   r   r   r   r    r      s,    $ &        r   )
__future__r   r/   loggingr   typingr   r   r   r   r   r   r	   Zlangchain_core.documentsr
   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   rN   	getLoggerrS   loggerr   r   r   r   r    <module>   s   $

