U
    	mh                     @   s   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
eZG dd dZdddd	d
ddZeedddZddddddZdS )    N)OptionalAnyDict)	timedeltac                   @   s   e Zd Zd"edddZdd Zd#eeee e	ddd	Z
eee d
ddZee	d
ddZee	d
ddZeee	dddZeeeef e	dddZeeee dddZeeeef dddZeeedddZd d! ZdS )$RedisClientN)	redis_urlc                 C   s$   |pt dd| _d | _|   d S )NZ	REDIS_URLzredis://localhost:6379)osgetenvr   clientconnect)selfr    r   shared/utils/redis_utils.py__init__   s    zRedisClient.__init__c              
   C   sl   z2t j| jdd| _| j  td| j  W n4 tk
rf } ztd|   W 5 d}~X Y nX dS )zConnect to RedisT)Zdecode_responseszConnected to Redis at zFailed to connect to Redis: N)	redisZfrom_urlr   r
   Zpingloggerinfo	Exceptionerror)r   er   r   r   r      s    
zRedisClient.connect)keyvalueexpirereturnc              
   C   s   zFt |ttfrtj|td}| jj|||d}t	d| d |W S  t
k
r } z td| d|  W Y dS d}~X Y nX dS )	zSet a key-value pair in Redisdefault)exzSet key 	 in RediszFailed to set key  in Redis: FN)
isinstancedictlistjsondumpsstrr
   setr   debugr   r   )r   r   r   r   resultr   r   r   r   r%      s    zRedisClient.set)r   r   c              
   C   s   zJ| j |}|dkrW dS zt|W W S  tjk
rF   | Y W S X W n> tk
r } z td| d|  W Y dS d}~X Y nX dS )zGet a value from Redis by keyNzFailed to get key  from Redis: )r
   getr"   loadsJSONDecodeErrorr   r   r   )r   r   r   r   r   r   r   r)   (   s    zRedisClient.getc              
   C   sl   z(| j |}td| d t|W S  tk
rf } z td| d|  W Y dS d}~X Y nX dS )zDelete a key from RediszDeleted key z from RediszFailed to delete key r(   FN)r
   deleter   r&   boolr   r   )r   r   r'   r   r   r   r   r,   8   s    
zRedisClient.deletec              
   C   sV   zt | j|W S  tk
rP } z td| d|  W Y dS d}~X Y nX dS )zCheck if a key exists in Redisz!Failed to check existence of key r   FN)r-   r
   existsr   r   r   )r   r   r   r   r   r   r.   B   s
    zRedisClient.exists)r   secondsr   c              
   C   sp   z,| j ||}td| d| d |W S  tk
rj } z td| d|  W Y dS d}~X Y nX dS )zSet expiration time for a keyzSet expiration for key z to z secondsz!Failed to set expiration for key : FN)r
   r   r   r&   r   r   )r   r   r/   r'   r   r   r   r   r   J   s    zRedisClient.expire)namemappingr   c              
   C   s   zli }|  D ]6\}}t|ttfr8tj|td||< qt|||< q| jj||d}t	
d| d W dS  tk
r } z t	d| d|  W Y dS d	}~X Y nX d	S )
zSet hash field valuesr   )r2   z	Set hash r   TzFailed to set hash r   FN)itemsr   r    r!   r"   r#   r$   r
   hsetr   r&   r   r   )r   r1   r2   Zserialized_mappingkvr'   r   r   r   r   r4   T   s    zRedisClient.hset)r1   r   r   c                 C   s   zL| j ||}|dkrW dS zt|W W S  tjk
rH   | Y W S X W nD tk
r } z&td| d| d|  W Y dS d}~X Y nX dS )zGet hash field valueNzFailed to get hash field  from r0   )r
   hgetr"   r*   r+   r   r   r   )r   r1   r   r   r   r   r   r   r8   f   s    zRedisClient.hget)r1   r   c              
   C   s   zZ| j |}i }| D ]:\}}zt|||< W q tjk
rR   |||< Y qX q|W S  tk
r } z"td| d|  i  W Y S d}~X Y nX dS )zGet all hash field valuesz#Failed to get all hash fields from r0   N)	r
   hgetallr3   r"   r*   r+   r   r   r   )r   r1   datar'   r5   r6   r   r   r   r   r9   v   s    zRedisClient.hgetall)r1   keysr   c              
   G   sr   z.| j j|f| }td| d|  |W S  tk
rl } z td| d|  W Y dS d}~X Y nX dS )zDelete hash fieldszDeleted hash fields r7   z"Failed to delete hash fields from r0   r   N)r
   hdelr   r&   r   r   )r   r1   r;   r'   r   r   r   r   r<      s    zRedisClient.hdelc                 C   s   | j r| j   td dS )zClose Redis connectionzRedis connection closedN)r
   closer   r   )r   r   r   r   r=      s    
zRedisClient.close)N)N)__name__
__module____qualname__r$   r   r   r   r   intr-   r%   r)   r,   r.   r   r   r4   r8   r9   r<   r=   r   r   r   r   r   
   s   


r   zrequest_status:{request_id}zsearch_results:{request_id}zmetadata:{url_hash}zsession:{session_id}Zprocessing_queuezservice_health:{service_name})REQUEST_STATUSSEARCH_RESULTSMETADATA_CACHEUSER_SESSIONZPROCESSING_QUEUESERVICE_HEALTH)patternr   c                 K   s   | j f |S )z0Generate a cache key from pattern and parameters)format)rG   kwargsr   r   r   get_cache_key   s    rJ   i  i  iQ i,  )rB   rC   rD   rE   rF   )r"   Zloggingtypingr   r   r   r   r   Zdatetimer   Z	getLoggerr>   r   r   Z
CACHE_KEYSr$   rJ   ZCACHE_EXPIRATIONr   r   r   r   <module>   s,   
 	