o
    ɭRh`                     @   s8  U d dl Z d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlZd dlZd dlmZ d dlm  mZ d dl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 m!Z! d dl"m#Z#m$Z$m%Z% ej&'d  d	d	d	d
Z(G dd deZ)G dd deZ*G dd deZ+G dd deZ,dZ-ej.e-ddZ/dZ0ej.e0ddZ1ej.e-ddZ2e/3dd Z/e13dd Z1e23dd Z2ej4dddZ5ej6dddd d!d"d#Z7e/e5e7e8 gZ9eee
e:e;e<e=f   e>d$< d%eje d&eje d'eje fd(d)Z?d*Z@ejAejBejCgZDejEejFejGgZHejId+ejJd'e<fd,d-ZKeLeM eNe/ejLe9 ZOd.e:d/e:d0ejPd'ej fd1d2ZQd.e:d/e:d0ejPd'ejjRe fd3d4ZSG d5d6 d6eje ZTG d7d8 d8eje ZUd.e:d0ejPd'ejeje  fd9d:ZVeG d;d< d<ZWeG d=d> d>eWZXejIddddeYdd?d?fd+ejJd@e=dAe=dBee= dCee= dDeje= dEe:dFe:d'eXfdGdHZZejI	 	dod+ejJdIeXdJe:dKee: d'eej! f
dLdMZ[ejId+ejJdIeXd'ej\fdNdOZ]ejIeZ e/ddPdd dfd+ejJdQeeX dRee< dJe:dKe:dSee: dTe:dUee: d'e)fdVdWZ^dXe#d'ee fdYdZZ_ejId+ejJdIeXd'ej`fd[d\ZaejId+ejJdIeXd'ejbfd]d^Zcd_eej` d'eej` fd`daZdd_eejb d'eejb fdbdcZeejId+ejJdIeXd'ej`fdddeZfejId+ejJdIeXd'ejbfdfdgZgG dhdi dieZhejI	dpd+ejJdjejeX dkeje) dle=d'ehf
dmdnZidS )q    N)AnyOptionalListDictUnioncast)	TypedDict)SearchStrategy)NOT_CLUSTER_ONLY)	dataclass)	Documents
EmbeddableEmbeddingFunction
EmbeddingsMetadata)LiteralValueWhereOperatorLogicalOperator   )zhnsw:construction_efzhnsw:search_efzhnsw:Mc                   @   s~   e Zd ZU dZeejeej f ed< e	eej
ejf  ed< e	eee	ej  ejf  ed< e	eeej ejf  ed< dS )	RecordSetz|
    A generated set of embeddings, ids, metadatas, and documents that
    represent what a user would pass to the API.
    ids
embeddings	metadatas	documentsN)__name__
__module____qualname____doc__r   typesIDr   __annotations__r   r   	Embeddingr   Document r#   r#   c/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/chromadb/test/property/strategies.pyr   5   s   
   r   c                   @   sV   e Zd ZU dZeej ed< eej	 ed< eeeej
   ed< eeej  ed< dS )NormalizedRecordSetz;
    A RecordSet, with all fields normalized to lists.
    r   r   r   r   N)r   r   r   r   r   r   r   r    r   r   r   r"   r#   r#   r#   r$   r%   A   s   
 r%   c                   @   sN   e Zd ZU dZeej ed< ejed< ee	ej
  ed< ee	ej  ed< dS )StateMachineRecordSetzO
    Represents the internal state of a state machine in hypothesis tests.
    r   r   r   r   N)r   r   r   r   r   r   r   r    r   r   r   r"   r#   r#   r#   r$   r&   L   s   
 
r&   c                   @   sF   e Zd ZU dZejed< eej ed< eej	 ed< eej
 ed< dS )Recordz$
    A single generated record.
    id	embeddingmetadatadocumentN)r   r   r   r   r   r   r    r   r!   r   r"   r#   r#   r#   r$   r'   W   s   
 
r'   z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_   )alphabetmin_sizez?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-   c                 C      |  d S N_sa
startswithsr#   r#   r$   <lambda>n       r7   c                 C   r0   r1   r3   r5   r#   r#   r$   r7   o   r8   c                 C   r0   r1   r3   r5   r#   r#   r$   r7   p   r8      	min_value	max_valueF    g    .g    .A)allow_infinity	allow_nanallow_subnormalwidthr<   r=   safe_values
strategy_a
strategy_breturnc                 C   s.   t t | |t | t  t t  |S N)stone_oftuplesnone)rD   rE   r#   r#   r$   one_or_both   s
   
rL   zCabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_./+drawc                 C   sX   t d}t d}t d}| t| }t||  t||  |S )Nz'^[a-zA-Z][a-zA-Z0-9-]{1,60}[a-zA-Z0-9]$z^([0-9]{1,3}\.){3}[0-9]{1,3}$z\.\.)	recompilerH   
from_regexstrip
hypothesisassumematchsearch)rM   _collection_name_re_ipv4_address_re_two_periods_renamer#   r#   r$   collection_name   s   


rZ   dimcountdtypec                 C   s,   t tjtjjdd|| fd| }|S Ng      g      ?)lowhighsize)r   r   r   nprandomuniformastypetolist)r[   r\   r]   r   r#   r#   r$   create_embeddings   s   rg   c                 C   s   t jjdd|| fd|S r^   )rb   rc   rd   re   )r[   r\   r]   r#   r#   r$   create_embeddings_ndarray   s   rh   c                   @   sH   e Zd ZdedejddfddZdejdej	fdd	Z
defd
dZdS )hashing_embedding_functionr[   r]   rF   Nc                 C   s   || _ || _d S rG   r[   r]   )selfr[   r]   r#   r#   r$   __init__   s   
z#hashing_embedding_function.__init__inputc                    s6   dd |D } fdd|D } fdd|D }|S )Nc                 S   s$   g | ]}t t|d  qS )zutf-8)listhashlibsha256encode	hexdigest.0textr#   r#   r$   
<listcomp>   s    z7hashing_embedding_function.__call__.<locals>.<listcomp>c                    s4   g | ]}| j t|  |d  j t|   qS rG   )r[   lenrs   rk   r#   r$   rv      s    &c                    s&   g | ]}t jd d |D  jdqS )c                 S   s   g | ]	}t |d d qS )   g      .@)int)rt   charr#   r#   r$   rv      s    zBhashing_embedding_function.__call__.<locals>.<listcomp>.<listcomp>)r]   )rb   arrayr]   rs   rx   r#   r$   rv      s    r#   )rk   rm   hashed_textspadded_textsr   r#   rx   r$   __call__   s   

z#hashing_embedding_function.__call__c                 C   s   d| j  d| j dS )Nzhashing_embedding_function(dim=z, dtype=)rj   rx   r#   r#   r$   __repr__   s   z#hashing_embedding_function.__repr__)r   r   r   rz   npt	DTypeLikerl   r   r   r   r   strr   r#   r#   r#   r$   ri      s    ri   c                   @   s   e Zd ZdedefddZdS )"not_implemented_embedding_functionrm   rF   c                 C   s   J d)NFz*This embedding function is not implementedr#   )rk   rm   r#   r#   r$   r      s   z+not_implemented_embedding_function.__call__N)r   r   r   r   r   r   r#   r#   r#   r$   r      s    r   c                 C   s   t ttt t| |S rG   )rH   justr   r   r   ri   rj   r#   r#   r$   embedding_function_strategy   s   r   c                   @   s:   e Zd ZU dZeed< eej ed< eej	e
  ed< dS )ExternalCollectiona  
    An external view of a collection.

    This strategy only contains information about a collection that a client of Chroma
    sees -- that is, it contains none of Chroma's internal bookkeeping. It should
    be used to test the API and client code.
    rY   r*   embedding_functionN)r   r   r   r   r   r    r   r   r   r   r   r#   r#   r#   r$   r      s
   
 r   c                   @   s\   e Zd ZU dZejed< eed< ej	ed< e
jed< ee ed< dZeed< dZeed	< d
S )
Collectionz
    An internal view of a collection.

    This strategy contains all the information Chroma uses internally to manage a
    collection. It is a superset of ExternalCollection and should be used to test
    internal Chroma logic.
    r(   	dimensionr]   known_metadata_keysknown_document_keywordsFhas_documentshas_embeddingsN)r   r   r   r   uuidUUIDr    rz   r   r   r   r   r   r   r   boolr   r#   r#   r#   r$   r     s   
 


r   i  add_filterable_datawith_hnsw_paramsr   r   with_persistent_hnsw_paramsmax_hnsw_batch_sizemax_hnsw_sync_thresholdc                 C   s  |du r
|du r
J | t  }| t}	| tjddd}
| tt}| |}|r/|s/td|rk|	du r7i }	|	t |rZ| tjd|d|	d< | tjdt	|	d |gd|	d	< | t
 rk| tg d
|	d< i }|rt|dk r| t}| tjt ||< t|dk su|du r| t
 }|dusJ ts|r|r| tjtddd}ng }n|r|r| tjtddd}ng }|sd}n
|du r| t
 }|dusJ | t|
|}tt ||	|
||||||d
S )zStrategy to generate a Collection object. If add_filterable_data is True, then known_metadata_keys and known_document_keywords will be populated with consistent data.F   i   r;   z@with_persistent_hnsw_params requires with_hnsw_params to be trueNr/   zhnsw:sync_thresholdzhnsw:batch_size)cosinel2ipz
hnsw:space   r.   max_sizeT)
r(   rY   r*   r   r]   r   r   r   r   r   )rZ   collection_metadatarH   integerssampled_fromfloat_types
ValueErrorupdatetest_hnsw_configminbooleansrw   	safe_textrI   rC   r
   listssafe_text_min_size_3r   r   r   uuid4)rM   r   r   r   r   r   r   r   rY   r*   r   r]   use_persistent_hnsw_paramsr   keyr   r   r#   r#   r$   collections  s   


	r   
collectionr.   r   c                 C   s|   | t jtt jt ||d}|jr6|j D ]	}||v r||= qdd |j D }|| t j	i |d |i kr<dS |S )zMStrategy for generating metadata that could be a part of the given collectionr   c                 S   s   i | ]
\}}|t |qS r#   )rH   r   )rt   kvr#   r#   r$   
<dictcomp>  s    zmetadata.<locals>.<dictcomp>)optionalN)
rH   dictionariesr   rI   rC   r   keysitemsr   fixed_dictionaries)rM   r   r.   r   r*   r   sampling_dictr#   r#   r$   r*   |  s"   	r*   c                 C   s   t s6d}|jrt|j}ntjdtj|dd}tjdtj|dd}| tjt||dd}d|S d}|jrBt|j}ntjdtj|dd}tjdtj|dd}| tjt||dd}d|S )	zNStrategy for generating documents that could be a part of the given collection)CcCsPcPor/   )blacklist_categories)r.   r-   r,   r.    )r   r   )	r
   r   rH   r   ru   
charactersr   rI   join)rM   r   r   known_words_strandom_words_stwordsr#   r#   r$   r+     s2   



r+   2   collection_strategyid_strategynum_unique_metadatamin_metadata_sizemax_metadata_sizec                 C   s`  | |}t | tj|||dd}	d }
|jr t|jt|	|j}
|d ur&|nt|	}| tjt|||d||d}g }t	t|	D ]}|
||t|   qAd }|jrd| tjt|t|	t|	d}t|	dkr| t rt|	d n|	}|
d ur| t r|
d n|
}| t r|d n|}|d ur| t r|d n|}||||dS |	|
||dS )NT)r.   r   uniquer   r,   r   )r   r   r   r   )rn   rH   r   r   rg   r   rw   r]   r*   rangeappendr   r+   r   )rM   r   r   r.   r   r   r   r   r   r   r   num_metadatagenerated_metadatasr   ir   	single_idsingle_embeddingsingle_metadatasingle_documentr#   r#   r$   
recordsets  sZ   	r   valuec                    s   t  trt fddS t  trt fddS t  tr,t  fddS t  t	r?tj
ddd fddS tt  fd	dS )
zi
    Returns a strategy that will generate all valid values except the input value - testing of $nin
    c                       |  kS rG   r#   xr   r#   r$   r7         z opposite_value.<locals>.<lambda>c                    r   rG   r#   r   r   r#   r$   r7     r   c                    r   rG   r#   r   r   r#   r$   r7     r   r9   r:   r;   c                    r   rG   r#   r   r   r#   r$   r7     r   c                    r   rG   r#   r   r   r#   r$   r7     r   )
isinstancefloatsafe_floatsfilterr   r   r   rH   r   rz   r   	from_typetyper   r#   r   r$   opposite_value  s   




r   c                    sx  t |j } t|}|j| dg}ttr#|g d n0ttr0|g d n#tt	r=|g d ntt
rJ|g d n	J dt ttrj tddg tt t|}|du ry|iS |d	krtt
rsi S ||g fd
dtdD iiS |dkrtt
rsi S || fddtdD iiS ||iiS )zLGenerate a filter that could be used in a query against the given collectionN)$eq$ne$in$nin)$gt$lt$lte$gte)r   r   r   r   r   r   r   r   FzUnsupported type: gư>gưr   c                       g | ]} t qS r#   r   rt   _rM   r   r#   r$   rv   D      z where_clause.<locals>.<listcomp>r/   r   c                    r   r#   r   r   r   r#   r$   rv   H  r   )sortedr   r   rH   r   r   r   extendr   rz   r   r   rb   float32r   )rM   r   
known_keysr   	legal_opsopr#   r   r$   where_clause!  s8   





& r   c                 C   s|   t s|jr| t|j}n| t}n|jr| t|j}n| t}| tddg}|dkr4d|iS |dks:J d|iS )zPGenerate a where_document filter that could be used against the given collectionz	$containsz$not_contains)r
   r   rH   r   r   r   )rM   r   wordr   r#   r#   r$   where_doc_clauseM  s   
r   base_stc                 C   ,   t ddg}t j|t j| ddddddS Nz$andz$orr   )r   r.   r,   )r   valuesr.   r   rH   r   r   r   r   r   r#   r#   r$   binary_operator_clausej     r   c                 C   r   r   r   r   r#   r#   r$   binary_document_operator_clausev  r  r  c                 C      t |}| t|t}|S rG   )r   rH   	recursiver   rM   r   r   wherer#   r#   r$   recursive_where_clause  s   r  c                 C   r  rG   )r   rH   r  r  r  r#   r#   r$   recursive_where_doc_clause  s
   
r  c                   @   sB   e Zd ZU eej ed< eeee	e f  ed< eej
 ed< dS )Filterr  r   where_documentN)r   r   r   r   r   Wherer    r   r   r   WhereDocumentr#   r#   r#   r$   r	    s   
 r	  collection_strecordset_stinclude_all_idsc           	      C   s   | |}| |}| t t  t|}| t t  t|}t|d tr-|d g}n|d }|sO| t t  t jt |dd}|d urOt	t
|}|d urct|dkrc| t  rc|d }|||dS )Nr   r,   r   r   )r  r
  r   )rH   rI   rK   r  r  r   r   r   r   rn   setrw   r   )	rM   r  r  r  r   	recordsetr   where_document_clauser   r#   r#   r$   filters  s    $ r  )r   N)F)jro   rR   hypothesis.strategies
strategiesrH   typingr   r   r   r   r   r   typing_extensionsr   r   numpyrb   numpy.typingr   chromadb.api.typesapir   rN   *hypothesis.strategies._internal.strategiesr	   chromadb.test.conftestr
   dataclassesr   r   r   r   r   r   chromadb.typesr   r   r   rc   seedr   r   r%   r&   r'   sql_alphabetru   r   sql_alphabet_minus_underscorer   tenant_database_namer   r   safe_integersfloatsr   r   rC   rz   r   r   r   r    rL   legal_id_charactersfloat16r   float64r   int16int32int64	int_types	compositeDrawFnrZ   rI   rK   r   r   r   rg   NDArrayrh   ri   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$   <module>   s  
  
 




	`*	
H+


