§
    šŠtj·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j        ¦   «         Zdd„Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )é    )ÚannotationsN)Úsha1)ÚThread)ÚAnyÚDictÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings)ÚVectorStore)ÚBaseSettingsÚSettingsConfigDictÚsÚstrÚargsr   ÚreturnÚboolc                ó   — |D ]	}|| vr dS Œ
dS )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© )r   r   Úas      úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/myscale.pyÚhas_mul_sub_strr      s-   € ð ð ð ˆØ�Aˆ:ˆ:Ø�5�5ð àˆ4ó    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dS )'Ú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.

    Ú	localhostr   Ú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ÚmetricÚitemr   r   c                ó"   — t          | |¦  «        S ©N)Úgetattr)Úselfr3   s     r   Ú__getitem__zMyScaleSettings.__getitem__U   s   € Ý�t˜TÑ"Ô"Ð"r   z.envúutf-8Úmyscale_Úignore)Úenv_fileÚenv_file_encodingÚ
env_prefixÚextra)r3   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r!   r#   r$   r&   r'   r,   r.   r0   r2   r8   r   Úmodel_configr   r   r   r   r   !   s  € € € € € € ðð ð> €DÐÐÐÑØ€DÐÐÐÑà"€HÐ"Ð"Ð"Ñ"Ø"€HÐ"Ð"Ð"Ñ"à€JÐÐÐÑØ,0€KÐ0Ð0Ð0Ñ0ð ØØØð	"ð "€Jð ð ð ñ ð €HÐÐÐÑØ€EÐÐÐÑØ€FÐÐÐÑð#ð #ð #ð #ð &Ð%ØØ!ØØð	ñ ô €L€L€Lr   r   c                  óò   ‡ — e Zd ZdZ	 d7d8ˆ fd„Zed9d„¦   «         Zd:d„Zd;d„Zd<d„Z		 	 	 d=d>d„Z
e	 	 	 	 d?d@d"„¦   «         ZdAd#„Z	 d7dBd)„Z	 dCdDd.„Z	 	 dCdEd/„Z	 dCdFd1„ZdGd2„Z	 	 dHdId5„ZedAd6„¦   «         Zˆ xZS )JÚ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/)
    NÚ	embeddingr   ÚconfigúOptional[MyScaleSettings]Úkwargsr   r   ÚNonec                óþ  •— 	 ddl m} n# t          $ r t          d¦  «        ‚w xY w	 ddlm} || _        n# t          $ r d„ | _        Y nw xY wt          ¦   «                              ¦   «          |�|| _        nt          ¦   «         | _        | j        sJ ‚| j        j	        r| j        j
        sJ ‚| j        j        r$| j        j        r| j        j        r| j        j        sJ ‚dD ]}|| j        j        v sJ ‚Œ| j        j                             ¦   «         dv sJ ‚| j        j        d	v rt                                d
¦  «         t%          |                     d¦  «        ¦  «        }| j        j        r>dd                     d„ | j        j                             ¦   «         D ¦   «         ¦  «        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                             ¦   «         d#v rd$nd%| _         |d+| j        j	        | j        j
        | j        j        | j        j        d&œ|¤Ž| _        	 | j                              d'¦  «         n?# tB          $ r2}
t            "                    d(| j        j#        › d)�¦  «         Y d}
~
nd}
~
ww xY w| j                              d*¦  «         | j                              |	¦  «         dS ),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 r5   r   )Úxs    r   ú<lambda>z"MyScale.__init__.<locals>.<lambda>ˆ   s   €  1€ r   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ú, ú,c                ó&   — g | ]\  }}d |› d|› d �‘ŒS )ú'ú=r   )Ú.0ÚkÚvs      r   ú
<listcomp>z$MyScale.__init__.<locals>.<listcomp>£   s*   € ÐVÐVÐV©d¨a°˜\ ˜\˜\ Q˜\˜\˜\ÐVÐVÐVr   Ú 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=r\   z,)
            ) ENGINE = MergeTree ORDER BY z	
        ú\)rd   r\   )rT   rU   Ú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_connectrN   ÚImportErrorrO   ÚpgbarÚsuperÚ__init__rI   r   r   r!   r,   r.   r0   r2   ÚupperÚloggerÚwarningÚlenÚembed_queryr'   ÚjoinÚitemsr&   ÚdimÚBSÚmust_escapeÚ_embeddingsÚ
dist_orderr#   r$   ÚclientÚcommandÚ	ExceptionÚdebugÚserver_version)r7   rH   rI   rK   rN   rO   r_   rs   Úindex_paramsÚschema_Ú_Ú	__class__s              €r   rk   zMyScale.__init__n   s’  ø€ ð	Ø5Ð5Ð5Ð5Ð5Ð5Ð5øÝð 	ð 	ð 	ÝðKñô ð ð	øøøð
	%Ø!Ð!Ð!Ð!Ð!Ð!àˆDŒJˆJøÝð 	%ð 	%ð 	%à$˜ˆDŒJˆJˆJð	%øøøõ 	‰Œ×ÒÑÔÐØÐØ ˆDŒKˆKå)Ñ+Ô+ˆDŒKØŒ{ÐÐˆ{ØŒ{ÔÐ4 D¤KÔ$4Ð4Ð4Ð4àŒKÔ"ð	
à”Ô$ð	
ð ”Ô!ð	
ð ”Ô"ð		
ð 	
ð#ð
 6ð 	/ð 	/ˆAØ˜œÔ.Ð.Ð.Ð.Ð.Ð.ØŒ{Ô!×'Ò'Ñ)Ô)Ð-CÐCÐCÐCÐCØŒ;ÔÐ!7Ð7Ð7Ý�NŠNðGñô ð õ �)×'Ò'¨Ñ7Ô7Ñ8Ô8ˆð Œ{Ô&ðˆD�3—8’8ÐVÐV°d´kÔ6M×6SÒ6SÑ6UÔ6UÐVÑVÔVÑWÔWÑWÐWàð 	ð
Ø(,¬Ô(<ðð Ø?C¼{Ô?Pðð à”Ô'¨Ô-ðð ð ”Ô'¨Ô/ðð ð ”Ô'¨Ô1ð	ð ð
 ”Ô'¨
Ô3ðð ð ”[Ô+¨HÔ5ðð ð <?ðð ð $(¤;Ô#9¸(Ô#Cðð ð œ+Ô0ðð ð '+¤kÔ&8ðð ð <Hðð ð ,0¬;Ô+AÀ$Ô+Gðð ð ˆð ˆŒØˆŒØ&ˆÔØ$ˆÔà”[Ô'×-Ò-Ñ/Ô/Ð3CÐCÐCˆEˆEÈð 	Œð
 !�jð 
Ø”Ô!Ø”Ô!Ø”[Ô)Ø”[Ô)ð	
ð 
ð
 ð
ð 
ˆŒð	ØŒK×ÒÐ DÑEÔEÐEÐEøÝð 	ð 	ð 	Ý�LŠLðF d¤kÔ&@ð Fð Fð Fñô ð ð ð ð ð ð øøøøð	øøøð
 	Œ×ÒÐBÑCÔCÐCØŒ×Ò˜GÑ$Ô$Ð$Ð$Ð$s/   ƒ
 Š$¨6 ¶AÁ
AË/L
 Ì

MÌ(MÍMc                ó   — | j         S r5   )rv   ©r7   s    r   Ú
embeddingszMyScale.embeddingsÎ   s   € àÔÐr   Úvaluer   c                óF   ‡ — d                      ˆ fd„|D ¦   «         ¦  «        S )Nrb   c              3  óD   •K  — | ]}|‰j         v r‰j        › |› �n|V — Œd S r5   )ru   rt   )r^   Úcr7   s     €r   ú	<genexpr>z%MyScale.escape_str.<locals>.<genexpr>Ó   s>   øè è € ÐVÐVÈ1¨!¨tÔ/?Ð*?Ð*?˜$œ'� 1���ÀQÐVÐVÐVÐVÐVÐVr   )rq   )r7   r„   s   ` r   Ú
escape_strzMyScale.escape_strÒ   s+   ø€ Ø�wŠwÐVÐVÐVÐVÐPUÐVÑVÔVÑVÔVÐVr   Útransacr   Úcolumn_namesúIterable[str]c           
     ó   ‡ — d                      |¦  «        }g }|D ]<}d                      ˆ fd„|D ¦   «         ¦  «        }|                     d|› d�¦  «         Œ=d‰ j        j        › d‰ j        j        › d|› dd                      |¦  «        › d�	}|S )	NrZ   c                ó\   •— g | ](}d ‰                      t          |¦  «        ¦  «        › d �‘Œ)S ©r\   )r‰   r   )r^   Ú_nr7   s     €r   ra   z'MyScale._build_istr.<locals>.<listcomp>Ù   s7   ø€ ÐFÐFÐF¸bÐ9˜dŸošo­c°"©g¬gÑ6Ô6Ð9Ð9Ð9ÐFÐFÐFr   ú(ú)z8
                INSERT INTO TABLE 
                    rc   z))
                VALUES
                z
                )rq   ÚappendrI   r.   r0   )r7   rŠ   r‹   ÚksÚ_dataÚnÚi_strs   `      r   Ú_build_istrzMyScale._build_istrÕ   sÈ   ø€ Ø�XŠX�lÑ#Ô#ˆØˆØð 	#ð 	#ˆAØ—’ÐFÐFÐFÐFÀAÐFÑFÔFÑGÔGˆAØ�LŠL˜˜Q˜˜˜Ñ"Ô"Ð"Ð"ðà”[Ô)ðð à,0¬KÔ,=ðð à@Bðð ð —’˜%‘”ð	ð ð ˆð ˆr   c                óf   — |                       ||¦  «        }| j                             |¦  «         d S r5   )r˜   rx   ry   )r7   rŠ   r‹   Ú_i_strs       r   Ú_insertzMyScale._insertã   s3   € Ø×!Ò! '¨<Ñ8Ô8ˆØŒ×Ò˜FÑ#Ô#Ð#Ð#Ð#r   é    ÚtextsÚ	metadatasúOptional[List[dict]]Ú
batch_sizer    ÚidsúOptional[Iterable[str]]ú	List[str]c           	     ó   — |pd„ |D ¦   «         }| j         j        }g }|d         ||d         ||d         t          | j        j        |¦  «        i}|pd„ |D ¦   «         }t          t
          j        |¦  «        ||d         <   t          t          |¦  «        t          |¦  «        z
  ¦  «        dk    sJ ‚t          | 
                    ¦   «         Ž \  }	}
	 d}|                      t          |
Ž d	t          |¦  «        ¬
¦  «        D ]±}t          ||	                     | j         j        d         ¦  «                 ¦  «        | j        k    sJ ‚|                     |¦  «         t          |¦  «        |k    rD|r|                     ¦   «          t!          | j        ||	g¬¦  «        }|                     ¦   «          g }Œ²t          |¦  «        dk    r,|r|                     ¦   «          |                      ||	¦  «         d„ |D ¦   «         S # t&          $ rG}t(                               dt-          |¦  «        › dt/          |¦  «        › 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.

        c                óv   — g | ]6}t          |                     d ¦  «        ¦  «                             ¦   «         ‘Œ7S )r9   )r   ÚencodeÚ	hexdigest)r^   Úts     r   ra   z%MyScale.add_texts.<locals>.<listcomp>ü   s8   € ÐIÐIÐI¸a•d˜1Ÿ8š8 GÑ,Ô,Ñ-Ô-×7Ò7Ñ9Ô9ÐIÐIÐIr   r(   r)   r*   c                ó   — g | ]}i ‘ŒS r   r   )r^   r   s     r   ra   z%MyScale.add_texts.<locals>.<listcomp>  s   € Ð!4Ð!4Ð!4¨ "Ð!4Ð!4Ð!4r   r+   r   NzInserting data...)ÚdescÚtotal)Útargetr   c                ó   — g | ]}|‘ŒS r   r   )r^   Úis     r   ra   z%MyScale.add_texts.<locals>.<listcomp>  s   € Ð#Ð#Ð#˜!�AÐ#Ð#Ð#r   ú	[91m[1mú
[0m [95mú[0m)rI   r,   Úmaprv   rp   ÚjsonÚdumpsro   ÚsetÚziprr   ri   Úindexrs   r“   rq   r   r›   Ústartrz   rm   ÚerrorÚtyper   )r7   r�   rž   r    r¡   rK   Úcolmap_rŠ   r‹   ÚkeysÚvaluesr¨   r`   Úes                 r   Ú	add_textszMyScale.add_textsç   sb  € ð* ÐIÐIÐIÀ5ÐIÑIÔIˆØ”+Ô(ˆàˆà�DŒM˜3Ø�FŒO˜UØ�HÔ�s 4Ô#3Ô#?ÀÑGÔGð
ˆð
 Ð4Ð!4Ð!4¨eÐ!4Ñ!4Ô!4ˆ	Ý,/µ´
¸IÑ,FÔ,Fˆ�W˜ZÔ(Ñ)Ý•3�w‘<”<¥# lÑ"3Ô"3Ñ3Ñ4Ô4¸Ò9Ð9Ð9Ð9Ý˜L×.Ò.Ñ0Ô0Ð1‰ˆˆfð	ØˆAØ—Z’ZÝ�V�Ð#6½cÀ)¹n¼nð  ñ ô ð 
!ð 
!�õ ˜1˜TŸZšZ¨¬Ô(>¸xÔ(HÑIÔIÔJÑKÔKÈtÌxÒWÐWÐWÐWØ—’˜qÑ!Ô!Ð!Ý�w‘<”< :Ò-Ð-Øð !ØŸš™œ˜Ý d¤l¸'À4¸ÐIÑIÔI�AØ—G’G‘I”I�IØ �GøÝ�7‰|Œ|˜aÒÐØð Ø—F’F‘H”H�HØ—’˜W dÑ+Ô+Ð+Ø#Ð#˜sÐ#Ñ#Ô#Ð#øÝð 	ð 	ð 	Ý�LŠLÐS­4°©7¬7ÐSÐSÅCÈÁFÄFÐSÐSÐSÑTÔTÐTØˆIˆIˆIˆIˆIˆIøøøøð	øøøs   ÃD*G< Ç<
IÈ<IÉIÉIúOptional[List[Dict[Any, Any]]]Útext_idsc                óL   —  | ||fi |¤Ž}|                      ||||¬¦  «         |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�   rH   rž   rI   rÁ   r    rK   Úctxs	            r   Ú
from_textszMyScale.from_texts  s<   € ð6 ˆc�)˜VÐ.Ð. vÐ.Ð.ˆØ�Š�e °jÈIˆÑVÔVÐ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                             d	| j         j        › d| 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[1mrc   z @ ú:z[0m

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

Table Schema:
z4---------------------------------------------------
zDESC z|[94mÚnameÚ24sz
[0m|[96mrº   z[0m|
)	rI   r.   r0   r   r!   r#   rx   ÚqueryÚnamed_results)r7   Ú_reprÚrs      r   Ú__repr__zMyScale.__repr__>  sû   € ð P $¤+Ô"6ÐOÐO¸¼Ô9JÐOÐOÐOˆØ�D”KÔ$ÐDÐD t¤{Ô'7ÐDÐDÐDÑDˆØÐU T¤[Ô%9ÐUÐUÐUÑUˆØ�Ñ ˆØ”×"Ò"Ø>�D”KÔ(Ð>Ð>¨4¬;Ô+<Ð>Ð>ñ
ô 
ç
Š-‰/Œ/ð	ð 	ˆAð ØT˜A˜fœIÐTÐTÐT¸1¸V¼9ÐTÐTÐTÐTñˆEˆEð 	�Ñ ˆØˆr   Úq_embúList[float]ÚtopkÚ	where_strr"   c                ó8  — d                      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 )NrZ   ú	PREWHERE rb   ú
            SELECT r)   z, 
                r+   z, dist
            FROM rc   ú
            ú
            ORDER BY distance(r*   ú, [ú]) 
                AS dist ú
            LIMIT )rq   r²   r   rI   r,   r.   r0   rw   ©r7   rÏ   rÑ   rÒ   Ú	q_emb_strÚq_strs         r   Ú_build_qstrzMyScale._build_qstrR  sû   € ð —H’H�S¥ e™_œ_Ñ-Ô-ˆ	Øð 	Ø/ IÐ/Ð/ˆIˆIàˆIðØ”KÔ*¨6Ô2ðð à”Ô'¨
Ô3ðð ð ”+Ô&ðð ð *.¬Ô):ðð ð ð	ð ð
  $œ{Ô5°hÔ?ðð ð
 ENðð ð œðð ð ðð ð ˆð ˆr   é   rÊ   r_   úList[Document]c                óR   —  | 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_vectorrv   rp   )r7   rÊ   r_   rÒ   rK   s        r   Úsimilarity_searchzMyScale.similarity_searchf  s@   € ð& 0ˆtÔ/ØÔ×(Ò(¨Ñ/Ô/°°Ið
ð 
ØAGð
ð 
ð 	
r   c           	     óL  ‡ — ‰                       |||¦  «        }	 ˆ fd„‰ j                             |¦  «                             ¦   «         D ¦   «         S # t          $ rG}t
                               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)
        c                óŠ   •— g | ]?}t          |‰j        j        d                   |‰j        j        d                  ¬¦  «        ‘Œ@S )r)   r+   ©Úpage_contentr+   ©r   rI   r,   ©r^   rÍ   r7   s     €r   ra   z7MyScale.similarity_search_by_vector.<locals>.<listcomp>–  s^   ø€ ð ð ð ð
 õ	 Ø!" 4¤;Ô#9¸&Ô#AÔ!BØ˜tœ{Ô5°jÔAÔBðñ ô ðð ð r   r¯   r°   r±   N©	rÞ   rx   rÊ   rË   rz   rm   r¹   rº   r   ©r7   rH   r_   rÒ   rK   rÝ   r¾   s   `      r   râ   z#MyScale.similarity_search_by_vector}  óÌ   ø€ ð. × Ò  ¨A¨yÑ9Ô9ˆð
	ðð ð ð ð
 œ×*Ò*¨5Ñ1Ô1×?Ò?ÑAÔAðñ ô ð øõ ð 	ð 	ð 	Ý�LŠLÐS­4°©7¬7ÐSÐSÅCÈÁFÄFÐSÐSÐSÑTÔTÐTØˆIˆIˆIˆIˆIˆIøøøøð	øøøó   š7A Á
B#Á<BÂB#ÂB#úList[Tuple[Document, float]]c           	     ó|  ‡ — ‰                       ‰ j                             |¦  «        ||¦  «        }	 ˆ fd„‰ j                             |¦  «                             ¦   «         D ¦   «         S # t          $ rG}t                               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.
        c                óš   •— g | ]G}t          |‰j        j        d                   |‰j        j        d                  ¬¦  «        |d         f‘ŒHS )r)   r+   rç   Údistré   rê   s     €r   ra   zCMyScale.similarity_search_with_relevance_scores.<locals>.<listcomp>¸  sl   ø€ ð 	ð 	ð 	ð õ Ø%& t¤{Ô'=¸fÔ'EÔ%FØ!" 4¤;Ô#9¸*Ô#EÔ!Fðñ ô ð �f”Iðð	ð 	ð 	r   r¯   r°   r±   N©rÞ   rv   rp   rx   rÊ   rË   rz   rm   r¹   rº   r   ©r7   rÊ   r_   rÒ   rK   rÝ   r¾   s   `      r   Ú'similarity_search_with_relevance_scoresz/MyScale.similarity_search_with_relevance_scores¡  óÝ   ø€ ð* × Ò  Ô!1×!=Ò!=¸eÑ!DÔ!DÀaÈÑSÔSˆð	ð	ð 	ð 	ð 	ð œ×*Ò*¨5Ñ1Ô1×?Ò?ÑAÔAð	ñ 	ô 	ð 	øõ ð 	ð 	ð 	Ý�LŠLÐS­4°©7¬7ÐSÐSÅCÈÁFÄFÐSÐSÐSÑTÔTÐTØˆIˆIˆIˆIˆIˆIøøøøð	øøøó   ²7A* Á*
B;Á4<B6Â0B;Â6B;c                ón   — | j                              d| j        j        › d| j        j        › �¦  «         dS )z,
        Helper function: Drop data
        zDROP TABLE IF EXISTS rc   N)rx   ry   rI   r.   r0   r‚   s    r   ÚdropzMyScale.dropÆ  sE   € ð 	Œ×ÒØN D¤KÔ$8ÐNÐN¸4¼;Ô;LÐNÐNñ	
ô 	
ð 	
ð 	
ð 	
r   úOptional[List[str]]úOptional[bool]c                óX  — |€|€
J d¦   «         ‚g }|r]t          |¦  «        dk    rJd                     d„ |D ¦   «         ¦  «        }|                     | j        j        d         › d|› d�¦  «         |r|                     |¦  «         t          |¦  «        dk    sJ ‚d	                     |¦  «        }d
| j        j        › d| j        j        › d|› �}	 | j                             |¦  «         dS # t          $ r2}t                               t          |¦  «        ¦  «         Y d}~dS 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   rY   c                ó   — g | ]}d |› d �‘Œ	S r�   r   )r^   r(   s     r   ra   z"MyScale.delete.<locals>.<listcomp>ã  s    € Ð 9Ð 9Ð 9¨r  R   Ð 9Ð 9Ð 9r   r(   z IN (r’   z AND zDELETE FROM rc   z WHERE TF)ro   rq   r“   rI   r,   r.   r0   rx   ry   rz   rm   r¹   r   )	r7   r¡   rÒ   rK   ÚcondsÚid_listÚwhere_str_finalÚqstrr¾   s	            r   ÚdeletezMyScale.deleteÎ  se  € ð  �K IÐ$5Ð$5ØWñ %6Ô$5Ð6ð ˆØð 	K•3�s‘8”8˜a’<�<Ø—i’iÐ 9Ð 9°SÐ 9Ñ 9Ô 9Ñ:Ô:ˆGØ�LŠL˜DœKÔ2°4Ô8ÐIÐI¸wÐIÐIÐIÑJÔJÐJØð 	$Ø�LŠL˜Ñ#Ô#Ð#Ý�5‰zŒz˜AŠ~ˆ~ˆ~ˆ~Ø!Ÿ,š, uÑ-Ô-ˆð'˜4œ;Ô/ð 'ð '°$´+Ô2Cð 'ð 'Ø$ð'ð 'ð 	ð	ØŒK×Ò Ñ%Ô%Ð%Ø�4øÝð 	ð 	ð 	Ý�LŠL�˜Q™œÑ Ô Ð Ø�5�5�5�5�5øøøøð	øøøs   ÃC- Ã-
D)Ã7'D$Ä$D)c                ó&   — | j         j        d         S )Nr+   )rI   r,   r‚   s    r   Úmetadata_columnzMyScale.metadata_columnô  s   € àŒ{Ô% jÔ1Ð1r   r5   )rH   r   rI   rJ   rK   r   r   rL   )r   r   )r„   r   r   r   )rŠ   r   r‹   rŒ   r   r   )rŠ   r   r‹   rŒ   r   rL   )Nrœ   N)r�   rŒ   rž   rŸ   r    r    r¡   r¢   rK   r   r   r£   )NNNrœ   )r�   rŒ   rH   r   rž   rÀ   rI   rJ   rÁ   r¢   r    r    rK   r   r   rG   ©r   r   ©rÏ   rÐ   rÑ   r    rÒ   r"   r   r   ©rß   N)
rÊ   r   r_   r    rÒ   r"   rK   r   r   rà   ©
rH   rÐ   r_   r    rÒ   r"   rK   r   r   rà   ©
rÊ   r   r_   r    rÒ   r"   rK   r   r   rï   )r   rL   )NN)r¡   rû   rÒ   r"   rK   r   r   rü   )r@   rA   rB   rC   rk   Úpropertyrƒ   r‰   r˜   r›   r¿   ÚclassmethodrÅ   rÎ   rÞ   rã   râ   rö   rú   r  r  Ú__classcell__©r€   s   @r   rG   rG   `   sþ  ø€ € € € € ðð ð  -1ð^%ð ^%ð ^%ð ^%ð ^%ð ^%ð ^%ð@ ð ð  ð  ñ „Xð ðWð Wð Wð Wðð ð ð ð$ð $ð $ð $ð +/ØØ'+ð6ð 6ð 6ð 6ð 6ðp ð
 59Ø,0Ø,0Øðð ð ð ñ „[ðð<ð ð ð ð* IMðð ð ð ð ð* BFð
ð 
ð 
ð 
ð 
ð4 Ø#'ð	"ð "ð "ð "ð "ðJ BFð#ð #ð #ð #ð #ðJ
ð 
ð 
ð 
ð $(Ø#'ð$ð $ð $ð $ð $ðL ð2ð 2ð 2ñ „Xð2ð 2ð 2ð 2ð 2r   rG   c                  óh   ‡ — 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
    NrH   r   rI   rJ   Úmust_have_colsr£   rK   r   r   rL   c                óL   •—  t          ¦   «         j        ||fi |¤Ž || _        dS )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)rj   rk   r  )r7   rH   rI   r  rK   r€   s        €r   rk   zMyScaleWithoutJSON.__init__ÿ  s4   ø€ ð 	�‰ŒÔ˜ FÐ5Ð5¨fÐ5Ð5Ð5Ø)7ˆÔÐÐr   rÏ   rÐ   rÑ   r    rÒ   r"   r   c                óH  — d                      t          t          |¦  «        ¦  «        }|rd|› �}nd}d| j        j        d         › dd                      | j        ¦  «        › d| j        j        › d| j        j        › d	|› d
| j        j        d         › d|› d| j        › d|› d	�}|S )NrZ   rÔ   rb   rÕ   r)   z, dist, 
                z
            FROM rc   rÖ   r×   r*   rØ   rÙ   rÚ   )	rq   r²   r   rI   r,   r  r.   r0   rw   rÛ   s         r   rÞ   zMyScaleWithoutJSON._build_qstr  s   € ð —H’H�S¥ e™_œ_Ñ-Ô-ˆ	Øð 	Ø/ IÐ/Ð/ˆIˆIàˆIðØ”KÔ*¨6Ô2ðð à—’˜$Ô-Ñ.Ô.ðð ð ”+Ô&ðð ð *.¬Ô):ðð ð ð	ð ð
  $œ{Ô5°hÔ?ðð ð
 ENðð ð œðð ð ðð ð ˆð ˆr   rß   r_   rà   c           	     óL  ‡ — ‰                       |||¦  «        }	 ˆ fd„‰ j                             |¦  «                             ¦   «         D ¦   «         S # t          $ rG}t
                               dt          |¦  «        › dt          |¦  «        › d�¦  «         g cY d}~S d}~ww xY w)rå   c                ó‚   •‡— g | ]:Št          ‰‰j        j        d                   ˆfd„‰j        D ¦   «         ¬¦  «        ‘Œ;S )r)   c                ó"   •— i | ]}|‰|         “ŒS r   r   ©r^   r_   rÍ   s     €r   ú
<dictcomp>zMMyScaleWithoutJSON.similarity_search_by_vector.<locals>.<listcomp>.<dictcomp>A  s   ø€ ÐCÐCÐC¨!˜a  1¤ÐCÐCÐCr   rç   ©r   rI   r,   r  rê   s    @€r   ra   zBMyScaleWithoutJSON.similarity_search_by_vector.<locals>.<listcomp>>  sg   øø€ ð ð ð ð
 õ	 Ø!" 4¤;Ô#9¸&Ô#AÔ!BØCÐCÐCÐC¨tÔ/BÐCÑCÔCðñ ô ðð ð r   r¯   r°   r±   Nrë   rì   s   `      r   râ   z.MyScaleWithoutJSON.similarity_search_by_vector%  rí   rî   rÊ   rï   c           	     ó|  ‡ — ‰                       ‰ j                             |¦  «        ||¦  «        }	 ˆ fd„‰ j                             |¦  «                             ¦   «         D ¦   «         S # t          $ rG}t                               dt          |¦  «        › dt          |¦  «        › d�¦  «         g cY d}~S d}~ww xY w)rñ   c                ó’   •‡— g | ]BŠt          ‰‰j        j        d                   ˆfd„‰j        D ¦   «         ¬¦  «        ‰d         f‘ŒCS )r)   c                ó"   •— i | ]}|‰|         “ŒS r   r   r  s     €r   r  zYMyScaleWithoutJSON.similarity_search_with_relevance_scores.<locals>.<listcomp>.<dictcomp>d  s   ø€ Ð!GÐ!GÐ!G¨a ! Q q¤TÐ!GÐ!GÐ!Gr   rç   ró   r  rê   s    @€r   ra   zNMyScaleWithoutJSON.similarity_search_with_relevance_scores.<locals>.<listcomp>`  su   øø€ ð 	ð 	ð 	ð õ Ø%& t¤{Ô'=¸fÔ'EÔ%FØ!GÐ!GÐ!GÐ!G°4Ô3FÐ!GÑ!GÔ!Gðñ ô ð �f”Iðð	ð 	ð 	r   r¯   r°   r±   Nrô   rõ   s   `      r   rö   z:MyScaleWithoutJSON.similarity_search_with_relevance_scoresI  r÷   rø   c                ó   — dS )Nrb   r   r‚   s    r   r  z"MyScaleWithoutJSON.metadata_columnn  s   € àˆrr   )
rH   r   rI   rJ   r  r£   rK   r   r   rL   r5   r  r  r	  r
  r  )r@   rA   rB   rC   rk   rÞ   râ   rö   r  r  r  r  s   @r   r  r  ù  s×   ø€ € € € € ðð ð -1Ø$&ð	8ð 8ð 8ð 8ð 8ð 8ð 8ð& IMðð ð ð ð ð. Ø#'ð	"ð "ð "ð "ð "ðJ BFð#ð #ð #ð #ð #ðJ ðð ð ñ „Xðð ð ð ð r   r  )r   r   r   r   r   r   )Ú
__future__r   r³   ÚloggingÚhashlibr   Ú	threadingr   Útypingr   r   r   r	   r
   r   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.vectorstoresr   Úpydantic_settingsr   r   Ú	getLoggerrm   r   r   rG   r  r   r   r   ú<module>r(     s‹  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à	ˆÔ	Ñ	Ô	€ðð ð ð ð <ð <ð <ð <ð <�lñ <ô <ð <ð~V2ð V2ð V2ð V2ð V2ˆkñ V2ô V2ð V2ðrwð wð wð wð w˜ñ wô wð wð wð wr   