Ë
    lQêj30  ã                   ó6  — d dl Z d dlmZ d dlmZmZmZmZmZ d dl	Z	d dl
Z
d dlmZ d dl	mZmZ d dlZd dlmZ d dlmZmZ d dlmZmZ d dlmc mc mZ d dlmc mc mZ d dlmZ d d	l m!Z! d d
l"m#Z# d dl$m%Z% dZ& ejN                   ejP                  d¬«      d¬«      Z) ee) ejT                  e)dd¬«       ejV                  «       ¬«       ed e e	j                  d¬«       e	j                  d¬«      ¬«      ¬«      dejX                  dejZ                  de.ddfd„«       «       Z/ ee) ejT                  e)ddd dd ¬!«       ejV                  «       ¬«       ed e e	j                  d ¬«       e	j                  d"¬«      ¬«      e	j`                  jb                  e	j`                  jd                  e	j`                  jf                  e	j`                  jh                  g¬#«      dejX                  dejZ                  de.ddfd$„«       «       Z5deeef   fd%„Z6d&ed'ed(e7de7fd)„Z8	 	 d3dejX                  dejZ                  de.d*e.d(e7ddfd+„Z9	 	 d4d,e:d-e:d.e:dejZ                  fd/„Z; ee) ejV                  «       ¬0«       edd"¬1«      dejX                  de.ddfd2„«       «       Z<y)5é    N)Úrandint)ÚcastÚListÚAnyÚDictÚTuple)ÚgivenÚsettings)Ú	ClientAPI)Ú
EmbeddingsÚ	Metadatas)ÚNOT_CLUSTER_ONLYÚoverride_hypothesis_profile)Úwait_for_version_increase)Úcreate_batches)ÚAdminClient)ÚSettingsé
   T)Úwith_hnsw_paramsÚcoll)Úkeyé   iô  )Úmin_sizeÚmax_size©Ú
collectionÚ
record_setÚshould_compacté2   )Úmax_examplesé   )ÚnormalÚfast)ÚdeadlineÚparentr   r   r   Úreturnc                 ó   — t        | ||«       y )N©Ú	_test_addr   s      úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/chromadb/test/property/test_add_mcmr.pyÚtest_add_smallr+      s   € ô" ˆj˜* nÕ5ó    éú   é   )r   r   Únum_unique_metadataÚmin_metadata_sizeÚmax_metadata_sizeé   )r$   r%   Úsuppress_health_checkc                 ó"   — t        | ||d¬«       y )NT)Úbatch_ann_accuracyr(   r   s      r*   Útest_add_mediumr6   3   s   € ôD ˆj˜* nÈÖNr,   c                  óž   — t        dd¬«      } t        dd¬«      }t        j                  dd| ¬«      }t        j                  dd|¬«      }||fS )z±Create two clients connected to different regions for MCMR testing.

    Returns:
        A tuple of two ClientAPI instances connected to localhost:8000 and localhost:8001.
    N)Úchroma_server_hostÚchroma_server_http_portÚ	localhosti@  )ÚhostÚportr
   iA  )r   ÚchromadbÚ
HttpClient)Ú	settings1Ú	settings2Úclient1Úclient2s       r*   Ú_create_mcmr_clientsrC   X   sO   € ô ¨DÈ$ÔO€IÜ¨DÈ$ÔO€IÜ×!Ñ! {¸È	ÔR€GÜ×!Ñ! {¸È	ÔR€GØ�GÐÐr,   rA   rB   Útopologyc                 óÔ   — | j                  «       }t        |«      }|› dt        j                  «       › �}|j	                  |«       | j                  |«       |j                  |«       |S )aD  Create an isolated database for MCMR testing using the topology+database format.

    Args:
        client1: The first client (region 1).
        client2: The second client (region 2).
        topology: The topology identifier for the test.

    Returns:
        The database name in the format '{topology}+{database}'.
    z+test_)Úget_settingsr   ÚuuidÚuuid4Úcreate_databaseÚset_database)rA   rB   rD   Úadmin_settingsÚadminÚdatabases         r*   Ú_create_isolated_database_mcmrrN   e   sa   € ð ×)Ñ)Ó+€NÜ˜Ó'€EØ�˜6¤$§*¡*£, Ð0€HØ	×Ñ˜(Ô#Ø×Ñ˜Ô"Ø×Ñ˜Ô"Ø€Or,   r5   c                 óÐ  — t        «       \  }}t        |||«       |j                  | j                  | j                  | j
                  | j                  ¬«      }|j                  | j                  | j
                  ¬«      }t        j                  |«      }	t         xr |}
t        t        |j                  «       d   «      }t        t        |j                  «       d   «      }d}t        t        t!        |	d   «      dz  «      }t#        d|› �«       t%        t'        |t        t(        t*           |	d   «      t        t,        |	d   «      t        t.        |	d	   «      t        t(        t*           |	d
   «      ¬«      «      }t1        |«      D ]Æ  \  }}t#        dt!        |d   «      «       |dz  dk(  r |j2                  |Ž  n |j2                  |Ž  |
sŒHt#        d«       |t!        |d   «      z  }||k\  sŒjt#        d|› �«       t#        d|› �«       t#        d|› d|› �«       t5        || j                  |«      }t5        || j                  |«      }d}ŒÈ t        dt!        |	d   «      dz  «      }||fD ]ö  }t        j6                  |t        t8        j:                  |	«      «       |r‰d}t=        dt!        |	d   «      |«      D ]j  }t        j>                  |t        t8        j:                  |	«      || j
                  t%        t=        |tA        ||z   t!        |	d   «      «      «      «      ¬«       Œl Œ¼t        j>                  |t        t8        j:                  |	«      || j
                  ¬«       Œø y)a¬  Test adding records to a collection across multiple regions.

    Args:
        collection: The collection configuration.
        record_set: The records to add.
        should_compact: Whether to wait for compaction.
        batch_ann_accuracy: Whether to batch the ANN accuracy checks.
        topology: Topology identifier for MCMR testing.
            Creates two clients connected to localhost:8000 and localhost:8001.
    )ÚnameÚmetadataÚembedding_functionÚconfiguration©rP   rR   Úversionr   Úidsr   z.starting min_records_between_compaction_waits=Ú
embeddingsÚ	metadatasÚ	documents©ÚapirV   rW   rX   rY   Úaddingr2   zshould wait for compactionz records_since_compaction_wait = z'min_records_between_compaction_waits = zwaiting z >= r   )Ú	n_resultsrR   Úquery_indices)r]   rR   N)!rC   rN   Úcreate_collectionrP   rQ   rR   Úcollection_configÚget_collectionÚ
invariantsÚwrap_allr   r   ÚintÚ	get_modelÚmaxÚ$MIN_RECORDS_BETWEEN_COMPACTION_WAITSÚlenÚprintÚlistr   r   Ústrr   r   Ú	enumerateÚaddr   ÚcountÚ
strategiesÚ	RecordSetÚrangeÚann_accuracyÚmin)r   r   r   r5   rD   rA   rB   Úcoll1Úcoll2Únormalized_record_setÚshould_wait_for_compactionÚcurrent_version1Úcurrent_version2Úrecords_since_compaction_waitÚ$min_records_between_compaction_waitsÚbatchesÚbatch_indexÚbatchr]   r   Ú
batch_sizeÚis                         r*   r)   r)   }   si  € ô" ,Ó-Ñ€GˆWÜ" 7¨G°XÔ>à×%Ñ%Ø�_‰_Ø×$Ñ$Ø%×8Ñ8Ø ×2Ñ2ð	 &ó €Eð ×"Ñ"Ø�_‰_Ø%×8Ñ8ð #ó €Eô
 '×/Ñ/°
Ó;ÐÜ%5Ð!5Ò!H¸.ÐÜœC §¡Ó!2°9Ñ!=Ó>ÐÜœC §¡Ó!2°9Ñ!=Ó>ÐØ$%Ð!Ü+.Ü,¬cÐ2GÈÑ2NÓ.OÐSUÑ.Uó,Ð(ô 
Ø
8Ð9]Ð8^Ð_ôô ÜØÜ”Tœ#‘YÐ 5°eÑ <Ó=ÜœJÐ(=¸lÑ(KÓLÜœ9Ð&;¸KÑ&HÓIÜœ4¤™9Ð&;¸KÑ&HÓIô	
ó€Gô (¨Ó0ò 2Ñˆ�UÜˆhœ˜E !™H›Ô&Ø˜‰?˜aÒØˆE�I‰I�uÒàˆE�I‰I�uÑÚ%ÜÐ.Ô/Ø)¬S°°q±«]Ñ:Ð)Ø,Ð0TÓTÜØ6Ð7TÐ6UÐVôô Ø=Ð>bÐ=cÐdôô ØÐ<Ð=¸TÐBfÐAgÐhôô $=Ø˜ZŸ_™_Ð.>ó$Ð ô $=Ø˜ZŸ_™_Ð.>ó$Ð ð 12Ñ-ð32ô< �AœÐ1°%Ñ8Ó9¸RÑ?ÓA€IØ˜�ò ˆÜ×Ñ˜œt¤J×$8Ñ$8Ð:OÓPÔQÙØˆJÜ˜1œcÐ"7¸Ñ">Ó?ÀÓLò 	�Ü×'Ñ'ØÜœ×-Ñ-Ð/DÓEØ'Ø'1×'DÑ'DÜ"&Ü˜a¤ Q¨¡^´SÐ9NÈuÑ9UÓ5VÓ!WÓXó#öñ	ô ×#Ñ#ØÜ”Z×)Ñ)Ð+@ÓAØ#Ø#-×#@Ñ#@ö	ñr,   Ú	dimensionr   r   c                 óª  — t        ||«      }t        |«      D �cg c]  }t        t        j                  «       «      ‘Œ! }}t        |«      D �cg c]  }d|› i‘Œ	 }}t        |«      D �cg c]  }d|› �‘Œ	 }}t        |«      D �cg c]  }dg| z  ‘Œ
 }	}|t        t        |	«      ||dœ}
t        t        j                  |
«      S c c}w c c}w c c}w c c}w )NÚsome_keyz	Document g      ð?)rV   rW   rX   rY   )	r   rq   rk   rG   rH   r   r   ro   rp   )r�   r   r   ÚsizeÚ_rV   r€   rX   rY   rW   r   s              r*   Úcreate_large_recordsetr†   ë   sÈ   € ô
 �8˜XÓ&€Dä&+¨D£kÖ
2 Œ3Œt�z‰z‹|ÕÐ
2€CÐ
2Ü/4°T«{Ö;¨!�*  Ò%Ð;€IÐ;Ü*/°«+Ö6 Q�9˜Q˜C’Ð6€IÐ6Ü-2°4«[Ö9¨�3�%˜)Ó#Ð9€JÐ9àÜœ: zÓ2ØØñ	(€Jô ”
×$Ñ$ jÓ1Ð1ùò 3ùÚ;ùÚ6ùÚ9s   š$CÁCÁ(CÂC)r   r   )r$   r    c                 óî  — d}t        «       \  }}t        |||«       |j                  «       j                  dk(  rt	        j
                  d«       t        | j                  dd¬«      }|j                  | j                  | j                  | j                  ¬«      }|j                  | j                  | j                  ¬«      }t        j                  |«      }t        t         |j#                  «       d	   «      }	t        t         |j#                  «       d	   «      }
t%        t'        |t        t(        t*           |d
   «      t        t,        |d   «      t        t.        |d   «      t        t(        t*           |d   «      ¬«      «      }t1        |«      D ],  \  }}|dz  dk(  r |j2                  |Ž  Œ |j2                  |Ž  Œ. t4        sE|rCt7        |d
   «      dkD  r2t9        || j                  |	d¬«       t9        || j                  |
d¬«       ||fD ]è  }t        j:                  |t        t<        j>                  |«      «       t        j@                  |t        t<        j>                  |«      «       t        jB                  |t        t<        j>                  |«      «       t        jD                  |t        t<        j>                  |«      «       t        jF                  |t        t<        j>                  |«      «       Œê y)zÀTest adding large record sets to a collection across multiple regions.

    Args:
        collection: The collection configuration.
        should_compact: Whether to wait for compaction.
    útilt-spanningz'chromadb.api.async_fastapi.AsyncFastAPIzDTODO @jai, come back and debug why CI runners fail with async + synci'  i N  )r�   r   r   )rP   rQ   rR   rT   rU   rV   rW   rX   rY   rZ   r2   r   r   i,  )Úadditional_timeN)$rC   rN   rF   Úchroma_api_implÚpytestÚskipr†   r�   r_   rP   rQ   rR   ra   rb   rc   r   rd   re   rj   r   r   rk   r   r   rl   rm   r   rh   r   rn   ro   rp   Ú	ids_matchÚmetadatas_matchÚdocuments_matchÚembeddings_match)r   r   rD   rA   rB   r   rt   ru   rv   Úinitial_version1Úinitial_version2r|   r}   r~   r   s                  r*   Útest_add_larger“   ÿ   s¥  € ð €HÜ+Ó-Ñ€GˆWÜ" 7¨G°XÔ>ð 	×ÑÓ×.Ñ.Ø4ò	5ô 	�‰ØRô	
ô (Ø×&Ñ&ØØô€Jð
 ×%Ñ%Ø�_‰_Ø×$Ñ$Ø%×8Ñ8ð &ó €Eð
 ×"Ñ"Ø�_‰_Ø%×8Ñ8ð #ó €Eô
 '×/Ñ/°
Ó;ÐÜœC §¡Ó!2°9Ñ!=Ó>ÐÜœC §¡Ó!2°9Ñ!=Ó>ÐäÜØÜ”Tœ#‘Y 
¨5Ñ 1Ó2ÜœJ¨
°<Ñ(@ÓAÜœ9 j°Ñ&=Ó>Üœ4¤™9 j°Ñ&=Ó>ô	
ó€Gô (¨Ó0ò Ñˆ�UØ˜‰?˜aÒØˆE�I‰I�uÒàˆE�I‰I�uÒð	õ ÙÜÐ% eÑ,Ó-°Ò2ô 	"Ø�Z—_‘_Ð&6Èõ	
ô 	"Ø�Z—_‘_Ð&6Èõ	
ð ˜�ò 
ˆÜ×Ñ˜œt¤J×$8Ñ$8Ð:OÓPÔQÜ×Ñ˜T¤4¬
×(<Ñ(<Ð>SÓ#TÔUÜ×"Ñ"Ø”$”z×+Ñ+Ð-BÓCô	
ô 	×"Ñ"Ø”$”z×+Ñ+Ð-BÓCô	
ô 	×#Ñ#Ø”$”z×+Ñ+Ð-BÓCõ	
ñ
r,   )Frˆ   )iÈ¯  iPÃ  )=rG   Úrandomr   Útypingr   r   r   r   r   Ú
hypothesisr‹   Úhypothesis.strategiesro   Ústr	   r
   r=   Úchromadb.apir   Úchromadb.api.typesr   r   Úchromadb.test.conftestr   r   Ú!chromadb.test.property.strategiesÚtestÚpropertyÚ!chromadb.test.property.invariantsrb   Ú-chromadb.test.utils.wait_for_version_increaser   Úchromadb.utils.batch_utilsr   Úchromadb.api.clientr   Úchromadb.configr   rg   ÚsharedÚcollectionsÚcollection_stÚ
recordsetsÚbooleansÚ
Collectionrp   Úboolr+   ÚHealthCheckÚtoo_slowÚdata_too_largeÚlarge_base_exampleÚfunction_scoped_fixturer6   rC   rk   rN   r)   rd   r†   r“   © r,   r*   ú<module>r±      s6  ðÛ Ý ß /Õ /Û Û Ý "ß &Û Ý "ß 4÷÷ 7Ó 6ß 6Ó 6Ý SÝ 5Ý +Ý $à')Ð $ð �—	‘	Ð0˜*×0Ñ0À$ÔGÈVÔT€ñ ØØ$ˆz×$Ñ$ ]¸QÈÔMØ�2—;‘;“=ôñ
 
ØÙ&Ø"ˆz×"Ñ"°Ô3Ø ˆZ× Ñ ¨bÔ1ôôð6Ø×%Ñ%ð6à×$Ñ$ð6ð ð6ð 
ò	6óóð6ñ ØØ$ˆz×$Ñ$ØØØØØØôð �2—;‘;“=ôñ 
ØÙ&Ø"ˆz×"Ñ"°Ô2Ø ˆZ× Ñ ¨aÔ0ôð
 	×Ñ×'Ñ'Ø×Ñ×-Ñ-Ø×Ñ×1Ñ1Ø×Ñ×6Ñ6ð	ôð	OØ×%Ñ%ð	Oà×$Ñ$ð	Oð ð	Oð 
ò		Oóóð2	Oð
˜e I¨yÐ$8Ñ9ó 
ðØðàðð ðð 	ó	ð8  %Ø#ñiØ×%Ñ%ðià×$Ñ$ðið ðið ð	ið
 ðið 
óið` Øñ2Øð2àð2ð ð2ð ×Ñó	2ñ( �-°°·±³Ô>Ù	�4 aÔ(ðQ
Ø×%Ñ%ðQ
àðQ
ð 
òQ
ó )ó ?ñQ
r,   