
    h:#                        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y)
    )annotationsN)repeat)AnyDictIterableListOptionalTupleType)Document)
Embeddings)VectorStorec                  h   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	 	 	 	 	 dd       Ze	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	       Z	 d	 	 	 	 	 	 	 	 	 dd
Z	 d	 	 	 	 	 	 	 	 	 ddZddZ	 	 d	 	 	 	 	 	 	 ddZddZdd dZ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

    c                    	 ddl m}  |||      | _        || _        |xs d| _        y# t        $ r t        d      w xY w)zInitialize with Xata client.r   )
XataClientzPCould not import xata python package. Please install it with `pip install xata`.)api_keydb_urlvectorsN)xata.clientr   ImportError_client
_embedding_table_name)selfr   r   	embedding
table_namer   s         c/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/xata.py__init__zXataVectorStore.__init__   sQ    	. "'&A&/%2  	= 	s   * ?c                    | j                   S N)r   )r   s    r   
embeddingszXataVectorStore.embeddings(   s        Nc                (    | j                  |||      S r!   )_add_vectors)r   r   	documentsidss       r   add_vectorszXataVectorStore.add_vectors,   s       )S99r#   c                    |}| j                  ||      }| j                  j                  t        |            }| j	                  |||      S r!   )_texts_to_documentsr   embed_documentslistr(   )r   texts	metadatasr'   kwargsdocsr   s          r   	add_textszXataVectorStore.add_texts4   sH     ''y9//11$u+>s33r#   c                   g }t        |      D ]a  \  }}||   j                  |d}|r||   |d<   ||   j                  j                         D ]  \  }}	|dvs|	||<    |j	                  |       c d}
g }t        dt        |      |
      D ]~  }||||
z    }| j                  j                         j                  | j                  d|i      }|j                  dk7  rt        d|j                   d	|       |j                  |d
           |S )z!Add vectors to the Xata database.)contentr   id)r4   r3   r   i  r   records   zError adding vectors to Xata:  	recordIDs)	enumeratepage_contentmetadataitemsappendrangelenr   r5   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   s5    &('0 
	NC$S>66&C HD	%cN3399; #S<<"CH# KK
	 
q#d)Z0 	+AQ^,E$$&2243C3CiQVEWXA}}#"@qQRPS TUUNN1[>*	+ r#   c                ~    |t        i       }t        | |      D cg c]  \  }}t        ||       }}}|S c c}}w )z:Return list of Documents from list of texts and metadatas.r:   r;   )r   zipr   )r-   r.   textr;   r0   s        r   r*   z#XataVectorStore._texts_to_documentsc   sP     r
I #&eY"7
h $:
 

 
s   9c                    |r|st        d      |j                  |      }	d}| j                  ||      }
 | ||||      }|j                  |	|
|       |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%   )clsr-   r   r.   r   r   r   r'   r/   r"   r0   	vector_dbs               r   
from_textszXataVectorStore.from_textss   sl     fCDD..u5
&&ui8!	
	 	z45r#   c                \    | j                  |||      }|D cg c]  }|d   	 }}|S c c}w )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.
        )filterr   )similarity_search_with_score)r   querykrX   r/   docs_and_scoresdr&   s           r   similarity_searchz!XataVectorStore.similarity_search   s=     ;;E1V;T#23aQqT3	3 4s   )c           	        | j                   j                  |      }|d|d}|r||d<   | j                  j                         j	                  | j
                  |      }|j                  dk7  rt        d|j                   d|       |d   }|D 	cg c])  }	t        |	d	   | j                  |	      
      |	d   d   f+ }
}	|
S c c}	w )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sizerX   payloadr6   z!Error running similarity search: r7   r5   r3   rO   xatascore)
r   embed_queryr   datavector_searchr   rA   rB   r   _extractMetadata)r   rZ   r[   rX   r/   r   rd   rM   hitshitr\   s              r   rY   z,XataVectorStore.similarity_search_with_score   s     OO//6	$!

  &GHLL--d.>.>-P==C?aPQsSTT| 	
  !$Y!2237 FG$	
 	
 	
s   .Cc                N    i }|j                         D ]  \  }}|dvs|||<    |S )z:Extract metadata from a record. Filters out known columns.)r4   r3   r   re   )r<   )r   recordr;   rG   rH   s        r   rj   z XataVectorStore._extractMetadata   s9     	$HC@@ #	$ r#   c                P   |r#| j                          | j                  d       y|pd}t        dt        |      |      D ]T  }||||z    }|D cg c]  }d| j                  |di }}| j
                  j                         j                  d|i       V yt        d	      c c}w )
zDelete by vector IDs.

        Args:
            ids: List of ids to delete.
            delete_all: Delete all records in the table.
        r   )ndocsNi  deletetabler4   
operationsrc   z%Either ids or delete_all must be set.)	_delete_allwait_for_indexingr>   r?   r   r   r5   transactionrS   )	r   r'   
delete_allr/   rI   rK   rL   r4   rt   s	            r   rq   zXataVectorStore.delete   s     """+_J1c#h
3 WAJ/PUJLX)9)9DE
  $$&22L*;U2VW DEEs   B#c                   	 | j                   j                         j                  | j                  ddgi      }|j                  dk7  rt        d|j                   d|       |d   D cg c]  }|d   	 }}t        |      dk(  ry|D cg c]  }d	| j                  |d
i }}| j                   j                         j                  d|i       c c}w c c}w )z Delete all records in the table.columnsr4   rc   r6   zError running query: r7   r5   r   rq   rr   rt   N)	r   rh   rZ   r   rA   rB   r?   r5   rw   )r   rM   recr'   r4   rt   s         r   ru   zXataVectorStore._delete_all   s    !!#))$*:*:YQUPVDW)XA}}#"7as KLL())53t95C53x1}LOFHT%5%5R@AJ  LL  "..j7Q.R  6s   +CCc                |   t        j                          }	 | j                  j                         j                  | j                  dddid      }|j
                  dk7  rt        d|j
                   d|       |d	   |k(  ryt        j                          |z
  |kD  rt        d
      t        j                  d       )zeWait for the search index to contain a certain number of
        documents. Useful in tests.
         rb   r   )rZ   pagerc   r6   zError running search: r7   
totalCountz+Timed out waiting for indexing to complete.g      ?N)timer   rh   search_tabler   rA   rB   sleep)r   timeoutrp   startrM   s        r   rv   z!XataVectorStore.wait_for_indexing   s     		!!#00  B*L 1 A }}#"8q LMM%'yy{U"W, MNNJJsO r#   )
r   strr   r   r   r   r   r   returnNone)r   r   r!   )r   zList[List[float]]r&   List[Document]r'   Optional[List[str]]r   	List[str])NN)
r-   Iterable[str]r.   zOptional[List[Dict[Any, Any]]]r'   r   r/   r   r   r   )r-   r   r.   z"Optional[Iterable[Dict[Any, Any]]]r   r   )NNNr   N)rT   zType['XataVectorStore']r-   r   r   r   r.   zOptional[List[dict]]r   Optional[str]r   r   r   r   r'   r   r/   r   r   z'XataVectorStore')   N)
rZ   r   r[   intrX   Optional[dict]r/   r   r   r   )
rZ   r   r[   r   rX   r   r/   r   r   zList[Tuple[Document, float]])rn   dictr   r   )r'   r   rx   zOptional[bool]r/   r   r   r   )r   r   )      )r   floatrp   r   r   r   )__name__
__module____qualname____doc__r   propertyr"   r(   r1   r%   staticmethodr*   classmethodrV   r^   rY   rj   rq   ru   rv    r#   r   r   r      sW   33 3 	3
 3 
3&   $(	:": ": !	:
 
: 59#'	44 24 !	4
 4 
4" $(	 "  "  !	 
 
 D  9=5 
  
 +/!% $##'$  (	
    !  
 > @D .<OR	" @D$$ $.<$OR$	%$L $(%)F F #F 	F
 
F4Sr#   r   )
__future__r   r   	itertoolsr   typingr   r   r   r   r	   r
   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   r   r   r#   r   <module>r      s.    "   C C C - 0 3{k {r#   