o
    Zh:#                     @  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                   @  s   e Zd ZdZdHd
dZedIddZ	dJdKddZ		dLdMddZ	dJdKd d!Z	e
	dJdNd#d$Ze					dOdPd*d+Z	dQdRd2d3Z	dQdSd5d6ZdTd9d:Z		dLdUd=d>ZdVd?d@ZdWdXdFdGZdS )Y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

    api_keystrdb_url	embeddingr   
table_namereturnNonec                 C  sJ   zddl m} W n ty   tdw |||d| _|| _|p!d| _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   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/xata.py__init__   s   zXataVectorStore.__init__c                 C  s   | j S N)r   r   r   r   r   
embeddings(   s   zXataVectorStore.embeddingsNr   List[List[float]]	documentsList[Document]idsOptional[List[str]]	List[str]c                 C  s   |  |||S r!   )_add_vectors)r   r   r%   r'   r   r   r   add_vectors,   s   zXataVectorStore.add_vectorstextsIterable[str]	metadatasOptional[List[Dict[Any, Any]]]kwargsr   c                 K  s.   |}|  ||}| jt|}| |||S r!   )_texts_to_documentsr   embed_documentslistr+   )r   r,   r.   r'   r0   docsr   r   r   r   	add_texts4   s   zXataVectorStore.add_textsc                 C  s   g }t |D ]-\}}|| j|d}|r|| |d< || j D ]\}}	|dvr-|	||< q!|| qd}
g }tdt||
D ]-}||||
  }| j 	| j
d|i}|jdkrftd|j d	| ||d
  q@|S )z!Add vectors to the Xata database.)contentr   id)r7   r6   r   i  r   records   zError adding vectors to Xata:  Z	recordIDs)	enumeratepage_contentmetadataitemsappendrangelenr   r8   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_vectors"Optional[Iterable[Dict[Any, Any]]]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 )r<   r=   r   ).0textr=   r   r   r   
<listcomp>l   s    
z7XataVectorStore._texts_to_documents.<locals>.<listcomp>)r   zip)r,   r.   r4   r   r   r   r1   c   s   z#XataVectorStore._texts_to_documentsclsType['XataVectorStore']Optional[List[dict]]Optional[str]'XataVectorStore'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   )
ValueErrorr2   r1   r*   )rT   r,   r   r.   r   r   r   r'   r0   r#   r4   Z	vector_dbr   r   r   
from_textss   s   
zXataVectorStore.from_texts   querykintfilterOptional[dict]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.
        )r_   c                 S     g | ]}|d  qS )r   r   )rP   dr   r   r   rR          z5XataVectorStore.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r   r\   r]   r_   r0   docs_and_scoresr%   r   r   r   similarity_search   s   z!XataVectorStore.similarity_searchList[Tuple[Document, float]]c           
        sx    j |}|d|d}|r||d<  j j j|d}|jdkr-t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sizer_   payloadr9   z!Error running similarity search: r:   r8   c                   s.   g | ]}t |d   |d|d d fqS )r6   rO   xataZscore)r   _extractMetadata)rP   hitr"   r   r   rR      s    
z@XataVectorStore.similarity_search_with_score.<locals>.<listcomp>)r   Zembed_queryr   dataZvector_searchr   rB   rC   )
r   r\   r]   r_   r0   r   rk   rM   hitsre   r   r"   r   rd      s   


z,XataVectorStore.similarity_search_with_scorerecorddictc                 C  s*   i }|  D ]\}}|dvr|||< q|S )z:Extract metadata from a record. Filters out known columns.)r7   r6   r   rl   )r>   )r   rq   r=   rH   rI   r   r   r   rm      s   z XataVectorStore._extractMetadata
delete_allOptional[bool]c                   s   |r     jdd dS |dur=d}tdt||D ]}||||  } fdd|D } j jd|id qdS td	)
zDelete by vector IDs.

        Args:
            ids: List of ids to delete.
            delete_all: Delete all records in the table.
        r   )ndocsNi  c                      g | ]
}d  j |diqS delete)tabler7   r   rP   r7   r"   r   r   rR          z*XataVectorStore.delete.<locals>.<listcomp>
operationsrj   z%Either ids or delete_all must be set.)_delete_allwait_for_indexingr@   rA   r   r8   transactionrY   )r   r'   rs   r0   rJ   rK   rL   r}   r   r"   r   rx      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r0dS  fdd	|D } j  jd|id q)z Delete all records in the table.Tcolumnsr7   rj   r9   zError running query: r:   c                 S  ra   )r7   r   )rP   Zrecr   r   r   rR      rc   z/XataVectorStore._delete_all.<locals>.<listcomp>r8   r   c                   rv   rw   rz   r{   r"   r   r   rR      r|   r}   N)	r   ro   r\   r   rB   rC   rA   r8   r   )r   rM   r'   r}   r   r"   r   r~      s   

zXataVectorStore._delete_all      timeoutfloatru   c                 C  s~   t   }	 | j j| jdddidd}|jdkr%td|j d	| |d
 |kr-dS t   | |kr9tdt d q)zeWait for the search index to contain a certain number of
        documents. Useful in tests.
        T ri   r   )r\   pagerj   r9   zError running search: r:   Z
totalCountz+Timed out waiting for indexing to complete.g      ?N)timer   ro   Zsearch_tabler   rB   rC   sleep)r   r   ru   startrM   r   r   r   r      s   


z!XataVectorStore.wait_for_indexing)
r   r   r   r   r   r   r   r   r   r   )r   r   r!   )r   r$   r%   r&   r'   r(   r   r)   )NN)
r,   r-   r.   r/   r'   r(   r0   r   r   r)   )r,   r-   r.   rN   r   r&   )NNNr   N)rT   rU   r,   r)   r   r   r.   rV   r   rW   r   rW   r   r   r'   r(   r0   r   r   rX   )r[   N)
r\   r   r]   r^   r_   r`   r0   r   r   r&   )
r\   r   r]   r^   r_   r`   r0   r   r   rg   )rq   rr   r   rr   )r'   r(   rs   rt   r0   r   r   r   )r   r   )r   r   )r   r   ru   r^   r   r   )__name__
__module____qualname____doc__r    propertyr#   r+   r5   r*   staticmethodr1   classmethodrZ   rf   rd   rm   rx   r~   r   r   r   r   r   r      s@    
"
&

r   )
__future__r   r   	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    $