o
    Zh8                     @  sv   d dl mZ d dlZd dl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 eeZG dd deZdS )	    )annotationsN)AnyListOptionalTuple)Document)
Embeddings)VectorStorec                   @  s   e Zd ZdZdPddZ	dQdRddZdSddZdTdUddZedVd!d"Z		#dWdXd*d+Z
	,	-	#	#	#dYdZd4d5Z	,	#	#d[d\d7d8Zd]d9d:Ze	#	d^d_d;d<Zd`d=d>Zdad@dAZdbdBdCZd`dDdEZd`dFdGZdcdIdJZdddNdOZd#S )eJaguara'  `Jaguar API` vector store.

    See http://www.jaguardb.com
    See http://github.com/fserv/jaguar-sdk

    Example:
       .. code-block:: python

           from langchain_community.vectorstores.jaguar import Jaguar

           vectorstore = Jaguar(
               pod = 'vdb',
               store = 'mystore',
               vector_index = 'v',
               vector_type = 'cosine_fraction_float',
               vector_dimension = 1536,
               url='http://192.168.8.88:8080/fwww/',
               embedding=openai_model
           )
    podstrstorevector_indexvector_typevector_dimensioninturl	embeddingr   c           	      C  s`   || _ || _|| _|| _|| _|| _zddlm} W n ty%   tdw ||| _	d| _
d S )Nr   )JaguarHttpClientzrCould not import jaguardb-http-client python package. Please install it with `pip install -U jaguardb-http-client` )_pod_store_vector_index_vector_type_vector_dimension
_embeddingZ%jaguardb_http_client.JaguarHttpClientr   ImportError_jag_token)	selfr   r   r   r   r   r   r   r    r    ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/jaguar.py__init__$   s   


zJaguar.__init__r   jaguar_api_keyOptional[str]returnboolc                 C  sB   |dkr	| j  }|| _| j || _| jdkrtd dS dS )aX  
        login to jaguardb server with a jaguar_api_key or let self._jag find a key
        Args:
            pod (str):  name of a Pod
            store (str):  name of a vector store
            optional jaguar_api_key (str): API key of user to jaguardb server
        Returns:
            True if successful; False if not successful
        r   z*E0001 error init(): invalid jaguar_api_keyFT)r   Z	getApiKeyZ_jaguar_api_keyloginr   loggererror)r   r#   r    r    r!   r'   @   s   


zJaguar.loginmetadata_str	text_sizeNonec                 C  st   | j d | j }	 d}||7 }|d| j d| j d7 }|d| j d7 }|d| d	7 }||d
 7 }| | dS )z
        create the vector store on the backend database
        Args:
            metadata_str (str):  columns and their types
        Returns:
            True if successful; False if not successful
        .zcreate store  (z vector(,z 'z'),z source char(256), v:text char(z),)N)r   r   r   r   r   run)r   r*   r+   podstoreqr    r    r!   createW   s   zJaguar.createFquerywithFiledictc                 C  s`   | j dkrtd| d i S | j|| j |}|j}zt|}|W S  ty/   i  Y S w )z
        Run any query statement in jaguardb
        Args:
            query (str): query statement to jaguardb
        Returns:
            None for invalid token, or
            json result string
        r   zE0005 error run(r0   )	r   r(   r)   r   posttextjsonloads	Exception)r   r5   r6   resptxtjsr    r    r!   r1   q   s   
	
z
Jaguar.runOptional[Embeddings]c                 C  s   | j S N)r   r   r    r    r!   
embeddings   s   zJaguar.embeddingsNtexts	List[str]	metadatasOptional[List[dict]]kwargsr   c                 K  sl  | j }|dd}|dd}| jd | j d | }d| }| |}	|	dkr*g S |	d }
|dkrDg }|D ]}||d |  q6|}| jt|}g }|du rd	}|D ]I}d
d |D }d	|}| jd | j }d| d }||d |
 d | 7 }|| 
dd}|d| d 7 }| |d}	||	d  |d7 }qV|S d	}|D ]}dd |D }| || |\}}}|dkr| j| j|d}|sg   S d	|}|d| 7 }dd	| d }|dd	| d 7 }| jd | j }d| d }||d |
 d | 7 }|| 
dd}|d| d 7 }|dkr"| |d}	n| |d}	||	d  |d7 }q|S )a  
        Add  texts through the embeddings and add to the vectorstore.
        Args:
          texts: list of text strings to add to the jaguar vector store.
          metadatas: Optional list of metadatas associated with the texts.
            [{"m1": "v11", "m2": "v12", "m3": "v13", "filecol": "path_file1.jpg" },
             {"m1": "v21", "m2": "v22", "m3": "v23", "filecol": "path_file2.jpg" },
             {"m1": "v31", "m2": "v32", "m3": "v33", "filecol": "path_file3.jpg" },
             {"m1": "v41", "m2": "v42", "m3": "v43", "filecol": "path_file4.jpg" }]
          kwargs: vector_index=name_of_vector_index
                  file_column=name_of_file_column

        Returns:
            List of ids from adding the texts into the vectorstore
        Zfile_columnr   text_tagr-   ztextcol data Nr   c                 S     g | ]}t |qS r    r   .0xr    r    r!   
<listcomp>       z$Jaguar.add_texts.<locals>.<listcomp>r/   zinsert into r.   z) values (''z\'z','')Fzid   c                 S  rL   r    rM   rN   r    r    r!   rQ      rR   ,'z
) values (T)r   getr   r   r1   appendr   Zembed_documentslistjoinreplace
_parseMetar   ZpostFiler   )r   rD   rF   rH   vcolfilecolrI   Zpodstorevcolr3   r?   ZtextcolZ	tag_textstrC   ZidsiZvecZstr_vecZvalues_commar2   r>   nvecvvecfilepathrcZnames_commar    r    r!   	add_texts   sj   





zJaguar.add_texts   kfetch_kwhereargsOptional[List[str]]List[Tuple[Document, float]]c                 K  sV  | j }| j}	| j|}
dd |
D }d|}| jd | j }d| d | d t| d t| d	 |	 }|d
7 }|durF|d| 7 }|durUd|}|d| 7 }|d| 7 }|dure|d| 7 }| |}|du rpg S g }|D ]4}|d }|d }|d }i }||d< |dur|D ]
}|| }|||< qt	||d}||f}|
| qt|S )a  
        Return Jaguar documents most similar to query, along with scores.
        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 3.
            lambda_val: lexical match parameter for hybrid search.
            where: the where clause in select similarity. For example a
                where can be "rating > 3.0 and (state = 'NV' or state = 'CA')"
            args: extra options passed to select similarity
            kwargs:  vector_index=vcol, vector_type=cosine_fraction_float
        Returns:
            List of Documents most similar to the query and score for each.
            List of Tuples of (doc, similarity_score):
                [ (doc, score), (doc, score), ...]
        c                 S  rL   r    rM   rO   fr    r    r!   rQ      rR   z7Jaguar.similarity_search_with_score.<locals>.<listcomp>r/   r-   zselect similarity(rW   z','topk=z	,fetch_k=z,type=z,with_score=yes,with_text=yesN&z
,metadata=z') from z where scorer9   rU   )Zpage_contentmetadata)r   r   r   embed_queryr[   r   r   r   r1   r   rY   )r   r5   ri   rj   rk   rl   rF   rH   r^   vtyperC   str_embeddingsqv_commar2   r3   metaZjarrZdocs_with_scorer?   rr   r9   rU   mdmmvdoctupr    r    r!   similarity_search_with_score   sj   
	


z#Jaguar.similarity_search_with_scoreList[Document]c                 K  s(   | j |f|||d|}dd |D S )a  
        Return Jaguar documents most similar to query, along with scores.
        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 5.
            where: the where clause in select similarity. For example a
                where can be "rating > 3.0 and (state = 'NV' or state = 'CA')"
        Returns:
            List of Documents most similar to the query
        )ri   rk   rF   c                 S  s   g | ]\}}|qS r    r    )rO   r|   _r    r    r!   rQ   B  rR   z,Jaguar.similarity_search.<locals>.<listcomp>)r~   )r   r5   ri   rk   rF   rH   Zdocs_and_scoresr    r    r!   similarity_search-  s   zJaguar.similarity_searchc                 K  s   | j }| j}| j|}dd |D }d|}| jd | j }d| d | d | d }	|	d	| 7 }	| |	}
t|
t	rFt
|
d
krFdS t|
d
 }|d dkrUdS dS )z
        Detect if given text is anomalous from the dataset
        Args:
            query: Text to detect if it is anomaly
        Returns:
            True or False
        c                 S  rL   r    rM   ro   r    r    r!   rQ   S  rR   z'Jaguar.is_anomalous.<locals>.<listcomp>r/   r-   zselect anomalous(z, 'z	', 'type=rT   z from r   FZ	anomalousZYEST)r   r   r   rt   r[   r   r   r1   
isinstancerZ   lenr:   r;   )r   r5   rH   r^   ru   rC   rv   rw   r2   r3   r?   jdr    r    r!   is_anomalousD  s   

zJaguar.is_anomalousc                 K  s>   | |||||||}| |
 |  |j||	fi | |S rA   )r'   clearrf   )clsrD   r   r   r   r   r   r   r   rF   r#   rH   Zjagstorer    r    r!   
from_textsa  s   
zJaguar.from_textsc                 C  &   | j d | j }d| }| | dS )z\
        Delete all records in jaguardb
        Args: No args
        Returns: None
        r-   ztruncate store Nr   r   r1   r   r2   r3   r    r    r!   r   x     zJaguar.clearzidsc                 K  s<   | j d | j }|D ]}d| d | d }| | q
dS )z
        Delete records in jaguardb by a list of zero-ids
        Args:
            pod (str):  name of a Pod
            ids (List[str]):  a list of zid as string
        Returns:
            Do not return anything
        r-   zdelete from z where zid='rS   Nr   )r   r   rH   r2   rU   r3   r    r    r!   delete  s
   	zJaguar.deletec                 C  sV   | j d | j }d| }| |}t|trt|dkrdS t|d }t|d S )z
        Count records of a store in jaguardb
        Args: no args
        Returns: (int) number of records in pod store
        r-   zselect count() from r   rJ   )	r   r   r1   r   rZ   r   r:   r;   r   )r   r2   r3   r?   r   r    r    r!   count  s   
zJaguar.countc                 C  r   )z`
        Drop or remove a store in jaguardb
        Args: no args
        Returns: None
        r-   zdrop store Nr   r   r    r    r!   drop  r   zJaguar.dropc                 C  s   | j | j dS )zY
        Logout to cleanup resources
        Args: no args
        Returns: None
        N)r   logoutr   rB   r    r    r!   r     s   zJaguar.logoutmsgc                 C  sD   t dd}td| |dd W d    d S 1 sw   Y  d S )Nz/tmp/debugjaguar.logazmsg=T)fileflush)openprint)r   r   r   r    r    r!   prt  s   "z
Jaguar.prtnvmapr_    Tuple[List[str], List[str], str]c           	      C  s   d}|dkrt | }t | }n/g }g }||v r+|| |||  || }| D ]\}}||krA|| || q/dd |D }|||fS )Nr   c                 S  rL   r    rM   )rO   er    r    r!   rQ     rR   z%Jaguar._parseMeta.<locals>.<listcomp>)rZ   keysvaluesrY   items)	r   r   r_   rd   rb   rc   ri   vZvvec_sr    r    r!   r]     s"   



zJaguar._parseMeta)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   )r#   r$   r%   r&   )r*   r   r+   r   r%   r,   )F)r5   r   r6   r&   r%   r7   )r%   r@   rA   )rD   rE   rF   rG   rH   r   r%   rE   )rg   rh   NNN)r5   r   ri   r   rj   r   rk   r$   rl   r$   rF   rm   rH   r   r%   rn   )rg   NN)r5   r   ri   r   rk   r$   rF   rm   rH   r   r%   r   )r5   r   rH   r   r%   r&   )Nr   )rD   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   rG   r#   r$   rH   r   r%   r
   )r%   r,   )r   rE   rH   r   r%   r,   )r%   r   )r   r   r%   r,   )r   r7   r_   r   r%   r   )__name__
__module____qualname____doc__r"   r'   r4   r1   propertyrC   rf   r~   r   r   classmethodr   r   r   r   r   r   r   r]   r    r    r    r!   r
      sB    

VS








r
   )
__future__r   r:   loggingtypingr   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr	   	getLoggerr   r(   r
   r    r    r    r!   <module>   s    
