
    љi                         S SK r S SKrS SKJrJrJrJrJrJrJ	r	J
r
  S SKrS SKrSSKJr  S\R                   S\4S jrS\S\R                   4S	 jr " S
 S\5      rg)    N)DictOptionalAnyTupleListAsyncIterableCallable	Awaitable   )BaseSpeakerStorearrreturnc           	          SSR                  [        [        U R                  [        R
                  5      R                  5       5      5      -   S-   $ )z.Convert numpy array to pgvector string format.[,])joinmapstrastypenpfloat32tolist)r   s    d/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/stt/speaker_registry/postgres.py_to_pg_vectorr   	   s8    #c3::bjj#9#@#@#BCDDsJJ    sc                 p    [         R                  " [        R                  " U 5      [         R                  S9$ )z.Convert pgvector string format to numpy array.)dtype)r   arrayjsonloadsr   )r   s    r   _from_pg_vectorr#      s    88DJJqM44r   c                      \ rS rSrSrSSSSSSSSS	S
SS.S\/ \\R                     4   S\	S\
S\	S\	S\	S\	S\	S\S\
S\
4S jjrS\R                  4S jrS\R                  4S jrS-S\	S\R                   S\\\	\4      SS4S  jjrS\	S\\R                   \\	\4   4   4S! jrS\	S"\	S#\SS4S$ jrS-S\	S"\	S%\S\4S& jjrS\\\	\R                   \\	\4   4      4S' jrS\
4S( jrS)\R                   S*\
S\\\	\4      4S+ jrS,rg).PGVectorStore   zq
PostgreSQL + pgvector store (asyncpg version).
Implements topk_similarity by DB-side ORDER BY distance LIMIT k.
N	localhosti8  aiavatarpostgresspeakersFr      )get_poolhostportdbnameuserpasswordconnection_strtable
use_cosinedb_pool_min_sizedb_pool_max_sizer,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   c                    Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        U	(       a  SOSU l        Xl	        Xl
        S U l        [        R                  " 5       U l        SU l        g )Nz<=>z<->F)_get_pool_funcr-   r.   r/   r0   r1   r2   r3   	_order_opr5   r6   _poolasyncioLock
_pool_lock_db_initialized)selfr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   s               r   __init__PGVectorStore.__init__   sa     '			 ,
",% 0 0#'
!,,.$r   r   c                   #    U R                   b  U R                  5       I S h  vN nU R                  (       dX  U R                   IS h  vN   U R                  (       d   U R                  U5      I S h  vN   SU l        S S S 5      IS h  vN   U$ U$ U R                  b  U R                  $ U R                   IS h  vN   U R                  b  U R                  sS S S 5      IS h  vN   $ U R
                  (       aB  [        R                  " U R
                  U R                  U R                  S9I S h  vN U l        Om[        R                  " U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9I S h  vN U l        U R                  U R                  5      I S h  vN   SU l        S S S 5      IS h  vN   U R                  $  GN GN GN GNp! , IS h  vN  (       d  f       U$ = f GN\ GN6 N N~ NX NC! , IS h  vN  (       d  f       U R                  $ = f7f)NT)dsnmin_sizemax_size)r-   r.   databaser0   r1   rD   rE   )r8   r>   r=   init_dbr:   r2   asyncpgcreate_poolr5   r6   r-   r.   r/   r0   r1   )r?   pools     r   r,   PGVectorStore.get_pool6   s    *,,..D''???//"ll4000/3, +? K4K ::!::???zz%zz #?? ""#*#6#6++!22!22$ 
 $+#6#6![[!]]!22!22$ 
 ,,tzz***#'D + #?. zzG /*0 +??? K #
 +) #??. zzs  !IG1%I	G4
I&G=3G74G=?I
G:1I<H=I H&I%H&I+AH&3H4A-H&!H "'H&	H"
H&I H$!I4I7G=:I=HHH	IIH& H&"H&$I&I,H/-I9IrJ   c                    #    UR                  5        IS h  vN nUR                  SU R                   S35      I S h  vN   S S S 5      IS h  vN   g  N< N N	! , IS h  vN  (       d  f       g = f7f)Nz,
                CREATE TABLE IF NOT EXISTS z (
                    id TEXT PRIMARY KEY,
                    embedding vector(256),
                    metadata jsonb NOT NULL DEFAULT '{}'::jsonb
                );
            )acquireexecuter3   )r?   rJ   conns      r   rG   PGVectorStore.init_db^   sY     <<>>T,, $,,0JJ< 8     ">> ">>>sT   A4AA4#AAAA4AA4AA4A1 A#!A1-A4
speaker_id	embeddingmetadatac                   #    [        U5      n[        R                  " U=(       d    0 5      nU R                  5       I S h  vN nUR	                  5        IS h  vN nUR                  SU R                   SU R                   S3XU5      I S h  vN   S S S 5      IS h  vN   g  Nd NM N N! , IS h  vN  (       d  f       g = f7f)Nz
                INSERT INTO z (id, embedding, metadata)
                VALUES ($1, $2::vector, $3::jsonb)
                ON CONFLICT (id) DO UPDATE
                SET embedding = EXCLUDED.embedding,
                    metadata = z/.metadata || EXCLUDED.metadata
                )r   r!   dumpsr,   rM   rN   r3   )r?   rQ   rR   rS   vec_strmd_jsonrJ   rO   s           r   upsertPGVectorStore.upserth   s     	***X^,]]_$<<>>T,,!ZZL )  !%

| , W	 	 	 ">> %!	 ">>>sk   >C B%CB'C2B-B)B-CB+ C'C)B-+C-C3B64C Cc                   #    U R                  5       I S h  vN nUR                  5        IS h  vN nUR                  SU R                   S3U5      I S h  vN nUc  [	        SU 35      e[        US   5      nUS   =(       d    0 nXV4sS S S 5      IS h  vN   $  N No NI N! , IS h  vN  (       d  f       g = f7f)Nz&SELECT embedding::text, metadata FROM z WHERE id = $1Unknown speaker_id: rR   rS   )r,   rM   fetchrowr3   KeyErrorr#   )r?   rQ   rJ   rO   rowembmds          r   getPGVectorStore.getx   s     ]]_$<<>>T8NS C {!5j\BCC!#k"23CZ&BB7 ">> %! ">>>sf   B?BB?BB?$B%B!3B%B?B#B?B?!B%#B?%B<+B.,B<8B?keyvaluec                 v  #    U R                  5       I S h  vN nUR                  5        IS h  vN nUR                  SU R                   S3[        R
                  " X#05      U5      I S h  vN nUS:X  a  [        SU 35      eS S S 5      IS h  vN   g  N Ni N- N! , IS h  vN  (       d  f       g = f7f)NzUPDATE z3 SET metadata = metadata || $1::jsonb WHERE id = $2zUPDATE 0r[   )r,   rM   rN   r3   r!   rU   r]   )r?   rQ   rc   rd   rJ   rO   results          r   set_metadataPGVectorStore.set_metadata   s     ]]_$<<>>T<<$**%XY

C<(* F #!5j\BCC ">> %! ">>>sf   B9BB9BB9:B-B.BB9BB9B9BB9B6%B(&B62B9defaultc                 ^  #    U R                  5       I S h  vN nUR                  5        IS h  vN nUR                  SU R                   S3X!5      I S h  vN nUc  [	        SU 35      eUS   c  UOUS   sS S S 5      IS h  vN   $  Nt N] N7 N! , IS h  vN  (       d  f       g = f7f)NzSELECT metadata->$1 FROM z WHERE id = $2r[   r   )r,   rM   r\   r3   r]   )r?   rQ   rc   ri   rJ   rO   r^   s          r   get_metadataPGVectorStore.get_metadata   s     ]]_$<<>>T+DJJ<~F C {!5j\BCC!!fn7#a& ">> %! ">>>sf   B-BB-BB-$BB!B9B-BB-B-BB-B*BB*&B-c                v  #    U R                  5       I S h  vN nUR                  5        IS h  vN nUR                  SU R                   35      I S h  vN nU H&  nUS   [	        US   5      US   =(       d    0 47v   M(     S S S 5      IS h  vN   g  N Ni NE N! , IS h  vN  (       d  f       g = f7f)Nz*SELECT id, embedding::text, metadata FROM idrR   rS   )r,   rM   fetchr3   r#   )r?   rJ   rO   rowsr^   s        r   	all_itemsPGVectorStore.all_items   s     ]]_$<<>>T&PQUQ[Q[P\$]^^D$i[1A!BS_EZXZ[[  ">> %!^ ">>>sf   B9BB9BB9"BB0BB9BB9B9BB9B6%B(&B62B9c                 :  #    U R                  5       I S h  vN nUR                  5        IS h  vN nUR                  SU R                   35      I S h  vN n[	        US   5      sS S S 5      IS h  vN   $  Nb NK N' N! , IS h  vN  (       d  f       g = f7f)NzSELECT COUNT(*) FROM r   )r,   rM   r\   r3   int)r?   rJ   rO   r^   s       r   countPGVectorStore.count   sg     ]]_$<<>>T(=djj\&JKKCs1v; ">> %!K ">>>sf   BA9BA;B"BA=B'B3A?4B;B=B?BBB
BBq_normkc                   #    [        SU5      n[        U5      nU R                  5       I Sh  vN nUR                  5        ISh  vN nUR	                  SU R
                   SU R                   S3X25      I Sh  vN nSSS5      ISh  vN   W Vs/ s H3  owS   [        [        R                  " [        US   5      U5      5      4PM5     sn$  N N NY NK! , ISh  vN  (       d  f       N`= fs  snf 7f)z5DB-side Top-K by distance; convert to cosine via dot.r   Nz SELECT id, embedding::text FROM z ORDER BY embedding z $1::vector LIMIT $2rn   rR   )maxr   r,   rM   ro   r3   r9   floatr   dotr#   )r?   rw   rx   rV   rJ   rO   rp   r^   s           r   topk_similarityPGVectorStore.topk_similarity   s     1I']]_$<<>>T24::,>RSWSaSaRbbvw D ">
 bffaeZ]TE"&&[9I)JF"STUaeff %! ">>>
 gsu   +C8CC8CC8
1C;C<C C8CC8:C3C8C8CC8C0C" C0,C8)r>   r8   r9   r:   r=   r2   r6   r5   r/   r-   r1   r.   r3   r0   )N) __name__
__module____qualname____firstlineno____doc__r	   r
   rH   Poolr   rt   boolr@   r,   rG   r   ndarrayr   r   r   rX   r   ra   rg   rk   r   rq   ru   r   r{   r}   __static_attributes__ r   r   r%   r%      s    ;? "  ! !% 2y667% 	%
 % % % % % % % % %<& &P',, s rzz XVZ[^`c[cVdMe qu  C E"**d38n2L,M DS Ds D3 D4 D	9S 	9s 	9S 	9TW 	9\uS"**d3PS8n5T/U!V \S 
gBJJ 
g3 
g4cSXjHYCZ 
gr   r%   )r;   r!   typingr   r   r   r   r   r   r	   r
   numpyr   rH    r   r   r   r   r#   r%   r   r   r   <module>r      s_      W W W   Krzz Kc K
5s 5rzz 5
^g$ ^gr   