
    ugE                     f   d dl 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 d dlmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZmZmZmZ d d	lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d d
l/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBZB G d de      ZCy)    )ListOptionalSequenceTupleUnioncast)UUID)	overrides)CollectionConfigurationInternal)DEFAULT_DATABASEDEFAULT_TENANTSystemlogger)SysDB)NotFoundErrorUniqueConstraintErrorInternalError)from_proto_collectionfrom_proto_segmentto_proto_update_metadatato_proto_segmentto_proto_segment_scope)CreateCollectionRequestCreateDatabaseRequestCreateSegmentRequestCreateTenantRequestDeleteCollectionRequestDeleteDatabaseRequestDeleteSegmentRequestGetCollectionsRequestGetCollectionsResponse GetCollectionWithSegmentsRequest!GetCollectionWithSegmentsResponseGetDatabaseRequestGetSegmentsRequestGetTenantRequestListDatabasesRequestUpdateCollectionRequestUpdateSegmentRequest)	SysDBStub) RetryOnRpcErrorClientInterceptor)OtelInterceptor)

CollectionCollectionAndSegmentsDatabaseMetadataOptionalArgumentSegmentSegmentScopeTenantUnspecifiedUpdateMetadata)EmptyNc                       e Zd ZU dZeed<   ej                  ed<   eed<   e	ed<   e	ed<   de
f fdZed/ fd       Zed/ fd       Zed/ fd       Zeefdededed	d
fd       Zeefdeded	efd       Zeefdeded	d
fd       Zed
d
efdee	   dee	   ded	ee   fd       Zeded	d
fd       Zeded	efd       Zeded	d
fd       Zededed	d
fd       Ze	 	 	 d0dedee   dee   dee   d	ee   f
d       Z e e!       fdeded e"ee#      d	d
fd!       Z$ed
d
d"ee%fdeded#e&d$ee   d ee'   d%ee	   d&e(ded'ed	e)e*e(f   fd(       Z+eee%fdeded'ed	d
fd)       Z,ed
d
ee%d
d
fdee   dee   ded'edee	   dee	   d	ee*   fd*       Z-ed+ed	e.fd,       Z/e e!        e!        e!       fdede"e   d%e"ee	      d e"ee#      d	d
f
d-       Z0d/d.Z1 xZ2S )1	GrpcSysDBzA gRPC implementation of the SysDB. In the distributed system, the SysDB is also
    called the 'Coordinator'. This implementation is used by Chroma frontend servers
    to call a remote SysDB (Coordinator) service._sys_db_stub_channel_coordinator_url_coordinator_port_request_timeout_secondssystemc                     |j                   j                  d      | _        |j                   j                  d      | _        |j                   j                  d      | _        t
        |   |      S )Nchroma_coordinator_hostchroma_server_grpc_port$chroma_sysdb_request_timeout_seconds)settingsrequirer<   r=   r>   super__init__)selfr?   	__class__s     Q/var/www/openai/venv/lib/python3.12/site-packages/chromadb/db/impl/grpc/client.pyrG   zGrpcSysDB.__init__@   s_     & 7 78Q R!'!8!89R!S(.(?(?2)
% w''    returnNc                 ,   t        j                  | j                   d| j                         | _        t               t               g}t        j                  | j                  g| | _        t        | j                        | _	        t        | -         S )N:)grpcinsecure_channelr<   r=   r;   r,   r+   intercept_channelr*   r:   rF   start)rH   interceptorsrI   s     rJ   rR   zGrpcSysDB.startI   s|    --$$%Qt'='=&>?
 ()+K+MN..t}}L|L%dmm4w}rK   c                 T    | j                   j                          t        |          S N)r;   closerF   stoprH   rI   s    rJ   rW   zGrpcSysDB.stopS   s    w|~rK   c                 f    | j                   j                  t                      t        |          S rU   )r:   
ResetStater7   rF   reset_staterX   s    rJ   r[   zGrpcSysDB.reset_stateX   s'    $$UW-w"$$rK   idnametenantc                 z   	 t        |j                  ||      }| j                  j                  || j                        }y # t
        j                  $ re}t        j                  d| d| d| d|        |j                         t
        j                  j                  k(  r
t               t               d }~ww xY w)Nr\   r]   r^   timeoutzFailed to create database name z and database id  for tenant  due to error: )r   hexr:   CreateDatabaser>   rO   RpcErrorr   infocode
StatusCodeALREADY_EXISTSr   r   )rH   r\   r]   r^   requestresponsees          rJ   create_databasezGrpcSysDB.create_database]   s    	"+rvvDPG((77!>!> 8 H }} 	"KK1$7HLY_X``opqors vvx4??999+--/!	"s   ?A B:A B55B:c           	         	 t        ||      }| j                  j                  || j                        }t	        t        |j                  j                        |j                  j                  |j                  j                        S # t        j                  $ rb}t        j                  d| d| d|        |j                         t        j                  j                   k(  r
t#               t%               d }~ww xY w)Nr]   r^   ra   re   r`   zFailed to get database rc   rd   )r$   r:   GetDatabaser>   r/   r	   databaser\   r]   r^   rO   rg   r   rh   ri   rj   	NOT_FOUNDr   r   )rH   r]   r^   rl   rm   rn   s         rJ   get_databasezGrpcSysDB.get_databasen   s    	"(d6BG((44!>!> 5 H H--001&&++((// 
 }} 	"KK)$|F8?STRUV vvx4??444#o%/!	"s   BB
 
C?AC::C?c           	      V   	 t        ||      }| j                  j                  || j                         y # t        j
                  $ r^}t        j                  d| d| d|        |j                         t        j                  j                  k(  r
t               t        d }~ww xY w)Nrq   ra   zFailed to delete database rc   rd   )r   r:   DeleteDatabaser>   rO   rg   r   rh   ri   rj   ru   r   r   )rH   r]   r^   rl   rn   s        rJ   delete_databasezGrpcSysDB.delete_database   s    	 +fEG,,!>!> -  }} 	 KK,TF,vhoVWUXY vvx4??444#o%	 s   47 B(
AB##B(limitoffsetc                    	 t        |||      }| j                  j                  || j                        }g }|j                  D ]G  }|j                  t        t        |j                        |j                  |j                               I |S # t        j                  $ r*}t        j                  d| d|        t               d }~ww xY w)N)rz   r{   r^   ra   rr   r`   z$Failed to list databases for tenant rd   )r'   r:   ListDatabasesr>   	databasesappendr/   r	   r\   r]   r^   rO   rg   r   rh   r   )	rH   rz   r{   r^   rl   rm   resultsproto_databasern   s	            rJ   list_databaseszGrpcSysDB.list_databases   s    	"*vfUG((66!>!> 7 H ')G"*"4"4N$5$56+00-44 #5 N}} 	"KK6vhoaSQ  /!		"s   BB C$%C		Cc                 V   	 t        |      }| j                  j                  || j                        }y # t        j
                  $ r_}t        j                  d| d|        |j                         t        j                  j                  k(  r
t               t               d }~ww xY w)Nr]   ra   zFailed to create tenant rd   )r   r:   CreateTenantr>   rO   rg   r   rh   ri   rj   rk   r   r   rH   r]   rl   rm   rn   s        rJ   create_tenantzGrpcSysDB.create_tenant   s    		")t4G((55!>!> 6 H }} 	"KK24&sKLvvx4??999+--/!		"s   36 B(	AB##B(c                    	 t        |      }| j                  j                  || j                        }t	        |j
                  j                        S # t        j                  $ r_}t        j                  d| d|        |j                         t        j                  j                  k(  r
t               t               d }~ww xY w)Nr   ra   zFailed to get tenant rd   )r&   r:   	GetTenantr>   r4   r^   r]   rO   rg   r   rh   ri   rj   ru   r   r   r   s        rJ   
get_tenantzGrpcSysDB.get_tenant   s    	"&D1G((22!>!> 3 H __))  }} 	"KK/v_QCHIvvx4??444#o%/!		"s   AA C(ACCsegmentc                 l   	 t        |      }t        |      }| j                  j                  || j                        }y # t
        j                  $ r_}t        j                  d| d|        |j                         t
        j                  j                  k(  r
t               t               d }~ww xY w)N)r   ra   zFailed to create segment 	, error: )r   r   r:   CreateSegmentr>   rO   rg   r   rh   ri   rj   rk   r   r   )rH   r   proto_segmentrl   rm   rn   s         rJ   create_segmentzGrpcSysDB.create_segment   s    	",W5M*%G ((66!>!> 7 H }} 	"KK3G9IaSIJvvx4??999+--/!		"s   >A B3AB..B3
collectionc           	         	 t        |j                  |j                        }| j                  j                  || j                        }y # t
        j                  $ rb}t        j                  d| d| d|        |j                         t
        j                  j                  k(  r
t               t               d }~ww xY w)N)r\   r   ra   z!Failed to delete segment with id  for collection rd   )r   re   r:   DeleteSegmentr>   rO   rg   r   rh   ri   rj   ru   r   r   )rH   r   r\   rl   rm   rn   s         rJ   delete_segmentzGrpcSysDB.delete_segment   s    	"*66%>>G ((66!>!> 7 H }} 	"KK3B47G
|Sbcdbef vvx4??444#o%/!	"s   AA C AB;;C typescopec                    	 t        |r|j                  nd ||rt        |      nd |j                        }| j                  j	                  || j
                        }g }|j                  D ]  }t        |      }	|j                  |	         |S # t        j                  $ r3}
t        j                  d| d| d| d| d|
 
       t               d }
~
ww xY w)N)r\   r   r   r   ra   zFailed to get segment id z, type z, scope r   rd   )r%   re   r   r:   GetSegmentsr>   segmentsr   r   rO   rg   r   rh   r   )rH   r   r\   r   r   rl   rm   r   r   r   rn   s              rJ   get_segmentszGrpcSysDB.get_segments   s    	"(266T7<,U3$%>>	G ((44!>!> 5 H &(G!)!2!2,];w' "3 N}} 	"KK+B4wtfHUGK[\f[ggvwxvyz  /!		"s   BB C!.CCmetadatac           	         	 d }|t               k7  rt        t        t        d f   |      }t	        |j
                  |j
                  |rt        |      nd       }||j                  d       d|_        | j                  j                  || j                         y # t        j                  $ r-}t        j                  d| d| d|        t!               d }~ww xY w)N)r\   r   r   r   Tra   z!Failed to update segment with id r   r   )r5   r   r   r6   r)   re   r   
ClearFieldreset_metadatar:   UpdateSegmentr>   rO   rg   r   rh   r   )rH   r   r\   r   write_metadatarl   rn   s          rJ   update_segmentzGrpcSysDB.update_segment	  s    	"!N;=(!%eND,@&A8!L*66%>>! 2.AG "":.)-&++!>!> ,  }} 	"KK3B47G
|S\]^\_`  /!		"s   BB C.(CCFconfigurationr   	dimensionget_or_creatert   c
                 >   	 t        |j                  ||j                         |rt        |      nd ||||	|D 
cg c]  }
t	        |
       c}
	      }| j
                  j                  || j                        }t        |j                        }||j                  fS c c}
w # t        j                  $ rh}t        j                  d| d| d|	 d| d| 
       |j                         t        j                   j"                  k(  r
t%               t'               d }~ww xY w)N)	r\   r]   configuration_json_strr   r   r   r^   rt   r   ra   zFailed to create collection id , name  for database  and tenant rd   )r   re   to_json_strr   r   r:   CreateCollectionr>   r   r   createdrO   rg   r   errorri   rj   rk   r   r   )rH   r\   r]   r   r   r   r   r   r^   rt   r   rl   rm   r   rn   s                  rJ   create_collectionzGrpcSysDB.create_collection*  s'   	"-66'4'@'@'B?G1(;T#+!CKL8*738L
G ((99!>!> : H /x/B/BCJx//// M }} 	"LL1"WTF.QYPZZfgmfnn}~  ~A  B vvx4??999+--/!	"s*   6B! B
AB! B! !D4A#DDc                 0   	 t        |j                  ||      }| j                  j                  || j                        }y # t
        j                  $ r}t        j                  d| d| d| d|        t        t
        j                  |      }t        j                  d|j                          dt
        j                  j                          |j                         t
        j                  j                  k(  r
t               t               d }~ww xY w)	N)r\   r^   rt   ra   zFailed to delete collection id r   r   rd   zError code: z, NotFoundError: )r   re   r:   DeleteCollectionr>   rO   rg   r   r   r   Callri   rj   ru   r   r   )rH   r\   r^   rt   rl   rm   rn   s          rJ   delete_collectionzGrpcSysDB.delete_collectionP  s    	"-66!G
 ((99!>!> : H }} 
	"LL1"^H:\Z`Yaapqrpst TYY"ALLqvvxj(9$//:S:S9TU vvx4??444#o%/!
	"s   ?A DB;DDc                    	 d }|t        |j                  ||      }|||t        d      t        |||||      }||t        ||||      }| j                  j	                  || j
                        }g }	|j                  D ]  }
|	j                  t        |
              |	S # t        j                  $ r3}t        j                  d| d| d| d	| d
| 
       t               d }~ww xY w)N)r\   rz   r{   zmIf name is specified, tenant and database must also be specified in order to uniquely identify the collection)r]   r^   rt   rz   r{   )r^   rt   rz   r{   ra   z"Failed to get collections with id r   z	, tenant z, database rd   )r    re   
ValueErrorr:   GetCollectionsr>   collectionsr   r   rO   rg   r   r   r   )rH   r\   r]   r^   rt   rz   r{   rl   rm   r   r   rn   s               rJ   get_collectionszGrpcSysDB.get_collectionsl  s2   '	"G~/vv!
 >h&6$ H  0!%! zdl/!%!	 04/@/@/O/O!>!> 0P 0H )+G&22
4Z@A 3N}} 	"LL4RDvYvhVabjakkz{|z}~  /!		"s   B%B( (C.;.C))C.collection_idc           	         	 t        |j                        }| j                  j                  |      }t	        t        |j                        |j                  D cg c]  }t        |       c}      S c c}w # t        j                  $ r_}|j                         t        j                  j                  k(  r
t               t        j                   d| d|        t#               d }~ww xY w)N)r\   )r   r   zFailed to get collection z  and its segments due to error: )r"   re   r:   GetCollectionWithSegmentsr.   r   r   r   r   rO   rg   ri   rj   ru   r   r   r   r   )rH   r   rl   rm   r   rn   s         rJ   get_collection_with_segmentsz&GrpcSysDB.get_collection_with_segments  s    	"6-:K:KLG!!;;GD  )01D1DEEMEVEVWEV',W5EVW W}} 	"vvx4??444#o%LL+M?:Z[\Z]^  /!	"s+   AA9 A4
,A9 4A9 9C+AC&&C+c           	      @   	 d }|t               k7  rt        t        |      }d }|t               k7  rt        t        t        d f   |      }d }|t               k7  rt        t        t
        d f   |      }t        |j                  |||rt        |      nd       }||j                  d       d|_
        | j                  j                  || j                        }	y # t        j                  $ r}
t        t        j                   |
      }
t#        j$                  d| d| d|
        |
j'                         t        j(                  j*                  k(  r
t-               |
j'                         t        j(                  j.                  k(  r
t1               t3               d }
~
ww xY w)N)r\   r]   r   r   r   Tra   zFailed to update collection id r   rd   )r5   r   strr   intr6   r(   re   r   r   r   r:   UpdateCollectionr>   rO   rg   r   r   r   ri   rj   ru   r   rk   r   r   )rH   r\   r]   r   r   
write_namewrite_dimensionr   rl   rm   rn   s              rJ   update_collectionzGrpcSysDB.update_collection  sj   %	"J{}$!#t_
"OKM)"&uS$Y'7"C!N;=(!%eND,@&A8!L-66)! 2.AG "":.)-&((99!>!> : H }} 		"TYY"ALL1"WTF/RSQTU vvx4??444#o%vvx4??999+--/!		"s   CC F,B,FFc                 N    | j                   j                  t               d       y )NT)wait_for_ready)r:   rZ   r7   )rH   s    rJ   reset_and_wait_for_readyz"GrpcSysDB.reset_and_wait_for_ready  s    $$UWT$BrK   )rL   N)NNN)3__name__
__module____qualname____doc__r*   __annotations__rO   Channelr   r   r   rG   r
   rR   rW   r[   r   r	   ro   r/   rv   ry   r   r   r   r   r4   r   r2   r   r   r3   r   r5   r1   r6   r   r   r   r0   boolr   r-   r   r   r   r.   r   r   r   __classcell__)rI   s   @rJ   r9   r9   5   s   5 ll!!(v (     % % 1?""!"+."	" "  4B " "c "x " "& 7E  C    $       $ $$	"}" " 	"
 
(	" "6 
"# 
"$ 
" 
" "s "v " " "g "$ " " " "4 "D " ""  ""(,"" TN" sm	"
 %" 
'	" "8 
 @K}	"" " #8N#;<	"
 
" "@  (,#'#$(#"#" #" 7	#"
 7##" 8$#" C=#" #" #" #" 
z4	 #" #"J  %(	"" " 	"
 
" "6  ""$(# $0"TN0" sm0" 	0"
 0" }0" 0" 
*	0" 0"d "!"	" "(  '2m5@]?J},"," s#," $HSM2	,"
 #8N#;<," 
," ,"\CrK   r9   )Dtypingr   r   r   r   r   r   uuidr	   r
   chromadb.api.configurationr   chromadb.configr   r   r   r   chromadb.db.systemr   chromadb.errorsr   r   r   chromadb.proto.convertr   r   r   r   r   chromadb.proto.coordinator_pb2r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   #chromadb.proto.coordinator_pb2_grpcr*   chromadb.proto.utilsr+   %chromadb.telemetry.opentelemetry.grpcr,   chromadb.typesr-   r.   r/   r0   r1   r2   r3   r4   r5   r6   google.protobuf.empty_pb2r7   rO   r9    rK   rJ   <module>r      sx    ? ?   F L L $ O O     & : A A   , oC oCrK   