
    2mh                         d dl Z d dlZd dlmZmZmZ d dlZd dlZd dlm	Z	  ej                  e      Z G d d      Zdddd	d
ddZdedefdZddddddZy)    N)OptionalAnyDict)	timedeltac            	           e Zd ZddefdZd Zddededee   de	fd	Z
dedee   fd
Zdede	fdZdede	fdZdedede	fdZdedeeef   de	fdZdededee   fdZdedeeef   fdZdededefdZd Zy)RedisClientN	redis_urlc                 p    |xs t        j                  dd      | _        d | _        | j	                          y )N	REDIS_URLzredis://localhost:6379)osgetenvr	   clientconnect)selfr	   s     ./shared/utils/redis_utils.py__init__zRedisClient.__init__   s*    "Vbii=U&V    c                    	 t        j                  | j                  d      | _        | j                  j	                          t
        j                  d| j                          y# t        $ r}t
        j                  d|         d}~ww xY w)zConnect to RedisT)decode_responseszConnected to Redis at zFailed to connect to Redis: N)	redisfrom_urlr	   r   pingloggerinfo	Exceptionerror)r   es     r   r   zRedisClient.connect   sm    	..$ODKKKKK00@AB 	LL7s;<	s   A"A% %	B.BBkeyvalueexpirereturnc                 :   	 t        |t        t        f      rt        j                  |t
              }| j                  j                  |||      }t        j                  d| d       |S # t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)	zSet a key-value pair in Redisdefault)exzSet key 	 in RediszFailed to set key  in Redis: NF)
isinstancedictlistjsondumpsstrr   setr   debugr   r   )r   r   r   r    resultr   s         r   r.   zRedisClient.set   s    		%$.

5#6[[__S%F_;FLL8C5	23M 	LL-cU+aSAB	s   A)A, ,	B5BBc                    	 | j                   j                  |      }|y	 t        j                  |      S # t        j                  $ r |cY S w xY w# t
        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)zGet a value from Redis by keyNzFailed to get key  from Redis: )r   getr+   loadsJSONDecodeErrorr   r   r   )r   r   r   r   s       r   r3   zRedisClient.get(   s{    	KKOOC(E}zz%((''  	LL-cU-sCD	s2   A 6 AA AA 	A?A::A?c                     	 | j                   j                  |      }t        j                  d| d       t	        |      S # t
        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)zDelete a key from RediszDeleted key z from RediszFailed to delete key r2   NF)r   deleter   r/   boolr   r   )r   r   r0   r   s       r   r7   zRedisClient.delete8   sg    	[['',FLL<uK89< 	LL0]1#FG	s   >A 	A/
A**A/c                     	 t        | j                  j                  |            S # t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)zCheck if a key exists in Redisz!Failed to check existence of key r'   NF)r8   r   existsr   r   r   )r   r   r   s      r   r:   zRedisClient.existsB   sN    	**3/00 	LL<SEQCPQ	s   #& 	AAAsecondsc                     	 | j                   j                  ||      }t        j                  d| d| d       |S # t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)zSet expiration time for a keyzSet expiration for key z to z secondsz!Failed to set expiration for key : NF)r   r    r   r/   r   r   )r   r   r;   r0   r   s        r   r    zRedisClient.expireJ   sk    	[[''W5FLL23%tG9HMNM 	LL<SEA3GH	   9< 	A*A%%A*namemappingc                    	 i }|j                         D ]H  \  }}t        |t        t        f      rt	        j
                  |t              ||<   ;t        |      ||<   J | j                  j                  ||      }t        j                  d| d       y# t        $ r%}t        j                  d| d|        Y d}~y	d}~ww xY w)
zSet hash field valuesr#   )r@   z	Set hash r&   TzFailed to set hash r'   NF)itemsr(   r)   r*   r+   r,   r-   r   hsetr   r/   r   r   )r   r?   r@   serialized_mappingkvr0   r   s           r   rC   zRedisClient.hsetT   s    	!# 31a$.,0JJq#,F&q),/F&q)	3 [[%%d4F%GFLL9TF)45 	LL.tfKsCD	s   BB 	CB??Cc           	         	 | j                   j                  ||      }|y	 t        j                  |      S # t        j                  $ r |cY S w xY w# t
        $ r(}t        j                  d| d| d|        Y d}~yd}~ww xY w)zGet hash field valueNzFailed to get hash field  from r=   )r   hgetr+   r4   r5   r   r   r   )r   r?   r   r   r   s        r   rI   zRedisClient.hgetf   s    	KK$$T3/E}zz%((''  	LL4SEvRsKL	s2   A 7 AA AA 	BA>>Bc                 F   	 | j                   j                  |      }i }|j                         D ]  \  }}	 t        j                  |      ||<     |S # t        j
                  $ r |||<   Y =w xY w# t        $ r'}t        j                  d| d|        i cY d}~S d}~ww xY w)zGet all hash field valuesz#Failed to get all hash fields from r=   N)	r   hgetallrB   r+   r4   r5   r   r   r   )r   r?   datar0   rE   rF   r   s          r   rK   zRedisClient.hgetallv   s    	;;&&t,DF

 "1" $

1F1I"
 M ++ " !F1I"  	LL>tfBqcJKI	s@   3A0 AA0 A-*A0 ,A--A0 0	B 9BB B keysc                     	  | j                   j                  |g| }t        j                  d| d|        |S # t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)zDelete hash fieldszDeleted hash fields rH   z"Failed to delete hash fields from r=   Nr   )r   hdelr   r/   r   r   )r   r?   rM   r0   r   s        r   rO   zRedisClient.hdel   sn    	%T[[%%d2T2FLL/vVD6BCM 	LL=dV2aSIJ	r>   c                 |    | j                   r0| j                   j                          t        j                  d       yy)zClose Redis connectionzRedis connection closedN)r   closer   r   )r   s    r   rQ   zRedisClient.close   s+    ;;KKKK12 r   )N)__name__
__module____qualname__r-   r   r   r   r   intr8   r.   r3   r7   r:   r    r   rC   rI   rK   rO   rQ    r   r   r   r   
   s	   # 
	s 3   s x}  # $ # $ #    tCH~ $ $ 3 8C=  C DcN  S S 3r   r   zrequest_status:{request_id}zsearch_results:{request_id}zmetadata:{url_hash}zsession:{session_id}processing_queuezservice_health:{service_name})REQUEST_STATUSSEARCH_RESULTSMETADATA_CACHEUSER_SESSIONPROCESSING_QUEUESERVICE_HEALTHpatternr!   c                 &     | j                   di |S )z0Generate a cache key from pattern and parametersrV   )format)r^   kwargss     r   get_cache_keyrb      s    7>>#F##r   i  i  iQ i,  )rX   rY   rZ   r[   r]   )r+   loggingtypingr   r   r   r   r   datetimer   	getLoggerrR   r   r   
CACHE_KEYSr-   rb   CACHE_EXPIRATIONrV   r   r   <module>ri      s      & &  	 			8	$I3 I3Z 43+**5
$3 $S $  r   