
    Ng                        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         f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/sqlitevss.py__init__zSQLiteVSS.__init__%   s    	 	 	 	C  	  	9//88J)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   s7    !))<t{<<
 

(**W >F00e== 	,++U+++I
 
),UIv)F)F
 
 

 	$$4;   	
 	
 	

 	!!!"**EEEV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 	5Cz#j/228bHFhGGGCc3z?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
 
 
 	EY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5j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 #1L 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 NNN		8	$	$J$ J$ J$ J$ J$ J$ J$ J$ J$ J$r+   