
    hv                        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y)	    )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	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ		 d	 	 	 	 	 	 	 dd	Z
e	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
       Zedd       ZddZy)	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
            ...
    c                    	 ddl }|s| j                  |      }t        |t              st        j                  d       || _        || _        || _	        | j                          y# t        $ r t        d      w xY w)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)selftable
connection	embeddingdb_filer   s         h/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/sqlitevss.py__init__zSQLiteVSS.__init__%   s|    	 //8J)Z0MMGH%#'')!  	C 	s   A$ $A9c                j   | j                   j                  d| j                   d       | j                   j                  d| j                   d| j                          d       | j                   j                  d| j                   d| j                   d       | j                   j	                          y )	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      ((,} 5		
 	  88<} E""&"9"9";!< =	
 	  !!% .%%)[[M 2	
	
 	!    Nc           
        | j                   j                  d| j                         j                         d   }|d}| j                  j                  t        |            }|s|D cg c]  }i  }}t        |||      D 	cg c]1  \  }}}	|t        j                  |      t        j                  |	      f3 }
}}}	| j                   j                  d| j                   d|
       | j                   j                          | j                   j                  d| j                   d|       }|D cg c]  }|d   	 c}S c c}w c c}	}}w c c}w )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 rowidr   zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > )r   r#   r   fetchoner   embed_documentslistzipjsondumpsexecutemanyr%   )r   texts	metadataskwargsmax_idembeds_textmetadataembed
data_inputresultsrows                r    	add_textszSQLiteVSS.add_textsb   sJ    !!)).t{{m<

(*W >F00e=%*++I+ *-UIv)F
 
%h 4::h'E):;

 
 	$$4;;-'VW	
 	!""** _VHE
 )00G00 ,
 1s   (	E 6E1Ec           	     ~   d| j                    d| j                    dt        j                  |       d| d	}| j                  j	                         }|j                  |       |j                         }g }|D ]D  }t        j                  |d         xs i }	t        |d   |	      }
|j                  |
|d	   f       F |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)
            )
        r7   r6   )page_contentr7   distance)
r   r-   r.   r   cursorr#   fetchallloadsr   append)r   r   kr2   	sql_queryr@   r:   	documentsr;   r7   docs              r    &similarity_search_with_score_by_vectorz0SQLiteVSS.similarity_search_with_score_by_vector   s    
 ++  KK= )" #'**Y"7!8A3 ?		 !!((*y!//#	 	5Czz#j/28bHFhGCc3z?34	5
 r&   c                    | j                   j                  |      }| j                  ||      }|D cg c]  \  }}|	 c}}S c c}}w z"Return docs most similar to query.r   rD   r   embed_queryrH   )r   queryrD   r2   r   rF   rG   r5   s           r    similarity_searchzSQLiteVSS.similarity_search   sM     OO//6	??1 @ 
	 #,,Q,,,s   Ac                b    | j                   j                  |      }| j                  ||      }|S rJ   rL   )r   rN   rD   r2   r   rF   s         r    similarity_search_with_scorez&SQLiteVSS.similarity_search_with_score   s;     OO//6	??1 @ 
	 r&   c                ^    | j                  ||      }|D cg c]  \  }}|	 c}}S c c}}w )NrK   )rH   )r   r   rD   r2   rF   rG   r5   s          r    similarity_search_by_vectorz%SQLiteVSS.similarity_search_by_vector   s9     ??1 @ 
	 #,,Q,,,s   )c                f    | j                  |      } | ||||      }|j                  ||       |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r   r   )r0   r1   )r   r<   )	clsr0   r   r1   r   r   r2   r   vsss	            r    
from_textszSQLiteVSS.from_texts   s>     **73
J9
 	EY7
r&   c                    dd l }dd l} |j                  |       }|j                  |_        |j                  d       |j                  |       |j                  d       |S )Nr   TF)sqlite3r   connectRowrow_factoryenable_load_extensionload)r   rY   r   r   s       r    r   zSQLiteVSS.create_connection   sR    $W__W-
!(
((.
#((/r&   c                R    d}| j                   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   rM   len)r   
dummy_textdummy_embeddings      r    r$   zSQLiteVSS.get_dimensionality   s(    
 ,
//55jA?##r&   )vss.db)r   strr   zOptional[sqlite3.Connection]r   r   r   rd   )returnNone)N)r0   zIterable[str]r1   Optional[List[dict]]r2   r   re   	List[str])   )r   List[float]rD   intr2   r   re   List[Tuple[Document, float]])rN   rd   rD   rk   r2   r   re   List[Document])rN   rd   rD   rk   r2   r   re   rl   )r   rj   rD   rk   r2   r   re   rm   )N	langchainrc   )rU   zType[SQLiteVSS]r0   rh   r   r   r1   rg   r   rd   r   rd   r2   r   re   r   )r   rd   re   zsqlite3.Connection)re   rk   )__name__
__module____qualname____doc__r!   r   r<   rH   rO   rQ   rS   classmethodrW   staticmethodr   r$    r&   r    r   r      s     ** 1* 	*
 *8"H +/"1"1 ("1 	"1
 
"1J 01$),<?	%8 $%-- -03-	- $% 03	% 01-$-),-<?-	- 
 +/   (	
    
 " 
 
$r&   r   )
__future__r   r-   loggingr   typingr   r   r   r   r   r	   r
   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   rY   	getLoggerro   loggerr   ru   r&   r    <module>r~      sQ    "      . 0 3			8	$I$ I$r&   