a
    bg8                     @  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                   @  sj  e Zd ZdZddddddddddZdEd	d
dddZddddddZdFdd
ddddZeddddZ	dGdddddd d!Z
dHdddd	d	d$dd%d&d'd(ZdIddd	d$dd)d*d+d,Zddd
d-d.d/ZedJdddddddddd	dd d0d1d2Zddd3d4Zdddd5d6d7Zddd8d9Zddd:d;Zddd<d=Zddd>d?d@ZdddAdBdCdDZdS )K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
           )
    strintr   )podstorevector_indexvector_typevector_dimensionurl	embeddingc           	      C  sd   || _ || _|| _|| _|| _|| _zddlm} W n tyN   tdY n0 ||| _	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    u/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/jaguar.py__init__$   s    


zJaguar.__init__r   zOptional[str]bool)jaguar_api_keyreturnc                 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None)metadata_str	text_sizer%   c                 C  sr   | 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dict)querywithFiler%   c                 C  sd   | j dkr td| d i S | j|| j |}|j}zt|}|W S  ty^   i  Y S 0 dS )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(r/   N)	r   r'   r(   r   posttextjsonloads	Exception)r   r5   r6   resptxtjsr    r    r!   r0   q   s    	

z
Jaguar.runzOptional[Embeddings])r%   c                 C  s   | j S N)r   r   r    r    r!   
embeddings   s    zJaguar.embeddingsNz	List[str]zOptional[List[dict]]r   )texts	metadataskwargsr%   c                 K  sv  | j }|dd}|dd}| jd | j d | }d| }| |}	|	dkrTg S |	d }
|dkrg }|D ]}||d |  ql|}| jt|}g }|du rFd	}|D ]}d
d |D }d	|}| jd | j }d| d }||d |
 d | 7 }|| 
dd}|d| d 7 }| |d}	||	d  |d7 }qn,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rL| |d}	n| |d}	||	d  |d7 }qN|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  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  s   g | ]}t |qS r    rH   rI   r    r    r!   rL      rM   ,'z
) values (T)r   getr   r   r0   appendr   Zembed_documentslistjoinreplace
_parseMetar   ZpostFiler   )r   rB   rC   rD   vcolfilecolrE   Zpodstorevcolr2   r>   ZtextcolZ	tag_textstrA   ZidsiZvecZstr_vecZvalues_commar1   r=   nvecvvecfilepathrcZnames_commar    r    r!   	add_texts   sh    






zJaguar.add_texts   zOptional[List[str]]zList[Tuple[Document, float]])r5   kfetch_kwhereargsrC   rD   r%   c                 K  sZ  | j }| j}	| j|}
dd |
D }d|}| jd | j }d| d | d t| d t| d	 |	 }|d
7 }|dur|d| 7 }|durd|}|d| 7 }|d| 7 }|dur|d| 7 }| |}|du rg S g }|D ]l}|d }|d }|d }i }||d< |dur6|D ]}|| }|||< qt	||d}||f}|
| q|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  s   g | ]}t |qS r    rH   rJ   fr    r    r!   rL      rM   z7Jaguar.similarity_search_with_score.<locals>.<listcomp>r.   r,   zselect similarity(rR   z','topk=z	,fetch_k=z,type=z,with_score=yes,with_text=yesN&z
,metadata=z') from z where scorer8   rP   )Zpage_contentmetadata)r   r   r   embed_queryrV   r   r   r   r0   r   rT   )r   r5   rd   re   rf   rg   rC   rD   rY   vtyperA   str_embeddingsqv_commar1   r2   metaZjarrZdocs_with_scorer>   rk   r8   rP   mdmmvdoctupr    r    r!   similarity_search_with_score   sj    
	


z#Jaguar.similarity_search_with_scorezList[Document])r5   rd   rf   rC   rD   r%   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
        )rd   rf   rC   c                 S  s   g | ]\}}|qS r    r    )rJ   ru   _r    r    r!   rL   B  rM   z,Jaguar.similarity_search.<locals>.<listcomp>)rw   )r   r5   rd   rf   rC   rD   Zdocs_and_scoresr    r    r!   similarity_search-  s    zJaguar.similarity_search)r5   rD   r%   c                 K  s   | j }| j}| j|}dd |D }d|}| jd | j }d| d | d | d }	|	d	| 7 }	| |	}
t|
t	rt
|
d
krdS t|
d
 }|d dkrd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  s   g | ]}t |qS r    rH   rh   r    r    r!   rL   S  rM   z'Jaguar.is_anomalous.<locals>.<listcomp>r.   r,   zselect anomalous(z, 'z	', 'type=rO   z from r   FZ	anomalousZYEST)r   r   r   rm   rV   r   r   r0   
isinstancerU   lenr9   r:   )r   r5   rD   rY   rn   rA   ro   rp   r1   r2   r>   jdr    r    r!   is_anomalousD  s    

zJaguar.is_anomalous)rB   r   r   r   r   r   r   r   rC   r$   rD   r%   c                 K  s>   | |||||||}| |
 |  |j||	fi | |S r?   )r&   clearra   )clsrB   r   r   r   r   r   r   r   rC   r$   rD   Zjagstorer    r    r!   
from_textsa  s    
zJaguar.from_textsc                 C  s&   | j d | j }d| }| | dS )z\
        Delete all records in jaguardb
        Args: No args
        Returns: None
        r,   ztruncate store Nr   r   r0   r   r1   r2   r    r    r!   r~   x  s    zJaguar.clear)zidsrD   r%   c                 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='rN   Nr   )r   r   rD   r1   rP   r2   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   rF   )	r   r   r0   rz   rU   r{   r9   r:   r   )r   r1   r2   r>   r|   r    r    r!   count  s    
zJaguar.countc                 C  s&   | j d | j }d| }| | dS )z`
        Drop or remove a store in jaguardb
        Args: no args
        Returns: None
        r,   zdrop store Nr   r   r    r    r!   drop  s    zJaguar.dropc                 C  s   | j | j dS )zY
        Logout to cleanup resources
        Args: no args
        Returns: None
        N)r   logoutr   r@   r    r    r!   r     s    zJaguar.logout)msgr%   c                 C  sB   t dd$}td| |dd W d    n1 s40    Y  d S )Nz/tmp/debugjaguar.logazmsg=T)fileflush)openprint)r   r   r   r    r    r!   prt  s    z
Jaguar.prtz Tuple[List[str], List[str], str])nvmaprZ   r%   c           	      C  s   d}|dkr&t | }t | }n^g }g }||v rV|| |||  || }| D ]$\}}||kr^|| || q^dd |D }|||fS )Nr   c                 S  s   g | ]}t |qS r    rH   )rJ   er    r    r!   rL     rM   z%Jaguar._parseMeta.<locals>.<listcomp>)rU   keysvaluesrT   items)	r   r   rZ   r_   r]   r^   rd   vZvvec_sr    r    r!   rX     s     

zJaguar._parseMeta)r   )F)N)rb   rc   NNN)rb   NN)Nr   )__name__
__module____qualname____doc__r"   r&   r3   r0   propertyrA   ra   rw   ry   r}   classmethodr   r~   r   r   r   r   r   rX   r    r    r    r!   r
      s@     V     S     (

r
   )
__future__r   r9   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   
