U
    gM%                     @   s&  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 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d"S )#    )ABCabstractmethod)OrderedDict)	dataclass)Enum)AnyListOptionalUnionc                   @   s   e Zd ZdZdZdS )CacheEntryStatusVALIDIN_PROGRESSN)__name__
__module____qualname__r   r    r   r   //tmp/pip-unpacked-wheel-f3sx1i9r/redis/cache.pyr      s   r   c                   @   s   e Zd ZdZdZdS )EvictionPolicyType
time_basedfrequency_basedN)r   r   r   r   r   r   r   r   r   r      s   r   T)frozenc                   @   s   e Zd ZU eed< eed< dS )CacheKeycommand
redis_keysN)r   r   r   str__annotations__tupler   r   r   r   r      s   
r   c                   @   s.   e Zd Zeeed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__%   s    zCacheEntry.__hash__c                 C   s   t | t |kS r!   )r%   )r#   otherr   r   r   __eq__*   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dd ZeeedddZee	dddZ
eeee	 d	d
dZee	ddddZdS )EvictionPolicyInterfacec                 C   s   d S r!   r   r&   r   r   r   cache/   s    zEvictionPolicyInterface.cachec                 C   s   d S r!   r   )r#   valuer   r   r   r,   4   s    returnc                 C   s   d S r!   r   r&   r   r   r   type8   s    zEvictionPolicyInterface.typec                 C   s   d S r!   r   r&   r   r   r   
evict_next=   s    z"EvictionPolicyInterface.evict_nextcountr/   c                 C   s   d S r!   r   r#   r3   r   r   r   
evict_manyA   s    z"EvictionPolicyInterface.evict_manyNr   r/   c                 C   s   d S r!   r   r#   r   r   r   r   touchE   s    zEvictionPolicyInterface.touch)r   r   r   propertyr   r,   setterr   r0   r   r1   intr   r5   r8   r   r   r   r   r+   .   s   
r+   c                   @   s^   e Zd Zedd ZeedddZedd Zeeedd	d
Z	ee
edddZdS )CacheConfigurationInterfacec                 C   s   d S r!   r   r&   r   r   r   get_cache_classK   s    z+CacheConfigurationInterface.get_cache_classr.   c                 C   s   d S r!   r   r&   r   r   r   get_max_sizeO   s    z(CacheConfigurationInterface.get_max_sizec                 C   s   d S r!   r   r&   r   r   r   get_eviction_policyS   s    z/CacheConfigurationInterface.get_eviction_policyr2   c                 C   s   d S r!   r   r4   r   r   r   is_exceeds_max_sizeW   s    z/CacheConfigurationInterface.is_exceeds_max_sizer   r/   c                 C   s   d S r!   r   r#   r   r   r   r   is_allowed_to_cache[   s    z/CacheConfigurationInterface.is_allowed_to_cacheN)r   r   r   r   r=   r;   r>   r?   boolr@   r   rC   r   r   r   r   r<   J   s   

r<   c                   @   s   e Zd ZeeedddZeeedddZeee	dddZ
eeeddd	Zeeeed
f dddZeeedddZeee ee dddZeee ee dddZeedddZeeedddZd
S )CacheInterfacer.   c                 C   s   d S r!   r   r&   r   r   r   
collectiona   s    zCacheInterface.collectionc                 C   s   d S r!   r   r&   r   r   r   configf   s    zCacheInterface.configc                 C   s   d S r!   r   r&   r   r   r   eviction_policyk   s    zCacheInterface.eviction_policyc                 C   s   d S r!   r   r&   r   r   r   sizep   s    zCacheInterface.sizeNkeyr/   c                 C   s   d S r!   r   r#   rK   r   r   r   getu   s    zCacheInterface.getentryr/   c                 C   s   d S r!   r   r#   rO   r   r   r   sety   s    zCacheInterface.set
cache_keysr/   c                 C   s   d S r!   r   )r#   rS   r   r   r   delete_by_cache_keys}   s    z#CacheInterface.delete_by_cache_keysr   r/   c                 C   s   d S r!   r   )r#   r   r   r   r   delete_by_redis_keys   s    z#CacheInterface.delete_by_redis_keysc                 C   s   d S r!   r   r&   r   r   r   flush   s    zCacheInterface.flushc                 C   s   d S r!   r   rL   r   r   r   is_cachable   s    zCacheInterface.is_cachable)r   r   r   r9   r   r   rF   r<   rG   r+   rH   r;   rI   r   r
   r   rM   rD   rQ   r   rT   r*   rV   rW   rX   r   r   r   r   rE   `   s0   rE   c                   @   s   e Zd ZeddddZeedddZeeddd	Zee	dd
dZ
eedddZeedddZeeedf dddZee ee dddZee ee dddZedddZeedddZdS )DefaultCacheN)cache_configr/   c                 C   s*   t  | _|| _| j  | _| | j_d S r!   )r   _cache_cache_configr?   r-   _eviction_policyr,   r#   rZ   r   r   r   r$      s    zDefaultCache.__init__r.   c                 C   s   | j S r!   r[   r&   r   r   r   rF      s    zDefaultCache.collectionc                 C   s   | j S r!   )r\   r&   r   r   r   rG      s    zDefaultCache.configc                 C   s   | j S r!   r]   r&   r   r   r   rH      s    zDefaultCache.eviction_policyc                 C   s
   t | jS r!   )lenr[   r&   r   r   r   rI      s    zDefaultCache.sizerN   c                 C   sJ   |  |jsdS || j|j< | j|j | jt| jrF| j  dS )NFT)	rX   r   r[   r]   r8   r\   r@   ra   r1   rP   r   r   r   rQ      s    
zDefaultCache.setrJ   c                 C   s*   | j |d }|d krd S | j| |S r!   )r[   rM   r]   r8   )r#   rK   rO   r   r   r   rM      s
    zDefaultCache.getrR   c                 C   sB   g }|D ]4}|  |d k	r2| j| |d q|d q|S )NTF)rM   r[   popappend)r#   rS   responserK   r   r   r   rT      s    z!DefaultCache.delete_by_cache_keysrU   c                 C   sh   g }g }|D ]@}t |tr"| }| jD ]"}||jkr(|| |d q(q|D ]}| j| qR|S )NT)
isinstancer*   decoder[   r   rc   rb   )r#   r   rd   Zkeys_to_deleteZ	redis_keyr   rK   r   r   r   rV      s    



z!DefaultCache.delete_by_redis_keysc                 C   s   t | j}| j  |S r!   )ra   r[   clear)r#   Z
elem_countr   r   r   rW      s    

zDefaultCache.flushc                 C   s   | j |jS r!   )r\   rC   r   rL   r   r   r   rX      s    zDefaultCache.is_cachable)r   r   r   r<   r$   r9   r   rF   rG   r+   rH   r;   rI   r   rD   rQ   r   r
   rM   r   rT   r*   rV   rW   rX   r   r   r   r   rY      s"   		rY   c                   @   s   e Zd Zdd Zedd ZejedddZeeddd	Z	e
dd
dZeee
 dddZe
ddddZdd ZdS )	LRUPolicyc                 C   s
   d | _ d S r!   r,   r&   r   r   r   r$      s    zLRUPolicy.__init__c                 C   s   | j S r!   r_   r&   r   r   r   r,      s    zLRUPolicy.cacheri   c                 C   s
   || _ d S r!   r_   )r#   r,   r   r   r   r,      s    r.   c                 C   s   t jS r!   )r   r   r&   r   r   r   r0      s    zLRUPolicy.typec                 C   s    |    | jjjdd}|d S )NFlastr   )_assert_cacher[   rF   popitem)r#   popped_entryr   r   r   r1      s    zLRUPolicy.evict_nextr2   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 sizeFrj   r   )rl   ra   r[   rF   
ValueErrorrangerm   rc   )r#   r3   Zpopped_keys_rn   r   r   r   r5      s    zLRUPolicy.evict_manyNr6   c                 C   s4   |    | jj|d kr"td| jj| d S )Nz(Given entry does not belong to the cache)rl   r[   rF   rM   ro   move_to_endr7   r   r   r   r8     s    zLRUPolicy.touchc                 C   s"   | j d kst| j tstdd S )Nz6Eviction policy should be associated with valid cache.)r,   re   rE   ro   r&   r   r   r   rl     s    zLRUPolicy._assert_cache)r   r   r   r$   r9   r,   r:   rE   r   r0   r   r1   r;   r   r5   r8   rl   r   r   r   r   rh      s   
rh   c                   @   s   e Zd ZeZdS )EvictionPolicyN)r   r   r   rh   LRUr   r   r   r   rs     s   rs   c                J   @   s  e Zd ZeZejZdZdddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKgJZ	eeefe
eedLdMdNZdOdP Ze
dQdRdSZedQdTdUZe
edVdWdXZeedYdZd[Zd\S )]CacheConfigi'  ZBITCOUNTZBITFIELD_ROZBITPOSZEXISTSZGEODISTZGEOHASHZGEOPOSZGEORADIUSBYMEMBER_ROZGEORADIUS_ROZ	GEOSEARCHGETZGETBITZGETRANGEZHEXISTSZHGETZHGETALLZHKEYSZHLENZHMGETZHSTRLENZHVALSzJSON.ARRINDEXzJSON.ARRLENzJSON.GETz	JSON.MGETzJSON.OBJKEYSzJSON.OBJLENz	JSON.RESPzJSON.STRLENz	JSON.TYPEZLCSZLINDEXZLLENZLPOSZLRANGEZMGETZSCARDZSDIFFZSINTERZ
SINTERCARDZ	SISMEMBERZSMEMBERSZ
SMISMEMBERZSORT_ROZSTRLENZSUBSTRZSUNIONzTS.GETzTS.INFOzTS.RANGEzTS.REVRANGEZTYPEZXLENZXPENDINGZXRANGEZXREADZ	XREVRANGEZZCARDZZCOUNTZZDIFFZZINTERZ
ZINTERCARDZ	ZLEXCOUNTZZMSCOREZZRANGEZZRANGEBYLEXZZRANGEBYSCOREZZRANKZ	ZREVRANGEZZREVRANGEBYLEXZZREVRANGEBYSCOREZZREVRANKZZSCOREZZUNION)max_sizecache_classrH   c                 C   s   || _ || _|| _d S r!   )_cache_class	_max_sizer]   )r#   rw   rx   rH   r   r   r   r$   h  s    zCacheConfig.__init__c                 C   s   | j S r!   )ry   r&   r   r   r   r=   r  s    zCacheConfig.get_cache_classr.   c                 C   s   | j S r!   rz   r&   r   r   r   r>   u  s    zCacheConfig.get_max_sizec                 C   s   | j S r!   r`   r&   r   r   r   r?   x  s    zCacheConfig.get_eviction_policyr2   c                 C   s
   || j kS r!   r{   r4   r   r   r   r@   {  s    zCacheConfig.is_exceeds_max_sizerA   c                 C   s
   || j kS r!   )DEFAULT_ALLOW_LISTrB   r   r   r   rC   ~  s    zCacheConfig.is_allowed_to_cacheN)r   r   r   rY   ZDEFAULT_CACHE_CLASSrs   rt   ZDEFAULT_EVICTION_POLICYZDEFAULT_MAX_SIZEr|   r;   r   r$   r=   r>   r?   rD   r@   r   rC   r   r   r   r   ru     s   O
ru   c                   @   s   e Zd ZeedddZdS )CacheFactoryInterfacer.   c                 C   s   d S r!   r   r&   r   r   r   	get_cache  s    zCacheFactoryInterface.get_cacheN)r   r   r   r   rE   r~   r   r   r   r   r}     s   r}   c                   @   s.   e Zd Zdee dddZedddZdS )	CacheFactoryNrZ   c                 C   s   || _ | j d krt | _ d S r!   )_configru   r^   r   r   r   r$     s    
zCacheFactory.__init__r.   c                 C   s   | j  }|| j dS )Nr   )r   r=   )r#   rx   r   r   r   r~     s    
zCacheFactory.get_cache)N)r   r   r   r	   ru   r$   rE   r~   r   r   r   r   r     s   r   N)abcr   r   collectionsr   dataclassesr   enumr   typingr   r   r	   r
   r   r   r   r   r+   r<   rE   rY   rh   rs   ru   r}   r   r   r   r   r   <module>   s$   .U/l