o
    Zh}                     @  s   d dl mZ d dlZd dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ er@d dlmZ d dlmZ d	Zd
ZdZdZdZG dd deZdS )    )annotationsN)InvalidStateErrorTask)TYPE_CHECKINGAsyncIteratorIteratorListOptionalSequenceTuple)	ByteStore)	SetupModeaexecute_cql)Session)PreparedStatementzm
    CREATE TABLE IF NOT EXISTS {keyspace}.{table} 
    (row_id TEXT, body_blob BLOB, PRIMARY KEY (row_id));
zDSELECT row_id, body_blob FROM  {keyspace}.{table} WHERE row_id IN ?;z2SELECT row_id, body_blob FROM  {keyspace}.{table};zAINSERT INTO {keyspace}.{table} (row_id, body_blob) VALUES (?, ?);z1DELETE FROM {keyspace}.{table} WHERE row_id IN ?;c                   @  s   e Zd ZdZddejdd4ddZd5ddZd5ddZd6ddZ	d6ddZ
d6ddZd7ddZd7d d!Zd8d$d%Zd8d&d'Zd9d(d)Zd9d*d+Zdd,d:d/d0Zdd,d;d2d3ZdS )<CassandraByteStorea  A ByteStore implementation using Cassandra as the backend.

    Parameters:
        table: The name of the table to use.
        session: A Cassandra session object. If not provided, it will be resolved
            from the cassio config.
        keyspace: The keyspace to use. If not provided, it will be resolved
            from the cassio config.
        setup_mode: The setup mode to use. Default is SYNC  (SetupMode.SYNC).
    N)sessionkeyspace
setup_modetablestrr   Optional[Session]r   Optional[str]r   r   returnNonec             	   C  s   |r|s)zddl m}m} |p||| _|p| | _W n ttfy(   tdw || _|| _|| _d | _d | _	d | _
tj| j| jd}d | _|tjkrXtt| j|| _d S | j| d S )Nr   )check_resolve_keyspacecheck_resolve_sessionz_Could not import a recent cassio package.Please install it with `pip install --upgrade cassio`.r   r   )Zcassio.configr   r   r   r   ImportErrorModuleNotFoundErrorr   select_statementinsert_statementdelete_statementCREATE_TABLE_CQL_TEMPLATEformatdb_setup_taskr   ASYNCasynciocreate_taskr   execute)selfr   r   r   r   r   r   Z
create_cql r+   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/storage/cassandra.py__init__1   s4   


zCassandraByteStore.__init__c                 C  s2   | j rz| j   W dS  ty   tdw dS )zAEnsure that the DB setup is finished. If not, raise a ValueError.zAsynchronous setup of the DB not finished. NB: AstraDB components sync methods shouldn't be called from the event loop. Consider using their async equivalents.N)r%   resultr   
ValueErrorr*   r+   r+   r,   ensure_db_setupX   s   z"CassandraByteStore.ensure_db_setupc                   s   | j r| j I dH  dS dS )z:Ensure that the DB setup is finished. If not, wait for it.N)r%   r0   r+   r+   r,   aensure_db_setupd   s   z#CassandraByteStore.aensure_db_setupr   c                 C  (   | j s| jtj| j| jd| _ | j S )zGet the prepared select statement for the table.
        If not available, prepare it.

        Returns:
            PreparedStatement: The prepared statement.
        r   )r    r   prepareSELECT_TABLE_CQL_TEMPLATEr$   r   r   r0   r+   r+   r,   get_select_statementi      z'CassandraByteStore.get_select_statementc                 C  r3   )zGet the prepared insert statement for the table.
        If not available, prepare it.

        Returns:
            PreparedStatement: The prepared statement.
        r   )r!   r   r4   INSERT_TABLE_CQL_TEMPLATEr$   r   r   r0   r+   r+   r,   get_insert_statementx   r7   z'CassandraByteStore.get_insert_statementc                 C  r3   )zGet the prepared delete statement for the table.
        If not available, prepare it.

        Returns:
            PreparedStatement: The prepared statement.
        r   )r"   r   r4   DELETE_TABLE_CQL_TEMPLATEr$   r   r   r0   r+   r+   r,   get_delete_statement   s   z'CassandraByteStore.get_delete_statementkeysSequence[str]List[Optional[bytes]]c                   sT   ddl m} |   i  | j|  ||gD ]}|j |j< q fdd|D S )Nr   ValueSequencec                      g | ]}  |qS r+   get.0keyZ	docs_dictr+   r,   
<listcomp>       z+CassandraByteStore.mget.<locals>.<listcomp>)cassandra.queryr@   r1   r   r)   r6   	body_blobrow_idr*   r<   r@   rowr+   rG   r,   mget   s   zCassandraByteStore.mgetc                   sd   ddl m} |  I d H  i  t| j|  ||gdI d H D ]}|j |j< q  fdd|D S )Nr   r?   
parametersc                   rA   r+   rB   rD   rG   r+   r,   rH      rI   z,CassandraByteStore.amget.<locals>.<listcomp>)rJ   r@   r2   r   r   r6   rK   rL   rM   r+   rG   r,   amget   s   zCassandraByteStore.amgetkey_value_pairsSequence[Tuple[str, bytes]]c                 C  s4   |    |  }|D ]\}}| j|||f q
d S )N)r1   r9   r   r)   r*   rS   r!   kvr+   r+   r,   mset   s
   zCassandraByteStore.msetc                   sD   |   I d H  |  }|D ]\}}t| j|||fdI d H  qd S )NrP   )r2   r9   r   r   rU   r+   r+   r,   amset   s   zCassandraByteStore.amsetc                 C  s0   ddl m} |   | j|  ||g d S )Nr   r?   )rJ   r@   r1   r   r)   r;   r*   r<   r@   r+   r+   r,   mdelete   s   zCassandraByteStore.mdeletec                   s@   ddl m} |  I d H  t| j|  ||gdI d H  d S )Nr   r?   rP   )rJ   r@   r2   r   r   r;   rZ   r+   r+   r,   amdelete   s   zCassandraByteStore.amdelete)prefixr]   Iterator[str]c                c  sH    |    | jtj| j| jdD ]}|j}|r||r!|V  qd S Nr   )	r1   r   r)   SELECT_ALL_TABLE_CQL_TEMPLATEr$   r   r   rL   
startswithr*   r]   rN   rF   r+   r+   r,   
yield_keys   s   zCassandraByteStore.yield_keysAsyncIterator[str]c                C sT   |   I d H  t| jtj| j| jdI d H D ]}|j}|r$||r'|V  qd S r_   )	r2   r   r   r`   r$   r   r   rL   ra   rb   r+   r+   r,   ayield_keys   s   zCassandraByteStore.ayield_keys)
r   r   r   r   r   r   r   r   r   r   )r   r   )r   r   )r<   r=   r   r>   )rS   rT   r   r   )r<   r=   r   r   )r]   r   r   r^   )r]   r   r   rd   )__name__
__module____qualname____doc__r   ZSYNCr-   r1   r2   r6   r9   r;   rO   rR   rX   rY   r[   r\   rc   re   r+   r+   r+   r,   r   %   s&    
'









r   )
__future__r   r'   r   r   typingr   r   r   r   r	   r
   r   Zlangchain_core.storesr   Z'langchain_community.utilities.cassandrar   r   Zcassandra.clusterr   rJ   r   r#   r5   r`   r8   r:   r   r+   r+   r+   r,   <module>   s"    $
