Ë
    µŒj·Y  ã                  óø   — d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ  ej0                  «       Zdd
„Z G d„ de«      Z G d„ de«      Z G d„ de«      Zy)é    )ÚannotationsN)Úsha1)ÚThread)ÚAnyÚDictÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings)ÚVectorStore)ÚBaseSettingsÚSettingsConfigDictc                ó   — |D ]  }|| vsŒ y y)zÔ
    Check if a string contains multiple substrings.
    Args:
        s: string to check.
        *args: substrings to check.

    Returns:
        True if all substrings are in the string, False otherwise.
    FT© )ÚsÚargsÚas      úr/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/vectorstores/myscale.pyÚhas_mul_sub_strr      s   € ó ˆØ�AŠ:Ùð ð ó    c                  óÈ   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZd	ed<   dZ	ded<   dZ
ded<   dddddœZded<   dZded<   dZded<   dZded<   d#d„Z eddd d!¬"«      Zy)$ÚMyScaleSettingsa®  MyScale client configuration.

    Attribute:
        myscale_host (str) : An URL to connect to MyScale backend.
                             Defaults to 'localhost'.
        myscale_port (int) : URL port to connect with HTTP. Defaults to 8443.
        username (str) : Username to login. Defaults to None.
        password (str) : Password to login. Defaults to None.
        index_type (str): index type string.
        index_param (dict): index build parameter.
        database (str) : Database name to find the table. Defaults to 'default'.
        table (str) : Table name to operate on.
                      Defaults to 'vector_table'.
        metric (str) : Metric to compute distance,
                       supported are ('L2', 'Cosine', 'IP'). Defaults to 'Cosine'.
        column_map (Dict) : Column type map to project column name onto langchain
                            semantics. Must have keys: `text`, `id`, `vector`,
                            must be same size to number of columns. For example:
                            .. code-block:: python

                                {
                                    'id': 'text_id',
                                    'vector': 'text_embedding',
                                    'text': 'text_plain',
                                    'metadata': 'metadata_dictionary_in_json',
                                }

                            Defaults to identity map.

    Ú	localhostÚstrÚhostiû   ÚintÚportNúOptional[str]ÚusernameÚpasswordÚMSTGÚ
index_typezOptional[Dict[str, str]]Úindex_paramÚidÚtextÚvectorÚmetadata)r&   r'   r(   r)   zDict[str, str]Ú
column_mapÚdefaultÚdatabaseÚ	langchainÚtableÚCosineÚmetricc                ó   — t        | |«      S ©N)Úgetattr)ÚselfÚitems     r   Ú__getitem__zMyScaleSettings.__getitem__U   s   € Ü�t˜TÓ"Ð"r   z.envúutf-8Úmyscale_Úignore)Úenv_fileÚenv_file_encodingÚ
env_prefixÚextra)r5   r   Úreturnr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r!   r"   r$   r%   r*   r,   r.   r0   r6   r   Úmodel_configr   r   r   r   r   !   sŸ   … ñð> €Dˆ#ÓØ€Dˆ#Óà"€HˆmÓ"Ø"€HˆmÓ"à€J�ÓØ,0€KÐ)Ó0ð ØØØñ	"€J�ó ð €HˆcÓØ€Eˆ3ÓØ€FˆCÓó#ñ &ØØ!ØØô	�Lr   r   c                  ót  ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zdd„Zdd„Zdd„Z		 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Z
e	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zdd	„Z	 d	 	 	 	 	 	 	 dd
„Z	 d	 	 	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 	 	 d d„Zd!d„Z	 	 d"	 	 	 	 	 	 	 d#d„Zedd„«       Zˆ xZS )$ÚMyScalea‘  `MyScale` vector store.

    You need a `clickhouse-connect` python package, and a valid account
    to connect to MyScale.

    MyScale can not only search with simple vector indexes.
    It also supports a complex query with multiple conditions,
    constraints and even sub-queries.

    For more information, please visit
        [myscale official site](https://docs.myscale.com/en/overview/)
    c                óÀ  •— 	 ddl m} 	 ddlm} || _        t
        ‰| �  «        |�|| _        nt        «       | _        | j                  sJ ‚| j                  j                  r| j                  j                  sJ ‚| j                  j                  rB| j                  j                  r,| j                  j                  r| j                  j                  sJ ‚dD ]  }|| j                  j                  v rŒJ ‚ | j                  j                  j                  «       dv sJ ‚| j                  j                  d	v rt         j#                  d
«       t%        |j'                  d«      «      }| j                  j(                  rPddj+                  | j                  j(                  j-                  «       D ��cg c]  \  }}d|› d|› d�‘Œ c}}«      z   nd}	d| j                  j                  › d| j                  j                  › d| j                  j                  d   › d| j                  j                  d   › d| j                  j                  d   › d| j                  j                  d   › d| j                  j                  d   › d|› d| j                  j                  d   › d| j                  j.                  › d| j                  j                  › d|	› d| j                  j                  d   › d �}
|| _        d!| _        d"| _        || _        | j                  j                  j                  «       d#v rd$nd%| _         |d+| j                  j                  | j                  j                  | j                  j:                  | j                  j<                  d&œ|¤Ž| _        	 | j>                  jA                  d'«       | j>                  jA                  d*«       | j>                  jA                  |
«       y# t        $ r t        d«      ‚w xY w# t        $ r d„ | _        Y �Œüw xY wc c}}w # tB        $ r7}t         jE                  d(| j>                  jF                  › d)�«       Y d}~Œ¨d}~ww xY w),zóMyScale Wrapper to LangChain

        embedding (Embeddings):
        config (MyScaleSettings): Configuration to MyScale Client
        Other keyword arguments will pass into
            [clickhouse-connect](https://docs.myscale.com/)
        r   )Ú
get_clientzlCould not import clickhouse connect python package. Please install it with `pip install clickhouse-connect`.)Útqdmc                ó   — | S r2   r   )Úxs    r   Ú<lambda>z"MyScale.__init__.<locals>.<lambda>ˆ   s   € ¡1r   N)r&   r(   r'   r)   )ÚIPÚCOSINEÚL2)ÚipÚcosineÚl2z_Lower case metric types will be deprecated the future. Please use one of ('IP', 'Cosine', 'L2')ztry this outú, Ú,Ú'Ú=Ú z(
            CREATE TABLE IF NOT EXISTS Ú.z(
                r&   z String,
                r'   r(   z! Array(Float32),
                r)   zP JSON,
                CONSTRAINT cons_vec_len CHECK length(                    z) = z$,
                VECTOR INDEX vidx z                     TYPE z&(                        'metric_type=z,)
            ) ENGINE = MergeTree ORDER BY z	
        Ú\)rY   rU   )rN   rO   ÚASCÚDESC)r   r   r!   r"   z"SET allow_experimental_json_type=1zClickhouse version=z6 - There is no allow_experimental_json_type parameter.z$SET allow_experimental_object_type=1r   )$Úclickhouse_connectrH   ÚImportErrorrI   ÚpgbarÚsuperÚ__init__Úconfigr   r   r   r*   r,   r.   r0   ÚupperÚloggerÚwarningÚlenÚembed_queryr%   ÚjoinÚitemsr$   ÚdimÚBSÚmust_escapeÚ_embeddingsÚ
dist_orderr!   r"   ÚclientÚcommandÚ	ExceptionÚdebugÚserver_version)r4   Ú	embeddingra   ÚkwargsrH   rI   Úkri   ÚvÚindex_paramsÚschema_Ú_Ú	__class__s               €r   r`   zMyScale.__init__n   s  ø€ ð	Ý5ð	%Ý!àˆDŒJô 	‰ÑÔØÐØ ˆD�Kä)Ó+ˆDŒKØ�{Š{Ðˆ{Ø�{‰{×Ò D§K¡K×$4Ò$4Ð4Ð4à�K‰K×"Ò"Ø—‘×$Ò$Ø—‘×!Ò!Ø—‘×"Ò"ð		
ð#ó
 6ˆAØ˜Ÿ™×.Ñ.Ò.Ð.Ð.ð 6à�{‰{×!Ñ!×'Ñ'Ó)Ð-CÑCÐCÐCØ�;‰;×ÑÐ!7Ñ7Ü�N‰NðGôô �)×'Ñ'¨Ó7Ó8ˆð �{‰{×&Ò&ð �3—8‘8°d·k±k×6MÑ6M×6SÑ6SÔ6UÔVÑ6U©d¨a°˜q   1 Q C qš\Ð6UÒVÓWÒWàð 	ð
(Ø(,¯©×(<Ñ(<Ð'=¸Q¸t¿{¹{×?PÑ?PÐ>Qð RØ—‘×'Ñ'¨Ñ-Ð.ð /Ø—‘×'Ñ'¨Ñ/Ð0ð 1Ø—‘×'Ñ'¨Ñ1Ð2ð 3Ø—‘×'Ñ'¨
Ñ3Ð4ð 5à—[‘[×+Ñ+¨HÑ5Ð6°d¸3¸%ð @#Ø#'§;¡;×#9Ñ#9¸(Ñ#CÐ"Dð EØŸ+™+×0Ñ0Ð1ð 2&Ø&*§k¡k×&8Ñ&8Ð%9¸¸<¸.ð I+Ø+/¯;©;×+AÑ+AÀ$Ñ+GÐ*Hð I	ðˆð ˆŒØˆŒØ&ˆÔØ$ˆÔà—[‘[×'Ñ'×-Ñ-Ó/Ð3CÑC‰EÈð 	Œñ
 !ð 
Ø—‘×!Ñ!Ø—‘×!Ñ!Ø—[‘[×)Ñ)Ø—[‘[×)Ñ)ñ	
ð
 ñ
ˆŒð	Ø�K‰K×ÑÐ DÔEð 	�‰×ÑÐBÔCØ�‰×Ñ˜GÕ$øô_ ò 	ÜðKóð ð	ûô ò 	%á$ˆD�Jð	%üó: WøôF ò 	Ü�L‰LØ% d§k¡k×&@Ñ&@Ð%Að BFð F÷ñ ûð	ús:   ƒO' ŠO? Æ-PÎP Ï'O<Ï?PÐPÐ	QÐ&-QÑQc                ó   — | j                   S r2   )rl   ©r4   s    r   Ú
embeddingszMyScale.embeddingsÎ   s   € à×ÑÐr   c                ó8   ‡ — dj                  ˆ fd„|D «       «      S )NrW   c              3  ó^   •K  — | ]$  }|‰j                   v r‰j                  › |› �n|–— Œ& y ­wr2   )rk   rj   )Ú.0Úcr4   s     €r   Ú	<genexpr>z%MyScale.escape_str.<locals>.<genexpr>Ó   s2   øè ø€ ÐVÑPUÈ1¨!¨t×/?Ñ/?Ñ*?˜$Ÿ'™'˜ 1 #‘ÀQÓFÑPUùs   ƒ*-)rg   )r4   Úvalues   ` r   Ú
escape_strzMyScale.escape_strÒ   s   ø€ Ø�w‰wÓVÑPUÓVÓVÐVr   c                óp  — dj                  |«      }g }|D ]R  }dj                  |D �cg c]   }d| j                  t        |«      «      › d�‘Œ" c}«      }|j                  d|› d�«       ŒT d| j                  j
                  › d| j                  j                  › d|› ddj                  |«      › d�	}|S c c}w )	NrT   rU   Ú(Ú)z8
                INSERT INTO TABLE 
                    rX   z))
                VALUES
                z
                )rg   r„   r   Úappendra   r,   r.   )r4   ÚtransacÚcolumn_namesÚksÚ_dataÚnÚ_nÚi_strs           r   Ú_build_istrzMyScale._build_istrÕ   sÀ   € Ø�X‰X�lÓ#ˆØˆÛˆAØ—‘ÁAÓFÁA¸b˜A˜dŸo™o¬c°"«gÓ6Ð7°qÒ9ÀAÑFÓGˆAØ�L‰L˜1˜Q˜C˜q˜Õ"ð ðà—[‘[×)Ñ)Ð*¨!¨D¯K©K×,=Ñ,=Ð+>¸aÀ¸tð Dà—‘˜%“Ð!ð "ð	ˆð ˆùò Gs   ¨%B3
c                ó^   — | j                  ||«      }| j                  j                  |«       y r2   )r�   rn   ro   )r4   r‰   rŠ   Ú_i_strs       r   Ú_insertzMyScale._insertã   s&   € Ø×!Ñ! '¨<Ó8ˆØ�‰×Ñ˜FÕ#r   c           	     ó¬  — |xs6 |D �cg c]*  }t        |j                  d«      «      j                  «       ‘Œ, c}}| j                  j                  }g }|d   ||d   ||d   t        | j                  j                  |«      i}	|xs |D �
cg c]  }
i ‘Œ c}
}t        t        j                  |«      |	|d   <   t        t        |«      t        |	«      z
  «      dk\  sJ ‚t        |	j                  «       Ž \  }}	 d}| j                  t        |Ž dt        |«      ¬	«      D ]¢  }t        ||j                  | j                  j                  d   «         «      | j                   k(  sJ ‚|j#                  |«       t        |«      |k(  sŒf|r|j%                  «        t'        | j(                  ||g¬
«      }|j+                  «        g }Œ¤ t        |«      dkD  r$|r|j%                  «        | j)                  ||«       |D �cg c]  }|‘Œ c}S c c}w c c}
w c c}w # t,        $ r:}t.        j1                  dt3        |«      › dt5        |«      › d�«       g cY d}~S d}~ww xY w)aŸ  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            ids: Optional list of ids to associate with the texts.
            batch_size: Batch size of insertion
            metadata: Optional column data to be inserted

        Returns:
            List of ids from adding the texts into the vectorstore.

        r7   r&   r'   r(   r)   r   NzInserting data...)ÚdescÚtotal)Útargetr   ú	[91m[1mú
[0m [95mú[0m)r   ÚencodeÚ	hexdigestra   r*   Úmaprl   rf   ÚjsonÚdumpsre   ÚsetÚziprh   r^   Úindexri   rˆ   rg   r   r“   Ústartrp   rc   ÚerrorÚtyper   )r4   ÚtextsÚ	metadatasÚ
batch_sizeÚidsrt   ÚtÚcolmap_r‰   rŠ   ry   ÚkeysÚvaluesrv   ÚiÚes                   r   Ú	add_textszMyScale.add_textsç   s  € ð* ÒIÁ5ÓIÁ5¸a”d˜1Ÿ8™8 GÓ,Ó-×7Ñ7Õ9À5ÑIˆØ—+‘+×(Ñ(ˆàˆà�D‰M˜3Ø�F‰O˜UØ�HÑœs 4×#3Ñ#3×#?Ñ#?ÀÓGð
ˆð
 Ò4©eÓ!4©e¨¢"¨eÑ!4ˆ	Ü,/´·
±
¸IÓ,Fˆ�W˜ZÑ(Ñ)Ü”3�w“<¤# lÓ"3Ñ3Ó4¸Ò9Ð9Ð9Ü˜L×.Ñ.Ó0Ð1‰ˆˆfð	ØˆAØ—Z‘ZÜ�V�Ð#6¼cÀ)»nð  ö �ô ˜1˜TŸZ™Z¨¯©×(>Ñ(>¸xÑ(HÓIÑJÓKÈtÏxÉxÒWÐWÐWØ—‘˜qÔ!Ü�w“< :Ó-ÙØŸ™œÜ d§l¡l¸'À4¸ÔI�AØ—G‘G”IØ ‘Gðô �7‹|˜aÒÙØ—F‘F”HØ—‘˜W dÔ+Ù"Ó#™s˜!’A˜sÑ#Ð#ùò= Jùò "5ùò* $øÜò 	Ü�L‰L˜?¬4°«7¨)Ð3CÄCÈÃFÀ8È7ÐSÔTØ�Iûð	úsC   ‰/HÂ
	HÃ5B
H Æ A5H Ç5	HÇ>H ÈH È	IÈ/IÉIÉIc                óD   —  | ||fi |¤Ž}|j                  ||||¬«       |S )aZ  Create Myscale wrapper with existing texts

        Args:
            texts (Iterable[str]): List or tuple of strings to be added
            embedding (Embeddings): Function to extract text embedding
            config (MyScaleSettings, Optional): Myscale configuration
            text_ids (Optional[Iterable], optional): IDs for the texts.
                                                     Defaults to None.
            batch_size (int, optional): Batchsize when transmitting data to MyScale.
                                        Defaults to 32.
            metadata (List[dict], optional): metadata to texts. Defaults to None.
            Other keyword arguments will pass into
                [clickhouse-connect](https://clickhouse.com/docs/en/integrations/python#clickhouse-connect-driver-api)
        Returns:
            MyScale Index
        )r©   r¨   r§   )r°   )	Úclsr¦   rs   r§   ra   Útext_idsr¨   rt   Úctxs	            r   Ú
from_textszMyScale.from_texts  s.   € ñ6 �)˜VÑ. vÑ.ˆØ�‰�e °jÈIˆÔVØˆ
r   c                óü  — d| j                   j                  › d| j                   j                  › d�}|| j                   j                  › d| j                   j                  › d�z  }|d| j                   j
                  › d�z  }|dz  }| j                  j                  d	| j                   j                  › d| j                   j                  › �«      j                  «       D ]  }|d
|d   d›d|d   d›d�z  }Œ |dz  }|S )zÑText representation for myscale, prints backends, username and schemas.
            Easy to use with `str(Myscale())`

        Returns:
            repr: string to show connection info and data schema
        z	[92m[1mrX   z @ Ú:z[0m

z[1musername: z[0m

Table Schema:
z4---------------------------------------------------
zDESC z|[94mÚnameÚ24sz
[0m|[96mr¥   z[0m|
)	ra   r,   r.   r   r   r!   rn   ÚqueryÚnamed_results)r4   Ú_reprÚrs      r   Ú__repr__zMyScale.__repr__>  s  € ð " $§+¡+×"6Ñ"6Ð!7°q¸¿¹×9JÑ9JÐ8KÈ3ÐOˆØ�D—K‘K×$Ñ$Ð% Q t§{¡{×'7Ñ'7Ð&8¸ÐDÑDˆØÐ$ T§[¡[×%9Ñ%9Ð$:Ð:TÐUÑUˆØ�Ñ ˆØ—‘×"Ñ"Ø�D—K‘K×(Ñ(Ð)¨¨4¯;©;×+<Ñ+<Ð*=Ð>ó
ç
‰-‹/òˆAð Ø˜A˜f™I c˜?Ð*:¸1¸V¹9ÀS¸/ÈÐTñ‰Eðð 	�Ñ ˆØˆr   c                ó‚  — dj                  t        t        |«      «      }|rd|› �}nd}d| j                  j                  d   › d| j                  j                  d   › d| j                  j
                  › d	| j                  j                  › d
|› d| j                  j                  d   › d|› d| j                  › d|› d
�}|S )NrT   ú	PREWHERE rW   ú
            SELECT r'   z, 
                r)   z, dist
            FROM rX   ú
            ú
            ORDER BY distance(r(   ú, [ú]) 
                AS dist ú
            LIMIT )rg   r�   r   ra   r*   r,   r.   rm   ©r4   Úq_embÚtopkÚ	where_strÚ	q_emb_strÚq_strs         r   Ú_build_qstrzMyScale._build_qstrR  sÝ   € ð —H‘HœS¤ e›_Ó-ˆ	ÙØ# I ;Ð/‰IàˆIðØ—K‘K×*Ñ*¨6Ñ2Ð3ð 4Ø—‘×'Ñ'¨
Ñ3Ð4ð 5Ø—+‘+×&Ñ&Ð' q¨¯©×):Ñ):Ð(;ð <ØˆKð Ø#Ÿ{™{×5Ñ5°hÑ?Ð@ÀÀIÀ;ð OØŸ™Ð)ð *Ø�&ð ðˆð ˆr   c                ó^   —  | j                   | j                  j                  |«      ||fi |¤ŽS )a©  Perform a similarity search with MyScale

        Args:
            query (str): query string
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.
            where_str (Optional[str], optional): where condition string.
                                                 Defaults to None.

            NOTE: Please do not let end-user to fill this and always be aware
                  of SQL injection. When dealing with metadatas, remember to
                  use `{self.metadata_column}.attribute` instead of `attribute`
                  alone. The default name for it is `metadata`.

        Returns:
            List[Document]: List of Documents
        )Úsimilarity_search_by_vectorrl   rf   )r4   rº   ru   rÊ   rt   s        r   Úsimilarity_searchzMyScale.similarity_searchf  s9   € ð& 0ˆt×/Ñ/Ø×Ñ×(Ñ(¨Ó/°°Iñ
ØAGñ
ð 	
r   c           	     ó¬  — | j                  |||«      }	 | j                  j                  |«      j                  «       D �cg c]C  }t	        || j
                  j                  d      || j
                  j                  d      ¬«      ‘ŒE c}S c c}w # t        $ r:}t        j                  dt        |«      › dt        |«      › d�«       g cY d}~S d}~ww xY w)áÁ  Perform a similarity search with MyScale by vectors

        Args:
            query (str): query string
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.
            where_str (Optional[str], optional): where condition string.
                                                 Defaults to None.

            NOTE: Please do not let end-user to fill this and always be aware
                  of SQL injection. When dealing with metadatas, remember to
                  use `{self.metadata_column}.attribute` instead of `attribute`
                  alone. The default name for it is `metadata`.

        Returns:
            List[Document]: List of (Document, similarity)
        r'   r)   ©Úpage_contentr)   r˜   r™   rš   N)rÍ   rn   rº   r»   r   ra   r*   rp   rc   r¤   r¥   r   ©r4   rs   ru   rÊ   rt   rÌ   r½   r¯   s           r   rÏ   z#MyScale.similarity_search_by_vector}  sÐ   € ð. × Ñ  ¨A¨yÓ9ˆð
	ð Ÿ™×*Ñ*¨5Ó1×?Ñ?ÔAóñ
 B�Aô	 Ø!" 4§;¡;×#9Ñ#9¸&Ñ#AÑ!BØ˜tŸ{™{×5Ñ5°jÑAÑBöð Bñð ùò øô ò 	Ü�L‰L˜?¬4°«7¨)Ð3CÄCÈÃFÀ8È7ÐSÔTØ�Iûð	ús0   •+B Á ABÂB ÂB Â	CÂ/CÃCÃCc           	     óè  — | j                  | j                  j                  |«      ||«      }	 | j                  j	                  |«      j                  «       D �cg c]H  }t        || j                  j                  d      || j                  j                  d      ¬«      |d   f‘ŒJ c}S c c}w # t        $ r:}t        j                  dt        |«      › dt        |«      › d�«       g cY d}~S d}~ww xY w)	á/  Perform a similarity search with MyScale

        Args:
            query (str): query string
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.
            where_str (Optional[str], optional): where condition string.
                                                 Defaults to None.

            NOTE: Please do not let end-user to fill this and always be aware
                  of SQL injection. When dealing with metadatas, remember to
                  use `{self.metadata_column}.attribute` instead of `attribute`
                  alone. The default name for it is `metadata`.

        Returns:
            List[Document]: List of documents most similar to the query text
            and cosine distance in float for each.
            Lower score represents more similarity.
        r'   r)   rÓ   Údistr˜   r™   rš   N)rÍ   rl   rf   rn   rº   r»   r   ra   r*   rp   rc   r¤   r¥   r   ©r4   rº   ru   rÊ   rt   rÌ   r½   r¯   s           r   Ú'similarity_search_with_relevance_scoresz/MyScale.similarity_search_with_relevance_scores¡  sï   € ð* × Ñ  ×!1Ñ!1×!=Ñ!=¸eÓ!DÀaÈÓSˆð	ð Ÿ™×*Ñ*¨5Ó1×?Ñ?ÔAó	ñ B�Aô Ø%& t§{¡{×'=Ñ'=¸fÑ'EÑ%FØ!" 4§;¡;×#9Ñ#9¸*Ñ#EÑ!Fôð �f‘Iòð Bñ	ð 	ùò 	øô ò 	Ü�L‰L˜?¬4°«7¨)Ð3CÄCÈÃFÀ8È7ÐSÔTØ�Iûð	ús0   ®+B. ÁAB)Â&B. Â)B. Â.	C1Â7/C,Ã&C1Ã,C1c                ó–   — | j                   j                  d| j                  j                  › d| j                  j                  › �«       y)z,
        Helper function: Drop data
        zDROP TABLE IF EXISTS rX   N)rn   ro   ra   r,   r.   r|   s    r   ÚdropzMyScale.dropÆ  s<   € ð 	�‰×ÑØ# D§K¡K×$8Ñ$8Ð#9¸¸4¿;¹;×;LÑ;LÐ:MÐNõ	
r   c                óX  — |€	|€J d«       ‚g }|r_t        |«      dkD  rQdj                  |D �cg c]  }d|› d�‘Œ
 c}«      }|j                  | j                  j                  d   › d|› d�«       |r|j                  |«       t        |«      dkD  sJ ‚d	j                  |«      }d
| j                  j
                  › d| j                  j                  › d|› �}	 | j                  j                  |«       yc c}w # t        $ r(}	t        j                  t        |	«      «       Y d}	~	yd}	~	ww xY w)a3  Delete by vector ID or other criteria.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        NzIYou need to specify where to be deleted! Either with `ids` or `where_str`r   rS   rU   r&   z IN (r‡   z AND zDELETE FROM rX   z WHERE TF)re   rg   rˆ   ra   r*   r,   r.   rn   ro   rp   rc   r¤   r   )
r4   r©   rÊ   rt   Úcondsr&   Úid_listÚwhere_str_finalÚqstrr¯   s
             r   ÚdeletezMyScale.deleteÎ  s*  € ð  �K IÐ$5ð 	
ØWó	
Ð6ð ˆÙ”3�s“8˜a’<Ø—i‘i±SÓ 9±S¨r 1 R D¨¢°SÑ 9Ó:ˆGØ�L‰L˜DŸK™K×2Ñ2°4Ñ8Ð9¸¸w¸iÀqÐIÔJÙØ�L‰L˜Ô#Ü�5‹z˜AŠ~Ðˆ~Ø!Ÿ,™, uÓ-ˆà˜4Ÿ;™;×/Ñ/Ð0°°$·+±+×2CÑ2CÐ1Dð EØ$Ð%ð'ð 	ð	Ø�K‰K×Ñ Ô%Øùò !:øô ò 	Ü�L‰Lœ˜Q›Ô Üûð	ús   ­C3ÃC8 Ã8	D)ÄD$Ä$D)c                ó4   — | j                   j                  d   S )Nr)   )ra   r*   r|   s    r   Úmetadata_columnzMyScale.metadata_columnô  s   € à�{‰{×%Ñ% jÑ1Ð1r   r2   )rs   r   ra   úOptional[MyScaleSettings]rt   r   r>   ÚNone)r>   r   )rƒ   r   r>   r   )r‰   r   rŠ   úIterable[str]r>   r   )r‰   r   rŠ   rç   r>   ræ   )Né    N)r¦   rç   r§   zOptional[List[dict]]r¨   r   r©   úOptional[Iterable[str]]rt   r   r>   ú	List[str])NNNrè   )r¦   rç   rs   r   r§   zOptional[List[Dict[Any, Any]]]ra   rå   r³   ré   r¨   r   rt   r   r>   rF   ©r>   r   ©rÈ   úList[float]rÉ   r   rÊ   r    r>   r   ©é   N)
rº   r   ru   r   rÊ   r    rt   r   r>   úList[Document]©
rs   rí   ru   r   rÊ   r    rt   r   r>   rð   ©
rº   r   ru   r   rÊ   r    rt   r   r>   zList[Tuple[Document, float]])r>   ræ   )NN)r©   zOptional[List[str]]rÊ   r    rt   r   r>   zOptional[bool])r?   r@   rA   rB   r`   Úpropertyr}   r„   r�   r“   r°   Úclassmethodrµ   r¾   rÍ   rÐ   rÏ   rÚ   rÜ   râ   rä   Ú__classcell__©rz   s   @r   rF   rF   `   sB  ø„ ñð  -1ð^%àð^%ð *ð^%ð ð	^%ð
 
õ^%ð@ ò ó ð óWóó$ð +/ØØ'+ð6àð6ð (ð6ð ð	6ð
 %ð6ð ð6ð 
ó6ðp ð
 59Ø,0Ø,0Øðàðð ðð 2ð	ð
 *ðð *ðð ðð ðð 
òó ðó<ð* IMðØ ðØ(+ðØ8Eðà	óð* BFð
Øð
Ø ð
Ø1>ð
ØQTð
à	ó
ð4 Ø#'ð	"àð"ð ð"ð !ð	"ð
 ð"ð 
ó"ðJ BFð#Øð#Ø ð#Ø1>ð#ØQTð#à	%ó#óJ
ð $(Ø#'ð$à ð$ð !ð$ð ð	$ð
 
ó$ðL ò2ó ô2r   rF   c                  ó¦   ‡ — e Zd ZdZdg f	 	 	 	 	 	 	 	 	 dˆ fd„Z	 d		 	 	 	 	 	 	 d
d„Z	 	 d	 	 	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 	 	 dd„Zedd„«       Z	ˆ xZ
S )ÚMyScaleWithoutJSONzsMyScale vector store without metadata column

    This is super handy if you are working to a SQL-native table
    Nc                ó6   •— t        ‰| �  ||fi |¤Ž || _        y)ag  Building a myscale vector store without metadata column

        embedding (Embeddings): embedding model
        config (MyScaleSettings): Configuration to MyScale Client
        must_have_cols (List[str]): column names to be included in query
        Other keyword arguments will pass into
            [clickhouse-connect](https://docs.myscale.com/)
        N)r_   r`   Úmust_have_cols)r4   rs   ra   rú   rt   rz   s        €r   r`   zMyScaleWithoutJSON.__init__ÿ  s!   ø€ ô 	‰Ñ˜ FÑ5¨fÒ5Ø)7ˆÕr   c                ó†  — dj                  t        t        |«      «      }|rd|› �}nd}d| j                  j                  d   › ddj                  | j
                  «      › d| j                  j                  › d| j                  j                  › d	|› d
| j                  j                  d   › d|› d| j                  › d|› d	�}|S )NrT   rÀ   rW   rÁ   r'   z, dist, 
                z
            FROM rX   rÂ   rÃ   r(   rÄ   rÅ   rÆ   )	rg   r�   r   ra   r*   rú   r,   r.   rm   rÇ   s         r   rÍ   zMyScaleWithoutJSON._build_qstr  sÝ   € ð —H‘HœS¤ e›_Ó-ˆ	ÙØ# I ;Ð/‰IàˆIðØ—K‘K×*Ñ*¨6Ñ2Ð3ð 4Ø—‘˜$×-Ñ-Ó.Ð/ð 0Ø—+‘+×&Ñ&Ð' q¨¯©×):Ñ):Ð(;ð <ØˆKð Ø#Ÿ{™{×5Ñ5°hÑ?Ð@ÀÀIÀ;ð OØŸ™Ð)ð *Ø�&ð ðˆð ˆr   c                óÀ  — | j                  |||«      }	 | j                  j                  |«      j                  «       D ��cg c]E  }t	        || j
                  j                  d      | j                  D �ci c]  }|||   “Œ
 c}¬«      ‘ŒG c}}S c c}w c c}}w # t        $ r:}t        j                  dt        |«      › dt        |«      › d�«       g cY d}~S d}~ww xY w)rÒ   r'   rÓ   r˜   r™   rš   N)rÍ   rn   rº   r»   r   ra   r*   rú   rp   rc   r¤   r¥   r   rÕ   s           r   rÏ   z.MyScaleWithoutJSON.similarity_search_by_vector%  sá   € ð. × Ñ  ¨A¨yÓ9ˆð
	ð Ÿ™×*Ñ*¨5Ó1×?Ñ?ÔAôñ
 B�Aô	 Ø!" 4§;¡;×#9Ñ#9¸&Ñ#AÑ!BØ/3×/BÒ/BÓCÑ/B¨!˜a  1¡™gÐ/BÑCöð Bòð ùò Dùóøô ò 	Ü�L‰L˜?¬4°«7¨)Ð3CÄCÈÃFÀ8È7ÐSÔTØ�Iûð	úsA   •,B Á3BÁ4BÂ
BÂB ÂBÂB Â	CÂ#/CÃCÃCc                óü  — | j                  | j                  j                  |«      ||«      }	 | j                  j	                  |«      j                  «       D ��cg c]J  }t        || j                  j                  d      | j                  D �ci c]  }|||   “Œ
 c}¬«      |d   f‘ŒL c}}S c c}w c c}}w # t        $ r:}t        j                  dt        |«      › dt        |«      › d�«       g cY d}~S d}~ww xY w)r×   r'   rÓ   rØ   r˜   r™   rš   N)rÍ   rl   rf   rn   rº   r»   r   ra   r*   rú   rp   rc   r¤   r¥   r   rÙ   s           r   rÚ   z:MyScaleWithoutJSON.similarity_search_with_relevance_scoresI  s   € ð* × Ñ  ×!1Ñ!1×!=Ñ!=¸eÓ!DÀaÈÓSˆð	ð Ÿ™×*Ñ*¨5Ó1×?Ñ?ÔAô	ñ B�Aô Ø%& t§{¡{×'=Ñ'=¸fÑ'EÑ%FØ37×3FÒ3FÓ!GÑ3F¨a ! Q q¡T¡'Ð3FÑ!Gôð �f‘Iòð Bò	ð 	ùò "Hùó		øô ò 	Ü�L‰L˜?¬4°«7¨)Ð3CÄCÈÃFÀ8È7ÐSÔTØ�Iûð	úsA   ®,B8 Á3B2ÂB-ÂB2Â)B8 Â-B2Â2B8 Â8	C;Ã/C6Ã0C;Ã6C;c                 ó   — y)NrW   r   r|   s    r   rä   z"MyScaleWithoutJSON.metadata_columnn  s   € àr   )
rs   r   ra   rå   rú   rê   rt   r   r>   ræ   r2   rì   rî   rñ   rò   rë   )r?   r@   rA   rB   r`   rÍ   rÏ   rÚ   ró   rä   rõ   rö   s   @r   rø   rø   ù  sø   ø„ ñð -1Ø$&ð	8àð8ð *ð8ð "ð	8ð
 ð8ð 
õ8ð& IMðØ ðØ(+ðØ8Eðà	óð. Ø#'ð	"àð"ð ð"ð !ð	"ð
 ð"ð 
ó"ðJ BFð#Øð#Ø ð#Ø1>ð#ØQTð#à	%ó#ðJ òó ôr   rø   )r   r   r   r   r>   Úbool)Ú
__future__r   rž   ÚloggingÚhashlibr   Ú	threadingr   Útypingr   r   r   r	   r
   r   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.vectorstoresr   Úpydantic_settingsr   r   Ú	getLoggerrc   r   r   rF   rø   r   r   r   Ú<module>r
     se   ðÝ "ã Û Ý Ý ß =× =å -Ý 0Ý 3ß >à	ˆ×	Ñ	Ó	€óô <�lô <ô~V2ˆkô V2ôrw˜õ wr   