§
    ˜Štj30  ã                   óÆ  — 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j'         ej(        d¬¦  «        d¬¦  «        Z) ee) ej*        e)dd¬¦  «         ej+        ¦   «         ¬¦  «         ed e e	j        d¬¦  «         e	j        d¬¦  «        ¬¦  «        ¬¦  «        dej,        dej-        de.ddfd„¦   «         ¦   «         Z/ ee) ej*        e)ddd dd ¬!¦  «         ej+        ¦   «         ¬¦  «         ed e e	j        d ¬¦  «         e	j        d"¬¦  «        ¬¦  «        e	j0        j1        e	j0        j2        e	j0        j3        e	j0        j4        g¬#¦  «        dej,        dej-        de.ddfd$„¦   «         ¦   «         Z5deeef         fd%„Z6d&ed'ed(e7de7fd)„Z8	 	 d7dej,        dej-        de.d,e.d(e7ddfd-„Z9	 	 d8d0e:d1e:d2e:dej-        fd3„Z; ee) ej+        ¦   «         ¬4¦  «         edd"¬5¦  «        dej,        de.ddfd6„¦   «         ¦   «         Z<dS )9é    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          | ||¦  «         d S )N©Ú	_test_addr   s      úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/chromadb/test/property/test_add_mcmr.pyÚtest_add_smallr+      s   € õ" ˆj˜* nÑ5Ô5Ð5Ð5Ð5ó    éú   é   )r   r   Únum_unique_metadataÚmin_metadata_sizeÚmax_metadata_sizeé   )r$   r%   Úsuppress_health_checkc                 ó,   — t          | ||d¬¦  «         d S )NT)Úbatch_ann_accuracyr(   r   s      r*   Útest_add_mediumr6   3   s"   € õD ˆj˜* nÈÐNÑNÔNÐNÐ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   sa   € õ ¨DÈ$ÐOÑOÔO€IÝ¨DÈ$ÐOÑOÔO€IÝÔ! {¸È	ÐRÑRÔR€GÝÔ! {¸È	ÐRÑRÔR€GØ�GÐÐr,   rA   rB   Útopologyc                 óú   — |                       ¦   «         }t          |¦  «        }|› dt          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   s|   € ð ×)Ò)Ñ+Ô+€NÝ˜Ñ'Ô'€EØÐ0Ð0¥$¤*¡,¤,Ð0Ð0€HØ	×Ò˜(Ñ#Ô#Ð#Ø×Ò˜Ñ"Ô"Ð"Ø×Ò˜Ñ"Ô"Ð"Ø€Or,   Fútilt-spanningr5   c                 óÆ  — t          ¦   «         \  }}t          |||¦  «         |                     | j        | j        | j        | j        ¬¦  «        }|                     | j        | j        ¬¦  «        }t          j	        |¦  «        }	t           o|}
t          t          |                     ¦   «         d         ¦  «        }t          t          |                     ¦   «         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 |j        |Ž  n
 |j        |Ž  |
r”t#          d¦  «         |t!          |d         ¦  «        z  }||k    rgt#          d|› �¦  «         t#          d|› �¦  «         t#          d|› d|› �¦  «         t5          || j        |¦  «        }t5          || j        |¦  «        }d}ŒÝt          dt!          |	d         ¦  «        dz  ¦  «        }||fD �]}t          j        |t          t8          j        |	¦  «        ¦  «         |rŸd}t=          dt!          |	d         ¦  «        |¦  «        D ]w}t          j        |t          t8          j        |	¦  «        || j        t%          t=          |tA          ||z   t!          |	d         ¦  «        ¦  «        ¦  «        ¦  «        ¬¦  «         ŒxŒÑt          j        |t          t8          j        |	¦  «        || j        ¬¦  «         �ŒdS )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©rQ   rS   Úversionr   Úidsr   z.starting min_records_between_compaction_waits=Ú
embeddingsÚ	metadatasÚ	documents©ÚapirW   rX   rY   rZ   Úaddingr2   zshould wait for compactionz records_since_compaction_wait = z'min_records_between_compaction_waits = zwaiting z >= r   )Ú	n_resultsrS   Úquery_indices)r^   rS   N)!rC   rN   Úcreate_collectionrQ   rR   rS   Ú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)   }   s;  € õ" ,Ñ-Ô-Ñ€GˆWÝ" 7¨G°XÑ>Ô>Ð>à×%Ò%ØŒ_ØÔ$Ø%Ô8Ø Ô2ð	 &ñ ô €Eð ×"Ò"ØŒ_Ø%Ô8ð #ñ ô €Eõ
 'Ô/°
Ñ;Ô;ÐÝ%5Ð!5Ð!H¸.ÐÝ�C §¢Ñ!2Ô!2°9Ô!=Ñ>Ô>ÐÝ�C §¢Ñ!2Ô!2°9Ô!=Ñ>Ô>ÐØ$%Ð!Ý+.Ý,­cÐ2GÈÔ2NÑ.OÔ.OÐSUÑ.Uñ,ô ,Ð(õ 
Ø_Ð9]Ð_Ð_ñô ð õ ÝØÝ•T�#”YÐ 5°eÔ <Ñ=Ô=Ý�JÐ(=¸lÔ(KÑLÔLÝ�9Ð&;¸KÔ&HÑIÔIÝ�4¥œ9Ð&;¸KÔ&HÑIÔIð	
ñ 	
ô 	
ñô €Gõ (¨Ñ0Ô0ð 2ð 2Ñˆ�UÝˆh�˜E !œH™œÑ&Ô&Ð&Ø˜‰?˜aÒÐØˆEŒI�uÐÐÐàˆEŒI�uÐÐØ%ð 	2ÝÐ.Ñ/Ô/Ð/Ø)­S°°q´©]¬]Ñ:Ð)Ø,Ð0TÒTÐTÝØVÐ7TÐVÐVñô ð õ ØdÐ>bÐdÐdñô ð õ ØhÐ<ÐhÐhÐBfÐhÐhñô ð õ $=Ø˜Zœ_Ð.>ñ$ô $Ð õ $=Ø˜Zœ_Ð.>ñ$ô $Ð ð 12Ð-øõ
 �A�Ð1°%Ô8Ñ9Ô9¸RÑ?ÑAÔA€IØ˜�ð ñ ˆÝÔ˜�t¥JÔ$8Ð:OÑPÔPÑQÔQÐQØð 	ØˆJÝ˜1�cÐ"7¸Ô">Ñ?Ô?ÀÑLÔLð 	ð 	�ÝÔ'ØÝ�Ô-Ð/DÑEÔEØ'Ø'1Ô'DÝ"&Ý˜a¥ Q¨¡^µSÐ9NÈuÔ9UÑ5VÔ5VÑ!WÔ!WÑXÔXñ#ô #ðñ ô ð ð ð	õ Ô#ØÝ•ZÔ)Ð+@ÑAÔAØ#Ø#-Ô#@ð	ñ ô ð ñ ðð r,   éÈ¯  éPÃ  Ú	dimensionr   r   c                 óX  ‡ — t          ||¦  «        }d„ t          |¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         }ˆ fd„t          |¦  «        D ¦   «         }|t          t          |¦  «        ||dœ}t          t          j        |¦  «        S )Nc                 óN   — g | ]"}t          t          j        ¦   «         ¦  «        ‘Œ#S © )rl   rG   rH   )Ú.0Ú_s     r*   ú
<listcomp>z*create_large_recordset.<locals>.<listcomp>ò   s&   € Ð
2Ð
2Ð
2 �3�tŒz‰|Œ|ÑÔÐ
2Ð
2Ð
2r,   c                 ó   — g | ]}d |› i‘ŒS )Úsome_keyr‡   ©rˆ   r�   s     r*   rŠ   z*create_large_recordset.<locals>.<listcomp>ó   s   € Ð;Ð;Ð;¨!�* ˜fÐ%Ð;Ð;Ð;r,   c                 ó   — g | ]}d |› �‘ŒS )z	Document r‡   r�   s     r*   rŠ   z*create_large_recordset.<locals>.<listcomp>ô   s   € Ð6Ð6Ð6 Q�˜Q��Ð6Ð6Ð6r,   c                 ó   •— g | ]}d g‰z  ‘Œ	S )g      ð?r‡   )rˆ   r‰   r„   s     €r*   rŠ   z*create_large_recordset.<locals>.<listcomp>õ   s    ø€ Ð9Ð9Ð9¨�3�%˜)Ñ#Ð9Ð9Ð9r,   )rW   rX   rY   rZ   )r   rr   r   r   rp   rq   )	r„   r   r   ÚsizerW   rY   rZ   rX   r   s	   `        r*   Úcreate_large_recordsetr‘   ë   sµ   ø€ õ
 �8˜XÑ&Ô&€Dà
2Ð
2¥e¨D¡k¤kÐ
2Ñ
2Ô
2€CØ;Ð;­u°T©{¬{Ð;Ñ;Ô;€IØ6Ð6­%°©+¬+Ð6Ñ6Ô6€IØ9Ð9Ð9Ð9­U°4©[¬[Ð9Ñ9Ô9€JàÝ�: zÑ2Ô2ØØð	(ð (€Jõ •
Ô$ jÑ1Ô1Ð1r,   )r   r   )r$   r    c                 óZ  — d}t          ¦   «         \  }}t          |||¦  «         |                     ¦   «         j        dk    rt	          j        d¦  «         t          | j        dd¬¦  «        }|                     | j	        | j
        | j        ¬¦  «        }|                     | j	        | j        ¬¦  «        }t          j        |¦  «        }t          t           |                     ¦   «         d	         ¦  «        }	t          t           |                     ¦   «         d	         ¦  «        }
t%          t'          |t          t(          t*                   |d
         ¦  «        t          t,          |d         ¦  «        t          t.          |d         ¦  «        t          t(          t*                   |d         ¦  «        ¬¦  «        ¦  «        }t1          |¦  «        D ]#\  }}|dz  dk    r |j        |Ž  Œ |j        |Ž  Œ$t4          sK|rIt7          |d
         ¦  «        dk    r0t9          || j	        |	d¬¦  «         t9          || j	        |
d¬¦  «         ||fD ]ã}t          j        |t          t<          j        |¦  «        ¦  «         t          j         |t          t<          j        |¦  «        ¦  «         t          j!        |t          t<          j        |¦  «        ¦  «         t          j"        |t          t<          j        |¦  «        ¦  «         t          j#        |t          t<          j        |¦  «        ¦  «         ŒädS )zÀTest adding large record sets to a collection across multiple regions.

    Args:
        collection: The collection configuration.
        should_compact: Whether to wait for compaction.
    rO   z'chromadb.api.async_fastapi.AsyncFastAPIzDTODO @jai, come back and debug why CI runners fail with async + synci'  i N  )r„   r   r   )rQ   rR   rS   rU   rV   rW   rX   rY   rZ   r[   r2   r   r   i,  )Úadditional_timeN)$rC   rN   rF   Úchroma_api_implÚpytestÚskipr‘   r„   r`   rQ   rR   rS   rb   rc   rd   r   re   rf   rk   r   r   rl   r   r   rm   rn   r   ri   r   ro   rp   rq   Ú	ids_matchÚmetadatas_matchÚdocuments_matchÚembeddings_match)r   r   rD   rA   rB   r   ru   rv   rw   Úinitial_version1Úinitial_version2r}   r~   r   r   s                  r*   Útest_add_larger�   ÿ   sJ  € ð €HÝ+Ñ-Ô-Ñ€GˆWÝ" 7¨G°XÑ>Ô>Ð>ð 	×ÒÑÔÔ.Ø4ò	5ð 	5õ 	ŒØRñ	
ô 	
ð 	
õ (ØÔ&ØØðñ ô €Jð
 ×%Ò%ØŒ_ØÔ$Ø%Ô8ð &ñ ô €Eð
 ×"Ò"ØŒ_Ø%Ô8ð #ñ ô €Eõ
 'Ô/°
Ñ;Ô;ÐÝ�C §¢Ñ!2Ô!2°9Ô!=Ñ>Ô>ÐÝ�C §¢Ñ!2Ô!2°9Ô!=Ñ>Ô>ÐåÝØÝ•T�#”Y 
¨5Ô 1Ñ2Ô2Ý�J¨
°<Ô(@ÑAÔAÝ�9 j°Ô&=Ñ>Ô>Ý�4¥œ9 j°Ô&=Ñ>Ô>ð	
ñ 	
ô 	
ñô €Gõ (¨Ñ0Ô0ð ð Ñˆ�UØ˜‰?˜aÒÐØˆEŒI�uÐÐÐàˆEŒI�uÐÐÐõ ð
àð
õ Ð% eÔ,Ñ-Ô-°Ò2Ð2õ 	"Ø�Z”_Ð&6Èð	
ñ 	
ô 	
ð 	
õ 	"Ø�Z”_Ð&6Èð	
ñ 	
ô 	
ð 	
ð ˜�ð 
ð 
ˆÝÔ˜�t¥JÔ$8Ð:OÑPÔPÑQÔQÐQÝÔ˜T¥4­
Ô(<Ð>SÑ#TÔ#TÑUÔUÐUÝÔ"Ø•$•zÔ+Ð-BÑCÔCñ	
ô 	
ð 	
õ 	Ô"Ø•$•zÔ+Ð-BÑCÔCñ	
ô 	
ð 	
õ 	Ô#Ø•$•zÔ+Ð-BÑCÔCñ	
ô 	
ð 	
ð 	
ð
ð 
r,   )FrO   )r‚   rƒ   )=rG   Úrandomr   Útypingr   r   r   r   r   Ú
hypothesisr•   Úhypothesis.strategiesrp   Ústr	   r
   r=   Úchromadb.apir   Úchromadb.api.typesr   r   Úchromadb.test.conftestr   r   Ú!chromadb.test.property.strategiesÚtestÚpropertyÚ!chromadb.test.property.invariantsrc   Ú-chromadb.test.utils.wait_for_version_increaser   Úchromadb.utils.batch_utilsr   Úchromadb.api.clientr   Úchromadb.configr   rh   ÚsharedÚcollectionsÚcollection_stÚ
recordsetsÚbooleansÚ
Collectionrq   Úboolr+   ÚHealthCheckÚtoo_slowÚdata_too_largeÚlarge_base_exampleÚfunction_scoped_fixturer6   rC   rl   rN   r)   re   r‘   r�   r‡   r,   r*   ú<module>rº      s@  ðØ €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4ðð ð ð ð ð ð ð ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø SÐ SÐ SÐ SÐ SÐ SØ 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø +Ð +Ð +Ð +Ð +Ð +Ø $Ð $Ð $Ð $Ð $Ð $à')Ð $ð �”	Ð0˜*Ô0À$ÐGÑGÔGÈVÐTÑTÔT€ð €ØØ$ˆzÔ$ ]¸QÈÐMÑMÔMØ�2”;‘=”=ðñ ô ð
 
€ØØ&Ð&Ø"ˆzÔ"°Ð3Ñ3Ô3Ø ˆZÔ ¨bÐ1Ñ1Ô1ðñ ô ðñ ô ð6ØÔ%ð6àÔ$ð6ð ð6ð 
ð	6ð 6ð 6ñô ñô ð6ð €ØØ$ˆzÔ$ØØØØØØðñ ô ð �2”;‘=”=ðñ ô ð 
€ØØ&Ð&Ø"ˆzÔ"°Ð2Ñ2Ô2Ø ˆZÔ ¨aÐ0Ñ0Ô0ðñ ô ð
 	ÔÔ'ØÔÔ-ØÔÔ1ØÔÔ6ð	ðñ ô ð	OØÔ%ð	OàÔ$ð	Oð ð	Oð 
ð		Oð 	Oð 	Oñô ñô ð2	Oð
˜e I¨yÐ$8Ô9ð 
ð 
ð 
ð 
ðØðàðð ðð 	ð	ð ð ð ð8  %Ø#ðið iØÔ%ðiàÔ$ðið ðið ð	ið
 ðið 
ðið ið ið ið` Øð2ð 2Øð2àð2ð ð2ð Ôð	2ð 2ð 2ð 2ð( €�-°°´±´Ð>Ñ>Ô>Ø	€�4 aÐ(Ñ(Ô(ðQ
ØÔ%ðQ
àðQ
ð 
ðQ
ð Q
ð Q
ñ )Ô(ñ ?Ô>ðQ
ð Q
ð Q
r,   