
    j                         U d dl Z d dlmZ d dlmZ d dlmZmZ  e j        e	          Z
 G d d          Zdaedz  ed<   defd	ZddededefdZdS )    N)Lock)Optional)
Collectionconnectionsc                        e Zd ZU dZed          ed<    e            Z fdZd Z	dde
d	e
d
efdZd Zde
defdZdefdZd Z xZS )MilvusConnectionManagerN	_instancec                     | j         L| j        5  | j         &t                                          |           | _         d d d            n# 1 swxY w Y   | j         S N)r	   _locksuper__new__)cls	__class__s    I/lsinfo/ai/hellotax_ai/base_platform/app/services/vector/milvus_client.pyr   zMilvusConnectionManager.__new__   s    =  9 9=($)GGOOC$8$8CM9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 }s   .A

AAc                     t          | d          sFd| _        d| _        d| _        d | _        d | _        d| _        t                              d           d S d S )NinitializedTdefaultFz%Milvus connection manager initialized)	hasattrr   connection_alias	connectedhostportuse_liteloggerinfoselfs    r   __init__z MilvusConnectionManager.__init__   sf    t]++ 	A#D$-D!"DNDIDI!DMKK?@@@@@	A 	A    	localhost19530Fr   r   r   c                 F   | j         rQ| j        |k    r2| j        |k    r'| j        |k    rt                              d           d S |                                  	 |r6t          j        | j	        d           t          
                    d           n<t          j        | j	        ||           t          
                    d| d|            d| _         || _        || _        || _        d S # t          $ r*}t                              d	|            d
| _          d }~ww xY w)Nz Using existing Milvus connectionz./data/milvus_data.db)aliasurizConnected to Milvus Lite)r$   r   r   zConnected to Milvus at :TzFailed to connect to Milvus: F)r   r   r   r   r   debug
disconnectr   connectr   r   	Exceptionerror)r   r   r   r   es        r   r)   zMilvusConnectionManager.connect   s:   > 	"yD  TY$%6%6DMX<U<U?@@@!!!	 E#$*?E\]]]]67777#$*?dQUVVVVCdCCTCCDDD!DNDIDI$DMMM 	 	 	LL<<<==="DN	s   BC, ,
D 6%DD c                     | j         rs	 t          j        | j                   d| _         t                              d           d S # t          $ r(}t                              d|            Y d }~d S d }~ww xY wd S )N)r$   FzDisconnected from Milvusz!Error disconnecting from Milvus: )r   r   r(   r   r   r   r*   r+   r   r,   s     r   r(   z"MilvusConnectionManager.disconnect6   s    > 	FF&T-BCCCC!&677777 F F FDDDEEEEEEEEEF	F 	Fs   ;A 
A8A33A8collection_namereturnc                 R   | j         st          d          	 t          |          }	 |                                 n7# t          $ r*}t                              d| d|            Y d }~nd }~ww xY w|S # t          $ r&}t                              d| d|             d }~ww xY w)Nz.Not connected to Milvus. Call connect() first.zCollection z load attempt: zFailed to get collection z: )r   r*   r   loadr   r'   r+   )r   r/   
collection
load_errorr,   s        r   get_collectionz&MilvusConnectionManager.get_collection?   s    ~ 	NLMMM		#O44JY!!!! Y Y YW?WW:WWXXXXXXXXY 	 	 	LLK_KKKKLLL	s=   A6 = A6 
A1 A,'A6 ,A11A6 6
B& !B!!B&c                     | j         sdS 	 t          j                     dS # t          $ r/}t                              d|            d| _         Y d }~dS d }~ww xY w)NFTzMilvus health check failed: )r   r   list_connectionsr*   r   r+   r.   s     r   health_checkz$MilvusConnectionManager.health_checkM   sx    ~ 	5	(***4 	 	 	LL;;;<<<"DN55555	s     
A$AAc                     |                                  sWt                              d           d| _        | j        r1| j        r,|                     | j        | j        | j                   d S d S d S d S )Nz$Attempting to reconnect to Milvus...F)r8   r   r   r   r   r   r)   r   r   s    r   	reconnectz!MilvusConnectionManager.reconnectX   s      "" 	BKK>???"DNy BTY BTY	4=AAAAA		B 	BB B B Br    r!   r"   F)__name__
__module____qualname__r	   r   __annotations__r   r   r   r   strboolr)   r(   r   r5   r8   r:   __classcell__)r   s   @r   r   r   
   s         59Ix12999DFFE    A A A C S d    .F F Fc j    	d 	 	 	 	B B B B B B Br    r   _milvus_managerr0   c                  :    t           t                      a t           S r   )rC   r    r    r   get_milvus_managerrF   c   s    133r    r!   r"   Fr   r   r   c                 P    t                      }|                    | ||           d S r   )rF   r)   )r   r   r   managers       r   init_milvus_connectionrI   j   s)     ""GOOD$)))))r    r;   )logging	threadingr   typingr   pymilvusr   r   	getLoggerr<   r   r   rC   r?   rF   r@   rA   rI   rE   r    r   <module>rO      s                , , , , , , , ,		8	$	$SB SB SB SB SB SB SB SBl 37(4/ 6 6 63    * * *# *SW * * * * * *r    