
    h;                        d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ  ej2                  e      Z G d de      Zy)    )annotationsN)deepcopy)Enum)AnyIterableListOptionalTuple)Document)
Embeddings)run_in_executor)VectorStore)maximal_marginal_relevancec                  :   e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 ddZedd       Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZe	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	 G d de
      Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 dd
Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 ddZd	ej                  df	 	 	 	 	 	 	 	 	 	 	 ddZd	ej                  df	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 d dd	 	 	 	 	 	 	 	 	 	 	 	 	 d!dZ	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 d#dZd$dZd%dZd&d'dZ	 d&	 	 	 	 	 d'dZy)(Rockseta  `Rockset` vector store.

    To use, you should have the `rockset` python package installed. Note that to use
    this, the collection being used must already exist in your Rockset instance.
    You must also ensure you use a Rockset ingest transformation to apply
    `VECTOR_ENFORCE` on the column being used to store `embedding_key` in the
    collection.
    See: https://rockset.com/blog/introducing-vector-search-on-rockset/ for more details

    Everything below assumes `commons` Rockset workspace.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import Rockset
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            import rockset

            # Make sure you use the right host (region) for your Rockset instance
            # and APIKEY has both read-write access to your collection.

            rs = rockset.RocksetClient(host=rockset.Regions.use1a1, api_key="***")
            collection_name = "langchain_demo"
            embeddings = OpenAIEmbeddings()
            vectorstore = Rockset(rs, collection_name, embeddings,
                "description", "description_embedding")

    c                2   	 ddl m} t        ||      st	        dt        |             || _        || _        || _        || _	        || _
        || _        	 | j                  j                  d       y# t        $ r t        d      w xY w# t        $ r Y yw xY w)aN  Initialize with Rockset client.
        Args:
            client: Rockset client object
            collection: Rockset collection to insert docs / query
            embeddings: Langchain Embeddings object to use to generate
                        embedding for given text.
            text_key: column in Rockset collection to use to store the text
            embedding_key: column in Rockset collection to use to store the embedding.
                           Note: We must apply `VECTOR_ENFORCE()` on this column via
                           Rockset ingest transformation.

        r   )RocksetClient]Could not import rockset client python package. Please install it with `pip install rockset`.z;client should be an instance of rockset.RocksetClient, got 	langchainN)rocksetr   ImportError
isinstance
ValueErrortype_client_collection_name_embeddings	_text_key_embedding_key
_workspaceset_applicationAttributeError)selfclient
embeddingscollection_nametext_keyembedding_key	workspacer   s           h/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/rocksetdb.py__init__zRockset.__init__1   s    *	- &-0F|n& 
  /%!+#	LL((5)  	@ 	*  		s   A2 B
 2B
	BBc                    | j                   S N)r   r#   s    r*   r%   zRockset.embeddingsa   s        Nc                   g }g }t        |      D ]  \  }}	t        |      |k(  r|| j                  |      z  }g }i }
|rt        |      |kD  rt        ||         }
|rt        |      |kD  r||   |
d<   |	|
| j                  <   | j
                  j                  |	      |
| j                  <   |j                  |
        t        |      dkD  r|| j                  |      z  }g }|S )a  Run more texts through the embeddings and add to the vectorstore

                Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of ids to associate with the texts.
            batch_size: Send documents in batches to rockset.

        Returns:
            List of ids from adding the texts into the vectorstore.

        _idr   )		enumeratelen_write_documents_to_rocksetr   r   r   embed_queryr   append)r#   texts	metadatasids
batch_sizekwargsbatch
stored_idsitextdocs              r*   	add_textszRockset.add_textse   s    ( 
 ' 	GAt5zZ'd>>uEE
CS^a/y|,s3x!| VE
"&C'+'7'7'C'CD'IC##$LL	 u:>$::5AAJEr/   c
                    |J d       |sJ d       |sJ d       |sJ d        | |||||      }|j                  ||||	       |S )znCreate Rockset wrapper with existing texts.
        This is intended as a quicker way to get started.
        zRockset Client cannot be NonezCollection name cannot be emptyzText key name cannot be emptyzEmbedding key cannot be empty)rA   )clsr7   	embeddingr8   r$   r&   r'   r(   r9   r:   r;   r   s               r*   
from_textszRockset.from_texts   sk    & !B#BB!A AA888x===}fi(MR%C<r/   c                       e Zd ZdZdZdZddZy)Rockset.DistanceFunction
COSINE_SIMEUCLIDEAN_DISTDOT_PRODUCTc                $    | j                   dk(  ryy)NrI   ASCDESC)valuer.   s    r*   order_byz!Rockset.DistanceFunction.order_by   s    zz--r/   N)returnstr)__name__
__module____qualname__rH   rI   rJ   rO    r/   r*   DistanceFunctionrG      s    !
)#	r/   rV      c                `     | j                   | j                  j                  |      |||fi |S )a  Perform a similarity search with Rockset

        Args:
            query (str): Text to look up documents similar to.
            distance_func (DistanceFunction): how to compute distance between two
                vectors in Rockset.
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.
            where_str (Optional[str], optional): Metadata filters supplied as a
                SQL `where` condition string. Defaults to None.
                eg. "price<=70.0 AND brand='Nintendo'"

            NOTE: Please do not let end-user to fill this and always be aware
                  of SQL injection.

        Returns:
            List[Tuple[Document, float]]: List of documents with their relevance score
        )1similarity_search_by_vector_with_relevance_scoresr   r5   r#   querykdistance_func	where_strr;   s         r*   'similarity_search_with_relevance_scoresz/Rockset.similarity_search_with_relevance_scores   sA    2 FtEE((/	

 
 	
r/   c                `     | j                   | j                  j                  |      |||fi |S )zaSame as `similarity_search_with_relevance_scores` but
        doesn't return the scores.
        )similarity_search_by_vectorr   r5   rZ   s         r*   similarity_searchzRockset.similarity_search   s@     0t//((/	

 
 	
r/   c                d     | j                   ||||fi |}|D cg c]  \  }}|	 c}}S c c}}w )zZAccepts a query_embedding (vector), and returns documents with
        similar embeddings.)rY   )	r#   rD   r\   r]   r^   r;   docs_and_scoresr@   _s	            r*   ra   z#Rockset.similarity_search_by_vector   sB     Q$PPq-
6<
 #22Q222s   ,c           	        d}d|v r|d   }| j                  |||||      }	 | j                  j                  j                  d|i      }g }
|j                  D ]  }i }t        |t              sJ dj                  t        |                   |j                         D ]  \  }}|| j                  k(  r=t        |t              s*J dj                  | j                  t        |                   |}R|d	k(  r2t        |t              sJ d
j                  t        |                   |}|dvs|||<    |
j!                  t#        |      f        |
S # t        $ r"}	t
        j                  d|	       g cY d}	~	S d}	~	ww xY w)z|Accepts a query_embedding (vector), and returns documents with
        similar embeddings along with their relevance scores.Texclude_embeddingsr[   )sqlz$Exception when querying Rockset: %s
Nz;document should be of type `dict[str,Any]`. But found: `{}`zIpage content stored in column `{}` must be of type `str`. But found: `{}`distzDComputed distance between vectors must of type `float`. But found {})r1   _event_time_meta)page_contentmetadata)_build_query_sqlr   Queriesr[   	Exceptionloggererrorresultsr   dictformatr   itemsr   rQ   floatr6   r   )r#   rD   r\   r]   r^   r;   rg   q_strquery_responseefinalResultdocumentrm   vrl   scores                   r*   rY   z9Rockset.similarity_search_by_vector_with_relevance_scores   s    "6)!'(<!=%%}a4F
	!\\1177We<L7MN 57&.. 	HHh- MTTN-
 !( $1&%a- 6*fT^^T!W56- $%L&[%a/ &'fT!Wo&/ E== #$HQK!$" ,J1	< E  	LL@!DI	s   (E 	E>E93E>9E>)r^   c               r   | j                   j                  |      } | j                  |f||dd|}|D 	cg c]  }	|	j                  | j                      }
}	t        t        j                  |      |
||      }|D ]  }||   j                  | j                  =  |D cg c]  }||   	 c}S c c}	w c c}w )a  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            distance_func (DistanceFunction): how to compute distance between two
                vectors in Rockset.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            where_str: where clause for the sql query
        Returns:
            List of Documents selected by maximal marginal relevance.
        F)r\   r^   rg   )lambda_multr\   )r   r5   ra   rm   r   r   nparray)r#   r[   r\   fetch_kr   r^   r;   query_embeddinginitial_docsr@   r%   selected_indicesr>   s                r*   max_marginal_relevance_searchz%Rockset.max_marginal_relevance_search0  s    : **66u=7t77
$	

 
 DPPCcll4#6#67P
P5HH_%#	
 " 	>AQ(()<)<=	> *::AQ:: Q ;s    B/ B4c                @   dj                  t        t        |            }|j                   d| j                   d| d}|rd| dnd}|rd| j                   d	nd}d
| d| d| j
                   d| j                   d| d|j                          dt        |       dS )zABuilds Rockset SQL query to query similar vectors to query_vector,(z, [z
]) as distzWHERE 
 z EXCEPT(z),zSELECT * z
FROM .zORDER BY dist z
LIMIT )joinmaprQ   rN   r   r    r   rO   )	r#   r   r]   r\   r^   rg   q_embedding_strdistance_strselect_embeddings	            r*   rn   zRockset._build_query_sqlh  s     ((3sO#<=)//0$2E2E1F G* .7fYKr*R	2Dht**+2.# 			!L> *
ooa--. /
 %%'( )
1vh  	r/   c                    | j                   j                  j                  | j                  || j                        }|j
                  D cg c]  }|j                   c}S c c}w )N
collectiondatar)   )r   	Documentsadd_documentsr   r    r   r1   )r#   r<   add_doc_res
doc_statuss       r*   r4   z#Rockset._write_documents_to_rockset  sR    ll,,::,,5DOO ; 
 2=1A1AB:
BBBs   A!c           	         	 ddl m} | j                  j                  j                  | j                  |D cg c]  } ||       c}| j                         y# t        $ r t        d      w xY wc c}w )z1Delete a list of docs from the Rockset collectionr   )DeleteDocumentsRequestDatar   )idr   N)rockset.modelsr   r   r   r   delete_documentsr   r    )r#   r9   r   r>   s       r*   delete_textszRockset.delete_texts  sv    	A 	//,,<?@q,2@oo 	0 	
  	@ 	 As   A A2
A/c                    	 |g }| j                  |       y# t        $ r }t        j                  d|       Y d }~yd }~ww xY w)Nz.Exception when deleting docs from Rockset: %s
FT)r   rp   rq   rr   )r#   r9   r;   rz   s       r*   deletezRockset.delete  sH    	{c"
 	  	LLJAN	s    	A<Ac                N   K   t        d | j                  |fi | d {   S 7 wr-   )r   r   )r#   r9   r;   s      r*   adeletezRockset.adelete  s&      %T4;;FvFFFFs   %#%)commons)r$   r   r%   r   r&   rQ   r'   rQ   r(   rQ   r)   rQ   )rP   r   )NN    )r7   zIterable[str]r8   Optional[List[dict]]r9   Optional[List[str]]r:   intr;   r   rP   	List[str])NNr   r   r   Nr   )r7   r   rD   r   r8   r   r$   r   r&   rQ   r'   rQ   r(   rQ   r9   r   r:   r   r;   r   rP   r   )r[   rQ   r\   r   r]   rV   r^   Optional[str]r;   r   rP   List[Tuple[Document, float]])r[   rQ   r\   r   r]   rV   r^   r   r;   r   rP   List[Document])rD   List[float]r\   r   r]   rV   r^   r   r;   r   rP   r   )rD   r   r\   r   r]   rV   r^   r   r;   r   rP   r   )rW      g      ?)r[   rQ   r\   r   r   r   r   rw   r^   r   r;   r   rP   r   )rW   NT)r   r   r]   rV   r\   r   r^   r   rg   boolrP   rQ   )r<   z
List[dict]rP   r   )r9   r   rP   Noner-   )r9   r   r;   r   rP   zOptional[bool])rR   rS   rT   __doc__r+   propertyr%   rA   classmethodrE   r   rV   rH   r_   rb   ra   rY   r   rn   r4   r   r   r   rU   r/   r*   r   r      sp   H #.. . 	.
 . . .`     +/#'&& (& !	&
 & & 
&P 
 +/!#'  (	
     !   
 8	4 	 *:*E*E#'

 
 (	

 !
 
 
&
H *:*E*E#'

 
 (	

 !
 
 

, *:*E*E#'33 3 (	3
 !3 3 
3& *:*E*E#'55 5 (	5
 !5 5 
&5t  4; $(4;4; 4; 	4;
 4; !4; 4; 
4;x #'#'$ ( 	
 ! ! 
2C
 	 *.G&G9<G	Gr/   r   )
__future__r   loggingcopyr   enumr   typingr   r   r   r	   r
   numpyr   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.runnablesr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   	getLoggerrR   rq   r   rU   r/   r*   <module>r      sK    "    7 7  - 0 4 3 M			8	$RGk RGr/   