
    Ng=                        d dl mZ d dl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ddZ G d de          ZdS )    )annotationsN)TYPE_CHECKINGAnyIterableListOptionalTupleType)Document)
Embeddings)VectorStorevectorList[float]returnbytesc                F    t          j        dt          |           z  g| R  S )zSerializes a list of floats into a compact "raw bytes" format

    Source: https://github.com/asg017/sqlite-vec/blob/21c5a14fc71c83f135f5b00c84115139fd12c492/examples/simple-python/demo.py#L8-L10
    z%sf)structpacklen)r   s    f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/sqlitevec.pyserialize_f32r      s'    
 ;us6{{*4V4444    c                      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	SQLiteVecaL  SQLite with Vec extension as a vector database.

    To use, you should have the ``sqlite-vec`` python package installed.
    Example:
        .. code-block:: python
            from langchain_community.vectorstores import SQLiteVec
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            ...
    vec.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-vec python package. Please install it with `pip install sqlite-vec`.z+embeddings input must be Embeddings object.)
sqlite_vecImportErrorcreate_connection
isinstancer   warningswarn_connection_table
_embeddingcreate_table_if_not_exists)selfr   r   r    r!   r#   s         r   __init__zSQLiteVec.__init__.   s    	 	 	 	C  	  	9//88J)Z00 	IMGHHH%#'')))))s    !r   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
            )
            ;
            z0
            CREATE VIRTUAL TABLE IF NOT EXISTS za_vec USING vec0(
                rowid INTEGER PRIMARY KEY,
                text_embedding float[z*]
            )
            ;
            zZ
                CREATE TRIGGER IF NOT EXISTS embed_text 
                AFTER INSERT ON z7
                BEGIN
                    INSERT INTO z_vec(rowid, text_embedding)
                    VALUES (new.rowid, new.text_embedding) 
                    ;
                END;
            )r)   executer*   get_dimensionalitycommit)r-   s    r   r,   z$SQLiteVec.create_table_if_not_existsJ   s      	(,	 	 		
 	
 	
 	  04  '+&=&=&?&?  	
 	
 	
 	  !%  "&	  
	
 
	
 
	
 	!!!!!r   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  r=   ).0_s     r   
<listcomp>z'SQLiteVec.add_texts.<locals>.<listcomp>   s    ++++++r   c                ^    g | ]*\  }}}|t          j        |          t          |          f+S r=   )jsondumpsr   )r>   textmetadataembeds       r   r@   z'SQLiteVec.add_texts.<locals>.<listcomp>   sG     
 
 
%h 4:h''u)=)=>
 
 
r   zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > c                    g | ]
}|d          S )r;   r=   )r>   rows     r   r@   z'SQLiteVec.add_texts.<locals>.<listcomp>   s    000G000r   )
r)   r1   r*   fetchoner+   embed_documentslistzipexecutemanyr3   )r-   r4   r6   r8   max_idembeds
data_inputresultss           r   	add_textszSQLiteVec.add_textsm   s7    !))<t{<<
 

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

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

 	!!!"**EEEVEE
 
 100000r      r   kintList[Tuple[Document, float]]c                ~   d| j          d| j          d}| j                                        }|                    |t	          |          |g           |                                }g }|D ]R}t          j        |d                   pi }	t          |d         |	          }
|	                    |
|d         f           S|S )Nzo
            SELECT 
                text,
                metadata,
                distance
            FROM z AS e
            INNER JOIN z_vec AS v on v.rowid = e.rowid  
            WHERE
                v.text_embedding MATCH ?
                AND k = ?
            ORDER BY distance
        rE   rD   )page_contentrE   distance)
r*   r)   cursorr1   r   fetchallrB   loadsr   append)r-   r    rT   r8   	sql_queryrZ   rQ   	documentsrH   rE   docs              r   &similarity_search_with_score_by_vectorz0SQLiteVec.similarity_search_with_score_by_vector   s    
 +    	 !((**9%%q)	
 	
 	
 //##	 	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    rT   c                    g | ]\  }}|S r=   r=   r>   r`   r?   s      r   r@   z/SQLiteVec.similarity_search.<locals>.<listcomp>       ,,,Q,,,r   r+   embed_queryra   r-   rb   rT   r8   r    r_   s         r   similarity_searchzSQLiteVec.similarity_search   sO     O//66	??1 @ 
 
	 -,),,,,r   c                h    | j                             |          }|                     ||          }|S )re   rf   rj   rl   s         r   similarity_search_with_scorez&SQLiteVec.similarity_search_with_score   sA     O//66	??1 @ 
 
	 r   c                H    |                      ||          }d |D             S )Nrf   c                    g | ]\  }}|S r=   r=   rh   s      r   r@   z9SQLiteVec.similarity_search_by_vector.<locals>.<listcomp>   ri   r   )ra   )r-   r    rT   r8   r_   s        r   similarity_search_by_vectorz%SQLiteVec.similarity_search_by_vector   s:     ??1 @ 
 
	 -,),,,,r   	langchainclsType[SQLiteVec]c                |    |                      |          } | ||||          }|                    ||           |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r!   r    )r4   r6   )r%   rR   )	rt   r4   r    r6   r   r!   r8   r   vecs	            r   
from_textszSQLiteVec.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!   r{   r#   r   s       r   r%   zSQLiteVec.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+   rk   r   )r-   
dummy_textdummy_embeddings      r   r2   zSQLiteVec.get_dimensionality   s,    
 ,
/55jAA?###r   )r   )r   r   r   r   r    r   r!   r   )r   r/   )N)r4   r5   r6   r7   r8   r   r   r9   )rS   )r    r   rT   rU   r8   r   r   rV   )rb   r   rT   rU   r8   r   r   rc   )rb   r   rT   rU   r8   r   r   rV   )r    r   rT   rU   r8   r   r   rc   )Nrs   r   )rt   ru   r4   r9   r    r   r6   r7   r   r   r!   r   r8   r   r   r   )r!   r   r   ry   )r   rU   )__name__
__module____qualname____doc__r.   r,   rR   ra   rm   ro   rr   classmethodrx   staticmethodr%   r2   r=   r   r   r   r   #   sL          * * * * *8!" !" !" !"L +/#1 #1 #1 #1 #1L 01    > $%- - - - - $%     01- - - - - 
 +/     [" 
 
 
 \
$ $ $ $ $ $r   r   )r   r   r   r   )
__future__r   rB   loggingr   r'   typingr   r   r   r   r   r	   r
   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   r{   	getLoggerr   loggerr   r   r=   r   r   <module>r      sB   " " " " " "                      . - - - - - 0 0 0 0 0 0 3 3 3 3 3 3 NNN		8	$	$5 5 5 5O$ O$ O$ O$ O$ O$ O$ O$ O$ O$r   