a
    bg:#                     @  s|   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 d dlmZ d dlmZ d dlmZ G dd	 d	eZdS )
    )annotationsN)repeat)AnyDictIterableListOptionalTupleTypeDocument)
Embeddings)VectorStorec                   @  s2  e Zd ZdZddddddddZeddd	d
Zd@dddddddZdAddddddddZdBdddddddZ	e
dCddddddZedDd ddd!d"d"dddd#d$
d%d&ZdEdd(d)ddd*d+d,ZdFdd(d)dd-d*d.d/Zd0d0d1d2d3ZdGdd4ddd5d6d7Zddd8d9ZdHd<d(dd=d>d?ZdS )IXataVectorStorez`Xata` vector store.

    It assumes you have a Xata database
    created with the right schema. See the guide at:
    https://integrations.langchain.com/vectorstores?integration_name=XataVectorStore

    strr   None)api_keydb_url	embedding
table_namereturnc                 C  sN   zddl m} W n ty*   tdY n0 |||d| _|| _|pFd| _dS )zInitialize with Xata client.r   )
XataClientzPCould not import xata python package. Please install it with `pip install xata`.)r   r   vectorsN)Zxata.clientr   ImportError_client
_embedding_table_name)selfr   r   r   r   r    r   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/xata.py__init__   s    
zXataVectorStore.__init__)r   c                 C  s   | j S N)r   r   r   r   r   
embeddings(   s    zXataVectorStore.embeddingsNzList[List[float]]zList[Document]zOptional[List[str]]z	List[str])r   	documentsidsr   c                 C  s   |  |||S r!   )_add_vectors)r   r   r$   r%   r   r   r   add_vectors,   s    zXataVectorStore.add_vectorszIterable[str]zOptional[List[Dict[Any, Any]]]r   )texts	metadatasr%   kwargsr   c                 K  s.   |}|  ||}| jt|}| |||S r!   )_texts_to_documentsr   embed_documentslistr'   )r   r(   r)   r%   r*   docsr   r   r   r   	add_texts4   s    zXataVectorStore.add_textsc                 C  s   g }t |D ]Z\}}|| j|d}|r4|| |d< || j D ]\}}	|dvrB|	||< qB|| qd}
g }tdt||
D ]Z}||||
  }| j 	| j
d|i}|jdkrtd|j d	| ||d
  q|S )z!Add vectors to the Xata database.)contentr   id)r1   r0   r   i  r   records   zError adding vectors to Xata:  Z	recordIDs)	enumeratepage_contentmetadataitemsappendrangelenr   r2   Zbulk_insertr   status_code	Exceptionextend)r   r   r$   r%   rowsidxr   rowkeyval
chunk_sizeZid_listichunkrr   r   r   r&   A   s(    

zXataVectorStore._add_vectorsz"Optional[Iterable[Dict[Any, Any]]])r(   r)   r   c                 C  s(   |du rt i }dd t| |D }|S )z:Return list of Documents from list of texts and metadatas.Nc                 S  s   g | ]\}}t ||d qS )r6   r7   r   ).0textr7   r   r   r   
<listcomp>l   s   z7XataVectorStore._texts_to_documents.<locals>.<listcomp>)r   zip)r(   r)   r.   r   r   r   r+   c   s    z#XataVectorStore._texts_to_documentsr   zType['XataVectorStore']zOptional[List[dict]]zOptional[str]z'XataVectorStore')
clsr(   r   r)   r   r   r   r%   r*   r   c                 K  sL   |r|st d||}	d}| ||}
| ||||d}||	|
| |S )z9Return VectorStore initialized from texts and embeddings.z$Xata api_key and db_url must be set.N)r   r   r   r   )
ValueErrorr,   r+   r&   )rM   r(   r   r)   r   r   r   r%   r*   r#   r.   Z	vector_dbr   r   r   
from_textss   s    
zXataVectorStore.from_texts   intzOptional[dict])querykfilterr*   r   c                 K  s"   | j |||d}dd |D }|S )zReturn docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.

        Returns:
            List of Documents most similar to the query.
        )rT   c                 S  s   g | ]}|d  qS )r   r   )rI   dr   r   r   rK          z5XataVectorStore.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r   rR   rS   rT   r*   docs_and_scoresr$   r   r   r   similarity_search   s    z!XataVectorStore.similarity_searchzList[Tuple[Document, float]]c           
        sx    j |}|d|d}|r$||d<  j j j|d}|jdkrZtd|j d| |d } fd	d
|D }	|	S )a  Run similarity search with Chroma with distance.

        Args:
            query (str): Query text to search for.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[dict]): Filter by metadata. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of documents most similar to the query
                text with distance in float.
        r   )ZqueryVectorcolumnsizerT   payloadr3   z!Error running similarity search: r4   r2   c                   s.   g | ]&}t |d   |d|d d fqS )r0   rH   xataZscore)r   _extractMetadata)rI   hitr"   r   r   rK      s   
z@XataVectorStore.similarity_search_with_score.<locals>.<listcomp>)r   Zembed_queryr   dataZvector_searchr   r<   r=   )
r   rR   rS   rT   r*   r   r]   rG   hitsrX   r   r"   r   rW      s    


z,XataVectorStore.similarity_search_with_scoredict)recordr   c                 C  s*   i }|  D ]\}}|dvr|||< q|S )z:Extract metadata from a record. Filters out known columns.)r1   r0   r   r^   )r8   )r   rd   r7   rB   rC   r   r   r   r_      s
    
z XataVectorStore._extractMetadatazOptional[bool])r%   
delete_allr*   r   c                   s   |r     jdd nd|durvd}tdt||D ]<}||||  } fdd|D } j jd|id q6ntd	dS )
zDelete by vector IDs.

        Args:
            ids: List of ids to delete.
            delete_all: Delete all records in the table.
        r   )ndocsNi  c                   s   g | ]}d  j |diqS delete)tabler1   r   rI   r1   r"   r   r   rK      s   z*XataVectorStore.delete.<locals>.<listcomp>
operationsr\   z%Either ids or delete_all must be set.)_delete_allwait_for_indexingr:   r;   r   r2   transactionrN   )r   r%   re   r*   rD   rE   rF   rl   r   r"   r   rh      s    
zXataVectorStore.deletec                   s    j  j jddgid}|jdkr<td|j d| dd |d	 D }t|d
kr\q fdd|D } j  jd|id q dS )z Delete all records in the table.columnsr1   r\   r3   zError running query: r4   c                 S  s   g | ]}|d  qS )r1   r   )rI   Zrecr   r   r   rK      rV   z/XataVectorStore._delete_all.<locals>.<listcomp>r2   r   c                   s   g | ]}d  j |diqS rg   rj   rk   r"   r   r   rK      s   rl   N)	r   ra   rR   r   r<   r=   r;   r2   ro   )r   rG   r%   rl   r   r"   r   rm      s    

zXataVectorStore._delete_all      float)timeoutrf   r   c                 C  s~   t   }| j j| jdddidd}|jdkrHtd|j d| |d	 |krVqzt   | |krntd
t d qdS )zeWait for the search index to contain a certain number of
        documents. Useful in tests.
         r[   r   )rR   pager\   r3   zError running search: r4   Z
totalCountz+Timed out waiting for indexing to complete.g      ?N)timer   ra   Zsearch_tabler   r<   r=   sleep)r   rt   rf   startrG   r   r   r   rn      s    

z!XataVectorStore.wait_for_indexing)N)NN)N)N)NNNr   N)rP   N)rP   N)NN)rq   rr   )__name__
__module____qualname____doc__r    propertyr#   r'   r/   r&   staticmethodr+   classmethodrO   rY   rW   r_   rh   rm   rn   r   r   r   r   r      s>       "      $  &
  r   )
__future__r   rw   	itertoolsr   typingr   r   r   r   r   r	   r
   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   r   r   r   r   r   <module>   s   $