
    g3fi*                        d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ  ede      Zdd	Z G d
 de      Z ddZ!	 	 	 	 	 	 ddZ"y)z7Utilities for batching operations in a background task.    )annotationsN)CallableIterable)AnyLiteralTypeVar)NOT_PROVIDED	BaseStoreGetOpItemListNamespacesOpMatchConditionNamespacePathNotProvidedOpPutOpResult
SearchItemSearchOp_ensure_refresh_ensure_ttl_validate_namespaceF)boundc                D     t        j                         d fd       }|S )Nc                   j                   }	 t        j                         }|| j                  u r=|r	d| d| dnd}t        j                  d| j
                  j                    d| d      	  | g|i |S # t        $ r Y w xY w)NzSpecifically, replace `store.z(...)` with `await store.az(...)zBFor example, replace `store.get(...)` with `await store.aget(...)`zSynchronous calls to z detected in the main event loop. This can lead to deadlocks or performance issues. Please use the asynchronous interface for main thread operations.  )__name__asyncioget_running_loop_loopInvalidStateError	__class__RuntimeError)storeargskwargsmethod_namecurrent_loopreplacement_strfuncs         X/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langgraph/store/base/batch.pywrapperz_check_loop.<locals>.wrapper"   s    ==	"335Lu{{* # 4K=@Z[fZgglm]  
 //+EOO,D,D+E FY ''q*  + E+D+F++  		s   AA; ;	BB)r%   AsyncBatchedBaseStorer&   r   r'   r   returnr   )	functoolswraps)r+   r-   s   ` r,   _check_loopr2   !   s%    __T, ,( N    c                      e Zd ZdZdZd fdZddZddZdd	 	 	 	 	 	 	 ddZddd	d
dd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ		 de
d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddddd
d	 	 	 	 	 	 	 	 	 	 	 ddZed d       Zedd	 	 	 	 	 	 	 dd       Zeddd	d
dd	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 de
d	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Zeddddd
d	 	 	 	 	 	 	 	 	 	 	 dd       Z xZS )!r.   z2Efficiently batch operations in a background task.)r!   _aqueue_taskc                    t         |           t        j                         | _        t        j
                         | _        d | _        | j                          y N)	super__init__r   r    r!   Queuer5   r6   _ensure_task)selfr#   s    r,   r:   zAsyncBatchedBaseStore.__init__?   s>    --/
AH*.
r3   c                r    	 | j                   r| j                   j                          y y # t        $ r Y y w xY wr8   )r6   cancelr$   r=   s    r,   __del__zAsyncBatchedBaseStore.__del__F   s5    	zz

!!#  		s   &* 	66c                    | j                   | j                   j                         rH| j                  j                  t	        | j
                  t        j                  |                   | _         yy)z1Ensure the background processing loop is running.N)r6   doner!   create_task_runr5   weakrefrefr@   s    r,   r<   z"AsyncBatchedBaseStore._ensure_taskM   sH    ::!2//T\\7;;tCT0UVDJ "3r3   Nrefresh_ttlc                  K   | j                          | j                  j                         }| j                  j	                  |t        ||t        | j                  |            f       | d {   S 7 wNrH   )r<   r!   create_futurer5   
put_nowaitr   r   
ttl_config)r=   	namespacekeyrI   futs        r,   agetzAsyncBatchedBaseStore.agetR   sh      	jj&&( / M		
 yys   A-A6/A40A6
   r   queryfilterlimitoffsetrI   c                 K   | j                          | j                  j                         }| j                  j	                  |t        |||||t        | j                  |            f       | d {   S 7 wrK   )r<   r!   rL   r5   rM   r   r   rN   )r=   namespace_prefixrU   rV   rW   rX   rI   rQ   s           r,   asearchzAsyncBatchedBaseStore.asearchg   sq      	jj&&($ / M
	
 yys   A0A92A73A9ttlc               
  K   | j                          t        |       | j                  j                         }| j                  j                  |t        ||||t        | j                  |            f       | d {   S 7 w)Nr\   )	r<   r   r!   rL   r5   rM   r   r   rN   )r=   rO   rP   valueindexr]   rQ   s          r,   aputzAsyncBatchedBaseStore.aput   ss      	I&jj&&(sE5k$//SV6W	
 yys   A:B<B=Bc                   K   | j                          | j                  j                         }| j                  j	                  |t        ||d       f       | d {   S 7 wr8   )r<   r!   rL   r5   rM   r   )r=   rO   rP   rQ   s       r,   adeletezAsyncBatchedBaseStore.adelete   sP     
 	jj&&(eIsD&A BCyys   AA!AA!d   prefixsuffix	max_depthrW   rX   c               \  K   | j                          | j                  j                         }g }|r|j                  t	        d|             |r|j                  t	        d|             t        t        |      |||      }| j                  j                  ||f       | d {   S 7 w)Nrf   )
match_typepathrg   )match_conditionsrh   rW   rX   )	r<   r!   rL   appendr   r   tupler5   rM   )	r=   rf   rg   rh   rW   rX   rQ   rl   ops	            r,   alist_namespacesz&AsyncBatchedBaseStore.alist_namespaces   s      	jj&&(##NhV$TU##NhV$TU"#34	
 	b	*yys   B#B,%B*&B,c                |    t        j                  | j                  |      | j                        j	                         S r8   )r   run_coroutine_threadsafeabatchr!   result)r=   opss     r,   batchzAsyncBatchedBaseStore.batch   s+    //C0@$**MTTVVr3   c                   t        j                  | j                  |||      | j                        j	                         S )N)rP   rI   )r   rr   rR   r!   rt   )r=   rO   rP   rI   s       r,   getzAsyncBatchedBaseStore.get   s6     //IIiSkIBDJJ

&(	r3   c         
         t        j                  | j                  ||||||      | j                        j	                         S )NrT   )r   rr   r[   r!   rt   )r=   rZ   rU   rV   rW   rX   rI   s          r,   searchzAsyncBatchedBaseStore.search   sL     //LL '   JJ

 &(
	r3   c                   t        |       t        j                  | j                  ||||t	        | j
                  |            | j                        j                          y )N)rP   r_   r`   r]   )r   r   rr   ra   r   rN   r!   rt   )r=   rO   rP   r_   r`   r]   s         r,   putzAsyncBatchedBaseStore.put   sW     	I&((II5   JJ		
 &(r3   c                    t        j                  | j                  ||      | j                        j	                          y )N)rP   )r   rr   rc   r!   rt   )r=   rO   rP   s      r,   deletezAsyncBatchedBaseStore.delete   s/     	((LLL,djj	

&(r3   c          	         t        j                  | j                  |||||      | j                        j	                         S )Nre   )r   rr   rp   r!   rt   )r=   rf   rg   rh   rW   rX   s         r,   list_namespacesz%AsyncBatchedBaseStore.list_namespaces  sK     //!!# "  JJ	
 &(		r3   )r/   None)rO   tuple[str, ...]rP   strrI   bool | Noner/   zItem | None)rZ   r   rU   z
str | NonerV   zdict[str, Any] | NonerW   intrX   r   rI   r   r/   zlist[SearchItem]r8   )rO   r   rP   r   r_   zdict[str, Any]r`   z!Literal[False] | list[str] | Noner]   zfloat | None | NotProvidedr/   r   )rO   r   rP   r   r/   r   )rf   NamespacePath | Nonerg   r   rh   z
int | NonerW   r   rX   r   r/   zlist[tuple[str, ...]])ru   zIterable[Op]r/   zlist[Result])r   
__module____qualname____doc__	__slots__r:   rA   r<   rR   r[   r	   ra   rc   rp   r2   rv   rx   rz   r|   r~   r   __classcell__)r#   s   @r,   r.   r.   :   s   <-IW $(" 
 ! 
4 !(,#')
  &   ! 
B 48 +7"  	
 1 ( 
,"  
	 (,'+ $ % %	
    
4 W W  $(	"	 	
 !	 
	 	  !(,#')
  &   ! 
 .  48 +7"  	
 1 ( 
 * "  
	   (,'+ $ % %	
    
 r3   r.   c                   t        |       dk  rdt        |       fS g }g }i }| D ]  }t        |t        t        t
        f      r"	 |j                  |j                  |             @t        |t              rr|j                  |j                  f}||v r||   }|||<   |j                  |       t        |      ||<   |j                  t        |             |j                  |       |j                  t        |             |j                  |        ||fS # t        $ r/ |j                  t        |             |j                  |       Y *w xY w)a  Dedupe operations while preserving order for results.

    Args:
        values: List of operations to dedupe

    Returns:
        Tuple of (listen indices, deduped operations)
        where listen indices map deduped operation results back to original positions
       N)lenlist
isinstancer   r   r   rm   r`   
ValueErrorr   rO   rP   )valuesdeduppedlistenputsro   putkeyixs          r,   _dedupe_opsr     s-    6{aT&\!!HF35D  b5(,<=>$hnnR01 E"llBFF+F~&\!b!"8}Vc(m,# MM#h-(OOB+ . 8'  $c(m,#$s    D4EEc                   K   | j                          d {   x}r |       x}r	 |g}	 | j                         x}r$|j                  |       | j                         x}r$|D cg c]  }|d   	 }}|D cg c]  }|d   	 }}	 t        |      \  }}|j                  |       d {   }	||D 
cg c]  }
|	|
   	 }	}
t        ||	d      D ]'  \  }}|j                         r|j                  |       ) 	 ~ny | j                          d {   x}ry y 7 # t        j                  $ r Y w xY wc c}w c c}w 7 c c}
w # t        $ r3}|D ]$  }|j                         r|j                  |       & Y d }~d }~ww xY w# ~w xY w7 {w)Nr   r   F)strict)rx   
get_nowaitrm   r   
QueueEmptyr   rs   ziprC   
set_result	Exceptionset_exception)aqueuer%   itemsitemsfutsr   r   r   resultsr   rQ   rt   es                 r,   rE   rE   F  s     

$
$$
$<1<"("3"3"55$5T* #)"3"3"55$5
 -22DQ22.34d$q'441'26':$FH$%HHX$66G)9?"@272;"@"@ (+4'G 3V"xxzNN623 G 

$
$$
$$ ))  34 7"@ ! 1# 1"xxz--a011 C %s   FDFF 5D !F %D61F 7D;F "E (E )
E 3E?&E &E 9F :FFFFD30F 2D33F  E E 	FE>&E>9F >FF F		F)r+   r   r/   r   )r   zlist[Op]r/   z!tuple[list[int] | None, list[Op]])r   z(asyncio.Queue[tuple[asyncio.Future, Op]]r%   z weakref.ReferenceType[BaseStore]r/   r   )#r   
__future__r   r   r0   rF   collections.abcr   r   typingr   r   r   langgraph.store.baser	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r.   r   rE    r3   r,   <module>r      s}    = "    . ( (    & Cx 2^I ^B(V'4'+' 
'r3   