
    Ng:#                        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	e          ZdS )
    )annotationsN)repeat)AnyDictIterableListOptionalTupleTypeDocument)
Embeddings)VectorStorec                      e Zd ZdZd;d
Zed<d            Z	 d=d>dZ	 	 d?d@dZ	 d=d>dZ	e
	 d=dAd            Ze	 	 	 	 	 dBdCd$            Z	 dDdEd+Z	 dDdFd-ZdGd0Z	 	 d?dHd3ZdId4ZdJdKd:ZdS )L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                    	 ddl m} n# t          $ r t          d          w xY w |||          | _        || _        |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)xata.clientr   ImportError_client
_embedding_table_name)selfr   r   r   r   r   s         a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/xata.py__init__zXataVectorStore.__init__   s    	....... 	 	 	=  	
 "z'&AAA&/%2s   	 #c                    | j         S N)r   )r!   s    r"   
embeddingszXataVectorStore.embeddings(   s
        Nr   List[List[float]]	documentsList[Document]idsOptional[List[str]]	List[str]c                0    |                      |||          S r%   )_add_vectors)r!   r   r)   r+   s       r"   add_vectorszXataVectorStore.add_vectors,   s       )S999r'   textsIterable[str]	metadatasOptional[List[Dict[Any, Any]]]kwargsr   c                    |}|                      ||          }| j                            t          |                    }|                     |||          S r%   )_texts_to_documentsr   embed_documentslistr0   )r!   r1   r3   r+   r5   docsr   s          r"   	add_textszXataVectorStore.add_texts4   sQ     ''y99/11$u++>>s333r'   c                @   g }t          |          D ]e\  }}||         j        |d}|r||         |d<   ||         j                                        D ]\  }}	|dvr|	||<   |                    |           fd}
g }t          dt          |          |
          D ]}||||
z            }| j                                        	                    | j
        d|i          }|j        dk    rt          d|j         d	|           |                    |d
                    |S )z!Add vectors to the Xata database.)contentr   id)r>   r=   r   i  r   records   zError adding vectors to Xata:  	recordIDs)	enumeratepage_contentmetadataitemsappendrangelenr   r?   bulk_insertr    status_code	Exceptionextend)r!   r   r)   r+   rowsidxr   rowkeyval
chunk_sizeid_listichunkrs                  r"   r/   zXataVectorStore._add_vectorsA   s^    &('00 
	 
	NC$S>6& C  %HD	%cN399;; # #S<<<"CHKK 
q#d))Z00 	+ 	+AQ^+,E$$&&2243CiQVEWXXA}## T T TQR T TUUUNN1[>****r'   "Optional[Iterable[Dict[Any, Any]]]c                \    |t          i           }d t          | |          D             }|S )z:Return list of Documents from list of texts and metadatas.Nc                6    g | ]\  }}t          ||           S )rD   rE   r   ).0textrE   s      r"   
<listcomp>z7XataVectorStore._texts_to_documents.<locals>.<listcomp>l   s9     
 
 
h $:::
 
 
r'   )r   zip)r1   r3   r:   s      r"   r7   z#XataVectorStore._texts_to_documentsc   sD     r

I
 
"%eY"7"7
 
 

 r'   clsType['XataVectorStore']Optional[List[dict]]Optional[str]'XataVectorStore'c                    |r|st          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   )
ValueErrorr8   r7   r/   )r`   r1   r   r3   r   r   r   r+   r5   r&   r:   	vector_dbs               r"   
from_textszXataVectorStore.from_textss   s      	Ef 	ECDDD..u55
&&ui88C!	
 
 
	 	z4555r'      querykintfilterOptional[dict]c                N    |                      |||          }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.
        )rm   c                    g | ]
}|d          S )r    )r\   ds     r"   r^   z5XataVectorStore.similarity_search.<locals>.<listcomp>   s    333aQqT333r'   )similarity_search_with_score)r!   rj   rk   rm   r5   docs_and_scoresr)   s          r"   similarity_searchz!XataVectorStore.similarity_search   s7     ;;E1V;TT33?333	r'   List[Tuple[Document, float]]c                2     j                             |          }|d|d}|r||d<    j                                                             j        |          }|j        dk    rt          d|j         d|           |d         } f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   )queryVectorcolumnsizerm   payloadr@   z!Error running similarity search: rA   r?   c                    g | ]:}t          |d                              |                    |d         d         f;S )r=   r[   xatascore)r   _extractMetadata)r\   hitr!   s     r"   r^   z@XataVectorStore.similarity_search_with_score.<locals>.<listcomp>   se     	
 	
 	
  !$Y!22377   FG$	
 	
 	
r'   )r   embed_queryr   datavector_searchr    rK   rL   )
r!   rj   rk   rm   r5   r   r|   rW   hitsrt   s
   `         r"   rs   z,XataVectorStore.similarity_search_with_score   s     O//66	$!
 

  	' &GHL--d.>-PP=CSSSPQSSTTT|	
 	
 	
 	
 	
 	
 	
 r'   recorddictc                P    i }|                                 D ]\  }}|dvr|||<   |S )z:Extract metadata from a record. Filters out known columns.)r>   r=   r   r~   )rF   )r!   r   rE   rQ   rR   s        r"   r   z XataVectorStore._extractMetadata   s=     	$ 	$HC@@@ #r'   
delete_allOptional[bool]c                `    |r,                                                        d           dS |od}t          dt          |          |          D ]L}||||z            } fd|D             } j                                                            d|i           Md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S delete)tabler>   r    r\   r>   r!   s     r"   r^   z*XataVectorStore.delete.<locals>.<listcomp>   s6       JLX)9DDE  r'   
operationsr{   z%Either ids or delete_all must be set.)_delete_allwait_for_indexingrH   rI   r   r?   transactionrf   )r!   r+   r   r5   rS   rU   rV   r   s   `       r"   r   zXataVectorStore.delete   s      	F"""+++++_J1c#hh
33 W WAJ./   PU  
 $$&&22L*;U2VVVVW W DEEEr'   c                    	  j                                                              j        ddgi          }|j        dk    rt          d|j         d|           d |d	         D             }t          |          d
k    rdS  fd|D             } j                                                             d|i           )z Delete all records in the table.Tcolumnsr>   r{   r@   zError running query: rA   c                    g | ]
}|d          S )r>   rq   )r\   recs     r"   r^   z/XataVectorStore._delete_all.<locals>.<listcomp>   s    5553t9555r'   r?   r   c                (    g | ]}d j         |diS r   r   r   s     r"   r^   z/XataVectorStore._delete_all.<locals>.<listcomp>   s6       FHT%5R@@A  r'   r   N)	r   r   rj   r    rK   rL   rI   r?   r   )r!   rW   r+   r   s   `   r"   r   zXataVectorStore._delete_all   s    
	S!!##))$*:YQUPVDW)XXA}## K K K K KLLL55)555C3xx1}}   LO  J L  ""..j7Q.RRR
	Sr'         timeoutfloatr   c                |   t          j                     }	 | j                                                            | j        dddid          }|j        dk    rt          d|j         d	|           |d
         |k    rdS t          j                     |z
  |k    rt          d          t          j        d           )zeWait for the search index to contain a certain number of
        documents. Useful in tests.
        T rz   r   )rj   pager{   r@   zError running search: rA   
totalCountz+Timed out waiting for indexing to complete.g      ?N)timer   r   search_tabler    rK   rL   sleep)r!   r   r   startrW   s        r"   r   z!XataVectorStore.wait_for_indexing   s     	
	!!##00 B*L*L 1  A }## L L L L LMMM%''y{{U"W,, MNNNJsOOO
	r'   )
r   r   r   r   r   r   r   r   r   r   )r   r   r%   )r   r(   r)   r*   r+   r,   r   r-   )NN)
r1   r2   r3   r4   r+   r,   r5   r   r   r-   )r1   r2   r3   rX   r   r*   )NNNr   N)r`   ra   r1   r-   r   r   r3   rb   r   rc   r   rc   r   r   r+   r,   r5   r   r   rd   )ri   N)
rj   r   rk   rl   rm   rn   r5   r   r   r*   )
rj   r   rk   rl   rm   rn   r5   r   r   rv   )r   r   r   r   )r+   r,   r   r   r5   r   r   r   )r   r   )r   r   )r   r   r   rl   r   r   )__name__
__module____qualname____doc__r#   propertyr&   r0   r;   r/   staticmethodr7   classmethodrh   ru   rs   r   r   r   r   rq   r'   r"   r   r      s        3 3 3 3&    X $(	: : : : : 59#'	4 4 4 4 4" $(	         D  9=    \ 
 +/!% $##'    [> @D    " @D$ $ $ $ $L    $(%)F F F F F4S S S S      r'   r   )
__future__r   r   	itertoolsr   typingr   r   r   r   r	   r
   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   r   rq   r'   r"   <module>r      s    " " " " " "        C C C C C C C C C C C C C C C C C C - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3{ { { { {k { { { { {r'   