
    NgWL                        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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 d	Zd
ZdZdZdZdZdZ G d de          Z dS )    )annotationsN)AnyDictListOptionalSequenceTupleType)Document)
Embeddings)UpsertResponse)VectorStore)overrideHNSWCS	langchaini  lc_textuniqueidc                      e Zd Zeedddej        dfdE fd            ZdFdZedGdHd            Z	edId            Z
e	 dJdKd             ZedLd"            ZdMd&Z	 dNdOd,Ze	 dJdPd-            Ze	 	 	 dQdRd3            Ze	 	 	 dQdSd4            Zee	 dGdTd;                        ZeedUd=                        ZedVd>            ZedFd?            ZdWd@ZdXdDZ xZS )Y
ApertureDBN
embeddingsr   descriptor_setstr
dimensionsOptional[int]engineOptional[str]metric	log_levelint
propertiesOptional[Dict]kwargsr   returnNonec                    	 ddl m}	m}
 n# t          $ r t          d          w xY w t	                      j        di | t          j        t                    | _	        | j	        
                    |           || _        || _        || _        || _        || _        || _        |)| j	                            d           t%          d          	 ddl m}	m}
 n)# t          $ r | j	                            d            w xY w |
            | _         |	| j                  | _        	 | j                                         n)# t.          $ r | j	                            d            w xY w|                                  dS )a  Create a vectorstore backed by ApertureDB

        A single ApertureDB instance can support many vectorstores,
        distinguished by 'descriptor_set' name.  The descriptor set is created
        if it does not exist.  Different descriptor sets can use different
        engines and metrics, be supplied by different embedding models, and have
        different dimensions.

        See ApertureDB documentation on `AddDescriptorSet`
        https://docs.aperturedata.io/query_language/Reference/descriptor_commands/desc_set_commands/AddDescriptorSet
        for more information on the engine and metric options.

        Args:
            embeddings (Embeddings): Embeddings object
            descriptor_set (str, optional): Descriptor set name. Defaults to
                "langchain".
            dimensions (Optional[int], optional): Number of dimensions of the
                embeddings. Defaults to None.
            engine (str, optional): Engine to use. Defaults to "HNSW" for new
                descriptorsets.
            metric (str, optional): Metric to use. Defaults to "CS" for new
                descriptorsets.
            log_level (int, optional): Logging level. Defaults to logging.WARN.
        r   Utilscreate_connectorzMApertureDB is not installed. Please install it using 'pip install aperturedb'NzNo embedding function provided.zFailed to connect to ApertureDB )aperturedb.Utilsr)   r*   ImportErrorsuper__init__logging	getLogger__name__loggersetLevelr   embedding_functionr   r   r   r"   fatal
ValueError	exception
connectionutilsstatus	Exception_find_or_add_descriptor_set)selfr   r   r   r   r   r    r"   r$   r)   r*   	__class__s              g/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/aperturedb.pyr/   zApertureDB.__init__   s   J	@@@@@@@@@ 	 	 	+  	 	""6"""'11Y''',",$$K?@@@>???	@@@@@@@@@ 	 	 	K!!+   	 +*,,U4?++
	J 	 	 	K!!"CDDD	 	((*****s     &C &C?'E &E'c                   | j         }	 d|dddddidig}| j                            |          \  }}| j                                        s
J |            d|d         d         v r!t	          |d         d         d                   nd}|dk    s
J d            |dk    r|d         d         d         d         }| j                            d	| d
           |d         }t	          |          dk    s
J d            | j        |d         | _        n<| j        |d         k    r+| j                            d| j         d|d                     |d         }t	          |          dk    s
J d            | j	        |d         | _	        n<| j	        |d         k    r+| j                            d| j	         d|d                     |d         }	| j
        |	| _
        n0| j
        |	k    r%| j                            d| j
         d|	            d |                                D             | _        d S | j                            d	| d           | j        t          | _        | j	        t          | _	        | j
        ,t	          | j                            d                    | _
        | j        #d | j                                        D             nd }
| j                            || j
        | j        | j	        |
           | j                            dd           | j                            dd           | j                            dt(                     d S )NFindDescriptorSetTall_properties)	with_nameenginesmetricsr   resultsentitiesr      z+Multiple descriptor sets with the same namezDescriptor set z already exists_engineszOnly one engine is supportedzEngine mismatch: z != _metricszOnly one metric is supportedzMetric mismatch: _dimensionszDimensions mismatch: c                    i | ]<\  }}|                     t                    |t          t                    d          |=S N)
startswithPROPERTY_PREFIXlen.0kvs      r@   
<dictcomp>z:ApertureDB._find_or_add_descriptor_set.<locals>.<dictcomp>   sS       Aq<<00#o&&(()1      z does not exist. Creating ittestc                *    i | ]\  }}t           |z   |S r+   rP   rR   s      r@   rV   z:ApertureDB._find_or_add_descriptor_set.<locals>.<dictcomp>   s#    LLLDAq1$aLLLrW   )namedimr   r   r"   _Descriptor_create_txn_DescriptorSet_name)r   r9   querylast_query_okrQ   r3   infor   errorr   r   itemsr"   ENGINEMETRICr5   embed_queryr:   add_descriptorsetcreate_entity_indexUNIQUEID_PROPERTY)r>   r   find_ds_queryrb
n_entitieserE   rF   r   r"   s              r@   r=   z&ApertureDB._find_or_add_descriptor_setl   s   ,E $!/##"& 0$7& &

 $$]331,,..11111 QqT"5666 !()*5666 	
 Q M??!()*5a8AKN~NNNOOO
mGw<<1$$$&D$$${"%aj
**!!"Sdk"S"Swqz"S"STTT
mGw<<1$$$&D$$${"%aj
**!!"Sdk"S"Swqz"S"STTT=)J&",J..!!MDOMMMM   GGII  DOOO KN.NNN   {"${"$&"%d&=&I&I&&Q&Q"R"R ?. MLDO4I4I4K4KLLLL  J((#O{{% )    J**=-HHHJ**+;WEEEJ**=:KLLLLLrW   idsOptional[List[str]]Optional[bool]c                    |
J d            d| j         t          d|gidig}| j                            |          \  }}|S )zDelete documents from the vectorstore by id.

        Args:
            ids: List of ids to delete from the vectorstore.

        Returns:
            True if the deletion was successful, False otherwise
        Nzids must be providedDeleteDescriptorin)setconstraints)r   rk   r:   execute)r>   rq   r$   ra   result_s         r@   deletezApertureDB.delete   sa      6 #.$5c{#C% %
 J&&u--	rW   Sequence[str]List[Document]c                    d j         t          d|giddidig} j                            |          \  }} fd|d         d                             dg           D             }|S )	zFind documents in the vectorstore by id.

        Args:
            ids: List of ids to find in the vectorstore.

        Returns:
            documents: List of Document objects found in the vectorstore.
        FindDescriptorrv   rC   T)rw   rx   rG   c                :    g | ]}                     |          S r+   _descriptor_to_documentrS   dr>   s     r@   
<listcomp>z)ApertureDB.get_by_ids.<locals>.<listcomp>   s7     
 
 
 ((++
 
 
rW   r   rH   )r   rk   r:   ry   get)r>   rq   ra   rG   r{   docss   `     r@   
get_by_idszApertureDB.get_by_ids   s     !.$5c{#C 0$7# #
 Z''..

 
 
 
QZ 0155j"EE
 
 
 rW      ra   rT   argsc                |    | j         
J d            | j                             |          } | j        ||g|R i |S )a  Search for documents similar to the query using the vectorstore

        Args:
            query: Query string to search for.
            k: Number of results to return.

        Returns:
            List of Document objects ordered by decreasing similarity to the query.
        NzEmbedding function is not set)r5   rh   similarity_search_by_vector)r>   ra   rT   r   r$   	embeddings         r@   similarity_searchzApertureDB.similarity_search   sW     &224S222+77>>	/t/	1NtNNNvNNNrW   List[Tuple[Document, float]]c                X    | j                             |          } | j        |g|R i |S rN   )r5   rh   '_similarity_search_with_score_by_vector)r>   ra   r   r$   r   s        r@   similarity_search_with_scorez'ApertureDB.similarity_search_with_score  s>     +77>>	;t;IWWWWPVWWWrW   r   dictr   c                   i }|                                 D ]>\  }}|                    t                    r|||t          t                    d          <   ?|t                   }|t
                   }t          |||          }|S )Npage_contentmetadataid)re   rO   rP   rQ   TEXT_PROPERTYrk   r   )r>   r   r   rT   rU   r   r   docs           r@   r   z"ApertureDB._descriptor_to_document  s    GGII 	8 	8DAq||O,, 8673//1123&'D8III
rW   Fr   List[float]vectorsboolc                    ddl m}  | j                  }t          j                    }|                     j        ||d            j                            dt          j                    |z
   d            fd|D             S )Nr   DescriptorsT)rw   vectork_neighbors	distances"ApertureDB similarity search took  secondsc                J    g | ]}                     |          |d          f S )	_distancer   r   s     r@   r   zFApertureDB._similarity_search_with_score_by_vector.<locals>.<listcomp>#  s0    WWWa--a00!K.AWWWrW   aperturedb.Descriptorsr   r9   timefind_similarr   r3   rc   )r>   r   rT   r   r   descriptors
start_times   `      r@   r   z2ApertureDB._similarity_search_with_score_by_vector  s     	766666!k$/22Y[[
  #I1PT 	! 	
 	
 	
 	Sz1ISSS	
 	
 	
 XWWW;WWWWrW   c                    ddl m}  | j                  }t          j                    }|                     j        ||            j                            dt          j                    |z
   d            fd|D             S )a3  Returns the k most similar documents to the given embedding vector

        Args:
            embedding: The embedding vector to search for
            k: The number of similar documents to return

        Returns:
            List of Document objects ordered by decreasing similarity to the query.
        r   r   )rw   r   r   r   r   c                :    g | ]}                     |          S r+   r   r   s     r@   r   z:ApertureDB.similarity_search_by_vector.<locals>.<listcomp><  '    EEEA,,Q//EEErW   r   )r>   r   rT   r$   r   r   r   s   `      r@   r   z&ApertureDB.similarity_search_by_vector%  s     	766666!k$/22Y[[
  #I1 	! 	
 	
 	
 	Sz1ISSS	
 	
 	
 FEEEEEEErW            ?fetch_klambda_multfloatc                    | j                             d|            | j                            |          } | j        ||||fi |S )a  Returns similar documents to the query that also have diversity

        This algorithm balances relevance and diversity in the search results.

        Args:
            query: Query string to search for.
            k: Number of results to return.
            fetch_k: Number of results to fetch.
            lambda_mult: Lambda multiplier for MMR.

        Returns:
            List of Document objects ordered by decreasing similarity/diversty.
        z)Max Marginal Relevance search for query: )r3   rc   r5   rh   'max_marginal_relevance_search_by_vector)r>   ra   rT   r   r   r$   r   s          r@   max_marginal_relevance_searchz(ApertureDB.max_marginal_relevance_search>  sf    , 	LULLMMM+77>>	;t;q';
 
28
 
 	
rW   c                    ddl m}  | j                  }t          j                    }|                     j        ||||            j                            dt          j                    |z
   d            fd|D             S )a  Returns similar documents to the vector that also have diversity

        This algorithm balances relevance and diversity in the search results.

        Args:
            embedding: Embedding vector to search for.
            k: Number of results to return.
            fetch_k: Number of results to fetch.
            lambda_mult: Lambda multiplier for MMR.

        Returns:
            List of Document objects ordered by decreasing similarity/diversty.
        r   r   )rw   r   r   r   r   z&ApertureDB similarity search mmr took r   c                :    g | ]}                     |          S r+   r   r   s     r@   r   zFApertureDB.max_marginal_relevance_search_by_vector.<locals>.<listcomp>~  r   rW   )r   r   r9   r   find_similar_mmrr   r3   rc   )	r>   r   rT   r   r   r$   r   r   r   s	   `        r@   r   z2ApertureDB.max_marginal_relevance_search_by_vectorZ  s    , 	766666!k$/22Y[[
$$## 	% 	
 	
 	
 	WTY[[:5MWWW	
 	
 	
 FEEEEEEErW   clsType[ApertureDB]texts	List[str]	metadatasOptional[List[dict]]c                F     | dd|i|}|                     ||           |S )aL  Creates a new vectorstore from a list of texts

        Args:
            texts: List of text strings
            embedding: Embeddings object as for constructing the vectorstore
            metadatas: Optional list of metadatas associated with the texts.
            kwargs: Additional arguments to pass to the constructor
        r   r+   )	add_texts)r   r   r   r   r$   stores         r@   
from_textszApertureDB.from_texts  s7    " 33y3F33y)))rW   	documentsc                D     | dd|i|}|                     |           |S )aX  Creates a new vectorstore from a list of documents

        Args:
            documents: List of Document objects
            embedding: Embeddings object as for constructing the vectorstore
            metadatas: Optional list of metadatas associated with the texts.
            kwargs: Additional arguments to pass to the constructor
        r   r+   )add_documents)r   r   r   r$   r   s        r@   from_documentszApertureDB.from_documents  s7      33y3F33I&&&rW   c                j    ddl m}m}  |            } ||          }|                    |           dS )zDeletes a vectorstore and all its data from the database

        Args:
            descriptor_set: The name of the descriptor set to delete
        r   r(   N)r,   r)   r*   remove_descriptorset)class_r   r)   r*   dbr:   s         r@   delete_vectorstorezApertureDB.delete_vectorstore  sQ     	=<<<<<<<b		"">22222rW   c                    ddl m}  |            }dddiddddig}|                    |          \  }}|                                s
J |            |d         d         d         S )zReturns a list of all vectorstores in the database

        Returns:
            List of descriptor sets with properties
        r   )r*   rB   rC   T)rG   rE   rF   r   rH   )r,   r*   ra   rb   )r   r*   r   ra   responser{   s         r@   list_vectorstoreszApertureDB.list_vectorstores  s     	655555 $ 0$7##"&& &

 hhuoo!!!++8+++{./
;;rW   c                V   d|v r|                     d          }|r/t          |          t          |          k    rt          d          g }t          ||          D ]6\  }}t	          |j        |j        |          }|                    |           7n|} | j        |fi |d         S )a  Add or update documents in the vectorstore.

        Args:
            documents: Documents to add to the vectorstore.
            kwargs: Additional keyword arguments.
                if kwargs contains ids and documents contain ids,
                the ids in the kwargs will receive precedence.

        Returns:
            List of IDs of the added texts.

        Raises:
            ValueError: If the number of ids does not match the number of documents.
        rq   zhThe number of ids must match the number of documents. Got {len(ids)} ids and {len(documents)} documents.r   	succeeded)	poprQ   r7   zipr   r   r   appendupsert)r>   r   r$   rq   
documents_id_documentdoc_with_ids           r@   r   zApertureDB.add_documents  s      F??**U##C s3xx3y>>11 I  
 J!$S)!4!4 / /X&!)!6%.  
 !!+..../ #J t{:0000==rW   re   Sequence[Document]r   c                  ddl m} d |D             }|r|                     |           d |D             }d |D             }| j                            |          }d |D             }g }	t          ||||          D ]\  }
}}}d |                                D             }|
|t          <   ||t          <   d| j	        |d	i}|g}t          j        |t          j        
                                          g}|	                    ||f            || j                  }|                    |	t"                     t%          |g           S )zInsert or update items

        Updating documents is dependent on the documents' `id` attribute.

        Args:
            items: List of Document objects to upsert

        Returns:
            UpsertResponse object with succeeded and failed
        r   )ParallelLoaderc                J    g | ] }t          |d           r|j        |j        !S r   )hasattrr   )rS   items     r@   r   z%ApertureDB.upsert.<locals>.<listcomp>  s:     $
 $
 $
t)<)<$
AEATDGATATATrW   c                    g | ]	}|j         
S r+   )r   rS   r   s     r@   r   z%ApertureDB.upsert.<locals>.<listcomp>  s    333c!333rW   c                B    g | ]}t          |d d          |j        ni S )r   N)getattrr   r   s     r@   r   z%ApertureDB.upsert.<locals>.<listcomp>  s?     
 
 
 $CT::FCLLB
 
 
rW   c                    g | ]@}t          |d           r|j        |j        nt          t          j                              AS r   )r   r   r   uuiduuid4r   s     r@   r   z%ApertureDB.upsert.<locals>.<listcomp>  sR     
 
 
 c4((VSV-?CFFSEVEV
 
 
rW   c                *    i | ]\  }}t           |z   |S r+   rZ   rR   s      r@   rV   z%ApertureDB.upsert.<locals>.<dictcomp>  s#    NNNTQ/A-qNNNrW   AddDescriptor)rw   r"   )dtype)	batchsize)r   failed)aperturedb.ParallelLoaderr   r|   r5   embed_documentsr   re   r   rk   r   nparrayfloat32tobytesr   r9   ingest	BATCHSIZEr   )r>   re   r$   r   ids_to_deleter   r   r   rq   datar   r   r   	unique_idr"   commandra   blobsloaders                      r@   r   zApertureDB.upsert  s    	=<<<<<$
 $
 %$
 $
 $
  	'KK&&&33U333
 

 
 
	 ,<<UCC

 

 
 

 47:y#5
 5
 	( 	(0D)Xy ONX^^=M=MNNNJ(,J}%,5J()."," "G IEXirz:::BBDDEEKK''''00di000B7777rW   )r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r   r%   r&   )r%   r&   rN   )rq   rr   r$   r   r%   rs   )rq   r}   r%   r~   )r   )
ra   r   rT   r!   r   r   r$   r   r%   r~   )ra   r   r   r   r$   r   r%   r   )r   r   r%   r   )r   F)r   r   rT   r!   r   r   r%   r   )r   r   rT   r!   r$   r   r%   r~   )r   r   r   )ra   r   rT   r!   r   r!   r   r   r$   r   r%   r~   )r   r   rT   r!   r   r!   r   r   r$   r   r%   r~   )r   r   r   r   r   r   r   r   r$   r   r%   r   )
r   r   r   r~   r   r   r$   r   r%   r   )r   r   r%   r&   )r   r~   r$   r   r%   r   )re   r   r$   r   r%   r   )r2   
__module____qualname__r   DESCRIPTOR_SETr0   WARNr/   r=   r|   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   r   __classcell__)r?   s   @r@   r   r      s        -$( $ $ %)K+ K+ K+ K+ K+ K+ XK+ZTM TM TM TMl     X,    X4 #$O O O O XO  X X X XX    CHX X X X X /0F F F F XF0   
 
 
 
 X
6   #F #F #F #F X#FJ 
 +/	    X [&    X [$ 
3 
3 
3 [
3 < < < [<0%> %> %> %>N48 48 48 48 48 48 48 48rW   r   )!
__future__r   r0   r   r   typingr   r   r   r   r   r	   r
   numpyr   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.indexing.baser   langchain_core.vectorstoresr   typing_extensionsr   rf   rg   r   r   rP   r   rk   r   r+   rW   r@   <module>r     s6   " " " " " "    C C C C C C C C C C C C C C C C C C     . - - - - - 0 0 0 0 0 0 7 7 7 7 7 7 3 3 3 3 3 3 & & & & & & 
		 M8 M8 M8 M8 M8 M8 M8 M8 M8 M8rW   