o
    gM                     @   sX  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	 d dl
mZ d dlmZmZmZmZ d dlmZmZmZmZmZmZ d dlm  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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d d
l7m8Z8m9Z9 d dl:Z:d dl;m<Z< d dl=m>Z>m?Z?m@Z@mAZA G dd de8eZBdS )    )futures)AnyDictListcast)UUID)	overrides)CollectionConfigurationInternal)DEFAULT_DATABASEDEFAULT_TENANT	ComponentSystem)from_proto_metadatafrom_proto_update_metadatafrom_proto_segmentfrom_proto_segment_scopeto_proto_collectionto_proto_segmentN)CreateCollectionRequestCreateCollectionResponseCreateDatabaseRequestCreateDatabaseResponseCreateSegmentRequestCreateSegmentResponseCreateTenantRequestCreateTenantResponseDeleteCollectionRequestDeleteCollectionResponseDeleteSegmentRequestDeleteSegmentResponseGetCollectionsRequestGetCollectionsResponse GetCollectionWithSegmentsRequest!GetCollectionWithSegmentsResponseGetDatabaseRequestGetDatabaseResponseGetSegmentsRequestGetSegmentsResponseGetTenantRequestGetTenantResponseResetStateResponseUpdateCollectionRequestUpdateCollectionResponseUpdateSegmentRequestUpdateSegmentResponse)SysDBServiceradd_SysDBServicer_to_server)Empty)
CollectionMetadataSegmentSegmentScopec                       s  e Zd ZU dZejed< eed< i Ze	e
ef ed< i Ze	e
ee
 f ed< i Ze	e
e	e
e	e
ef f f ed< i Ze	e
e	e
ef f ed< def fd	d
Zed: fddZed: fddZed: fddZedddedejdefddZedddedejdefddZedddedejde fddZ!eddde"dejde#fddZ$eddde%dejde&fdd Z'd!edejde&fd"d#Z(eddde)dejde*fd$d%Z+eddde,dejde-fd&d'Z.eddde/dejde0fd(d)Z1eddde2dejde3fd*d+Z4eddde5dejde6fd,d-Z7eddde8dejde9fd.d/Z:eddde;dejde<fd0d1Z=eddde>dejde?fd2d3Z@edddeAdejdeBfd4d5ZCd6eDd7eEjFddfd8d9ZG  ZHS );GrpcMockSysDBzA mock sysdb implementation that can be used for testing the grpc client. It stores
    state in simple python data structures instead of a database._server_server_port	_segments_collection_to_segments$_tenants_to_databases_to_collections_tenants_to_database_to_idsystemc                    s   |j d| _t |S )Nchroma_server_grpc_port)settingsrequirer8   super__init__)selfr=   	__class__ S/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/db/impl/grpc/server.pyrB   C   s   zGrpcMockSysDB.__init__returnNc                    sH   t tjdd| _t| | j | jd| j  | j  t	  S )N
   )max_workersz[::]:)
grpcserverr   ThreadPoolExecutorr7   r0   add_insecure_portr8   startrA   rC   rD   rF   rG   rO   G   s
   

zGrpcMockSysDB.startc                    s   | j d  t  S N)r7   stoprA   rP   rD   rF   rG   rR   O   s   
zGrpcMockSysDB.stopc                    sL   i | _ i | _i | jt< i | jt t< i | jt< tdd| jt t< t  S )Nr   )int)r9   r;   r   r
   r<   r   rA   reset_staterP   rD   rF   rG   rT   T   s   


zGrpcMockSysDB.reset_stateF)check_signaturerequestcontextc                 C   s~   |j }|j}|| jvr|tjjd| d || j| v r*|tjjd| d i | j| |< t|j	d| j
| |< t S )NTenant 
 not found	Database  already existshex)tenantnamer;   abortrK   
StatusCode	NOT_FOUNDALREADY_EXISTSr   idr<   r   )rC   rV   rW   r^   databaserF   rF   rG   CreateDatabase_   s   
zGrpcMockSysDB.CreateDatabasec                 C   sz   |j }|j}|| jvr|tjjd| d || j| vr*|tjjd| d | j| | }tt	j
|j||ddS )NrX   rY   rZ   )rd   r_   r^   )re   )r^   r_   r;   r`   rK   ra   rb   r<   r%   protoDatabaser]   )rC   rV   rW   r^   re   rd   rF   rF   rG   GetDatabaseo   s   
zGrpcMockSysDB.GetDatabasec                 C   sB   |j }|| jv r|tjjd| d i | j|< i | j|< t S )NrX   r[   )r_   r;   r`   rK   ra   rc   r<   r   rC   rV   rW   r^   rF   rF   rG   CreateTenant~   s   


zGrpcMockSysDB.CreateTenantc                 C   s:   |j }|| jvr|tjjd| d ttj|ddS )NrX   rY   r_   )r^   )	r_   r;   r`   rK   ra   rb   r)   rg   Tenantrj   rF   rF   rG   	GetTenant   s   

zGrpcMockSysDB.GetTenantc                 C   s   t |j}| ||S rQ   )r   segmentCreateSegmentHelper)rC   rV   rW   ro   rF   rF   rG   CreateSegment   s   
zGrpcMockSysDB.CreateSegmentro   c                 C   sB   |d j | jv r|tjjd|d  d || j|d j < t S )Nrd   Segment r[   )r]   r9   r`   rK   ra   rc   r   )rC   ro   rW   rF   rF   rG   rp      s   z!GrpcMockSysDB.CreateSegmentHelperc                 C   s:   |j }|| jv r| j|= t S |tjjd| d d S )Nrr   rY   )rd   r9   r   r`   rK   ra   rb   )rC   rV   rW   id_to_deleterF   rF   rG   DeleteSegment   s   
zGrpcMockSysDB.DeleteSegmentc           	      C   s   | drt|jdnd }| dr|jnd }| dr!t|jnd }t|jd}g }| j D ]+}|r;|d |kr;q0|rD|d |krDq0|rM|d |krMq0|rV|d |krVq0|	| q0t
dd |D dS )	Nrd   r\   typescope
collectionc                 S      g | ]}t |qS rF   r   .0ro   rF   rF   rG   
<listcomp>       z-GrpcMockSysDB.GetSegments.<locals>.<listcomp>)segments)HasFieldr   rd   ru   r   rv   rw   r9   valuesappendr'   )	rC   rV   rW   	target_idtarget_typetarget_scopetarget_collectionfound_segmentsro   rF   rF   rG   GetSegments   s*   zGrpcMockSysDB.GetSegmentsc                 C   s   t |j}|j| jvr|tjjd| d d S | j|j }|dr@t	t
ttf |d }|d d u r9i |d< | ||j |drL|jrLi |d< t S )Nrr   rY   metadatareset_metadata)r   rd   r]   r9   r`   rK   ra   rb   r   r   r   strr   _merge_metadatar   r   r.   )rC   rV   rW   id_to_updatero   targetrF   rF   rG   UpdateSegment   s   

zGrpcMockSysDB.UpdateSegmentc                    sT  |j  |j}|j}|| jvr|tjjd| d || j| vr-|tjjd| d | j D ]D\}}| D ];\}}|j	|v ru||jksM||jkr`|tjj
d|j	 d| d|  q:|jsu|tjj
d|j	 d| d|  q:q2| j| | }	 fdd|	 D }
t|
d	ksJ t|
d
kr|jr|
d
 }tt|ddS |tjj
d  d t|j}t|j	d}t||j |t|j|j||d
d}g }|jD ]8}t|}|d j| jv r|D ]}| t|d| q|tjj
d|d  d | || ||d j q||	|j	< | d| d|j	 }|| j |< tt|ddS )NrX   rY   rZ   Collection z already exists in tenant z
 database c                    s   g | ]
}|d   kr|qS rl   rF   )r{   ccollection_namerF   rG   r|     s    z2GrpcMockSysDB.CreateCollection.<locals>.<listcomp>   r   F)rw   createdr[   r\   )rd   r_   configurationr   	dimensionre   r^   versionrd   )rd   rr   :T)!r_   r^   re   r;   r`   rK   ra   rb   itemsrd   rc   get_or_creater   lenr   r   r	   from_json_strconfiguration_json_strr   r2   r   r   r   r~   r   r]   r9   rt   r   rp   r   r:   )rC   rV   rW   r^   re   search_tenant	databasessearch_databasesearch_collectionscollectionsmatchesexisting_collectionr   rd   new_collectionsegments_addedsegment_protoro   scollection_unique_keyrF   r   rG   CreateCollection   s   







zGrpcMockSysDB.CreateCollectionc           
      C   s   |j }|j}|j}|| jvr|tjjd| d || j| vr-|tjjd| d | j| | }||v rX||= | d| d| }| j| }|rU|D ]}	| j	|	= qNt
 S |tjjd| d d S )NrX   rY   rZ   r   r   )rd   r^   re   r;   r`   rK   ra   rb   r:   r9   r   )
rC   rV   rW   collection_idr^   re   r   r   segment_ids
segment_idrF   rF   rG   DeleteCollection?  s&   


zGrpcMockSysDB.DeleteCollectionc              	   C   s   | drt|jdnd }| dr|jnd }i }| j D ]5\}}| D ],\}}	|jdkr5||jkr5q&|jdkr@||jkr@q&||	 t	d| d| d|	  q&qg }
|
 D ]}|re|d |kreqZ|rn|d |krnqZ|
| qZtdd	 |
D d
S )Nrd   r\   r_    Tenant: , Database: , Collections: c                 S   rx   rF   )r   )r{   rw   rF   rF   rG   r|   r  s    z0GrpcMockSysDB.GetCollections.<locals>.<listcomp>)r   )r   r   rd   r_   r;   r   r^   re   updateprintr   r   r!   )rC   rV   rW   r   target_nameallCollectionsr^   r   re   r   found_collectionsrw   rF   rF   rG   GetCollectionsX  s4   
	zGrpcMockSysDB.GetCollectionsc              	      s  i } j  D ]\}}| D ]\}}|| td| d| d|  qq||jd }|d u r?|tjj	d|j d |j
 d|j d|j }	 fdd j|	 D }
d	d
 |
D tjtjtjhkru|tjjd| d|
  tt|dd |
D dS )Nr   r   r   zCollection with id rY   r   c                    s   g | ]} j | qS rF   )r9   )r{   rd   rP   rF   rG   r|     s    z;GrpcMockSysDB.GetCollectionWithSegments.<locals>.<listcomp>c                 S   s   h | ]}|d  qS )rv   rF   rz   rF   rF   rG   	<setcomp>  r}   z:GrpcMockSysDB.GetCollectionWithSegments.<locals>.<setcomp>z#Incomplete segments for collection z: c                 S   rx   rF   ry   rz   rF   rF   rG   r|     r}   )rw   r~   )r;   r   r   r   getrd   r`   rK   ra   rb   r^   re   r:   r5   METADATARECORDVECTORINTERNALr#   r   )rC   rV   rW   r   r^   r   re   r   rw   r   r~   rF   rP   rG   GetCollectionWithSegmentsw  s&   
z'GrpcMockSysDB.GetCollectionWithSegmentsc                 C   s  t |j}i }| j D ]\}}| D ]\}}|j|v r|}qq|j|vr4|tjjd| d d S ||j }	|	drC|j
|	d< |	drM|j|	d< |	drwt|j}
d }|
d urpi }|
 D ]\}}|d uro|||< qc||	d< t S |	dr|jri |	d< t S )Nr   rY   r_   r   r   r   )r   rd   r;   r   r]   r`   rK   ra   rb   r   r_   r   r   r   r   r,   )rC   rV   rW   r   r   r^   r   re   maybe_collectionsrw   update_metadatacleaned_metadatakeyvaluerF   rF   rG   UpdateCollection  s@   










zGrpcMockSysDB.UpdateCollectionc                 C   s   |    t S rQ   )rT   r*   )rC   rV   rW   rF   rF   rG   
ResetState  s   zGrpcMockSysDB.ResetStater   sourcec                 C   s^   t tttf |}t tttf t|}|| | D ]\}}|d u r,||v r,||= qd S rQ   )r   r   r   r   r   r   r   )rC   r   r   target_metadatasource_metadatar   r   rF   rF   rG   r     s   
zGrpcMockSysDB._merge_metadata)rH   N)I__name__
__module____qualname____doc__rK   Server__annotations__rS   r9   r   r   r4   r:   r   r;   r2   r<   r   r   rB   r   rO   rR   rT   r   ServicerContextr   rf   r$   r%   ri   r   r   rk   r(   r)   rn   r   r   rq   rp   r   r   rt   r&   r'   r   r-   r.   r   r   r   r   r   r   r   r    r!   r   r"   r#   r   r+   r,   r   r1   r*   r   r3   rg   UpdateMetadatar   __classcell__rF   rF   rD   rG   r6   6   s  
 

	X) r6   )C
concurrentr   typingr   r   r   r   uuidr   r   chromadb.api.configurationr	   chromadb.configr
   r   r   r   chromadb.proto.convertr   r   r   r   r   r   chromadb.proto.chroma_pb2rg   
chroma_pb2chromadb.proto.coordinator_pb2r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   #chromadb.proto.coordinator_pb2_grpcr/   r0   rK   google.protobuf.empty_pb2r1   chromadb.typesr2   r3   r4   r5   r6   rF   rF   rF   rG   <module>   s     t