
    2i[                         d Z ddlZddlmZmZmZ ddlmZ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mZmZmZ  G d	 d
e      Z G d d      Zy)zECommand mixin for emulating `redis-py`'s cuckoo filter functionality.    N)ListAnyDict)CountingCuckooFilterCuckooFilterFullError)_msgs)extract_args)commandCommandItemIntKey)SimpleErrorOK	casematchSimpleStringc            	       n     e Zd Zddedededef fdZdedef fdZdedef fd	Zdedef fd
Z	 xZ
S )ScalableCuckooFiltercapacitybucket_sizemax_iterations	expansionc                 T    t         |   ||||       || _        d| _        d| _        y Nr   )super__init__initial_capacityinserteddeleted)selfr   r   r   r   	__class__s        c/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/fakeredis/stack/_cf_mixin.pyr   zScalableCuckooFilter.__init__   s,    ;	J%-    itemreturnc                 n    	 t         |   |       | xj                  dz  c_        y# t        $ r Y yw xY w)NF   T)r   addr   r   r   r#   r    s     r!   insertzScalableCuckooFilter.insert   s;    	GK 	 % 		s   ( 	44c                 "    t         |   |      S N)r   checkr(   s     r!   countzScalableCuckooFilter.count   s    w}T""r"   c                 P    t         |   |      r| xj                  dz  c_        yy)Nr&   TF)r   remover   r(   s     r!   deletezScalableCuckooFilter.delete    s#    7>$LLALr"   )      r&   )__name__
__module____qualname__intr   bytesboolr)   r-   r0   __classcell__)r    s   @r!   r   r      sc     3 C ad 5 T #% #C #5 T  r"   r   c            	       ,   e Zd Zedededefd       Zedededefd       Z e	d e
e      efdej                        ded	edefd
       Z e	d e
e      efdej                        ded	edefd       Z e	d e
e      efdej                        dededefd       Z e	d e
e      efdej                        ded	edefd       Z e	d e
e      efdej                        ded	edefd       Z e	d e
       fdej                        dedeeef   fd       Z e	d e
       fef      dededee   fd       Z e	d e
       fef      dededee   fd       Z e	d e
e      efef      dededee   fd       Z e	d e
       efefej6                        dedededefd        Z e	d! e
       efdej6                        ded"edee   fd#       Z e	d$ e
       eefdej6                        ded%ed&edefd'       Zy())CFCommandsMixinkeyr#   r$   c                     | j                   | j                  t        d             | j                   j                  |      }| j	                          |rdS dS )N   r&   r   )valueupdater   r)   updated)r<   r#   ress      r!   _cf_addzCFCommandsMixin._cf_add(   sH    99JJ+D12iit$qQr"   c                 >    | j                   || j                   v rdS dS Nr&   r   )r?   )r<   r#   s     r!   	_cf_existzCFCommandsMixin._cf_exist0   s!    YY*tsyy/@qHqHr"   zCF.ADD )namefixedrepeatflagsr?   c                 .    t         j                  ||      S r+   )r;   rC   r   r<   r?   s      r!   cf_addzCFCommandsMixin.cf_add4   s    &&sE22r"   zCF.ADDNXc                 L    ||j                   v ryt        j                  ||      S r   )r?   r;   rC   rM   s      r!   cf_addnxzCFCommandsMixin.cf_addnx8   s$    CII&&sE22r"   zCF.COUNTc                     |j                   yt        |j                         t        urt        t        j
                        |j                   j                  |      S r   )r?   typer   r   msgsWRONGTYPE_MSGr-   )r   r<   r#   s      r!   cf_countzCFCommandsMixin.cf_count>   sD    99		?"66d0011yyt$$r"   zCF.DELc                     |j                   t        t        j                        |j                   j	                  |      }|rdS dS rE   )r?   r   rS   NOT_FOUND_MSGr0   )r   r<   r?   rB   s       r!   cf_delzCFCommandsMixin.cf_delF   s>    99d0011iiu%qQr"   z	CF.EXISTSc                 .    t         j                  ||      S r+   r;   rF   rM   s      r!   cf_existzCFCommandsMixin.cf_existM   s    ((e44r"   zCF.INFOc           	      <   |j                   t        |j                         t        urt        d      |j                   j                  t        |j                   j                        t        |j                   j                  |j                   j                  z  |j                   j                  z        |j                   j                  |j                   j                  |j                   j                  |j                   j                  |j                   j                  dS )N...)s   Sizes   Number of bucketss   Number of filterss   Number of items inserteds   Number of items deleteds   Bucket sizes   Max iterationss   Expansion rate)r?   rR   r   r   r   lenbucketsr6   r   expansion_rater   r   r   	max_swaps)r   r<   s     r!   cf_infozCFCommandsMixin.cf_infoQ   s    99SYY7K Ke$$YY''"%cii&7&7"8"%syy'9'9CII<V<V'VZ]ZcZcZrZr&r"s),););(+		(9(9II11"yy22"yy77	
 		
r"   z	CF.INSERT)rH   rI   rJ   argsc                    t        |ddd      \  \  }}}t        |      dk  st        |d   d      st        d      |d	d  }|xs d
}|j                  |rt        t
        j                        |j                  t        |      |_        |D cg c]  }| j                  ||       }}|j                          |S c c}w N)z	+capacitynocreateFT)error_on_unexpectedleft_from_first_unexpectedr1   r   s   itemsr]   r&   r>   )
r	   r^   r   r   r?   rS   rW   r   rC   rA   )	r   r<   rc   r   	no_create	left_argsitemsr#   rB   s	            r!   	cf_insertzCFCommandsMixin.cf_insert`   s    +7+cg,
(9y
 y>AYy|X%Fe$$!"#t99d001199,X6CI3894t||C&99
 :s   B=zCF.INSERTNXc                    t        |ddd      \  \  }}}t        |      dk  st        |d   d      st        d      |d	d  }|xs d
}|j                  |rt        t
        j                        |j                  t        |      |_        g }|D ]C  }||j                  v r|j                  d       #|j                  | j                  ||             E |j                          |S re   )r	   r^   r   r   r?   rS   rW   r   appendrC   rA   )	r   r<   rc   r   ri   rj   rk   rB   r#   s	            r!   cf_insertnxzCFCommandsMixin.cf_insertnxt   s    +7+cg,
(9y
 y>AYy|X%Fe$$!"#t99d001199,X6CI 	4Dsyy 

1

4<<T23		4
 	
r"   z
CF.MEXISTSvaluesc                 V    |D cg c]  }t         j                  ||       }}|S c c}w r+   rZ   )r   r<   rp   r?   rB   s        r!   
cf_mexistszCFCommandsMixin.cf_mexists   s-    BHI((e4II
 Js   &z
CF.RESERVEr   c                     |j                   t        t        j                        t	        |d      \  \  }}}}|xs d}|xs d}t        |||      }|j                  |       t        S )N)z+bucketsizez+maxiterationsz
+expansionr2   r1   )r   r   )r?   r   rS   ITEM_EXISTS_MSGr	   r   r@   r   )	r   r<   r   rc   r   r   r   _r?   s	            r!   
cf_reservezCFCommandsMixin.cf_reserve   so    99 d22336BA7
30ni! (-2!&Q$X;Wef

5	r"   zCF.SCANDUMPiteratorc                 &   |j                   t        t        j                        t	        j
                         }|dk(  rP|j                   j                  |       |j                  d       |j                         }|j                          d|gS dd gS )Nr   r&   )
r?   r   rS   rW   ioBytesIOtofileseekreadclose)r   r<   rw   fss        r!   cf_scandumpzCFCommandsMixin.cf_scandump   ss    99d0011JJLq=IIQFF1IAGGIq6Mt9r"   zCF.LOADCHUNKru   datac                     |j                   4t        |j                         t        urt        t        j
                        t        j                  |      |_         |j                          t        S r+   )	r?   rR   r   r   rS   rW   	frombytesrA   r   )r   r<   ru   r   s       r!   cf_loadchunkzCFCommandsMixin.cf_loadchunk   sM    99 T#))_<P%Pd0011(2248		r"   N) r3   r4   r5   staticmethodr   r7   r6   rC   rF   r
   r   r   rS   FLAG_DO_NOT_CREATErN   rP   rU   rX   r[   r   r   rb   r   rl   ro   rr   r   FLAG_LEAVE_EMPTY_VALr   rv   r   r   rG   r"   r!   r;   r;   '   s   [  #   I{ I% IC I I (3';#<e"DRW[WnWno3+ 3e 3 3 p3 *S)=%>$FrY]YpYpq3K 3 3# 3 r3
 *S)=%>$FrY]YpYpq%K %u % % r% (3';#<e"DRW[WnWno+ e   p +c*>&?%GPRZ^ZqZqr5K 5 5# 5 s5 )CE8Bd>U>UV
; 
4s
+; 
 W
 +ceXuh?[  49  @& -xA{ 5 T#Y  B. ,s+?'@%&HRWQYZk E d3i  [ ,suclE84KdKdek S  <  f -s|BdF_F_`{ c d3i  a .U(;BdNgNgh  5 \  ir"   r;   )__doc__ry   typingr   r   r   	probablesr   r   	fakeredisr   rS   fakeredis._command_args_parsingr	   fakeredis._commandsr
   r   r   r   fakeredis._helpersr   r   r   r   r   r;   rG   r"   r!   <module>r      s?    K 	 " " A # 8 > > G G/ 2M Mr"   