
    Zi                     |   U d dl Z 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 d dlmZ d dlmZ d d	lmZmZ d
ddddddZeeef         ed<   g dZdddddddZeeef         ed<   g dZdddddddddd	Zeeef         ed<   d ed!eeeef         eeef         f         fd"Z d#ee         d$ee         d%eeeef                  d!eeef         fd&Z!d#ee         d$ee         d%eeeef                  d!eeef         fd'Z"d(e#d#ee         d$ee         d%eeeef                  d!eeef         f
d)Z$d*eeef         d+eeef         d(e#d!dfd,Z%d-eeef         d+eeef         d(e#d!dfd.Z&d!eeeeef         f         fd/Z'd ed!eeeeef         f         fd0Z(d1ed2eeeeef         f         d!dfd3Z) e	 ej*                     ej+                    4          d5ed6ed7ej,        d!dfd8            Z- e	 ej*                     ej.                    9          d5ed6ed ee         d!dfd:            Z/dS );    N)AnyDictOptionalSetTuplecast)given)	ClientAPI)CreateCollectionConfiguration)CollectionMetadataEMBEDDING_KEYSchema)
strategies)check_metadata)resetis_spann_disabled_modespaceef_construction	ef_searchmax_neighborssync_thresholdresize_factor)
hnsw:spacezhnsw:construction_efzhnsw:search_efzhnsw:Mzhnsw:sync_thresholdzhnsw:resize_factorHNSW_METADATA_TO_CONFIG)r   r   r   r   r   r   l2d      i  g333333?HNSW_DEFAULTS)	r   search_nprobewrite_nprober   r   r   reassign_neighbor_countsplit_thresholdmerge_threshold@          2      SPANN_DEFAULTSschemareturnc                     | j         j        }|J |j        }|J | j        t                   j        }|J |j        }|J t          j        |j                  t          j        |j                  fS )N)defaults
float_listvector_indexkeysr   r   vector_index_to_dictconfig)r*   defaults_floatdefaults_viembedding_floatembedding_vis        _/root/projects/butler/venv/lib64/python3.11/site-packages/chromadb/test/property/test_schema.py#_extract_vector_configs_from_schemar8   I   s     _/N%%% -K"""k-0;O&&&"/L### 	'(:;;'(;<<     metadataconfigurationschema_vector_index_configc                    t                                           }d}d}|rT|                    d          }|rrt          t          t
          t          f         |          }|                    t          j	        |                     |                    d          |d         |d<   d}d}|                    d          }|rt          t          t
          t          f         |          }	t          j	        |	          }
|

                                D ]\  }}||t          |         k    rd}|	                    d          5|s3|	                    d          t          d         k    rd}|	d         |d<   d}|rf|                    d          |d         |d<   d}|                    d          r/t          j	        |d                   }|                    |           | rH|                     d          3|                     d          t           d         k    r|r| d         |d<   d}|rI|                    d          	 3|                    d          t           d         k    r|s|d         |d<   d}|sY|rW|                    d          B|d         }t          |d	          r*t          t          |                                          |d<   |S )
NFTspannr   hnswr    embedding_function_default_spaceembedding_functiondefault_space)r)   copygetr   r   strr   updater   non_none_itemsitemsr   hasattrrB   )r:   r;   r<   expected	space_setshould_try_metadata	spann_cfgspann_cfg_dicthnsw_cfghnsw_cfg_dicthnsw_non_nonekeyvaluespann_schemaefs                  r7   _compute_expected_config_spannrV   \   s    ""$$HI  !!%%g..	 	,!$sCx.)<<NOOJ5nEEFFF!!'**6$27$;! 	&+# $$V,, 	! c3h::M&5mDDM+1133 0 0
U$-2D)D)D +0'  ))5i5 $$W--w1GGG*/'$1'$:! 	! *%))'22> :7 CHWI%))'22 	*%4*73 L OOL))) 	LL&&2LL&&.*AAA B %\2	 	#&**+MNN&**+MNN'"# ## 7.
 	 >> 233?/02'' 	> $S" ; ; = =HWOr9   c                 ,   t                                           }d}t                      }d}|r`|                    d          }|t	          t
          t          t          f         |          }t          j	        |          }	|
                    |	           |	                                D ]\  }
}||t           |
         k    rd}|
                    |	                                           |	                    d          *|s(|	                    d          t           d         k    rd}d}|                    d          }|Mt	          t
          t          t          f         |          }|                    d          |s|d         |d<   d}d}|r| rt                                          D ]h\  }
}|                     |
          |dk    r#| |
         ||<   d}|                    |           D||vr | |
         ||<   |                    |           i|r{|                    d          |d         |d<   d}|                    d          r.|
                    t          j	        |d                              n|                    d          r	 |r%|                    d          	 |s|d         |d<   d}|sY|rW|                    d          B|d         }t          |d          r*t	          t          |                                          |d<   |S )	NFTr?   r   r>   r@   rA   rB   )r   rC   setrD   r   r   rE   r   r   rG   rF   rH   r0   r   addrI   rB   )r:   r;   r<   rJ   rK   configured_hnsw_keysrL   hnsw_cfg_raw	hnsw_dictrQ   rR   rS   spann_cfg_raw
spann_dictcfg_keyrU   s                   r7   _compute_expected_config_hnswr`      si   
 !!##HI%(UU ,$((00#(,T#s(^\(J(JI&5i@@MOOM***+1133 0 0
U$-2D)D)D*/' ''(:(:(<(<===  ))5i5 $$W--w1GGG*/' 	%))'22$)-d38nm)L)LJ~~g&&292$.w$7! 	&+# 2x 2399;; 
	2 
	2LC||C  ('!!$,SM! 	$((111222$,SM!$((111! 
%))'22> :7 CHWI%))&11 	OO)*DV*LMM    (++G44 	 	#	&**+MNN 7.
 	 >> 233?/02'' 	> $S" ; ; = =HWOr9   spann_activec                 J    | rt          |||          S t          |||          S )aR  
    some assumptions/assertions:
    1. we are not testing failure paths. any config built is/should be valid. invalid cases can be tested separately or in e2e tests
    ex: if configuration is set, schema is not set. if schema is set, configuration is not set. both hnsw and spann cannot be set at the same time in config or schema
    )rV   r`   ra   r:   r;   r<   s       r7   _compute_expected_configrd     sB      
-m%?
 
 	
 -m%?
 
 	
r9   actualrJ   c                 D   |rt           nt          }|D ]}|                     |          }||         }t          |t                    r@t          |t                    r+t          j        ||dd          sJ | d| d|             t||k    sJ | d| d|             d S )N&.>rel_tolabs_tol mismatch: expected , got )SPANN_FIELDSHNSW_FIELDSrD   
isinstancefloatmathisclose)re   rJ   ra   fieldsfieldactual_valueexpected_values          r7   _assert_config_valuesrw     s    
 *:\\{F R Rzz%((!%lE** 	Rz.%/P/P 	R<ndD   R RQQ^QQ<QQR R R R
 ...QQ^QQ<QQ /...R Rr9   vector_infoc                    | d         |d         k    sJ |rt          t          t          t          t          f                  | d                   }|J t
          D ]}|dk    r	|                    |          }||         }t          |t                    r@t          |t                    r+t          j
        ||dd          sJ | d| d|             {||k    sJ | d| d|             d S t          t          t          t          t          f                  | d                   }|J t          D ]}|dk    r	|                    |          }||         }t          |t                    r@t          |t                    r+t          j
        ||dd          sJ | d| d|             {||k    sJ | d| d|             d S )Nr   r>   rg   rh   rk   rl   r?   )r   r   r   rE   r   rm   rD   ro   rp   rq   rr   rn   )rx   rJ   ra   rM   rt   ru   rv   rO   s           r7   _assert_schema_valuesrz   ,  sz   
 w8G#44444 !V$sCx.1;w3GHH	$$$! 	V 	VE$==//L%e_N,.. V:ne3T3T V| .$   V VUUUU|UUV V V V
 !N222UUUU|UU 3222	V 	V c3h0+f2EFF###  	V 	VE#<<..L%e_N,.. V:ne3T3T V| .$   V VUUUU|UUV V V V
 !N222UUUU|UU 3222	V 	Vr9   c                  P    ddiddiddiddiddiddiddidddiddiddddiidS )z
    Get expected index states for default schema (when schema=None).
    Based on Schema._initialize_defaults() and _initialize_keys().
    enabledTF)string_invertedint_invertedfloat_invertedbool_invertedsparse_vector	fts_indexr/   )r}   r   r/   )r-   	#documentz
#embedding r   r9   r7   _get_default_schema_indexesr   V  s     !*40&-($/'.'/#U+&.
 
 !*51#T*
 

 Y-
  r9   c                    i }| j         j        r;| j         j        j        r*d|vri |d<   d| j         j        j        j        i|d         d<   | j         j        r;| j         j        j        r*d|vri |d<   d| j         j        j        j        i|d         d<   | j         j        r;| j         j        j        r*d|vri |d<   d| j         j        j        j        i|d         d<   | j         j        r;| j         j        j	        r*d|vri |d<   d| j         j        j	        j        i|d         d<   | j         j
        rP| j         j
        j        r?d|vri |d<   | j         j
        j        j        | j         j
        j        j        d|d         d<   | j                                        D ]\  }}|t          d	fv ri }|j        r"|j        j        rd|j        j        j        i|d<   |j        r"|j        j        rd|j        j        j        i|d<   |j        r"|j        j        rd|j        j        j        i|d<   |j        r"|j        j	        rd|j        j	        j        i|d<   |j
        r2|j
        j        r&|j
        j        j        |j
        j        j        d|d<   |r|||<   |S )
z
    Extract expected index states from input schema.
    Returns a dict mapping key -> index_type -> enabled/config info.
    r-   r|   r}   r~   r   r   )r|   r2   r   r   )r-   stringstring_inverted_indexr|   	int_valueint_inverted_indexfloat_valuefloat_inverted_indexbooleanbool_inverted_indexr   sparse_vector_indexr2   r0   rH   r   )r*   rJ   rR   value_typeskey_expecteds        r7    _extract_expected_schema_indexesr   o  s+    +-H  
&/"8"N 
X%%#%HZ v-CK3
./   
V_%>%Q 
X%%#%HZ v0CK0
^, " 
v'B'W 
X%%#%HZ v2GO2
-.  
6?#:#N 
X%%#%HZ v.BJ1
_-
 	%	
O)=	
 X%%#%HZ 4HPo3GN1
 1
_- #K--// ") ")[=+...') 	+"4"J 	;-CK/L*+   	[%:%M 	;0CK,L( " 	{'>'S 	;2GO.L)*  	;#6#J 	;.BJ-L) $ 	)B)V 	&4HP%3GN- -L)
  	)(HSMOr9   actual_schemaexpected_indexesc                    d|v r|d         }| j         }d|v rU|d         d         }|j        }|r2|j        r+|j        j        |k    sJ d| d|j        j                     n|s
J d            d|v rU|d         d         }|j        }|r2|j        r+|j        j        |k    sJ d| d|j        j                     n|s
J d	            d
|v rU|d
         d         }|j        }|r2|j        r+|j        j        |k    sJ d| d|j        j                     n|s
J d            d|v rU|d         d         }|j        }|r2|j	        r+|j	        j        |k    sJ d| d|j	        j                     n|s
J d            d|v r|d         d         }|j
        }	|	
J d            |	j        
J d            |	j        j        |k    sJ d| d|	j        j                     d|d         v r||d         d         }
|	j        j        }|
j        *|j        |
j        k    sJ d|
j         d|j                     |
j        *|j        |
j        k    sJ d|
j         d|j                     d|v r\|d         d         }|j        }|
J d            |j        
J d            |j        j        |k    sJ d| d|j        j                     d|v r\|d         d         }|j        }|
J d            |j        
J d            |j        j        |k    sJ d| d|j        j                     |                                D ]\  }}|dk    r|| j        v sJ d | d!            | j        |         }d|v rg|d         d         }|j        }|J d"| d#            |j        J d"| d$            |j        j        |k    sJ d"| d%| d|j        j                     d|v rg|d         d         }|j        }|J d"| d&            |j        J d"| d'            |j        j        |k    sJ d"| d(| d|j        j                     d
|v rg|d
         d         }|j        }|J d"| d)            |j        J d"| d*            |j        j        |k    sJ d"| d+| d|j        j                     d|v rg|d         d         }|j        }|J d"| d,            |j	        J d"| d-            |j	        j        |k    sJ d"| d.| d|j	        j                     d|v r|d         d         }|d         d         }
|j
        }	|	J d"| d/            |	j        J d"| d0            |	j        j        |k    sJ d"| d1| d|	j        j                     |	j        j        }|
j        -|j        |
j        k    sJ d"| d2|
j         d|j                     |
j        -|j        |
j        k    sJ d"| d3|
j         d|j                     d|v rg|d         d         }|j        }|J d"| d#            |j        J d"| d4            |j        j        |k    sJ d"| d5| d|j        j                     d|v rg|d         d         }|j        }|J d"| d6            |j        J d"| d7            |j        j        |k    sJ d"| d8| d|j        j                     dS )9z<Assert that the actual schema matches expected index states.r-   r}   r|   z4defaults string_inverted enabled mismatch: expected rl   z*defaults string_inverted should be enabledr~   z1defaults int_inverted enabled mismatch: expected z'defaults int_inverted should be enabledr   z3defaults float_inverted enabled mismatch: expected z)defaults float_inverted should be enabledr   z2defaults bool_inverted enabled mismatch: expected z(defaults bool_inverted should be enabledr   Nz#defaults sparse_vector should existz)defaults sparse_vector_index should existz2defaults sparse_vector enabled mismatch: expected r2   z/defaults sparse_vector bm25 mismatch: expected z5defaults sparse_vector source_key mismatch: expected r   zdefaults string should existzdefaults fts_index should existz.defaults fts_index enabled mismatch: expected r/   z defaults float_list should existz"defaults vector_index should existz1defaults vector_index enabled mismatch: expected zExpected key 'z' not found in schemazKey 'z' string should existz$' string_inverted_index should existz-' string_inverted enabled mismatch: expected z' int_value should existz!' int_inverted_index should existz*' int_inverted enabled mismatch: expected z' float_value should existz#' float_inverted_index should existz,' float_inverted enabled mismatch: expected z' boolean should existz"' bool_inverted_index should existz+' bool_inverted enabled mismatch: expected z' sparse_vector should existz"' sparse_vector_index should existz+' sparse_vector enabled mismatch: expected z(' sparse_vector bm25 mismatch: expected z.' sparse_vector source_key mismatch: expected z' fts_index should existz'' fts_index enabled mismatch: expected z' float_list should existz' vector_index should existz*' vector_index enabled mismatch: expected )r-   r   r   r|   r   r   r   r   r   r   r   r   r2   bm25
source_keyr   r.   r/   rH   r0   )r   r   defaults_expecteddefaults_actualexpected_enabledactual_string
actual_intactual_floatactual_boolactual_sparseexpected_configactual_configactual_float_listrR   r   actual_value_typess                   r7   _assert_schema_indexesr     s    %%%,Z8'0 11101BCIN+2M V!D V!7?CSSSS PJZ  P  Pbo  cF  cN  P  P TSSS (UU)UUUU...0@K(2J Sj; S19=MMMM GGW  G  G_i_|  `E  G  G NMMM (RR)RRRR00001AB9M*6L U A U 5=AQQQQ MIY  M  Mam  bC  bK  M  M RQQQ (TT)TTTT///0A)L)1K T{> T3;?OOOO JHX  J  J`k`  aH  J  J POOO (SS)SSSS///0A)L+9M ,,.S,,,1==: >== 19=MMMM HDT  H  H\i\}  ]F  H  H NMM ,_==="3O"DX"N - A H"'3%*o.BBBByI]yyerewyy CBB"-9%0O4NNNN LOi  L  Lq~  rJ  L  L ONN +++0=iH+2M ,,.L,,,'330 433 '/3CCCCy@PyyXeXoXwyy DCC ...0@K / :$002T000!.::3 ;:: ".6:JJJJ DCS  D  D[l[y  \B  D  D KJJ .3355 ]G ]G\*m((((*U3*U*U*U(((*/4,,+,=>yI.5M ,,.Pc.P.P.P,,,3??@s@@@ @?? 3;?OOOO Os  O  OIY  O  Oan  bE  bM  O  O POO \))+N;IF+5J))+P3+P+P+P)))-99=s=== :99 -59IIII Fs  F  FFV  F  F^h^{  _D  F  F JII |+++,<=iH-9L++-TS-T-T-T+++1==?s??? >== 19=MMMM Ls  L  LHX  L  L`l  aB  aJ  L  L NMM l**+O<YG,4K**,OC,O,O,O***/;;>s>>> <;; /7;KKKK Is  I  IGW  I  I_j_~  `G  I  I LKK l**+O<YG*?;HEO.<M ,,.Wc.W.W.W,,,1==>s>>> >== 19=MMMM Ks  K  KGW  K  K_l  `A  `I  K  K NMM *=DM#/!&/*>>>>x3xxH\xxdqdvxx ?>>)5!,0JJJJ K3  K  KoNh  K  Kp}  qI  K  K KJJ ,&&+K8C.5M ,,.Pc.P.P.P,,,'334s444 433 '/3CCCC|s||CS||[h[r[z|| DCC \))+N;IF 2 =$002X#2X2X2X000!.::7s777 ;:: ".6:JJJJ Gs  G  GFV  G  G^o^|  _E  G  G KJJy]G ]Gr9   )nameoptional_fieldsclientr   r   c                    |j         }|j        }|j        }t          |            |                     ||||          }||j         d i fv sJ nt          ||j                    |j        }t           }|rdnd}	|rdnd}
|                    |	          }|                    |
          }|J |	 d            |d i fv sJ |
 d            t          ||||j	                  }t          t          t          t          t          f         |          ||           |r|                    d          |d         }||                    d          }||                                }|r|                    d          d	k    rzt!          |d
          s
J d            |                    d
          |                                k    s5J d|                                 d|                    d
                       |j        }|J t%          |          \  }}|r)|d         J |d         J |d         J |d         J n(|d         J |d         J |d         J |d         J t'          |||           t'          |||           |rB|                    d          .|d         }|%|j        j        j        j        j        }|nt!          |d
          r^|                                |                                k    s4J d|                                 d|                                             |j        t4                   j        j        j        j        }|tt!          |d
          rf|                                |                                k    s>J d|                                 d|                                             d S d S d S d S d S d S )N)r   r:   r;   r*   r>   r?   z configuration missingz configuration should be absentrc   rA   typeknownr   z*embedding function should have name methodz+embedding function name mismatch: expected rl   z4defaults embedding function name mismatch: expected z9embedding key embedding function name mismatch: expected )r:   r;   r*   r   create_collectionr   r   rD   rd   schema_vector_inforw   r   r   rE   r   
get_configrI   r   r8   rz   r-   r.   r/   r2   rA   r0   r   )r   r   r   r:   r;   r*   
collectioncoll_configra   
active_keyinactive_keyactive_blockinactive_blockrJ   rU   coll_ef	ef_configschema_resultdefaults_cfgembedding_cfgdefaults_efembedding_efs                         r7   1test_vector_index_configuration_create_collectionr     s    'H#1M#F	&MMM))#	 *  J "tRj00000x!4555*K--L(4fJ)666wL??:..L __\22N##
%J%J%J###
    777  
 (!##2#E	  H $tCH~|<<hUUU  **+?@@L/0>!oo&:;;G"#..00	 v!6!6'!A!A"F  D DCD D D %==00BGGII===M$&GGIIM M5>]]65J5JM M >==
 %M$$$"Em"T"TL- 	1F#+++V$,,,G$000W%1111G$,,,W%---F#///V$000,,???-<@@@  **+?@@L/0>'0;HObK&7;+G+G&"''))RWWYY666F "		F F1<1A1A1C1CF F 766
 )-m<GT[nL'GL&,I,I'#((**bggii777G "		G G1=1B1B1D1DG G 877 LL> ('''77r9   r   r*   c                 H   t          |            |t                      }nt          |          }|                     ||          }|j        }|
J d            t          ||           |                     |          }|j        }|
J d            t          ||           dS )z
    Test that schema-only components (inverted indexes, sparse vector indexes)
    are correctly created and persisted when creating a collection.
    Nr   zSchema should not be None)r   r   r   r   r*   r   get_collection)r   r   r*   r   r   r   s         r7   %test_schema_create_and_get_collectionr     s     
&MMM~688;FCC))tF)CCJ %M$$&A$$$=*:;;;&&t,,J%M$$&A$$$=*:;;;;;r9   )0rq   typingr   r   r   r   r   r   
hypothesisr	   chromadb.apir
   %chromadb.api.collection_configurationr   chromadb.api.typesr   r   r   chromadb.test.propertyr   !chromadb.test.property.invariantsr   chromadb.test.conftestr   r   r   rE   __annotations__rn   r   rm   r)   r8   rV   r`   boolrd   rw   rz   r   r   r   collection_name&metadata_configuration_schema_strategyCollectionInputCombinationr   schema_strategyr   r   r9   r7   <module>r      s    8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8       " " " " " " O O O O O O         
 . - - - - - < < < < < <        -!+)+ + c3h      ! !tCH~   
 
 
 !
" 
"S#X 
 
 

4S>4S>)*   &S)*S9:S !)c3h 8S 
#s(^	S S S SlN)*N9:N !)c3h 8N 
#s(^	N N N Nb

)*
 9:
 !)c3h 8	

 
#s(^
 
 
 
*RcNR38nR R 
	R R R R('Vc3h'V38n'V 'V 
	'V 'V 'V 'VTT#tCH~*=%>    2VV	#tCH~
V V V VrGG3S#X./G 
G G G GD 	#	#	%	%EJEGG  ``
`  :` 
	` ` `	 `F 	#	#	%	%%:%''  <<
< V< 
	< < <	 < < <r9   