§
    šŠtj^0  ã                  ó  — d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ erd dlmZ d dlmZ  G d	„ d
ee¦  «        Z edeeef         ¬¦  «        Z ej        e¦  «        ZdZ G d„ de¦  «        ZdS )é    )ÚannotationsN)ÚEnum)	ÚTYPE_CHECKINGÚAnyÚDictÚ	GeneratorÚIterableÚListÚOptionalÚTypeVarÚUnion)ÚDocument)ÚVectorStore)Ú
Embeddings)Ú
Collectionc                  ó"   — e Zd ZdZdZ	 dZ	 dZdS )ÚDocumentDBSimilarityTypez)DocumentDB Similarity Type as enumerator.ÚcosineÚ
dotProductÚ	euclideanN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCOSÚDOTÚEUC© ó    úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/documentdb.pyr   r      s+   € € € € € Ø3Ð3à
€CØØ
€CØØ
€CØÐr   r   ÚDocumentDBDocumentType)Úboundé€   c                  óò   — e Zd ZdZddddœdGd„ZedHd„¦   «         ZdId„ZedJd„¦   «         Z	dKd„Z
dLd„Zdej        ddfdMd%„Z	 dNdOd,„ZdPd/„Ze	 	 dQdRd2„¦   «         ZdNdSd6„ZdNdTd9„Z	 	 	 dUdVdC„Z	 	 dWd&dDœdXdF„Zd&S )YÚDocumentDBVectorSearcha€  `Amazon DocumentDB (with MongoDB compatibility)` vector store.
    Please refer to the official Vector Search documentation for more details:
    https://docs.aws.amazon.com/documentdb/latest/developerguide/vector-search.html

    To use, you should have both:
    - the ``pymongo`` python package installed
    - a connection string and credentials associated with a DocumentDB cluster

    Example:
        . code-block:: python

            from langchain_community.vectorstores import DocumentDBVectorSearch
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            from pymongo import MongoClient

            mongo_client = MongoClient("<YOUR-CONNECTION-STRING>")
            collection = mongo_client["<db_name>"]["<collection_name>"]
            embeddings = OpenAIEmbeddings()
            vectorstore = DocumentDBVectorSearch(collection, embeddings)
    ÚvectorSearchIndexÚtextContentÚvectorContent)Ú
index_nameÚtext_keyÚembedding_keyÚ
collectionú"Collection[DocumentDBDocumentType]Ú	embeddingr   r)   Ústrr*   r+   c               ón   — || _         || _        || _        || _        || _        t
          j        | _        dS )a¹  Constructor for DocumentDBVectorSearch

        Args:
            collection: MongoDB collection to add the texts to.
            embedding: Text embedding model to use.
            index_name: Name of the Vector Search index.
            text_key: MongoDB field that will contain the text
                for each document.
            embedding_key: MongoDB field that will contain the embedding
                for each document.
        N)Ú_collectionÚ
_embeddingÚ_index_nameÚ	_text_keyÚ_embedding_keyr   r   Ú_similarity_type)Úselfr,   r.   r)   r*   r+   s         r    Ú__init__zDocumentDBVectorSearch.__init__B   s;   € ð( &ˆÔØ#ˆŒØ%ˆÔØ!ˆŒØ+ˆÔÝ 8Ô <ˆÔÐÐr   Úreturnc                ó   — | j         S ©N)r2   ©r7   s    r    Ú
embeddingsz!DocumentDBVectorSearch.embeddings]   s
   € àŒÐr   c                ó   — | j         S )zUReturns the index name

        Returns:
            Returns the index name

        )r3   r<   s    r    Úget_index_namez%DocumentDBVectorSearch.get_index_namea   s   € ð ÔÐr   Úconnection_stringÚ	namespaceÚkwargsr   c                óÂ   — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w ||¦  «        }|                     d¦  «        \  }}||         |         }	 | |	|fi |¤ŽS )a†  Creates an Instance of DocumentDBVectorSearch from a Connection String

        Args:
            connection_string: The DocumentDB cluster endpoint connection string
            namespace: The namespace (database.collection)
            embedding: The embedding utility
            **kwargs: Dynamic keyword arguments

        Returns:
            an instance of the vector store

        r   )ÚMongoClientzGCould not import pymongo, please install it with `pip install pymongo`.ú.)ÚpymongorD   ÚImportErrorÚsplit)
Úclsr@   rA   r.   rB   rD   ÚclientÚdb_nameÚcollection_namer,   s
             r    Úfrom_connection_stringz-DocumentDBVectorSearch.from_connection_stringj   sž   € ð(	Ø+Ð+Ð+Ð+Ð+Ð+Ð+øÝð 	ð 	ð 	Ýð)ñô ð ð	øøøð
 *˜kÐ*;Ñ<Ô<ˆØ#,§?¢?°3Ñ#7Ô#7Ñ ˆ�Ø˜G”_ _Ô5ˆ
Øˆs�:˜yÐ3Ð3¨FÐ3Ð3Ð3s   ‚	 ‰#Úboolc                óŒ   — | j                              ¦   «         }| j        }|D ] }|                     d¦  «        }||k    r dS Œ!dS )zãVerifies if the specified index name during instance
            construction exists on the collection

        Returns:
          Returns True on success and False if no such index exists
            on the collection
        ÚnameTF)r1   Úlist_indexesr3   Úpop)r7   Úcursorr)   ÚresÚcurrent_index_names        r    Úindex_existsz#DocumentDBVectorSearch.index_existsŠ   s]   € ð Ô!×.Ò.Ñ0Ô0ˆØÔ%ˆ
àð 	ð 	ˆCØ!$§¢¨¡¤ÐØ! ZÒ/Ð/Ø�t�tð 0ð ˆur   ÚNonec                óp   — |                       ¦   «         r!| j                             | j        ¦  «         dS dS )zEDeletes the index specified during instance construction if it existsN)rV   r1   Ú
drop_indexr3   r<   s    r    Údelete_indexz#DocumentDBVectorSearch.delete_indexœ   s@   € à×ÒÑÔð 	:ØÔ×'Ò'¨Ô(8Ñ9Ô9Ð9Ð9Ð9ð	:ð 	:r   i   é   é@   Ú
dimensionsÚintÚ
similarityr   ÚmÚef_constructionúdict[str, Any]c           	     ó¢   — || _         | j        j        | j        | j        did||||dœdœgdœ}| j        j        }|                     |¦  «        }|S )aà  Creates an index using the index name specified at
            instance construction

        Args:
            dimensions: Number of dimensions for vector similarity.
                The maximum number of supported dimensions is 2000

            similarity: Similarity algorithm to use with the HNSW index.
                 Possible options are:
                    - DocumentDBSimilarityType.COS (cosine distance),
                    - DocumentDBSimilarityType.EUC (Euclidean distance), and
                    - DocumentDBSimilarityType.DOT (dot product).

            m: Specifies the max number of connections for an HNSW index.
                Large impact on memory consumption.

            ef_construction: Specifies the size of the dynamic candidate list
                for constructing the graph for HNSW index. Higher values lead
                to more accurate results but slower indexing speed.


        Returns:
            An object describing the created index

        ÚvectorÚhnsw)Útyper_   r]   r`   ÚefConstruction)rP   ÚkeyÚvectorOptions)ÚcreateIndexesÚindexes)r6   r1   rP   r3   r5   ÚdatabaseÚcommand)r7   r]   r_   r`   ra   Úcreate_index_commandsÚcurrent_databaseÚcreate_index_responsess           r    Úcreate_indexz#DocumentDBVectorSearch.create_index£   s’   € ð@ !+ˆÔð "Ô-Ô2ð !Ô,Ø Ô/°Ð:à &Ø&0Ø&0ØØ*9ð&ð &ð
ð 
ðð!
ð !
Ðð$  Ô+Ô4Ðð 2B×1IÒ1IØ!ñ2
ô 2
Ðð &Ð%r   NÚtextsúIterable[str]Ú	metadatasúOptional[List[Dict[str, Any]]]r
   c                óÌ  — |                      dt          ¦  «        }|pd„ |D ¦   «         }g }g }g }t          t          ||¦  «        ¦  «        D ]k\  }	\  }
}|                     |
¦  «         |                     |¦  «         |	dz   |z  dk    r-|                     |                      ||¦  «        ¦  «         g }g }Œl|r)|                     |                      ||¦  «        ¦  «         |S )NÚ
batch_sizec              3  ó   K  — | ]}i V — Œd S r;   r   )Ú.0Ú_s     r    ú	<genexpr>z3DocumentDBVectorSearch.add_texts.<locals>.<genexpr>è   s"   è è € Ð:MÐ:MÀ!¸2Ð:MÐ:MÐ:MÐ:MÐ:MÐ:Mr   é   r   )ÚgetÚDEFAULT_INSERT_BATCH_SIZEÚ	enumerateÚzipÚappendÚextendÚ_insert_texts)r7   rr   rt   rB   rw   Ú
_metadatasÚtexts_batchÚmetadatas_batchÚ
result_idsÚiÚtextÚmetadatas               r    Ú	add_textsz DocumentDBVectorSearch.add_textsá   s	  € ð —Z’Z Õ.GÑHÔHˆ
Ø-6Ð-MÐ:MÐ:MÀuÐ:MÑ:MÔ:Mˆ
ØˆØˆØˆ
Ý#,­S°¸
Ñ-CÔ-CÑ#DÔ#Dð 	%ð 	%ÑˆAÑ��hØ×Ò˜tÑ$Ô$Ð$Ø×"Ò" 8Ñ,Ô,Ð,Ø�A‘˜Ñ# qÒ(Ð(Ø×!Ò! $×"4Ò"4°[À/Ñ"RÔ"RÑSÔSÐSØ �Ø"$�øØð 	PØ×Ò˜d×0Ò0°¸oÑNÔNÑOÔOÐOØÐr   ú	List[str]úList[Dict[str, Any]]c                ó¼   ‡ — |sg S ‰ j                              |¦  «        }ˆ fd„t          |||¦  «        D ¦   «         }‰ j                             |¦  «        }|j        S )zàUsed to Load Documents into the collection

        Args:
            texts: The list of documents strings to load
            metadatas: The list of metadata objects associated with each document

        Returns:

        c                ó<   •— g | ]\  }}}‰j         |‰j        |i|¥‘ŒS r   )r4   r5   )ry   Útr`   r.   r7   s       €r    ú
<listcomp>z8DocumentDBVectorSearch._insert_texts.<locals>.<listcomp>  sB   ø€ ð 
ð 
ð 
á��1�ið Œ^˜Q Ô 3°YÐDÀ!ÐDð
ð 
ð 
r   )r2   Úembed_documentsr€   r1   Úinsert_manyÚinserted_ids)r7   rr   rt   r=   Ú	to_insertÚinsert_results   `     r    rƒ   z$DocumentDBVectorSearch._insert_texts÷   s~   ø€ ð ð 	ØˆIð ”_×4Ò4°UÑ;Ô;ˆ
ð
ð 
ð 
ð 
å#& u¨i¸Ñ#DÔ#Dð
ñ 
ô 
ˆ	ð
 Ô(×4Ò4°YÑ?Ô?ˆØÔ)Ð)r   úOptional[List[dict]]ú,Optional[Collection[DocumentDBDocumentType]]c                ój   — |€t          d¦  «        ‚ | ||fi |¤Ž}|                     ||¬¦  «         |S )Nz*Must provide 'collection' named parameter.)rt   )Ú
ValueErrorr‹   )rI   rr   r.   rt   r,   rB   Úvectorstores          r    Ú
from_textsz!DocumentDBVectorSearch.from_texts  sQ   € ð ÐÝÐIÑJÔJÐJØ�c˜* iÐ:Ð:°6Ð:Ð:ˆØ×Ò˜e¨yÐÑ9Ô9Ð9ØÐr   ÚidsúOptional[List[str]]úOptional[bool]c                ó\   — |€t          d¦  «        ‚|D ]}|                      |¦  «         ŒdS )Nz#No document ids provided to delete.T)rš   Údelete_document_by_id)r7   r�   rB   Údocument_ids       r    ÚdeletezDocumentDBVectorSearch.delete  sA   € Øˆ;ÝÐBÑCÔCÐCàð 	4ð 	4ˆKØ×&Ò& {Ñ3Ô3Ð3Ð3Øˆtr   r¢   úOptional[str]c                óÆ   — 	 ddl m} n"# t          $ r}t          d¦  «        |‚d}~ww xY w|€t          d¦  «        ‚| j                             d ||¦  «        i¦  «         dS )zjRemoves a Specific Document by Id

        Args:
            document_id: The document identifier
        r   )ÚObjectIdz>Unable to import bson, please install with `pip install bson`.Nz"No document id provided to delete.Ú_id)Úbson.objectidr¦   rG   rš   r1   Ú
delete_one)r7   r¢   r¦   Úes       r    r¡   z,DocumentDBVectorSearch.delete_document_by_id&  s–   € ð	Ø.Ð.Ð.Ð.Ð.Ð.Ð.øÝð 	ð 	ð 	ÝØPñô àðøøøøð	øøøð ÐÝÐAÑBÔBÐBàÔ×#Ò# U¨H¨H°[Ñ,AÔ,AÐ$BÑCÔCÐCÐCÐCs   ‚	 ‰
(“#£(é   é(   r=   úList[float]ÚkÚ	ef_searchÚfilterúOptional[Dict[str, Any]]úList[Document]c           	     ó   — |si }d|idd|| j         | j        ||dœiig}| j                             |¦  «        }g }|D ]@}|                     | j        ¦  «        }	|                     t          |	|¬¦  «        ¦  «         ŒA|S )a   Returns a list of documents.

        Args:
            embeddings: The query vector
            k: the number of documents to return
            ef_search: Specifies the size of the dynamic candidate list
                that HNSW index uses during search. A higher value of
                efSearch provides better recall at cost of speed.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
        Returns:
            A list of documents closest to the query vector
        z$matchz$searchÚvectorSearch)rd   Úpathr_   r®   ÚefSearch)Úpage_contentrŠ   )r5   r6   r1   Ú	aggregaterR   r4   r�   r   )
r7   r=   r®   r¯   r°   ÚpipelinerS   ÚdocsrT   r‰   s
             r    Ú _similarity_search_without_scorez7DocumentDBVectorSearch._similarity_search_without_score7  s·   € ð* ð 	ØˆFà�vÐàØ"Ø",Ø $Ô 3Ø&*Ô&;ØØ$-ð%ð %ðð
ð*
ˆð Ô!×+Ò+¨HÑ5Ô5ˆàˆàð 	Cð 	CˆCØ—7’7˜4œ>Ñ*Ô*ˆDØ�KŠK�¨d¸SÐAÑAÔAÑBÔBÐBÐBàˆr   )r°   Úqueryc               ó€   — | j                              |¦  «        }|                      ||||¬¦  «        }d„ |D ¦   «         S )N)r=   r®   r¯   r°   c                ó   — g | ]}|‘ŒS r   r   )ry   Údocs     r    r‘   z<DocumentDBVectorSearch.similarity_search.<locals>.<listcomp>t  s   € Ð$Ð$Ð$˜�Ð$Ð$Ð$r   )r2   Úembed_queryr»   )r7   r¼   r®   r¯   r°   rB   r=   rº   s           r    Úsimilarity_searchz(DocumentDBVectorSearch.similarity_searchg  sR   € ð ”_×0Ò0°Ñ7Ô7ˆ
Ø×4Ò4Ø! Q°)ÀFð 5ñ 
ô 
ˆð %Ð$˜tÐ$Ñ$Ô$Ð$r   )
r,   r-   r.   r   r)   r/   r*   r/   r+   r/   )r9   r   )r9   r/   )
r@   r/   rA   r/   r.   r   rB   r   r9   r%   )r9   rN   )r9   rW   )
r]   r^   r_   r   r`   r^   ra   r^   r9   rb   r;   )rr   rs   rt   ru   rB   r   r9   r
   )rr   rŒ   rt   r�   r9   r
   )NN)rr   rŒ   r.   r   rt   r—   r,   r˜   rB   r   r9   r%   )r�   rž   rB   r   r9   rŸ   )r¢   r¤   r9   rW   )r«   r¬   N)
r=   r­   r®   r^   r¯   r^   r°   r±   r9   r²   )r«   r¬   )r¼   r/   r®   r^   r¯   r^   r°   r±   rB   r   r9   r²   )r   r   r   r   r8   Úpropertyr=   r?   ÚclassmethodrM   rV   rZ   r   r   rq   r‹   rƒ   rœ   r£   r¡   r»   rÁ   r   r   r    r%   r%   ,   sÙ  € € € € € ðð ð4 .Ø%Ø,ð=ð =ð =ð =ð =ð =ð6 ðð ð ñ „Xðð ð  ð  ð  ð ð4ð 4ð 4ñ „[ð4ð>ð ð ð ð$:ð :ð :ð :ð Ø/GÔ/KØØ!ð<&ð <&ð <&ð <&ð <&ðB 59ðð ð ð ð ð,*ð *ð *ð *ð0 ð
 +/ØCGðð ð ð ñ „[ððð ð ð ð ðDð Dð Dð Dð Dð( ØØ+/ð.ð .ð .ð .ð .ðf Øð	%ð ,0ð%ð %ð %ð %ð %ð %ð %ð %r   r%   )Ú
__future__r   ÚloggingÚenumr   Útypingr   r   r   r   r	   r
   r   r   r   Úlangchain_core.documentsr   Úlangchain_core.vectorstoresr   Úlangchain_core.embeddingsr   Úpymongo.collectionr   r/   r   r!   Ú	getLoggerr   Úloggerr~   r%   r   r   r    ú<module>rÎ      s”  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð .Ð -Ð -Ð -Ð -Ð -Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3àð .Ø4Ð4Ð4Ð4Ð4Ð4Ø-Ð-Ð-Ð-Ð-Ð-ðð ð ð ð ˜s Dñ ô ð ð !˜Ð!9ÀÀcÈ3ÀhÄÐPÑPÔPÐ à	ˆÔ	˜8Ñ	$Ô	$€àÐ ðH%ð H%ð H%ð H%ð H%˜[ñ H%ô H%ð H%ð H%ð H%r   