o
    gE                     @   s`  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lBZBG dd deZCdS )    )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                       s  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d	ZedC fddZedC fddZedC fddZeefdededed
dfddZeefdeded
efddZeefdeded
dfddZeddefdee	 dee	 ded
ee fddZeded
dfdd Zeded
efd!d"Zed#ed
dfd$d%Zed&eded
dfd'd(Ze			dDd&edee d)ee d*ee d
ee f
d+d,Z ee! fd&eded-e"ee#  d
dfd.d/Z$eddd0ee%fdeded1e&d2ee d-ee' d3ee	 d4e(ded5ed
e)e*e(f fd6d7Z+eee%fdeded5ed
dfd8d9Z,eddee%ddfdee dee ded5edee	 dee	 d
ee* fd:d;Z-ed<ed
e.fd=d>Z/ee! e! e! fdede"e d3e"ee	  d-e"ee#  d
df
d?d@Z0dCdAdBZ1  Z2S )E	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                    s6   |j d| _|j d| _|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/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/db/impl/grpc/client.pyrD   @   s   zGrpcSysDB.__init__returnNc                    sR   t | j d| j | _t t g}t j| jg|R  | _t| j| _	t
  S )N:)grpcinsecure_channelr:   r;   r9   r+   r*   intercept_channelr)   r8   rC   start)rE   interceptorsrF   rH   rI   rO   I   s   
zGrpcSysDB.startc                    s   | j   t  S N)r9   closerC   stoprE   rF   rH   rI   rS   S   s   

zGrpcSysDB.stopc                    s   | j t  t  S rQ   )r8   
ResetStater6   rC   reset_staterT   rF   rH   rI   rV   X   s   
zGrpcSysDB.reset_stateidnametenantc                 C   s   zt |j||d}| jj|| jd}W d S  tjy@ } ztd| d| d| d|  |	 tj
jkr9t t d }~ww )NrW   rX   rY   timeoutzFailed to create database name z and database id  for tenant  due to error: )r   hexr8   CreateDatabaser<   rL   RpcErrorr   infocode
StatusCodeALREADY_EXISTSr   r   )rE   rW   rX   rY   requestresponseerH   rH   rI   create_database]   s   zGrpcSysDB.create_databasec                 C   s   z t ||d}| jj|| jd}tt|jjd|jj|jj	dW S  t
jyI } ztd| d| d|  | t
jjkrBt t d }~ww )NrX   rY   r[   r_   rZ   zFailed to get database r]   r^   )r#   r8   GetDatabaser<   r.   r   databaserW   rX   rY   rL   ra   r   rb   rc   rd   	NOT_FOUNDr   r   )rE   rX   rY   rf   rg   rh   rH   rH   rI   get_databasen   s&   zGrpcSysDB.get_databasec                 C   sv   zt ||d}| jj|| jd W d S  tjy: } ztd| d| d|  | tj	j
kr4t td }~ww )Nrj   r[   zFailed to delete database r]   r^   )r   r8   DeleteDatabaser<   rL   ra   r   rb   rc   rd   rn   r   r   )rE   rX   rY   rf   rh   rH   rH   rI   delete_database   s   zGrpcSysDB.delete_databaselimitoffsetc           	   
   C   s   z+t |||d}| jj|| jd}g }|jD ]}|tt|jd|j	|j
d q|W S  tjyF } ztd| d|  t d }~ww )N)rr   rs   rY   r[   rk   rZ   z$Failed to list databases for tenant r^   )r&   r8   ListDatabasesr<   	databasesappendr.   r   rW   rX   rY   rL   ra   r   rb   r   )	rE   rr   rs   rY   rf   rg   resultsproto_databaserh   rH   rH   rI   list_databases   s,   

zGrpcSysDB.list_databasesc              
   C   sp   zt |d}| jj|| jd}W d S  tjy7 } ztd| d|  | tj	j
kr0t t d }~ww )NrX   r[   zFailed to create tenant r^   )r   r8   CreateTenantr<   rL   ra   r   rb   rc   rd   re   r   r   rE   rX   rf   rg   rh   rH   rH   rI   create_tenant   s   
zGrpcSysDB.create_tenantc              
   C   sz   zt |d}| jj|| jd}t|jjdW S  tjy< } zt	
d| d|  | tjjkr5t t d }~ww )Nrz   r[   zFailed to get tenant r^   )r%   r8   	GetTenantr<   r3   rY   rX   rL   ra   r   rb   rc   rd   rn   r   r   r|   rH   rH   rI   
get_tenant   s   
zGrpcSysDB.get_tenantsegmentc              
   C   sx   zt |}t|d}| jj|| jd}W d S  tjy; } ztd| d|  |	 tj
jkr4t t d }~ww )N)r   r[   zFailed to create segment 	, error: )r   r   r8   CreateSegmentr<   rL   ra   r   rb   rc   rd   re   r   r   )rE   r   proto_segmentrf   rg   rh   rH   rH   rI   create_segment   s   zGrpcSysDB.create_segment
collectionc                 C   s|   zt |j|jd}| jj|| jd}W d S  tjy= } ztd| d| d|  |	 tj
jkr6t t d }~ww )N)rW   r   r[   z!Failed to delete segment with id  for collection r^   )r   r_   r8   DeleteSegmentr<   rL   ra   r   rb   rc   rd   rn   r   r   )rE   r   rW   rf   rg   rh   rH   rH   rI   delete_segment   s"   zGrpcSysDB.delete_segmenttypescopec                 C   s   z1t |r|jnd ||rt|nd |jd}| jj|| jd}g }|jD ]}t|}	||	 q#|W S  t	j
yU }
 ztd| d| d| d| d|
 
 t d }
~
ww )N)rW   r   r   r   r[   zFailed to get segment id z, type z, scope r   r^   )r$   r_   r   r8   GetSegmentsr<   segmentsr   rv   rL   ra   r   rb   r   )rE   r   rW   r   r   rf   rg   rw   r   r   rh   rH   rH   rI   get_segments   s,   
 zGrpcSysDB.get_segmentsmetadatac                 C   s   z7d }|t  krtttd f |}t|j|j|rt|nd d}|d u r,|d d|_| j	j
|| jd W d S  tjyU } ztd| d| d|  t d }~ww )N)rW   r   r   r   Tr[   z!Failed to update segment with id r   r   )r4   r   r   r5   r(   r_   r   
ClearFieldreset_metadatar8   UpdateSegmentr<   rL   ra   r   rb   r   )rE   r   rW   r   write_metadatarf   rh   rH   rH   rI   update_segment	  s0   


zGrpcSysDB.update_segmentFconfigurationr   	dimensionget_or_createrm   c
                 C   s   z/t |j|| |rt|nd ||||	dd |D d	}
| jj|
| jd}t|j}||j	fW S  t
jy^ } z"td| d| d|	 d| d	| 
 | t
jjkrWt t d }~ww )
Nc                 S      g | ]}t |qS rH   )r   .0r   rH   rH   rI   
<listcomp>A      z/GrpcSysDB.create_collection.<locals>.<listcomp>)	rW   rX   configuration_json_strr   r   r   rY   rm   r   r[   zFailed to create collection id , name  for database  and tenant r^   )r   r_   to_json_strr   r8   CreateCollectionr<   r   r   createdrL   ra   r   errorrc   rd   re   r   r   )rE   rW   rX   r   r   r   r   r   rY   rm   rf   rg   r   rh   rH   rH   rI   create_collection*  s4   
 zGrpcSysDB.create_collectionc                 C   s   zt |j||d}| jj|| jd}W d S  tjyU } z4td| d| d| d|  t	tj
|}td|  dtjj  | tjjkrNt t d }~ww )	N)rW   rY   rm   r[   zFailed to delete collection id r   r   r^   zError code: z, NotFoundError: )r   r_   r8   DeleteCollectionr<   rL   ra   r   r   r   Callrc   rd   rn   r   r   )rE   rW   rY   rm   rf   rg   rh   rH   rH   rI   delete_collectionP  s,   zGrpcSysDB.delete_collectionc                 C   s   zRd }|d urt |j||d}|d ur(|d u r|d u rtdt |||||d}|d u r8|d u r8t ||||d}| jj|| jd}g }	|jD ]	}
|	t|
 qF|	W S  t	j
yv } ztd| d| d| d	| d
| 
 t d }~ww )N)rW   rr   rs   zmIf name is specified, tenant and database must also be specified in order to uniquely identify the collection)rX   rY   rm   rr   rs   )rY   rm   rr   rs   r[   z"Failed to get collections with id r   z	, tenant z, database r^   )r   r_   
ValueErrorr8   GetCollectionsr<   collectionsrv   r   rL   ra   r   r   r   )rE   rW   rX   rY   rm   rr   rs   rf   rg   rw   r   rh   rH   rH   rI   get_collectionsl  sR   

 zGrpcSysDB.get_collectionscollection_idc              
   C   s   zt |jd}| j|}tt|jdd |jD dW S  tj	yB } z|
 tjjkr0t td| d|  t d }~ww )N)rW   c                 S   r   rH   )r   r   rH   rH   rI   r     r   z:GrpcSysDB.get_collection_with_segments.<locals>.<listcomp>)r   r   zFailed to get collection z  and its segments due to error: )r!   r_   r8   GetCollectionWithSegmentsr-   r   r   r   rL   ra   rc   rd   rn   r   r   r   r   )rE   r   rf   rg   rh   rH   rH   rI   get_collection_with_segments  s"   
z&GrpcSysDB.get_collection_with_segmentsc                 C   s  zSd }|t  krtt|}d }|t  krtttd f |}d }|t  kr-tttd f |}t|j|||r8t|nd d}|d u rH|	d d|_
| jj|| jd}	W d S  tjy }
 z-ttj|
}
td| d| d|
  |
 tjjkr{t |
 tjjkrt t d }
~
ww )N)rW   rX   r   r   r   Tr[   zFailed to update collection id r   r^   )r4   r   strr   intr5   r'   r_   r   r   r   r8   UpdateCollectionr<   rL   ra   r   r   r   rc   rd   rn   r   re   r   r   )rE   rW   rX   r   r   
write_namewrite_dimensionr   rf   rg   rh   rH   rH   rI   update_collection  sH   





zGrpcSysDB.update_collectionc                 C   s   | j jt dd d S )NT)wait_for_ready)r8   rU   r6   rT   rH   rH   rI   reset_and_wait_for_ready  s   z"GrpcSysDB.reset_and_wait_for_ready)rJ   N)NNN)3__name__
__module____qualname____doc__r)   __annotations__rL   Channelr   r   r   rD   r	   rO   rS   rV   r   r   ri   r.   ro   rq   r   r   ry   r}   r3   r   r1   r   r   r2   r   r4   r0   r5   r   r   r
   r/   boolr   r,   r   r   r   r-   r   r   r   __classcell__rH   rH   rF   rI   r7   5   s>  
 
		
 	

%2

.r7   )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.   r/   r0   r1   r2   r3   r4   r5   google.protobuf.empty_pb2r6   rL   r7   rH   rH   rH   rI   <module>   s      L0