
    3fi(                       d dl mZ d dl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Zd dlZd dlmZ d dlmZmZmZmZ d dlmZmZ d d	lmZ erd d
lmZmZmZm Z   G d de!e      Z" G d de      Z# G d de#      Z$ G d de#      Z% G d de#      Z& G d de#      Z' G d de'      Z( G d de'      Z) G d de      Z*	 	 	 	 ddZ+y)    )annotationsN)Enum)Path)AnyDictListOptionalUnion)
get_fields)	BaseModelFieldfield_validator	validator)TYPE_CHECKINGLiteral)REDIS_VECTOR_DTYPE_MAP)NumericFieldTagField	TextFieldVectorFieldc                      e Zd ZdZdZdZdZy)RedisDistanceMetricz)Distance metrics for Redis vector fields.L2COSINEIPN)__name__
__module____qualname____doc__l2cosineip     k/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/redis/schema.pyr   r      s    3	BF	Br$   r   c                  ,    e Zd ZU dZ ed      Zded<   y)
RedisFieldzBase class for Redis fields..strnameN)r   r   r   r   r   r)   __annotations__r#   r$   r%   r'   r'   !   s    &c
D#r$   r'   c                  n    e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   dZ
ded<   ddZy)TextFieldSchemaz Schema for text fields in Redis.   floatweightFboolno_stemNzOptional[str]phonetic_matcherwithsuffixtrieno_indexOptional[bool]sortablec                    ddl m}  || j                  | j                  | j                  | j
                  | j                  | j                        S )Nr   )r   )r/   r1   r2   r6   r4   )redis.commands.search.fieldr   r)   r/   r1   r2   r6   r4   )selfr   s     r%   as_fieldzTextFieldSchema.as_field1   s>    9II;;LL!22]]]]
 	
r$   )returnr   )r   r   r   r   r/   r*   r1   r2   r3   r4   r6   r:   r#   r$   r%   r,   r,   '   sG    *FEGT&*m* ND Hd$Hn$

r$   r,   c                  R    e Zd ZU dZdZded<   dZded<   dZded<   dZd	ed
<   ddZ	y)TagFieldSchemazSchema for tag fields in Redis.,r(   	separatorFr0   case_sensitiver4   r5   r6   c                    ddl m}  || j                  | j                  | j                  | j
                  | j                        S )Nr   )r   )r?   r@   r6   r4   )r8   r   r)   r?   r@   r6   r4   )r9   r   s     r%   r:   zTagFieldSchema.as_fieldF   s7    8IInn..]]]]
 	
r$   N)r;   r   )
r   r   r   r   r?   r*   r@   r4   r6   r:   r#   r$   r%   r=   r=   >   s2    )Is ND Hd$Hn$	
r$   r=   c                  6    e Zd ZU dZdZded<   dZded<   d	dZy)
NumericFieldSchemaz#Schema for numeric fields in Redis.Fr0   r4   r5   r6   c                `    ddl m}  || j                  | j                  | j                        S )Nr   )r   )r6   r4   )r8   r   r)   r6   r4   )r9   r   s     r%   r:   zNumericFieldSchema.as_fieldX   s     <DIIVVr$   N)r;   r   )r   r   r   r   r4   r*   r6   r:   r#   r$   r%   rC   rC   R   s    -Hd$Hn$Wr$   rC   c                      e Zd ZU dZ ed      Zded<    ed      Zded<    ed      Zd	ed
<    ed      Z	ded<   dZ
ded<    edd
dd      edd              Z ed
d      dd       ZddZy)RedisVectorFieldz#Base class for Redis vector fields..intdimsobject	algorithmFLOAT32defaultr(   datatyper   r   distance_metricNOptional[int]initial_capbefore)modec                "    |j                         S N)upperclsvs     r%   uppercase_stringsz"RedisVectorField.uppercase_stringsg   s     wwyr$   T)prec                    |j                         t        vr#t        dt        j                          d|       |j                         S )Nzdatatype must be one of z. Got )rV   r   
ValueErrorkeysrW   s     r%   uppercase_and_check_dtypez*RedisVectorField.uppercase_and_check_dtypel   sH    77922*+A+F+F+H*IPQsS  wwyr$   c                    | j                   | j                  | j                  d}| j                  | j                  |d<   |S )N)TYPEDIMDISTANCE_METRICINITIAL_CAP)rN   rH   rO   rQ   )r9   
field_datas     r%   _fieldszRedisVectorField._fieldst   sD    MM99#33


 '(,(8(8J}%r$   )rY   r(   r;   r(   )r;   Dict[str, Any])r   r   r   r   r   rH   r*   rJ   rN   rO   rQ   r   classmethodrZ   r   r_   rf   r#   r$   r%   rF   rF   ^   s    -c
D#c
Iv"),Hc,+0+BO(B!%K%[*.?hO  P zt$ %r$   rF   c                  B     e Zd ZU dZdZded<   dZded<   d	 fdZ xZS )
FlatVectorFieldz'Schema for flat vector fields in Redis.FLATzLiteral['FLAT']rJ   NrP   
block_sizec                    ddl m} t        |          }| j                  | j                  |d<    || j
                  | j                  |      S )Nr   r   
BLOCK_SIZE)r8   r   superrf   rl   r)   rJ   r9   r   re   	__class__s      r%   r:   zFlatVectorField.as_field   sA    ;W_&
??&'+J|$499dnnjAAr$   r;   r   )	r   r   r   r   rJ   r*   rl   r:   __classcell__rr   s   @r%   rj   rj      s&    1!'I' $J$B Br$   rj   c                       e Zd ZU dZdZded<    ed      Zded<    ed	      Zded
<    ed      Z	ded<    ed      Z
ded<   d fdZ xZS )HNSWVectorFieldz'Schema for HNSW vector fields in Redis.HNSWzLiteral['HNSW']rJ      rL   rG   m   ef_construction
   
ef_runtimeg{Gz?r.   epsilonc                    ddl m} t        |          }|j	                  | j
                  | j                  | j                  | j                  d        || j                  | j                  |      S )Nr   rn   )MEF_CONSTRUCTION
EF_RUNTIMEEPSILON)r8   r   rp   rf   updaterz   r|   r~   r   r)   rJ   rq   s      r%   r:   zHNSWVectorField.as_field   s\    ;W_&
VV#'#7#7"oo<<		
 499dnnjAAr$   rs   )r   r   r   r   rJ   r*   r   rz   r|   r~   r   r:   rt   ru   s   @r%   rw   rw      sX    1!'I'2As -OS-B'J'4(GU(B Br$   rw   c                      e Zd ZU dZ ed      gZded<   dZded<   dZd	ed
<   dZ	ded<   dZ
ded<   dZded<   dZded<   ddZddZddZedd       Zedd       Zed d       Zd!dZed"d       Zy)#
RedisModelzSchema for Redis index.contentr)   zList[TextFieldSchema]textNzOptional[List[TagFieldSchema]]tagz"Optional[List[NumericFieldSchema]]numericzOptional[List[RedisField]]extraz7Optional[List[Union[FlatVectorField, HNSWVectorField]]]vectorr(   content_keycontent_vectorcontent_vector_keyc                    | j                   g | _         | j                   D ]  }|j                  | j                  k(  s y  | j                   j                  t	        | j                               y )Nr   )r   r)   r   appendr,   r9   fields     r%   add_content_fieldzRedisModel.add_content_field   sZ    99DIYY 	EzzT---	 			d.>.>?@r$   c                    | j                   g | _         |d   dk(  r%| j                   j                  t        di |       y |d   dk(  r%| j                   j                  t        di |       y t	        d|d          )NrJ   rk   rx   z+algorithm must be either FLAT or HNSW. Got r#   )r   r   rj   rw   r]   )r9   vector_fields     r%   add_vector_fieldzRedisModel.add_vector_field   s     ;;DK $.KK>>?+&&0KK>>?=,-/ r$   c                   g g g d}| j                   j                         D ]  \  }}t        |t              st	        |      dkD  s&g }|D ]_  }i }|j                   j                         D ]-  \  }}t        |t
              r|j                  ||<   &|)|||<   / |j                  |       a |||<    i }	|j                         D ]  \  }
}t	        |      dkD  s||	|
<    |	S )N)r   r   r   r   )__dict__items
isinstancelistlenr   valuer   )r9   schemasattr
attr_valuefield_valuesvalr   r   field_valueschemakrY   s               r%   as_dictzRedisModel.as_dict   s    13B2(N $ 3 3 5 	-D**d+J!0C57% /C,.E /2ll.@.@.B 7*{%k48+6+<+<E%L(4+6E%L7 !''./ !-%	-( (*MMO 	DAq1vzq		 r$   c                    | j                   st        d      | j                   D ]  }|j                  | j                  k(  s|c S  t        d      )NzNo vector fields foundzNo content_vector field found)r   r]   r)   r   r   s     r%   r   zRedisModel.content_vector   sM    {{566[[ 	EzzT444	 899r$   c                <    t         | j                  j                     S rU   )r   r   rN   r9   s    r%   vector_dtypezRedisModel.vector_dtype   s     &d&9&9&B&BCCr$   c                ~    t        d | j                  | j                  | j                  | j                  fD              S )Nc              3  $   K   | ]  }|d u  
 y wrU   r#   ).0r   s     r%   	<genexpr>z&RedisModel.is_empty.<locals>.<genexpr>   s      
#ETM
s   )allr   r   r   r   r   s    r%   is_emptyzRedisModel.is_empty   s5     
(,$))T\\4;;'W
 
 	
r$   c                    g }| j                   r|S t        |       j                         D ]<  }|dvst        | |      }||D ]!  }|j	                  |j                                # > |S )N)r   r   r   )r   r   r^   getattrr   r:   )r9   redis_fields
field_namefield_groupr   s        r%   r   zRedisModel.get_fields   sx    +-==$T*//1 	>J!OO%dJ7*!, >$++ENN,<=>		> r$   c                0   g }| j                   r|S t        |       j                         D ]i  }t        | |      }||D ]S  }t	        |t
              r|j                  | j                  | j                  fvs9|j                  |j                         U k |S rU   )
r   r   r^   r   r   r(   r)   r   r   r   )r9   r^   r   r   r   s        r%   metadata_keyszRedisModel.metadata_keys  s    ==K$T*//1 		0J!$
3K&( 0E%eS1ejj((//I 7 EJJ/0		0 r$   )r;   None)r   rg   r;   r   )r;   zDict[str, List[Any]])r;   z'Union[FlatVectorField, HNSWVectorField])r;   znp.dtype)r;   r0   )r;   zList['RedisField'])r;   z	List[str])r   r   r   r   r,   r   r*   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r#   r$   r%   r   r      s    ! $3	#B"CD
C*.C	'.26G/6(,E%, GKFCJ K ..A"< : : D D 
 

  r$   r   c                   t        | t              r| S t        | t              r+t        | d      5 }t	        j
                  |      cddd       S t        | t              rat        |       j                         j                         r+t        | d      5 }t	        j
                  |      cddd       S t        d|  d      t        dt        |              # 1 sw Y   yxY w# 1 sw Y   yxY w)zRead in the index schema from a dict or yaml file.

    Check if it is a dict and return RedisModel otherwise, check if it's a path and
    read in the file assuming it's a yaml file and return a RedisModel
    rbNzindex_schema file z does not existz8index_schema must be a dict, or path to a yaml file Got )r   dictr   openyaml	safe_loadr(   resolveis_fileFileNotFoundError	TypeErrortype)index_schemafs     r%   read_schemar     s     ,%	L$	',% 	%>>!$	% 	%	L#	&%%'//1lD) )Q~~a() ) $&8o$VWW%&(
 	
	% 	%) )s   CC"C"C+)r   z7Optional[Union[Dict[str, List[Any]], str, os.PathLike]]r;   rg   ),
__future__r   osenumr   pathlibr   typingr   r   r   r	   r
   numpynpr   langchain_core.utils.pydanticr   pydanticr   r   r   r   typing_extensionsr   r   0langchain_community.vectorstores.redis.constantsr   r8   r   r   r   r   r(   r   r'   r,   r=   rC   rF   rj   rw   r   r   r#   r$   r%   <module>r      s    " 	   3 3   4 A A 4 S #t  
j 
.
Z 
(	W 	Wz BB& BB& B0v vr
I

r$   