o
    i9/                     @   sB  d dl 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mZ d dlmZ G dd deZG d	d
 d
eZeddG dd dZG 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G dd de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G d#d$ d$eZd%S )&    )ABCabstractmethod)OrderedDict)	dataclass)Enum)AnyListOptionalUnion)	CSCReasonc                   @      e Zd ZdZdZdS )CacheEntryStatusVALIDIN_PROGRESSN)__name__
__module____qualname__r   r    r   r   ?/home/ubuntu/.local/lib/python3.10/site-packages/redis/cache.pyr   
       r   c                   @   r   )EvictionPolicyType
time_basedfrequency_basedN)r   r   r   r   r   r   r   r   r   r      r   r   T)frozenc                   @   s.   e Zd ZU dZeed< eed< dZeed< dS )CacheKeya  
    Represents a unique key for a cache entry.

    Attributes:
        command (str): The Redis command being cached.
        redis_keys (tuple): The Redis keys involved in the command.
        redis_args (tuple): Additional arguments for the Redis command.
            This field is included in the cache key to ensure uniqueness
            when commands have the same keys but different arguments.
            Changing this field will affect cache key uniqueness.
    command
redis_keysr   
redis_argsN)r   r   r   __doc__str__annotations__tupler   r   r   r   r   r      s
   
 r   c                   @   s2   e Zd ZdededefddZdd Zdd	 Zd
S )
CacheEntry	cache_keycache_valuestatusc                 C   s   || _ || _|| _|| _d S N)r#   r$   r%   connection_ref)selfr#   r$   r%   r'   r   r   r   __init__(   s   
zCacheEntry.__init__c                 C   s   t | j| j| j| jfS r&   )hashr#   r$   r%   r'   r(   r   r   r   __hash__4   s   zCacheEntry.__hash__c                 C   s   t | t |kS r&   )r*   )r(   otherr   r   r   __eq__9   s   zCacheEntry.__eq__N)	r   r   r   r   bytesr   r)   r,   r.   r   r   r   r   r"   '   s    
r"   c                   @   s   e Zd Zeedd Zejedd ZeedefddZede	fddZ
ed	edee	 fd
dZede	ddfddZdS )EvictionPolicyInterfacec                 C      d S r&   r   r+   r   r   r   cache>      zEvictionPolicyInterface.cachec                 C   r1   r&   r   )r(   valuer   r   r   r2   C   r3   returnc                 C   r1   r&   r   r+   r   r   r   typeH   r3   zEvictionPolicyInterface.typec                 C   r1   r&   r   r+   r   r   r   
evict_nextM      z"EvictionPolicyInterface.evict_nextcountc                 C   r1   r&   r   r(   r9   r   r   r   
evict_manyQ   r8   z"EvictionPolicyInterface.evict_manyr#   Nc                 C   r1   r&   r   r(   r#   r   r   r   touchU   r8   zEvictionPolicyInterface.touch)r   r   r   propertyr   r2   setterr   r6   r   r7   intr   r;   r=   r   r   r   r   r0   =   s     r0   c                   @   sb   e Zd Zedd ZedefddZedd Zededefd	d
Z	ede
defddZdS )CacheConfigurationInterfacec                 C   r1   r&   r   r+   r   r   r   get_cache_class[   r8   z+CacheConfigurationInterface.get_cache_classr5   c                 C   r1   r&   r   r+   r   r   r   get_max_size_   r8   z(CacheConfigurationInterface.get_max_sizec                 C   r1   r&   r   r+   r   r   r   get_eviction_policyc   r8   z/CacheConfigurationInterface.get_eviction_policyr9   c                 C   r1   r&   r   r:   r   r   r   is_exceeds_max_sizeg   r8   z/CacheConfigurationInterface.is_exceeds_max_sizer   c                 C   r1   r&   r   r(   r   r   r   r   is_allowed_to_cachek   r8   z/CacheConfigurationInterface.is_allowed_to_cacheN)r   r   r   r   rB   r@   rC   rD   boolrE   r   rG   r   r   r   r   rA   Z   s    

rA   c                   @   s   e Zd ZeedefddZeedefddZeede	fddZ
eedefdd	Zed
edeedf fddZededefddZedee dee fddZedee dee fddZedefddZed
edefddZdS )CacheInterfacer5   c                 C   r1   r&   r   r+   r   r   r   
collectionq   r3   zCacheInterface.collectionc                 C   r1   r&   r   r+   r   r   r   configv   r3   zCacheInterface.configc                 C   r1   r&   r   r+   r   r   r   eviction_policy{   r3   zCacheInterface.eviction_policyc                 C   r1   r&   r   r+   r   r   r   size   r3   zCacheInterface.sizekeyNc                 C   r1   r&   r   r(   rN   r   r   r   get   r8   zCacheInterface.getentryc                 C   r1   r&   r   r(   rQ   r   r   r   set   r8   zCacheInterface.set
cache_keysc                 C   r1   r&   r   r(   rT   r   r   r   delete_by_cache_keys   r8   z#CacheInterface.delete_by_cache_keysr   c                 C   r1   r&   r   r(   r   r   r   r   delete_by_redis_keys   r8   z#CacheInterface.delete_by_redis_keysc                 C   r1   r&   r   r+   r   r   r   flush   r8   zCacheInterface.flushc                 C   r1   r&   r   rO   r   r   r   is_cachable   r8   zCacheInterface.is_cachable)r   r   r   r>   r   r   rJ   rA   rK   r0   rL   r@   rM   r   r
   r"   rP   rH   rS   r   rV   r/   rX   rY   rZ   r   r   r   r   rI   p   s2    rI   c                   @   s   e Zd ZdeddfddZedefddZedefdd	Zede	fd
dZ
edefddZdedefddZdedeedf fddZdee dee fddZdeee ee f dee fddZdefddZdedefddZdS )DefaultCachecache_configr5   Nc                 C   s*   t  | _|| _| j  | _| | j_d S r&   )r   _cache_cache_configrD   r4   _eviction_policyr2   r(   r\   r   r   r   r)      s   zDefaultCache.__init__c                 C      | j S r&   r]   r+   r   r   r   rJ         zDefaultCache.collectionc                 C   ra   r&   )r^   r+   r   r   r   rK      rc   zDefaultCache.configc                 C   ra   r&   r_   r+   r   r   r   rL      rc   zDefaultCache.eviction_policyc                 C   s
   t | jS r&   )lenr]   r+   r   r   r   rM         
zDefaultCache.sizerQ   c                 C   s.   |  |jsdS || j|j< | j|j dS )NFT)rZ   r#   r]   r_   r=   rR   r   r   r   rS      s
   zDefaultCache.setrN   c                 C   s*   | j |d }|d u rd S | j| |S r&   )r]   rP   r_   r=   )r(   rN   rQ   r   r   r   rP      s
   zDefaultCache.getrT   c                 C   sB   g }|D ]}|  |d ur| j| |d q|d q|S )NTF)rP   r]   popappend)r(   rT   responserN   r   r   r   rV      s   z!DefaultCache.delete_by_cache_keysr   c              	      s   g }g }|D ]G}|g}t |tr||d nt |tr2z
||d W n	 ty1   Y nw | jD ] t fdd|D rL|  |d q5q|D ]}| j	| qP|S )Nzutf-8c                 3   s    | ]}| j v V  qd S r&   )r   ).0	candidater#   r   r   	<genexpr>   s    z4DefaultCache.delete_by_redis_keys.<locals>.<genexpr>T)

isinstancer   rh   encoder/   decodeUnicodeDecodeErrorr]   anyrg   )r(   r   ri   keys_to_delete	redis_key
candidatesrN   r   rl   r   rX      s*   




z!DefaultCache.delete_by_redis_keysc                 C   s   t | j}| j  |S r&   )re   r]   clear)r(   
elem_countr   r   r   rY      s   

zDefaultCache.flushc                 C   s   | j |jS r&   )r^   rG   r   rO   r   r   r   rZ      s   zDefaultCache.is_cachable)r   r   r   rA   r)   r>   r   rJ   rK   r0   rL   r@   rM   r"   rH   rS   r   r
   rP   r   rV   r/   r   rX   rY   rZ   r   r   r   r   r[      s0    
			
r[   c                   @   s   e Zd ZdZdefddZedefddZede	fdd	Z
edefd
dZedefddZdedeedf fddZdedefddZdee dee fddZdee dee fddZdefddZdedefddZdS )
CacheProxyzY
    Proxy object that wraps cache implementations to enable additional logic on top
    r2   c                 C   
   || _ d S r&   rb   r(   r2   r   r   r   r)         
zCacheProxy.__init__r5   c                 C      | j jS r&   )r]   rJ   r+   r   r   r   rJ        zCacheProxy.collectionc                 C   r|   r&   )r]   rK   r+   r   r   r   rK     r}   zCacheProxy.configc                 C   r|   r&   )r]   rL   r+   r   r   r   rL   
  r}   zCacheProxy.eviction_policyc                 C   r|   r&   )r]   rM   r+   r   r   r   rM     r}   zCacheProxy.sizerN   Nc                 C      | j |S r&   )r]   rP   rO   r   r   r   rP        zCacheProxy.getrQ   c                 C   sB   | j |}| j| jrddlm} |dtjd | j	
  |S )Nr   )record_csc_eviction   )r9   reason)r]   rS   rK   rE   rM   redis.observability.recorderr   r   FULLrL   r7   )r(   rQ   is_setr   r   r   r   rS     s   
zCacheProxy.setrT   c                 C   r~   r&   )r]   rV   rU   r   r   r   rV   $  r   zCacheProxy.delete_by_cache_keysr   c                 C   r~   r&   )r]   rX   rW   r   r   r   rX   '  r   zCacheProxy.delete_by_redis_keysc                 C   s
   | j  S r&   )r]   rY   r+   r   r   r   rY   *  r{   zCacheProxy.flushc                 C   r~   r&   )r]   rZ   rO   r   r   r   rZ   -  r   zCacheProxy.is_cachable)r   r   r   r   rI   r)   r>   r   rJ   rA   rK   r0   rL   r@   rM   r   r
   r"   rP   rH   rS   r   rV   r/   rX   rY   rZ   r   r   r   r   rx      s"    rx   c                   @   s   e Zd Zdd Zedd ZejdefddZedefdd	Z	de
fd
dZdedee
 fddZde
ddfddZdd ZdS )	LRUPolicyc                 C   s
   d | _ d S r&   )r2   r+   r   r   r   r)   2  r{   zLRUPolicy.__init__c                 C   ra   r&   rb   r+   r   r   r   r2   5  rc   zLRUPolicy.cacher2   c                 C   ry   r&   rb   rz   r   r   r   r2   9  rf   r5   c                 C   s   t jS r&   )r   r   r+   r   r   r   r6   =  rc   zLRUPolicy.typec                 C   s    |    | jjjdd}|d S )NFlastr   )_assert_cacher]   rJ   popitem)r(   popped_entryr   r   r   r7   A  s   zLRUPolicy.evict_nextr9   c                 C   sT   |    |t| jjkrtdg }t|D ]}| jjjdd}||d  q|S )Nz#Evictions count is above cache sizeFr   r   )r   re   r]   rJ   
ValueErrorranger   rh   )r(   r9   popped_keys_r   r   r   r   r;   F  s   zLRUPolicy.evict_manyr#   Nc                 C   s4   |    | jj|d u rtd| jj| d S )Nz(Given entry does not belong to the cache)r   r]   rJ   rP   r   move_to_endr<   r   r   r   r=   S  s   zLRUPolicy.touchc                 C   s"   | j d u st| j tstdd S )Nz6Eviction policy should be associated with valid cache.)r2   rn   rI   r   r+   r   r   r   r   [  s   zLRUPolicy._assert_cache)r   r   r   r)   r>   r2   r?   rI   r   r6   r   r7   r@   r   r;   r=   r   r   r   r   r   r   1  s    
r   c                   @   s   e Zd ZeZdS )EvictionPolicyN)r   r   r   r   LRUr   r   r   r   r   `  s    r   c                   @   s   e Zd ZeZejZdZg dZ	eeefde
dedefddZdd	 Zd
e
fddZd
efddZde
d
efddZded
efddZdS )CacheConfigi'  )JBITCOUNTBITFIELD_ROBITPOSEXISTSGEODISTGEOHASHGEOPOSGEORADIUSBYMEMBER_ROGEORADIUS_RO	GEOSEARCHGETGETBITGETRANGEHEXISTSHGETHGETALLHKEYSHLENHMGETHSTRLENHVALSzJSON.ARRINDEXzJSON.ARRLENzJSON.GETz	JSON.MGETzJSON.OBJKEYSzJSON.OBJLENz	JSON.RESPzJSON.STRLENz	JSON.TYPELCSLINDEXLLENLPOSLRANGEMGETSCARDSDIFFSINTER
SINTERCARD	SISMEMBERSMEMBERS
SMISMEMBERSORT_ROSTRLENSUBSTRSUNIONzTS.GETzTS.INFOzTS.RANGEzTS.REVRANGETYPEXLENXPENDINGXRANGEXREAD	XREVRANGEZCARDZCOUNTZDIFFZINTER
ZINTERCARD	ZLEXCOUNTZMSCOREZRANGEZRANGEBYLEXZRANGEBYSCOREZRANK	ZREVRANGEZREVRANGEBYLEXZREVRANGEBYSCOREZREVRANKZSCOREZUNIONmax_sizecache_classrL   c                 C   s   || _ || _|| _d S r&   )_cache_class	_max_sizer_   )r(   r   r   rL   r   r   r   r)     s   
zCacheConfig.__init__c                 C   ra   r&   )r   r+   r   r   r   rB        zCacheConfig.get_cache_classr5   c                 C   ra   r&   r   r+   r   r   r   rC     r   zCacheConfig.get_max_sizec                 C   ra   r&   rd   r+   r   r   r   rD     r   zCacheConfig.get_eviction_policyr9   c                 C   s
   || j kS r&   r   r:   r   r   r   rE     r{   zCacheConfig.is_exceeds_max_sizer   c                 C   s
   || j v S r&   )DEFAULT_ALLOW_LISTrF   r   r   r   rG     r{   zCacheConfig.is_allowed_to_cacheN)r   r   r   r[   DEFAULT_CACHE_CLASSr   r   DEFAULT_EVICTION_POLICYDEFAULT_MAX_SIZEr   r@   r   r)   rB   rC   rD   rH   rE   r   rG   r   r   r   r   r   d  s(    O

r   c                   @   s   e Zd ZedefddZdS )CacheFactoryInterfacer5   c                 C   r1   r&   r   r+   r   r   r   	get_cache  r8   zCacheFactoryInterface.get_cacheN)r   r   r   r   rI   r   r   r   r   r   r     s    r   c                   @   s.   e Zd Zddee fddZdefddZdS )	CacheFactoryNr\   c                 C   s    || _ | j d u rt | _ d S d S r&   )_configr   r`   r   r   r   r)     s   
zCacheFactory.__init__r5   c                 C   s   | j  }t|| j dS )N)r\   )r   rB   rx   )r(   r   r   r   r   r     s   
zCacheFactory.get_cacher&   )r   r   r   r	   r   r)   rI   r   r   r   r   r   r     s    r   N)abcr   r   collectionsr   dataclassesr   enumr   typingr   r   r	   r
   redis.observability.attributesr   r   r   r   r"   r0   rA   rI   r[   rx   r   r   r   r   r   r   r   r   r   <module>   s*    .\7/l