
    3fig                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl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 d dlmZ e
rd dlmZ d dlZd dlmZ d dlmZ d dl m!Z! d d	l"m#Z#m$Z$  ejJ                  e&      Z' ejP                  d
d      jS                         Z* ejV                   e,ee*      d        ededef         Z-d dZ.d!dZ/d"dZ0d#dZ1e/d$d       Z2d%dZ3d&dZ4e/d'd       Z5e/	 d(	 	 	 	 	 	 	 d)d       Z6e/	 d(	 	 	 	 	 	 	 	 	 d*d       Z7e/	 d(	 	 	 	 	 	 	 	 	 d*d       Z8e/d+d       Z9e/d,d       Z: G d de!      Z;y)-    )annotationsN)TYPE_CHECKINGAnyCallableDictIterableListOptionalTupleTypeTypeVarUnioncast)NDArray)
Connection)Document)
Embeddings)VectorStore)DistanceStrategymaximal_marginal_relevance	LOG_LEVELERRORz)%(asctime)s - %(levelname)s - %(message)s)levelformatT.)boundc                &   	 dd l }t        |dd       }t        | |j                        r| S |rt        | |      r| j                         S d}|r|dz  }t        d| dt        |       j                         # t        $ r}t        d      |d }~ww xY w)Nr   IUnable to import oracledb, please install with `pip install -U oracledb`.ConnectionPoolzoracledb.Connectionz or oracledb.ConnectionPoolzExpected client of type z, got )	oracledbImportErrorgetattr
isinstancer   acquire	TypeErrortype__name__)clientr    econnection_pool_classvalid_typess        g/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/oraclevs.py_get_connectionr-   4   s     $H.>E&(--.	:f6K#L~~+ 88K&{m6$v,:O:O9PQ
 	
!  W
	s   A6 6	B?BBc                `     t        j                         d fd       }t        t        |      S )Nc                    	  | i |S # t         $ r5}t        j                  d       t        dj                  |            |d }~wt        $ r5}t        j                  d       t	        dj                  |            |d }~wt
        $ rD}t        j                  dj                  |             t        dj                  |            |d }~ww xY w)NzDB-related error occurred.zFailed due to a DB issue: {}zValidation error.zValidation failed: {}z An unexpected error occurred: {}zUnexpected error: {})RuntimeErrorlogger	exceptionr   
ValueError	Exception)argskwargsdb_errval_errr)   funcs        r,   wrapperz#_handle_exceptions.<locals>.wrapperN   s    	H((( 	9:.55f=  	S014;;GDE7R 	H?FFqIJ5<<Q?@aG	Hs,    	C0AC0B  C?CC)r5   r   r6   r   returnr   )	functoolswrapsr   r   )r9   r:   s   ` r,   _handle_exceptionsr>   M   s/    __TH H$ 7    c                4   	 dd l }	 | j                         5 }|j                  d|        	 d d d        y# t        $ r}t        d      |d }~ww xY w# 1 sw Y   y xY w# |j                  $ r)}|j
                  }|d   j                  dk(  rY d }~y d }~ww xY w)Nr   r   zSELECT COUNT(*) FROM Ti  F)r    r!   cursorexecuteDatabaseErrorr5   code)
connection
table_namer    r)   rA   exerr_objs          r,   _table_existsrI   d   s      	FNN2:,?@	 	  W
		 	 !! ''1:??c!	sM   6 A AA 	AAAAA A B.BBBc                $   | j                  d      D cg c]  }t        |       }}|j                  d      D cg c]  }t        |       }}t        ||      D ]  \  }}||k  r y||kD  s y t        |      t        |      k  S c c}w c c}w )N.TF)splitintziplen)versiontarget_versionpartversion_partstarget_partsvts          r,   _compare_versionrW   w   s    +2==+=>4SY>M>*8*>*>s*CD$CIDLD M<0 1q5U	 }L 111 ?Ds
   BBc                    d}| j                         5 }|j                  ||j                                |j                         }d d d        |d uS # 1 sw Y   d uS xY w)Nzq
        SELECT index_name 
        FROM all_indexes 
        WHERE upper(index_name) = upper(:idx_name)
        )idx_name)rA   rB   upperfetchone)rE   
index_namequeryrA   results        r,   _index_existsr_      sh    E 
			 #uz'7'7'9:"# # s   2AAc                    t         j                  dt         j                  dt         j                  di}| |v r||    S t	        d|        )N	EUCLIDEANDOTCOSINEzUnsupported distance strategy: )r   EUCLIDEAN_DISTANCEDOT_PRODUCTrc   r3   )distance_strategydistance_strategy2functions     r,   _get_distance_functionrh      s[     	++[$$e" 66)*;<< 67H6IJ
KKr?   c                j    t        t        j                               j                  dd      }|  d| S )N- _)struuiduuid4replace)	base_name	unique_ids     r,   _get_index_namers      s0    DJJL!))#r2I[)%%r?   c                R   dddd| dd}t        | |      so| j                         5 }dj                  d |j                         D              }d	| d
| d}|j	                  |       d d d        t
        j                  d       y t
        j                  d       y # 1 sw Y   5xY w)Nz&RAW(16) DEFAULT SYS_GUID() PRIMARY KEYCLOBJSONzvector(z
, FLOAT32))idtextmetadata	embedding, c              3  0   K   | ]  \  }}| d |   yw) N ).0col_namecol_types      r,   	<genexpr>z _create_table.<locals>.<genexpr>   s$      !-?Xx8*AhZ(!s   zCREATE TABLE z ()zTable created successfully...zTable already exists...)rI   rA   joinitemsrB   r1   info)rE   rF   embedding_dim	cols_dictrA   ddl_bodyddls          r,   _create_tabler      s     7}oZ8	I Z0  	 Fyy !CL??CT! H "*Rz;CNN3	  	34-.	  	 s   ABB&OracleVSc                n   t        |       }|t        d      |ry|d   dk(  r#t        ||j                  |j                  |       y |d   dk(  r#t        ||j                  |j                  |       y t        ||j                  |j                  |       y t        ||j                  |j                  |       y )NFailed to acquire a connection.idx_typeHNSWIVF)r-   r3   _create_hnsw_indexrF   rf   _create_ivf_index)r(   vector_storeparamsrE   s       r,   create_indexr      s     !(J:;;*'''..	0 % J5(''..	"  ''..	  	//1O1OQW	
 r?   c                   ddddddd}|r^|j                         }dD ]/  }||vs|dk(  rt        t        ||               ||<   (||   ||<   1 |D ]  }||vst        d	|        n|}|d   }d
| d| d}	d|v rdnd}
dt	        |       }d}d|v rd|v rd}n%d|v rd|vr|d   |d<   d}nd|vrd|v r
|d   |d<   d}d}|	|
z   |z   |z   |z   } |j
                  di |}t        | |d         s@| j                         5 }|j                  |       t        j                  d       d d d        y t        j                  d       y # 1 sw Y   y xY w)Nr          Z      )rY   r   	neighborsefConstructionaccuracyparallelrY   r   rY   Invalid parameter: zcreate vector index z on z0(embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPHr     WITH TARGET ACCURACY {accuracy}rk   
 DISTANCE r   r   zU parameters (type {idx_type}, neighbors {neighbors}, efConstruction {efConstruction})z parallel {parallel}Index created successfully...Index already exists...r~   copyrs   rm   r3   rh   r   r_   rA   rB   r1   r   rE   rF   rf   r   defaultsconfigcompulsory_keykeyrY   base_sqlaccuracy_partdistance_partparameters_partparallel_partddl_assemblyr   rA   s                    r,   r   r      s    H 6 	FNV+!Z/-<H^45.F>* .6n-EF>*	F  	>C(" #6se!<==	>  j!H
xjZL 9/ 	0  <F;O6VXM !78I!J KLMOf!1V!;; 	 
	#36#A#+,<#= ; 	 
F	"'76'A&{3{; 	 +M 	= =0?B]R  ,


'
'C VJ%78  	9FNN3KK78	9 	9 	-.		9 	9s   'E		Ec                   dddddd}|r^|j                         }dD ]/  }||vs|dk(  rt        t        ||               ||<   (||   ||<   1 |D ]  }||vst        d|        n|}|d   }d	| d
| d}	d|v rdnd}
dt	        |       }d}d|v rd|v rd|d    d|d    d}d|d    }|	|
z   |z   |z   |z   } |j
                  di |}t        | |d         s@| j                         5 }|j                  |       d d d        t        j                  d       y t        j                  d       y # 1 sw Y   5xY w)Nr   r   r   r   )rY   r   neighbor_partr   r   r   rY   r   zCREATE VECTOR INDEX z ON z,(embedding) ORGANIZATION NEIGHBOR PARTITIONSr   r   rk   r   r   r   z PARAMETERS (type z, neighbor partitions r   z
 PARALLEL r   r   r   r~   r   r   s                    r,   r   r   >  s    H 6 	FNV+!Z/-<H^45.F>* .6n-EF>*	F  	>C(" #6se!<==	>  j!H
xjZL 9+ 	,  <F;O6VXM !78I!J KLMOV6 9 
!3 4 5!/2316 	 !
!3 45M 	= =0?B]R  ,


'
'C VJ%78  	 FNN3	 34-.		  	 s   /D55D>c                   t        |       }|t        d      t        ||      rF|j                         5 }d| d}|j	                  |       ddd       t
        j                  d       yt
        j                  d       y# 1 sw Y   5xY w)zDrop a table and purge it from the database.

    Args:
        client: The OracleDB connection object.
        table_name: The name of the table to drop.

    Raises:
        RuntimeError: If an error occurs while dropping the table.
    Nr   zDROP TABLE z PURGEzTable dropped successfully...zTable not found...)r-   r3   rI   rA   rB   r1   r   )r(   rF   rE   rA   r   s        r,   drop_table_purger     s     !(J:;;Z,  	 F
|62CNN3	  	34  	()
	  	 s   BB
c                (   t        |       }|t        d      t        ||      rId| }|j                         5 }|j	                  |       t
        j                  d| d       ddd       yt
        j                  d| d       y# 1 sw Y   yxY w)zDrop an index if it exists.

    Args:
        client: The OracleDB connection object.
        index_name: The name of the index to drop.

    Raises:
        RuntimeError: If an error occurs while dropping the index.
    Nr   zDROP INDEX zIndex z has been dropped.z does not exist.)r-   r3   r_   rA   rB   r1   r   r2   )r(   r\   rE   
drop_queryrA   s        r,   drop_index_if_existsr     s     !(J:;;Z,":,/
  	AFNN:&KK&,>?@	A
  	6*-=>?
	A
 s   +BBc                  L   e Zd ZdZej
                  ddf	 	 	 	 	 	 	 	 	 	 	 ddZedd       ZddZ	ddZ
ddZe	 	 d	 	 	 	 	 	 	 	 	 dd	       Z	 	 d 	 	 	 	 	 	 	 	 	 d!dZ	 	 d 	 	 	 	 	 	 	 	 	 d"dZ	 	 d 	 	 	 	 	 	 	 	 	 d#dZed$d       Ze	 	 d 	 	 	 	 	 	 	 	 	 d%d       Ze	 d&	 	 	 	 	 	 	 	 	 d'd       Zed
dddd	 	 	 	 	 	 	 	 	 	 	 d(d       Ze	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d*d       Ze	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d+d       Zed&d,d       Zee	 d&	 	 	 	 	 	 	 	 	 	 	 d-d              Zy).r   a  `OracleVS` vector store.

    To use, you should have both:
    - the ``oracledb`` python package installed
    - a connection string associated with a OracleDBCluster having deployed an
       Search index

    Example:
        .. code-block:: python

            from langchain_classic.vectorstores import OracleVS
            from langchain_classic.embeddings.openai import OpenAIEmbeddings
            import oracledb

            with oracledb.connect(user = user, passwd = pwd, dsn = dsn) as
            connection:
                print ("Database version:", connection.version)
                embeddings = OpenAIEmbeddings()
                query = ""
                vectors = OracleVS(connection, table_name, embeddings, query)
    What is a Oracle databaseNc           	        	 dd l }d| _        t        |      }	|	t	        d      t        |	d      rL|	j                  r@|j                  dk(  rt        d      t        |j                  d      rd	| _        nd| _        nt        |j                  d      rBt        d
j                  t        t        |j                                     d      st        d      t        d
j                  t        t        |j                                     d      rd	| _        nd| _        t        |j                  d      rd	| _        	 	 || _        	 t        |t               st"        j%                  d       || _        || _        | j+                         }
|| _        || _        || _        t3        |	||
       y # t        $ r}t        d      |d }~ww xY w# |j4                  $ r)}t"        j7                  d|        t9        d      |d }~wt        $ r)}t"        j7                  d|        t9        d      |d }~wt        $ r&}t"        j7                  d       t9        d      |d }~ww xY w)Nr   r   arrayr   thinz2.1.0z?Oracle DB python thin client driver version 2.1.0 not supportedz2.2.0clobrK   z23.4z~Oracle DB python thick client driver version earlier than 2.1.0 not supported with client libraries greater than equal to 23.4zt`embedding_function` is expected to be an Embeddings object, support for passing in a function will soon be removed.z,Database error occurred while create table: z/Failed to create table due to a database error.zValidation error: z1Failed to create table due to a validation error.z6An unexpected error occurred while creating the index.z2Failed to create table due to an unexpected error.)r    r!   insert_moder-   r3   hasattrr   __version__r4   rW   r   maprm   clientversionr(   r#   r   r1   warningembedding_functionr]   get_embedding_dimensionrF   rf   r   r   rC   r2   r0   )selfr(   r   rF   rf   r]   r   r    r)   rE   r   r7   r8   rG   s                 r,   __init__zOracleVS.__init__  sS   	 #$V,
>??:v&:??##w.U  "("6"6@#) #*  !5!5w?$S(*@*@*B!CDf
  $   S(2H2H2J)K LfU#) #*  4 4g>#)  	2 DK70*=F
 '9D#DJ 88:M(DO%6D" DK*j-@w  	- 	x %% 	KF8TUA  	1';<C  	UVD	sH   F( 9A.G (	G1F==GI$G88I$H((I4!IIc                R    t        | j                  t              r| j                  S dS )a  
        A property that returns an Embeddings instance embedding_function
        is an instance of Embeddings, otherwise returns None.

        Returns:
            Optional[Embeddings]: The embedding function if it's an instance of
            Embeddings, otherwise None.
        N)r#   r   r   )r   s    r,   
embeddingszOracleVS.embeddings'  s.     $11:> ##	
 	
r?   c                r    | j                  | j                  | j                  ndg      }t        |d         S )Nrk   r   )_embed_documentsr]   rO   )r   embedded_documents     r,   r   z OracleVS.get_embedding_dimension7  s;     11::1TZZr:

 $Q'((r?   c                    t        | j                  t              r| j                  j                  |      S t	        | j                        r|D cg c]  }| j                  |       c}S t        d      c c}w )Nz:The embedding_function is neither Embeddings nor callable.)r#   r   r   embed_documentscallabler%   )r   textsrx   s      r,   r   zOracleVS._embed_documents@  si    d--z:**::5AAd--.>CDdD++D1DDL  Es   A5c                    t        | j                  t              r| j                  j                  |      S | j                  |      S N)r#   r   r   embed_query)r   rx   s     r,   _embed_queryzOracleVS._embed_queryJ  s:    d--z:**66t<<**400r?   c                h   t        |      }|rP|D cg c]D  }t        j                  |j                               j	                         dd j                         F }}n|ret        d |D              rS|D cg c]G  }t        j                  |d   j                               j	                         dd j                         I }}ny|D cg c]  }t        t        j                               ! }	}|	D cg c]D  }t        j                  |j                               j	                         dd j                         F }}| j                  |      }
|s|D cg c]  }i  }}| j                  dk(  rQt        ||
||      D cg c]3  \  }}}}|t        j                  |      t        j                  |      |f5 }}}}}nQt        ||
||      D cg c]4  \  }}}}|t        j                  d|      t        j                  |      |f6 }}}}}t!        | j"                        }|t%        d      |j'                         5 }|j)                  d| j*                   d	|       |j-                          ddd       |S c c}w c c}w c c}w c c}w c c}w c c}}}}w c c}}}}w # 1 sw Y   |S xY w)
ab  Add more texts to the vectorstore index.
        Args:
          texts: Iterable of strings to add to the vectorstore.
          metadatas: Optional list of metadatas associated with the texts.
          ids: Optional list of ids for the texts that are being added to
          the vector store.
          kwargs: vectorstore specific parameters
        N   c              3  $   K   | ]  }d |v  
 yw)rw   Nr~   )r   ry   s     r,   r   z%OracleVS.add_texts.<locals>.<genexpr>g  s     JHtx/Js   rw   r   fr   zINSERT INTO z8 (id, embedding, metadata, text) VALUES (:1, :2, :3, :4))listhashlibsha256encode	hexdigestrZ   allrm   rn   ro   r   r   rN   jsondumpsr   r-   r(   r3   rA   executemanyrF   commit)r   r   	metadatasidsr6   _idprocessed_idsry   rl   generated_idsr   id_rz   rx   docsrE   rA   s                    r,   	add_textszOracleVS.add_textsP  s   " U RUJMszz|,668"=CCEM  3J	JJ
 !* x~4467AACCRHNNPM  ,1&'DJJL!M 
 ) szz|,668"=CCEM 
 **51
%*++I+ v% 7:!:y%7 2CHd djj+TZZ-A4HD  7:!:y%7 2CHd ekk#y14::h3GND  %T[[1
>??  	 Ft/ 00 1
 	  e ,	  s8   A	I>6AJ	$J3A	J	J8J
9J
1J''J1   c                    g }t        | j                  t              r| j                  j                  |      } | j                  d|||d|}|S z"Return docs most similar to query.rz   kfilterr~   )r#   r   r   r   similarity_search_by_vector)r   r]   r   r   r6   rz   	documentss          r,   similarity_searchzOracleVS.similarity_search  s]     "$	d--z://;;EBI4D44 
1V
7=
	 r?   c                d     | j                   d|||d|}|D cg c]  \  }}|	 c}}S c c}}w )Nr   r~   )1similarity_search_by_vector_with_relevance_scores)r   rz   r   r   r6   docs_and_scoresdocrl   s           r,   r   z$OracleVS.similarity_search_by_vector  sE     Q$PP 
1V
7=
 #22Q222   ,c                    g }t        | j                  t              r| j                  j                  |      } | j                  d|||d|}|S r   )r#   r   r   r   r   )r   r]   r   r   r6   rz   r   s          r,   similarity_search_with_scorez%OracleVS.similarity_search_with_score  s]     "$	d--z://;;EBIP$PP 
1V
7=
 r?   c                >   	 dd l }d}|rvt        ||j                        r7|j	                         }t        |t
              r|j                  d      }|S |}|S t        |t              r|}|S t        dt        |            |S # t        $ r}t        d      |d }~ww xY w)Nr   r   rk   zutf-8zUnexpected type:)
r    r!   r#   LOBreadbytesdecoderm   r4   r&   )r   r^   r    r)   
clob_valueraw_datas         r,   _get_clob_valuezOracleVS._get_clob_value  s    	 
&(,,/!;;=h.!)"J  "*J
 	 FC(#
    2DLAA)  	- 	s   B 	BBBc                D   g }| j                   dk(  rt        j                  |      }nt        j                  d|      }dt	        | j
                         d| j                   d| d}t        | j                        }|t        d      |j                         5 }	|	j                  ||       |	j                         }
|
D ]  }t        |d	   t              rt        |d	         ni |rbt        fd
|j!                         D              sKt#        |d   | j%                  |d         nd      }|d   }|j'                  ||f       t#        |d   | j%                  |d         nd      }|d   }|j'                  ||f        	 d d d        |S # 1 sw Y   |S xY w)Nr   r   z
            SELECT id,
              text,
              metadata,
              vector_distance(embedding, :embedding,
              z) as distance
            FROM >
            ORDER BY distance
            FETCH APPROX FIRST  ROWS ONLY
        r   rz      c              3  J   K   | ]  \  }}j                  |      |v   y wr   getr   r   valuery   s      r,   r   zMOracleVS.similarity_search_by_vector_with_relevance_scores.<locals>.<genexpr>  s#     W*#u8<<,5W    #   rk   page_contentry      )r   r   r   r   rh   rf   rF   r-   r(   r3   rA   rB   fetchallr#   dictr   r   r   r  append)r   rz   r   r   r6   r   embedding_arrr]   rE   rA   resultsr^   r   distancery   s                 @r,   r   z:OracleVS.similarity_search_by_vector_with_relevance_scores  s     v% JJy1M!KKY7M
 &d&<&<=> ?//" #  !s #		 %T[[1
>??  	<FNN5MN:oo'G " <.8D.I4q	?r WWW& $*!9#8 !% 4 4VAY ?%'%- $*!9'..X?"  &ay4 !00;!#!)C  &ayH#**C?;5<	<B C	<B s   A0FA?FFc                P   | j                   dk(  rt        j                  |      }nt        j                  d|      }g }dt	        | j
                         d| j                   d| d}t        | j                        }|t        d      |j                         5 }	|	j                  ||       |	j                         }
|
D ]  }| j                  |d	         }t        |d
   t              r|d
   ni |r#t!        fd|j#                         D              sVt%        |      }|d   }|d   r(t'        j                  |d   t&        j(                        n$t'        j*                  dt&        j(                        }|j-                  |||f        	 d d d        |S # 1 sw Y   |S xY w)Nr   r   zy
            SELECT id,
              text,
              metadata,
              vector_distance(embedding, :embedding, z8) as distance,
              embedding
            FROM r  r  r   r  r  r	  c              3  J   K   | ]  \  }}j                  |      |v   y wr   r  r  s      r,   r   zLOracleVS.similarity_search_by_vector_returning_embeddings.<locals>.<genexpr>K  s(      %3=3HLL%.%r  r  r  r   dtyper   )r   r   r   r   rh   rf   rF   r-   r(   r3   rA   rB   r  r  r#   r  r   r   r   npfloat32emptyr  )r   rz   r   r   r6   r  r   r]   rE   rA   r  r^   page_content_strdocumentr  current_embeddingry   s                   @r,   0similarity_search_by_vector_returning_embeddingsz9OracleVS.similarity_search_by_vector_returning_embeddings   s    v% JJy1M!KKY7M	6
 #4#9#9:6

//" #  !s #	 %T[[1
>??  	NFNN5MN:oo'G! N#'#7#7q	#B (26!9d(C6!9  %AG% "  (%5 H  &ayH "!9 "**=XXarzz: & $$h:K%LM-N		N6 7	N6 s   A;FA:FF%         ?r   fetch_klambda_multr   c                  | j                  |||      }|rt        | ng g g f\  }}}	t        t        j                  |t        j
                        t        |	      ||      }
|
D cg c]  }||   ||   f }}|S c c}w )a  Return docs and their similarity scores selected using the
        maximal marginal
            relevance.

        Maximal marginal relevance optimizes for similarity to query AND
        diversity
        among selected documents.

        Args:
          self: An instance of the class
          embedding: Embedding to look up documents similar to.
          k: Number of Documents to return. Defaults to 4.
          fetch_k: Number of Documents to fetch before filtering to
                   pass to MMR algorithm.
          filter: (Optional[Dict[str, str]]): Filter by metadata. Defaults
          to None.
          lambda_mult: Number between 0 and 1 that determines the degree
                       of diversity among the results with 0 corresponding
                       to maximum diversity and 1 to minimum diversity.
                       Defaults to 0.5.
        Returns:
            List of Documents and similarity scores selected by maximal
            marginal
            relevance and score for each.
        )r   r  )r   r)  )r$  rN   r   r  r   r  r   )r   rz   r   r(  r)  r   docs_scores_embeddingsr   scoresr   mmr_selected_indicesi"mmr_selected_documents_with_scoress                r,   2max_marginal_relevance_search_with_score_by_vectorz;OracleVS.max_marginal_relevance_search_with_score_by_vector^  s    J "&!V!Vwv "W "
 -CC'(RQS 	&	6:  :HHYbjj1#	 
 0D.
*+Yq\6!9%.
* .
 21	.
s   'A<c                d    | j                  |||||      }|D 	cg c]  \  }}	|	 c}	}S c c}	}w )aZ  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND
        diversity
        among selected documents.

        Args:
          self: An instance of the class
          embedding: Embedding to look up documents similar to.
          k: Number of Documents to return. Defaults to 4.
          fetch_k: Number of Documents to fetch to pass to MMR algorithm.
          lambda_mult: Number between 0 and 1 that determines the degree
                       of diversity among the results with 0 corresponding
                       to maximum diversity and 1 to minimum diversity.
                       Defaults to 0.5.
          filter: Optional[Dict[str, Any]]
          **kwargs: Any
        Returns:
          List of Documents selected by maximal marginal relevance.
        r'  )r0  )
r   rz   r   r(  r)  r   r6   r   r   rl   s
             r,   'max_marginal_relevance_search_by_vectorz0OracleVS.max_marginal_relevance_search_by_vector  s?    < QQGV R 
 #22Q222r   c                X    | j                  |      } | j                  |f||||d|}|S )a  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND
        diversity
        among selected documents.

        Args:
          self: An instance of the class
          query: Text to look up documents similar to.
          k: Number of Documents to return. Defaults to 4.
          fetch_k: Number of Documents to fetch to pass to MMR algorithm.
          lambda_mult: Number between 0 and 1 that determines the degree
                       of diversity among the results with 0 corresponding
                       to maximum diversity and 1 to minimum diversity.
                       Defaults to 0.5.
          filter: Optional[Dict[str, Any]]
          **kwargs
        Returns:
          List of Documents selected by maximal marginal relevance.

        `max_marginal_relevance_search` requires that `query` returns matched
        embeddings alongside the match documents.
        r'  )r   r2  )	r   r]   r   r(  r)  r   r6   rz   r   s	            r,   max_marginal_relevance_searchz&OracleVS.max_marginal_relevance_search  sM    B %%e,	@D@@
#
 
	 r?   c           
        |t        d      |D cg c]D  }t        j                  |j                               j	                         dd j                         F }}dj                  t        t        |            D cg c]  }dt        |dz         z    c}      }d| j                   d| d	}t        |d
      D ci c]  \  }}d| | }	}}t        | j                        }
|
t        d      |
j                         5 }|j                  ||	       |
j!                          ddd       yc c}w c c}w c c}}w # 1 sw Y   yxY w)zDelete by vector IDs.
        Args:
          self: An instance of the class
          ids: List of ids to delete.
          **kwargs
        NzNo ids provided to delete.r   r{   z:idr  zDELETE FROM z WHERE id IN (r   )startrw   r   )r3   r   r   r   r   rZ   r   rangerO   rm   rF   	enumerater-   r(   rA   rB   r   )r   r   r6   r   
hashed_idsr.  placeholdersr   	hashed_id	bind_varsrE   rA   s               r,   deletezOracleVS.delete  sL    ;9:: NQ
FIGNN3::<(224Sb9??A

 

 yyeC
O>T!U%#a!e*"4!UVT__-^L>K 5>jPQ4R
$0AybHi
	 
 %T[[1
>??  	 FNN3	*	  	 #

 "V

	  	 s   A	D1>D6 D;#EE
c                   |j                  dd       }|t        d      |j                  di       }t        |j                  dd            }t        t        |j                  dd             }t        |t              s"t        dt        |      j                   d      |j                  d	d
      }	t        ||        | |||||	|      }
|
j                  t        |      |       |
S )Nr(   zclient parameter is required...r   rF   	langchainrf   zExpected DistanceStrategy got r}   r]   r   )r(   r   rF   rf   r]   r   )r   r   )r  r3   rm   r   r   r#   r%   r&   r'   r   r   r   )clsr   rz   r   r6   r(   r   rF   rf   r]   vsss              r,   
from_textszOracleVS.from_texts  s     jj40>>??Hb)L+>?
 fjj)<dC
 +-=>06G1H1Q1Q0RRST  

7$?@,(!/
 	DK9=
r?   )r(   r   r   z/Union[Callable[[str], List[float]], Embeddings]rF   rm   rf   r   r]   zOptional[str]r   Optional[Dict[str, Any]])r;   zOptional[Embeddings])r;   rM   )r   	List[str]r;   zList[List[float]])rx   rm   r;   List[float])NN)
r   Iterable[str]r   zOptional[List[Dict[Any, Any]]]r   Optional[List[str]]r6   r   r;   rD  )r   N)
r]   rm   r   rM   r   rC  r6   r   r;   List[Document])
rz   rE  r   rM   r   Optional[dict[str, Any]]r6   r   r;   rH  )
r]   rm   r   rM   r   rI  r6   r   r;   List[Tuple[Document, float]])r^   r   r;   rm   )
rz   rE  r   rM   r   rI  r6   r   r;   rJ  r   )
rz   rE  r   rM   r   rC  r6   r   r;   z1List[Tuple[Document, float, NDArray[np.float32]]])rz   rE  r   rM   r(  rM   r)  floatr   rC  r;   rJ  )r   r%  r&  N)rz   rE  r   rM   r(  rM   r)  rK  r   rC  r6   r   r;   rH  )r]   rm   r   rM   r(  rM   r)  rK  r   rC  r6   r   r;   rH  )r   rG  r6   r   r;   None)r@  zType[OracleVS]r   rF  rz   r   r   zOptional[List[dict]]r6   r   r;   r   )r'   
__module____qualname____doc__r   rd   r   propertyr   r   r   r   r>   r   r   r   r   r  r   r$  r0  r2  r4  r=  classmethodrB  r~   r?   r,   r   r     s   < /?.Q.Q:+/XX
X X ,X X )Xt 
 
)1  59#'	EE 2E !	E
 E 
E ET +/	  )	
  
& +/	
3
3 
3 )	
3
 
3 

3 +/	  )	
  
&   2  +/	?? ? )	?
 ? 
&? ?B 
 ,0	;; ; )	;
 ; 
;; ;z 
  +/=2=2 	=2
 =2 =2 )=2 
&=2 =2~   +/ 3 3  3 	 3
  3 ) 3  3 
 3  3D   +/)) ) 	)
 ) )) ) 
) )V    B 
 +/	$$$ $ (	$
 $ 
$  $r?   )r(   r   r;   zConnection | None)r9   r   r;   r   )rE   r   rF   rm   r;   bool)rP   rm   rQ   rm   r;   rR  )rE   r   r\   rm   r;   rR  )rf   r   r;   rm   )rq   rm   r;   rm   )rE   r   rF   rm   r   rM   r;   rL  r   )r(   r   r   r   r   rI  r;   rL  )
rE   r   rF   rm   rf   r   r   rI  r;   rL  )r(   r   rF   rm   r;   rL  )r(   r   r\   rm   r;   rL  )<
__future__r   r   r<   r   r   loggingosrn   typingr   r   r   r   r   r	   r
   r   r   r   r   r   numpy.typingr   r    r   numpyr  langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   	getLoggerr'   r1   getenvrZ   	log_levelbasicConfigr"   r   r-   r>   rI   rW   r_   rh   rs   r   r   r   r   r   r   r   r~   r?   r,   <module>ra     s	   "      	     !#  - 0 3
 
		8	$BIIk7+113	   
'9
%6 CxS)*
2.&2   "L"&
 / /(  (,""" %" 
	" "J 
 (,	P/P/P/ (P/ %	P/
 
P/ P/f 
 (,	D/D/D/ (D/ %	D/
 
D/ D/N  .  .	{ 	r?   