
    NgW%                        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
 d dlmZ d dlmZ d dlmZ d dlmZ  ej        e          Zdd
Z G d de          ZdS )    )annotationsN)AnyIterableListOptionalType)Document)
Embeddings)get_from_dict_or_env)VectorStorereturnstrc                 2    t          j                    j        S N)uuiduuid4hex     a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/tair.py	_uuid_keyr      s    :<<r   c                      e Zd ZdZ	 	 	 d.d/dZed0d            Zd1dZ	 d2d3dZ	 d4d5d$Z	e
	 	 	 	 d6d7d)            Ze
	 	 	 	 d6d8d+            Ze	 d9d:d,            Ze
	 	 	 d;d<d-            ZdS )=Tairz`Tair` vector store.contentmetadataNembedding_functionr
   urlr   
index_namecontent_keymetadata_keysearch_paramsOptional[dict]kwargsr   c                   || _         || _        	 ddlm} n# t          $ r t	          d          w xY w	  |j        |fi |}	n$# t          $ r}
t          d|
           d }
~
ww xY w|	| _        || _        || _	        || _
        d S )Nr   r   PCould not import tair python package. Please install it with `pip install tair`.zTair failed to connect: )r   r   tairr   ImportErrorfrom_url
ValueErrorclientr   r    r!   )selfr   r   r   r   r    r!   r#   
TairClientr+   es              r   __init__zTair.__init__   s     #5$	/////// 	 	 	=  	
	=(Z(7777FF 	= 	= 	=;;;<<<	= &(*s    1A 
A%A  A%r   c                    | j         S r   )r   )r,   s    r   
embeddingszTair.embeddings5   s    &&r   dimintdistance_type
index_type	data_typeboolc                    | j                             | j                  }|t                              d           dS  | j         j        | j        ||||fi | dS )NzIndex already existsFT)r+   tvs_get_indexr   loggerinfotvs_create_index)r,   r2   r4   r5   r6   r#   indexs          r   create_index_if_not_existzTair.create_index_if_not_exist9   sy     ))$/::KK.///5$$O	
 	
 	
 	
 	
 tr   textsIterable[str]	metadatasOptional[List[dict]]	List[str]c                   g }|                     dd          }d}| j                            | j                  }||                     d          dk    rd}| j                            d          }| j                            t          |                    }	t          |          D ]\  }
}|r||
         nt                      }|r||
         ni }|r? |j
        | j        ||	|
         dfi d|| j        || j        t          j        |          i n< |j
        | j        ||	|
         dfi | j        || j        t          j        |          i |                    |           |                                 |S )	z$Add texts data to an existing index.keysNFlexical_algorithmbm25TtransactionTEXT)getr+   r9   r   pipeliner   embed_documentslist	enumerater   tvs_hsetr   r    jsondumpsappendexecute)r,   r?   rA   r#   idsrE   use_hybrid_searchr=   rL   r1   itextkeyr   s                 r   	add_textszTair.add_textsO   s    zz&$''!))$/::+>!?!?6!I!I $;''E'::,<<T%[[II
 '' 	 	GAt!2$q''y{{C'08y||bH  !!OqM	
 
 ($)4:h+?+?
 
 
 
 "!OqM		 	 ($)4:h+?+?	 	 	 JJsOOOO
r      querykList[Document]c                B   | j                             |          } | j        j        | j        ||ddfi |}| j                            d          }|D ],\  }}|                    | j        || j        | j                   -|	                                }	d |	D             S )a\  
        Returns the most similar indexed documents to the query text.

        Args:
            query (str): The query text for which to find similar documents.
            k (int): The number of documents to return. Default is 4.

        Returns:
            List[Document]: A list of documents that are most similar to the query text.
        FNrH   c           	     l    g | ]1}t          |d          t          j        |d                             2S )   r   )page_contentr   )r	   rQ   loads.0ds     r   
<listcomp>z*Tair.similarity_search.<locals>.<listcomp>   sQ     
 
 

 	 qTAaD))  
 
 
r   )
r   embed_queryr+   tvs_knnsearchr   rL   	tvs_hmgetr    r   rT   )
r,   r\   r]   r#   	embeddingkeys_and_scoresrL   rY   _docss
             r   similarity_searchzTair.similarity_search   s     +77>>	3$+3OQ	5$
 
:@
 
 ;''E'::% 	 	FCd&79I    !!
 

 
 
 
 	
r   	langchaincls
Type[Tair]rk   c                0   	 ddl m} n# t          $ r t          d          w xY wt          |dd          }	d|v r|                    d           |j        j        }
d|v r|                    d          }
|j        j        }d|v r|                    d          }|j	        j
        }d|v r|                    d          }i }d	|v r|                    d	          }i }d
|v r|                    d
          }d }d|v r|                    d          }	  | ||	|f|||d|}n$# t          $ r}t          d|           d }~ww xY w|                    |          } |j        t          |d                   |
||fi | |                    |||           |S )Nr   )
tairvectorr&   tair_urlTAIR_URLr4   r5   r6   index_paramsr!   rE   r   r    r!   ztair failed to connect: )rE   )r'   rt   r(   r   popDistanceMetricInnerProduct	IndexTypeHNSWDataTypeFloat32r*   rM   r>   lenrZ   )rq   r?   rk   rA   r   r   r    r#   rt   r   r4   r5   r6   rw   r!   rE   tair_vector_storer.   r1   s                      r   
from_textszTair.from_texts   sG   	''''''' 	 	 	=  	
 #6:zBBJJz""""1>f$$"JJ77M).
6!!L11J'/	&  

;//IV##!::n55Lf$$"JJ77MV::f%%D	= #! ()+! ! ! !  	= 	= 	=;;;<<<	= ..u55
33
1		
 	

 	
 	
 	
 	##E94#@@@  s    	 #D! !
E+D==E	documentsc                X    d |D             }d |D             } | j         ||||||fi |S )Nc                    g | ]	}|j         
S r   )rb   rd   s     r   rg   z'Tair.from_documents.<locals>.<listcomp>   s    333A333r   c                    g | ]	}|j         
S r   )r   rd   s     r   rg   z'Tair.from_documents.<locals>.<listcomp>   s    333AQZ333r   )r   )	rq   r   rk   rA   r   r   r    r#   r?   s	            r   from_documentszTair.from_documents   sZ     4333333333	s~9i[,
 
RX
 
 	
r   c                |   	 ddl m} n# t          $ r t          d          w xY wt          |dd          }	 d|v r|                    d            |j        dd|i|}n$# t          $ r}t          d|           d}~ww xY w|                    |           }|dk    rt          	                    d	           d
S dS )z
        Drop an existing index.

        Args:
            index_name (str): Name of the index to drop.

        Returns:
            bool: True if the index is dropped successfully.
        r   r%   r&   ru   rv   r   zTair connection error: NzIndex does not existFTr   )
r'   r   r(   r   ry   r)   r*   tvs_del_indexr:   r;   )r   r#   r-   r   r+   r.   rets          r   
drop_indexzTair.drop_index   s   	/////// 	 	 	=  	
 #6:zBB	<V##

:&&&(Z(;;S;F;;FF 	< 	< 	<:q::;;;	< "":..!88KK.///5ts   	 #(A! !
B+A==Bc                x    t          |dd          }i }d|v r|                    d          } | |||f|||d|S )z"Connect to an existing Tair index.ru   rv   r!   rx   )r   ry   )rq   rk   r   r   r    r#   r   r!   s           r   from_existing_indexzTair.from_existing_index  sr     #6:zBBf$$"JJ77Ms
 $%'
 
 
 
 	
r   )r   r   N)r   r
   r   r   r   r   r   r   r    r   r!   r"   r#   r   )r   r
   )r2   r3   r4   r   r5   r   r6   r   r#   r   r   r7   r   )r?   r@   rA   rB   r#   r   r   rC   )r[   )r\   r   r]   r3   r#   r   r   r^   )Nrp   r   r   )rq   rr   r?   rC   rk   r
   rA   rB   r   r   r   r   r    r   r#   r   r   r   )r   r^   rk   r
   rA   rB   r   r   r   r   r    r   r#   r   r   r   )rp   )r   r   r#   r   r   r7   )rp   r   r   )rk   r
   r   r   r   r   r    r   r#   r   r   r   )__name__
__module____qualname____doc__r/   propertyr1   r>   rZ   ro   classmethodr   r   staticmethodr   r   r   r   r   r   r      su        %&(,+ + + + +< ' ' ' X'   2 +/. . . . .b $%!
 !
 !
 !
 !
F 
 +/%$&A! A! A! A! [A!F 
 +/%$&
 
 
 
 [
" %" " " " \"H  &$&
 
 
 
 [
 
 
r   r   )r   r   )
__future__r   rQ   loggingr   typingr   r   r   r   r   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.utilsr   langchain_core.vectorstoresr   	getLoggerr   r:   r   r   r   r   r   <module>r      s   " " " " " "    6 6 6 6 6 6 6 6 6 6 6 6 6 6 - - - - - - 0 0 0 0 0 0 5 5 5 5 5 5 3 3 3 3 3 3		8	$	$   a
 a
 a
 a
 a
; a
 a
 a
 a
 a
r   