
    1yi                         d Z ddlmZmZ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mZ ddlmZmZmZmZ  G d d	e      Z G d
 d      Zy)z:Command mixin for emulating `redis-py`'s BF functionality.    )AnyListUnionDict)ExpandingBloomFilter)_msgs)extract_args)commandKeyCommandItemFloatInt)SimpleErrorOK	casematchSimpleStringc                   d     e Zd ZdZddededef fdZdedef fdZ	e
d	ed
edd fd       Z xZS )ScalableBloomFilterr   capacity
error_ratescalec                 4    t         |   ||       || _        y N)super__init__r   )selfr   r   r   	__class__s       [/var/www/html/content_weaver/venv/lib/python3.12/site-packages/fakeredis/stack/_bf_mixin.pyr   zScalableBloomFilter.__init__   s    :.
    keyreturnc                     || v ry| j                   | j                  k(  r2| j                  | j                  k\  rt	        t
        j                        t        t        | '  |       y)NTF)
r   	NO_GROWTHelements_addedestimated_elementsr   msgsFILTER_FULL_MSGr   r   add)r   r    r   s     r   add_itemzScalableBloomFilter.add_item   sT    $;::'D,?,?4CZCZ,Zd2233!4,S1r   bkwargsc                 ~    | j                  |      \  }}}}t        ||      }|j                  ||       ||_        |S )N)r   r   )_parse_footerr   _parse_blooms_added_elements)clsr*   r+   sizeest_els	added_elsfprblms           r   bf_frombytesz ScalableBloomFilter.bf_frombytes   sD    (+(9(9!(<%gy#!7sC!T"'
r   )d   MbP?   )__name__
__module____qualname__r#   intfloatr   bytesboolr)   classmethodr   r6   __classcell__)r   s   @r   r   r      s_    I     c  E d  U c 6K  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      ded	edefd
       Z e	d e
e      fd      ded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      efd      ded	ed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efefej*                        dedededede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eeef   f   fd       Z e	d e
       efdej*                        dededee   fd        Z e	d! e
       eefdej*                        deded"edefd#       Zy$)%BFCommandsMixinr    itemr!   c                 d    | j                   j                  |      }| j                          |rdS dS Nr      )valuer)   updated)r    rE   ress      r   _bf_addzBFCommandsMixin._bf_add&   s,    ii  &qQr   c                 &    || j                   v rdS dS )NrH   r   )rI   )r    rE   s     r   	_bf_existzBFCommandsMixin._bf_exist,   s    SYY&q.Q.r   zBF.ADD )namefixedrepeatrI   c                 .    t         j                  ||      S r   rD   rL   r   r    rI   s      r   bf_addzBFCommandsMixin.bf_add0   s    &&sE22r   zBF.CARDc                 .    |j                   j                  S r   )rI   r$   )r   r    s     r   bf_cardzBFCommandsMixin.bf_card4   s    yy'''r   zBF.MADDvaluesc                 V    |D cg c]  }t         j                  ||       }}|S c c}w r   rT   r   r    rY   rI   rK   s        r   bf_maddzBFCommandsMixin.bf_madd8   s-    @FGu&&sE2GG
 H   &z	BF.EXISTSc                 .    t         j                  ||      S r   rD   rN   rU   s      r   bf_existzBFCommandsMixin.bf_exist=   s    ((e44r   z
BF.MEXISTSc                 V    |D cg c]  }t         j                  ||       }}|S c c}w r   r_   r[   s        r   
bf_mexistszBFCommandsMixin.bf_mexistsA   s-    BHI((e4II
 Jr]   z
BF.RESERVE)rP   rQ   rR   flagsr   r   argsc                    |j                   t        t        j                        t	        |d      \  \  }}}||rt        t        j
                        |d}|rt        j                  n|}|j                  t        |||             t        S )N)
+expansion
nonscalingr9   )
rI   r   r&   ITEM_EXISTS_MSGr	   $NONSCALING_FILTERS_CANNOT_EXPAND_MSGr   r#   updater   )	r   r    r   r   rd   	expansionnon_scaling_r   s	            r   
bf_reservezBFCommandsMixin.bf_reserveF   s     99 d2233&249U&V# K! [dGGHHI1<#--)

&xUCD	r   z	BF.INSERTc                    t        |ddd      \  \  }}}}}}t        |      dk  st        |d   d      st        d      |d	d  }	|xs d
}|xs d}|j                  |rt        t
        j                        ||rt        t
        j                        |d}|rt        j                  n|}
|j                  t        |||
      |_        |	D cg c]  }| j                  ||       }}|j                          |S c c}w )N)z	+capacityz.errorrf   rg   nocreateFT)error_on_unexpectedleft_from_first_unexpectedr9   r   s   items...rH   r8   r7   )r	   lenr   r   rI   r&   NOT_FOUND_MSGri   r   r#   rL   rJ   )r   r    rd   r   r   rk   rl   	no_create	left_argsitemsr   rE   rK   s                r   	bf_insertzBFCommandsMixin.bf_insert\   s	   O[K %'+	P
LA:y+y9 y>AYy|X%Fe$$!"(5
?s99d0011 [dGGHHI1<#--)99+Hj%HCI3894t||C&99
 :s   C=zBF.INFOc                    |j                   t        |j                         t        urt        d      t	        |      dkD  rt        t
        j                        t	        |      dk(  r|j                   j                  |j                   j                  |j                   j                  dz   |j                   j                  |j                   j                  dkD  r|j                   j                  dS d dS t        |d   d      r|j                   j                  S t        |d   d      r|j                   j                  S t        |d   d      r|j                   j                  dz   S t        |d   d      r|j                   j                  S t        |d   d	      r1|j                   j                  dkD  r|j                   j                  S d S t        t
        j                        )
Nrs   rH   r   )s   Capacitys   Sizes   Number of filterss   Number of items inserteds   Expansion rates   CAPACITYs   SIZEs   FILTERSs   ITEMSs	   EXPANSION)rI   typer   r   rt   r&   SYNTAX_ERROR_MSGr%   r$   
expansionsr   r   )r   r    rd   s      r   bf_infozBFCommandsMixin.bf_infoy   s   99SYY7J Je$$t9q=d3344t9> YY9911&)ii&:&:Q&>-0YY-E-E69iioo6I399?? 
 PT  T!Wk*99///tAw(99///tAw
+99''!++tAw)99+++tAw-+.99+?+?!+C399''MMd3344r   zBF.SCANDUMPiteratorc                     |j                   t        t        j                        |dk(  rt	        |j                         }d|gS dd gS rG   )rI   r   r&   ru   r?   )r   r    r   ss       r   bf_scandumpzBFCommandsMixin.bf_scandump   sE    99d0011q=cii Aq6Mt9r   zBF.LOADCHUNKdatac                     |j                   4t        |j                         t        urt        t        j
                        |j                  t        j                  |             t        S r   )	rI   r{   r   r   r&   ru   rj   r6   r   )r   r    r   r   s       r   bf_loadchunkzBFCommandsMixin.bf_loadchunk   sJ    99 T#))_<O%Od0011

&33D9:	r   N) r:   r;   r<   staticmethodr   r?   r=   rL   rN   r
   r   r   rV   rX   r   r\   r`   rb   r   r   r&   FLAG_LEAVE_EMPTY_VALr>   r   rn   ry   r   r   r   r~   r   r   rO   r   r   rD   rD   %   s   [  #  
 /{ /% /C / / (3':#;U"CBO3+ 3e 3 3 P3 )C(;$<#>rJ(; (3 ( K( )C(;$<e#DeXV;  49  W +c*=&>%FrR5K 5 5# 5 S5 ,s+>'?&GQVPXYk E d3i  Z E

 x''	
k 
u 
 
TY 
^j 
	
 +ceXuh?[  49  @8 )CE8UH=5; 5u 5sDPSDT?T9U 5 >54 -s|BdF_F_`{ c d3i  a .U(;BdNgNgh s % L  ir   rD   N)__doc__typingr   r   r   r   	probablesr   	fakeredisr   r&   fakeredis._command_args_parsingr	   fakeredis._commandsr
   r   r   r   r   fakeredis._helpersr   r   r   r   r   rD   rO   r   r   <module>r      s<    @ ) ) * # 8 E E G G. 0 r   