
    Ng8                        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j        e          Z G d de          ZdS )	    )annotationsN)AnyListOptionalTuple)Document)
Embeddings)VectorStorec                      e Zd ZdZd?dZ	 d@dAdZdBdZdCdDdZedEd            Z		 dFdGd%Z
	 	 	 	 	 dHdId.Z	 	 	 dJdKd0ZdLd1Ze	 	 dMdNd2            ZdOd3ZdPd5ZdQd6ZdOd7ZdOd8ZdRd:ZdSd>ZdS )T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                    || _         || _        || _        || _        || _        || _        	 ddlm} n# t          $ r t          d          w xY 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
_embedding%jaguardb_http_client.JaguarHttpClientr   ImportError_jag_token)	selfr   r   r   r   r   r   r   r   s	            c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/jaguar.py__init__zJaguar.__init__$   s     	)'!1#	NNNNNNN 	 	 	O  	 %$S))	s	   3 Ar   jaguar_api_keyOptional[str]returnboolc                    |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!   	getApiKey_jaguar_api_keyloginr"   loggererror)r#   r&   s     r$   r-   zJaguar.login@   si     R!Y0022N-ioon55;"LLEFFF5t    metadata_str	text_sizeNonec                    | j         dz   | j        z   }	 d}||z  }|d| j         d| j         dz  }|d| j         dz  }|d| d	z  }||d
z   z  }|                     |           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#   r1   r2   podstoreqs        r$   createzJaguar.createW   s     9s?T[0	 	X	G$$GGd.DGGGG	($#((((	<y<<<<	\Cr0   FquerywithFiledictc                    | j         dk    r t                              d| d           i S | j                            || j         |          }|j        }	 t          j        |          }|S # t          $ r i cY S w xY 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(r8   )	r"   r.   r/   r!   posttextjsonloads	Exception)r#   r=   r>   resptxtjss         r$   r9   z
Jaguar.runq   s     ;"LL4E444555Iy~~eT[(;;i	CBI 	 	 	III	s   A+ +A:9A:Optional[Embeddings]c                    | j         S N)r   r#   s    r$   
embeddingszJaguar.embeddings   s
    r0   Ntexts	List[str]	metadatasOptional[List[dict]]kwargsr   c                   | j         }|                    dd          }|                    dd          }| j        dz   | j        z   dz   |z   }d|z   }|                     |          }	|	dk    rg S |	d         }
|dk    r$g }|D ]}|                    |dz   |z              |}| j                            t          |                    }g }|d	}|D ]}d
 |D             }d	                    |          }| j        dz   | j        z   }d|z   dz   }||dz   |
z   dz   |z   z  }||         
                    dd          }|d|z   dz   z  }|                     |d          }	|                    |	d                    |dz  }n]d	}|D ]W}d |D             }|                     ||         |          \  }}}|dk    r'| j                            | j        |d          }|sg c S d	                    |          }|d|z   z  }dd	                    |          z   dz   }|dd	                    |          z   dz   z  }| j        dz   | j        z   }d|z   dz   }||dz   |
z   dz   |z   z  }||         
                    dd          }|d|z   dz   z  }|dk    r|                     |d          }	n|                     |d          }	|                    |	d                    |dz  }Y|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
        file_columnr   text_tagr5   ztextcol data Nr   c                ,    g | ]}t          |          S  r   .0xs     r$   
<listcomp>z$Jaguar.add_texts.<locals>.<listcomp>       ///a3q66///r0   r7   zinsert into r6   z) values (''z\'z','')Fzid   c                ,    g | ]}t          |          S rY   rZ   r[   s     r$   r^   z$Jaguar.add_texts.<locals>.<listcomp>   r_   r0   ,'z
) values (T)r   getr   r   r9   appendr   embed_documentslistjoinreplace
_parseMetar!   postFiler"   )r#   rN   rP   rR   vcolfilecolrU   podstorevcolr;   rH   textcol	tag_textstrM   idsivecstr_vecvalues_commar:   rG   nvecvvecfilepathrcnames_commas                             r$   	add_textszJaguar.add_texts   sW   * !**]B//::j"--y34s:TA%XXa[[88IV*r>>I 5 5  C!!34444E_44T%[[AA
A! 
 
//3///"xx009s?T[8"X-4TCZ')M9LHHAh&&sE22US[4''XXa''

2e9%%%Q
 A!  //3///'+y|W'M'M$dHb==++DK1EEB "!			!hhtnnsTz)"UZZ%5%55;sxx'8'8 83 >>9s?T[8"X-4[3&0<?,NNAh&&sE22TCZ$&&b==!T**BB!U++B

2e9%%%Q
r0      kfetch_kwhereargsOptional[List[str]]List[Tuple[Document, float]]c                   | j         }| j        }	| j                            |          }
d |
D             }d                    |          }| j        dz   | j        z   }d|z   dz   |z   dz   t          |          z   dz   t          |          z   dz   |	z   }|d	z  }||d|z   z  }|d                    |          }|d|z   z  }|d|z   z  }||d|z   z  }|                     |          }|g S g }|D ]_}|d         }|d         }|d         }i }||d<   ||D ]}||         }|||<   t          ||          }||f}|
                    |           `|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                ,    g | ]}t          |          S rY   rZ   r\   fs     r$   r^   z7Jaguar.similarity_search_with_score.<locals>.<listcomp>       555Q#a&&555r0   r7   r5   zselect similarity(re   z','topk=z	,fetch_k=z,type=z,with_score=yes,with_text=yesN&z
,metadata=z') from z where scorerB   rb   )page_contentmetadata)r   r   r   embed_queryrj   r   r   r   r9   r   rg   )r#   r=   r   r   r   r   rP   rR   rn   vtyperM   str_embeddingsqv_commar:   r;   metajarrdocs_with_scorerH   r   rB   rb   mdmmvdoctups                              r$   similarity_search_with_scorez#Jaguar.similarity_search_with_score   s   2 !!_0077
55*55588N++9s?T[0   	
 !ff  'll  	 	
 	
,,tOA 88I&&D$$A	Z(""U""Axx{{<I 	( 	(BwKEf:DU)C BBuI$"  AABBqEEr:::C,C""3''''r0   List[Document]c                >     | j         |f|||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
        )r   r   rP   c                    g | ]\  }}|S rY   rY   )r\   r   _s      r$   r^   z,Jaguar.similarity_search.<locals>.<listcomp>B  s    222Q222r0   )r   )r#   r=   r   r   rP   rR   docs_and_scoress          r$   similarity_searchzJaguar.similarity_search-  sJ    $ <$;
ey
 
<B
 
 32/2222r0   c                   | j         }| j        }| j                            |          }d |D             }d                    |          }| j        dz   | j        z   }d|z   dz   |z   dz   |z   dz   }	|	d|z   z  }	|                     |	          }
t          |
t                    rt          |
          d	k    rd
S t          j        |
d	                   }|d         dk    rd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                ,    g | ]}t          |          S rY   rZ   r   s     r$   r^   z'Jaguar.is_anomalous.<locals>.<listcomp>S  r   r0   r7   r5   zselect anomalous(z, 'z	', 'type=ra   z from r   F	anomalousYEST)r   r   r   r   rj   r   r   r9   
isinstanceri   lenrC   rD   )r#   r=   rR   rn   r   rM   r   r   r:   r;   rH   jds               r$   is_anomalouszJaguar.is_anomalousD  s     !!_0077
55*55588N++9s?T[0$&.9KG%ORVV	X  XXa[[b$ 	CGGqLL5Z1k?e##4ur0   c           	          | |||||||          }|                     |
           |                                  |j        ||	fi | |S rK   )r-   clearr~   )clsrN   r   r   r   r   r   r   r   rP   r&   rR   jagstores                r$   
from_textszJaguar.from_textsa  sk     3k3CS)
 
 	~&&&5)66v666r0   c                ^    | j         dz   | j        z   }d|z   }|                     |           dS )z\
        Delete all records in jaguardb
        Args: No args
        Returns: None
        r5   ztruncate store Nr   r   r9   r#   r:   r;   s      r$   r   zJaguar.clearx  s3     9s?T[0(r0   zidsc                z    | j         dz   | j        z   }|D ]%}d|z   dz   |z   dz   }|                     |           &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
        r5   zdelete from z where zid='r`   Nr   )r#   r   rR   r:   rb   r;   s         r$   deletezJaguar.delete  sY     9s?T[0 	 	C)N:S@3FAHHQKKKK	 	r0   c                   | j         dz   | j        z   }d|z   }|                     |          }t          |t                    rt          |          dk    rdS t          j        |d                   }t          |d                   S )z
        Count records of a store in jaguardb
        Args: no args
        Returns: (int) number of records in pod store
        r5   zselect count() from r   rV   )	r   r   r9   r   ri   r   rC   rD   r   )r#   r:   r;   rH   r   s        r$   countzJaguar.count  sw     9s?T[0"X-XXa[[b$ 	CGGqLL1Z12f:r0   c                ^    | j         dz   | j        z   }d|z   }|                     |           dS )z`
        Drop or remove a store in jaguardb
        Args: no args
        Returns: None
        r5   zdrop store Nr   r   s      r$   dropzJaguar.drop  s3     9s?T[0H$r0   c                D    | j                             | j                   dS )zY
        Logout to cleanup resources
        Args: no args
        Returns: None
        N)r!   logoutr"   rL   s    r$   r   zJaguar.logout  s"     		%%%%%r0   msgc                    t          dd          5 }t          d| |d           d d d            d S # 1 swxY w Y   d S )Nz/tmp/debugjaguar.logazmsg=T)fileflush)openprint)r#   r   r   s      r$   prtz
Jaguar.prt  s    (#.. 	7$,,,T6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   488nvmapro    Tuple[List[str], List[str], str]c                   d}|dk    rCt          |                                          }t          |                                          }ng }g }||v r8|                    |           |                    ||                    ||         }|                                D ]5\  }}||k    r*|                    |           |                    |           6d |D             }|||fS )Nr   c                ,    g | ]}t          |          S rY   rZ   )r\   es     r$   r^   z%Jaguar._parseMeta.<locals>.<listcomp>  s    '''Q#a&&'''r0   )ri   keysvaluesrg   items)	r#   r   ro   r{   ry   rz   r   vvvec_ss	            r$   rl   zJaguar._parseMeta  s    b==

%%D''DDDD%G$$$E'N+++ > # #1<<KKNNNKKNNN''$'''VX%%r0   )r   r   r   r   r   r   r   r   r   r   r   r   r   r	   )r   )r&   r'   r(   r)   )r1   r   r2   r   r(   r3   )F)r=   r   r>   r)   r(   r?   )r(   rI   rK   )rN   rO   rP   rQ   rR   r   r(   rO   )r   r   NNN)r=   r   r   r   r   r   r   r'   r   r'   rP   r   rR   r   r(   r   )r   NN)r=   r   r   r   r   r'   rP   r   rR   r   r(   r   )r=   r   rR   r   r(   r)   )Nr   )rN   rO   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   rP   rQ   r&   r'   rR   r   r(   r   )r(   r3   )r   rO   rR   r   r(   r3   )r(   r   )r   r   r(   r3   )r   r?   ro   r   r(   r   )__name__
__module____qualname____doc__r%   r-   r<   r9   propertyrM   r~   r   r   r   classmethodr   r   r   r   r   r   r   rl   rY   r0   r$   r   r      s        *   < )+    .   4    *    X +/Q Q Q Q Ql #")-N N N N Nf #)-3 3 3 3 3.   :  +/(*    [,            & & & &7 7 7 7& & & & & &r0   r   )
__future__r   rC   loggingtypingr   r   r   r   langchain_core.documentsr   langchain_core.embeddingsr	   langchain_core.vectorstoresr
   	getLoggerr   r.   r   rY   r0   r$   <module>r      s    " " " " " "   - - - - - - - - - - - - - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3		8	$	$y& y& y& y& y&[ y& y& y& y& y&r0   