a
    g	g#E                     @  sh  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 d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dl$m%Z% d dl&m'Z' e
rd dlm(Z( d dlm)Z) d dlm*Z* d d lm+Z+ d d!lm,Z, d d"l-m.Z. d d#l/m0Z0 d d$l1m2Z2 d d%l3m4Z4 d d&lm5Z5 d d'l6m7Z7 d d(l6m8Z8 d d)l9m:Z: d d*l9m;Z; ed+ed, d-Z<d.d/d0d1d2Z=e>d3d4 e?d5eD Z@e@d6kZAe@d7kZBe@d8kZCe@d9kZDeZEzd d:lFmGZG W n  eHy   d d:lmGZG Y n0 eBrd dlm*ZI eJeId; ZKnd<ZKzd d=lmLZL W n$ eHy   eMdZLd>ZNd>ZOY n0 d<ZNe@d?kZOzd d@lmPZP W n  eHy(   eMdZPd>ZQY n0 dAZReRdB ZSd<ZQeDrNd dCl/mTZT nd dDlUmVZT edeWeTf ZXeeWeTf ZYdEdFdGdHdIZZdEdJdGdKdLZ[dEdMdGdNdOZ\dPZ]ej^dQdRdSdTdUZ_ddVdWZ`dXdYdSdZd[ZadXd\dSd]d^ZbdXd\dSd_d`ZcdQdadSdbdcZddddedfdgdhZed+d+didjdkZfdXdldSdmdnZgdodpdqdrZhdXd.dsdadtdudvZidwdx Zjdydz Zkdadpd{d|Zldadpd}d~ZmdddddZndd Zoddd\d\dddZpdd ZqeJejrdrdd Zsdd Ztndd Zsdd Ztdd ZuddadddZvddadddZwdd Zxddd\dddZyddddddZzd+dd+dddZ{G dd dej5Z|ee|ddd.dddZ}G dd deZ~ee~ddd.dddZdd Zdd ZdddddZdddMdddZdddadddÄZddadŜddǄZddɄ Zddd̜dd΄ZeBr2d dlmZ d dlmZ n"d dlmZ ddӄ ZddpddքZdddadלddلZdS )    )annotationsN)Any)Iterable)Iterator)Mapping)Optional)TYPE_CHECKING)TypeVar)Union)__version__)inspectschema)sql)types)url)compiles)CheckConstraint)Column)ForeignKeyConstraint)visitors)BindParameter)ColumnClause)quoted_name)
TextClause)UnaryExpression)traverse)	TypeGuard)Index)Table)
Connection)Dialect)Transaction)	Inspector)ColumnCollection)SQLCompiler)Insert)ColumnElement)
Constraint)
SchemaItem)Select)TableClause_CE)r'   r)   )boundstrzUnion[int, str])valuereturnc                 C  s    z
t | W S    |  Y S 0 d S N)int)r/    r3   [/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/alembic/util/sqla_compat.py	_safe_int4   s    
r5   c                 C  s   g | ]}t |qS r3   )r5   ).0xr3   r3   r4   
<listcomp><       r8   z(\d+|[abc]\d))      )r:      )r:   r<      )   )
_NONE_NAMEcommitT)ComputedF)r:   r;      )Identity)	start	incrementZminvalueZmaxvalueZ
nominvalueZ
nomaxvaluecyclecacheorder)Zon_null)	_NoneName)symbol_ConstraintNamez!TypeGuard[_ConstraintNameDefined])namer0   c                 C  s   | t u pt| ttfS r1   )r?   
isinstancer.   rI   rL   r3   r3   r4   constraint_name_defined}   s    rO   zTypeGuard[str]c                 C  s
   t | tS r1   )rM   r.   rN   r3   r3   r4   constraint_name_string   s    rP   zOptional[str]c                 C  s   t | r| S d S r1   )rP   rN   r3   r3   r4   constraint_name_or_none   s    rQ   autozOptional[Connection]zIterator[None])
connectionr0   c                 c  s~   z
| j }W n ty    d }Y n0 |d u r2d V  nH| st| d usDJ |   d V  W d    qz1 sh0    Y  nd V  d S r1   )in_transactionAttributeErrorbeginrS   rT   r3   r3   r4   _ensure_scope_for_ddl   s    

&rX   c                 C  s    t r| j|dS | j|dS d S )N)hide_password)sqla_14Zrender_as_stringZ__to_string__)r   rY   r3   r3   r4   url_render_as_string   s    r[   r    r"   c                 C  s   t | }|r|S |  S d S r1   )_get_connection_transactionrV   rS   Ztransactionr3   r3   r4   "_safe_begin_connection_transaction   s    r^   Nonec                 C  s   t | }|r|  d S r1   )r\   r@   r]   r3   r3   r4   #_safe_commit_connection_transaction   s    r`   c                 C  s   t | }|r|  d S r1   )r\   rollbackr]   r3   r3   r4   %_safe_rollback_connection_transaction   s    rb   boolc                 C  s*   z
| j }W n ty   Y dS 0 | S d S )NF)rT   rU   rW   r3   r3   r4   _get_connection_in_transaction   s
    
rd   r   zIterable[ColumnElement[Any]])idxr0   c                 C  s   | j S r1   )expressionsre   r3   r3   r4   _idx_table_bound_expressions   s    rh   )schema_itemr0   c                 K  s.   t | dr| jf i |S | jf i |S d S )N_copy)hasattrrj   copy)ri   kwr3   r3   r4   rj      s    
rj   zOptional[Transaction]c                 C  s   t r|  S | j}|jS d S r1   )rZ   Zget_transaction_rootZ_Connection__transaction)rS   rr3   r3   r4   r\      s    r\   zurl.URL)r0   c                  O  s2   t tjdrtjj| i |S tj| i |S d S )Ncreate)rk   r   URLrp   )argrm   r3   r3   r4   _create_url   s    rs   zUnion[str, None])connectable	tablename
schemanamer0   c                 C  s(   t rt| ||S | j| ||S d S r1   )rZ   r   Z	has_tabledialect)rt   ru   rv   r3   r3   r4   _connectable_has_table   s
    rx   c                 K  sL   t r:|  }|||W  d    S 1 s.0    Y  n| j||S d S r1   )rZ   Z_operation_contextexecutebind)	inspectorZ	statementparamsconnr3   r3   r4   _exec_on_inspector   s    
,r~   c                 C  s&   t s
| jS ddlm} | j|ju S d S )Nr   r   )rZ   Znullablesqlalchemy.sqlr   Z_user_defined_nullableZNULL_UNSPECIFIED)Zmetadata_columnr   r3   r3   r4   _nullability_might_be_unset  s
    
r   c                  G  s   t sdS tdd | D S d S )NFc                 s  s   | ]}t |tV  qd S r1   )rM   rA   r6   sdr3   r3   r4   	<genexpr>  r9   z._server_default_is_computed.<locals>.<genexpr>)has_computedanyZserver_defaultr3   r3   r4   _server_default_is_computed  s    r   c                  G  s   t sdS tdd | D S d S )NFc                 s  s   | ]}t |tV  qd S r1   )rM   rC   r   r3   r3   r4   r     r9   z._server_default_is_identity.<locals>.<genexpr>)rZ   r   r   r3   r3   r4   _server_default_is_identity  s    r   r(   r   )
constraintr0   c                 C  s*   t | tr | j}|d usJ |S | jS d S r1   )rM   r   parenttable)r   r   r3   r3   r4   _table_for_constraint  s
    
r   c                 C  s<   t | trdd | jD S t | tr.t| jS t| jS d S )Nc                 S  s   g | ]
}|j qS r3   )r   )r6   Zfkr3   r3   r4   r8   '  r9   z+_columns_for_constraint.<locals>.<listcomp>)rM   r   elementsr   _find_columnsZsqltextlistcolumnsr   r3   r3   r4   _columns_for_constraint%  s
    


r   r#   )r{   r   include_colsr0   c                 C  s    t r| |d S | |d S d S r1   )rZ   Zreflect_tableZreflecttable)r{   r   r   r3   r3   r4   _reflect_table.  s
    r   c                 C  s*   t | r"t| \}}||j|S | S d S r1   )_type_has_variants_get_variant_mappinggetrL   )type_rw   Z	base_typemappingr3   r3   r4   _resolve_for_variant9  s    r   _variant_mappingc                 C  s
   t | jS r1   )rc   r   r   r3   r3   r4   r   C  s    r   c                 C  s
   | | j fS r1   )r   r   r3   r3   r4   r   F  s    r   c                 C  s   t | tju S r1   )typesqltypesZVariantr   r3   r3   r4   r   K  s    c                 C  s   | j | jfS r1   )implr   r   r3   r3   r4   r   N  s    c              
     s    fdd j D } jj} jj} jd jjj} jd jjj}dd  jD } j} j} j	}	 j
}
|||||||||	|
f
S )Nc                   s   g | ]} j | jqS r3   )r   rL   )r6   keyr   r3   r4   r8   S  s   z_fk_spec.<locals>.<listcomp>r   c                 S  s   g | ]}|j jqS r3   )columnrL   )r6   elementr3   r3   r4   r8   [  r9   )Zcolumn_keysr   rL   r   r   r   r   ondeleteonupdate
deferrable	initially)r   Zsource_columnsZsource_tableZsource_schemaZtarget_schematarget_tableZtarget_columnsr   r   r   r   r3   r   r4   _fk_specR  s.    
r   r   c                 C  sF   | j d  }|d}|d d|}| jd us:J || jjkS )Nr   .)r   Z_get_colspecsplitpopjoinr   r   )r   spectokensZtablekeyr3   r3   r4   _fk_is_self_referentialn  s    


r   c                 C  s   | j S r1   )Z_type_boundr   r3   r3   r4   _is_type_boundw  s    r   c                 C  s   t  }t| i d|ji |S )z2locate Column objects within the given expression.r   )setr   add)Zclausecolsr3   r3   r4   r   ~  s    r   r$   zUnion[Column, ColumnClause])
collectionr   r0   c                 C  sH   |j dusJ | |j  }t| ds,t| dr:| j| n
| | dS )z(remove a column from a ColumnCollection.NZ
_immutableZ	_readonly)r   rk   _parentremove)r   r   Z	to_remover3   r3   r4   _remove_column_from_collection  s
    
r   z%Union[str, TextClause, ColumnElement]zUnion[ColumnElement, Column])r   text_r0   c                 C  sp   t |tr$t|tj}| | |S t |tr8t| |S t |trNt| |j	S t |t
jrdt|| S tddS )zAa workaround for the Index construct's severe lack of flexibilityz#String or text() construct expectedN)rM   r.   r   r   NULLTYPEappend_columnr   _textual_index_element_textual_index_columntextr   r'   _copy_expression
ValueError)r   r   cr3   r3   r4   r     s    





r   )
expressionr   r0   c                   s    fdd}t | i |S )Nc                   sV   t | trN| jd urN| j urN| j jv r6 j| j S t| } | |S nd S d S r1   )rM   r   r   rL   r   rj   r   )colr   r   r3   r4   replace  s    
z!_copy_expression.<locals>.replace)r   Zreplacement_traverse)r   r   r   r3   r   r4   r     s    r   c                   @  s.   e Zd ZdZdZddddddZd	d
 ZdS )r   aQ  Wrap around a sqlalchemy text() construct in such a way that
    we appear like a column-oriented SQL expression to an Index
    construct.

    The issue here is that currently the Postgresql dialect, the biggest
    recipient of functional indexes, keys all the index expressions to
    the corresponding column expressions when rendering CREATE INDEX,
    so the Index we create here needs to have a .columns collection that
    is the same length as the .expressions collection.  Ultimately
    SQLAlchemy should support text() expressions in indexes.

    See SQLAlchemy issue 3174.

    Z_textual_idx_elementr   r   r_   )r   r   r0   c                 C  s8   || _ || _|j| _t| jjtj| _|| j d S r1   )	r   r   r   r   r   r   r   fake_columnr   )selfr   r   r3   r3   r4   __init__  s
    z_textual_index_element.__init__c                 C  s   | j gS r1   )r   )r   r3   r3   r4   get_children  s    z#_textual_index_element.get_childrenN)__name__
__module____qualname____doc__Z__visit_name__r   r   r3   r3   r3   r4   r     s   r   r%   )r   compilerr0   c                 K  s   |j | jfi |S r1   )processr   r   r   rm   r3   r3   r4   _render_textual_index_column  s    r   c                   @  s   e Zd ZdS )_literal_bindparamN)r   r   r   r3   r3   r3   r4   r     s   r   c                 K  s   |j | fi |S r1   )Zrender_literal_bindparamr   r3   r3   r4   _render_literal_bindparam  s    r   c                 C  s
   t | jS r1   )r   rf   rg   r3   r3   r4   _get_index_expressions  s    r   c                 C  s   dd t | D S )Nc                 S  s   g | ]}t |d dqS )rL   N)getattr)r6   expr3   r3   r4   r8     r9   z+_get_index_column_names.<locals>.<listcomp>)r   rg   r3   r3   r4   _get_index_column_names  s    r   r   r   )r   r0   c                 C  s   t r
| jS i S d S r1   )sqla_13kwargs)r   r3   r3   r4   _column_kwargs  s    r   zUnion[Index, Constraint]zOptional[Dialect])r   rw   r0   c                 C  s   | j d u rd S |d usJ tr.|jj| ddS t| j drFt| j }nt}|t| j dd}| j|d} t	| t
jr||d }|| S |j| S d S )NFZ_alembic_quotequote)r   rN   )rL   rZ   identifier_preparerformat_constraintrk   r   r   r.   	__class__rM   r   r   Zddl_compilerZ_prepared_index_name)r   rw   Zquoted_name_clsnew_namedr3   r3   r4   _get_constraint_final_name  s$    
r   zUnion[Constraint, Index]c                 C  sD   t r6| jd u rdS |d usJ |jj| dd}|d uS | jd uS d S )NFr   )rZ   rL   r   r   )r   rw   rL   r3   r3   r4   _constraint_is_named%  s    
r   r!   )mysql_dialectr0   c                 C  s   t r
| jS t| jo| jS d S r1   )rZ   Z
is_mariadbrc   Zserver_version_info_is_mariadbr   r3   r3   r4   r   4  s    r   c                 C  s   | j S r1   ) _mariadb_normalized_version_infor   r3   r3   r4   r   >  s    r   zUnion[TableClause, Table]r&   )r   r0   c                 C  s    t r|   S | jddS d S )NT)inline)rZ   insertr   )r   r3   r3   r4   _insert_inlineB  s    r   )create_mock_engine)selectcreate_enginec                 K  s   t dd|dS )Nzpostgresql://Zmock)Zstrategyexecutorr   )r   r   rm   r3   r3   r4   r   O  s    r   r*   c                  O  s   t jt| fi |S r1   )r   r   r   )r   rm   r3   r3   r4   _selectT  s    r   )indexr0   c                 C  s8   | j D ],}t|tr|j}q
t|tr,|jr dS qdS )NTF)rf   rM   r   r   r   Z
is_literal)r   exprr3   r3   r4   is_expression_indexX  s    

r   )T)
__future__r   
contextlibretypingr   r   r   r   r   r   r	   r
   Z
sqlalchemyr   r   r   r   r   r   Zsqlalchemy.enginer   Zsqlalchemy.ext.compilerr   Zsqlalchemy.schemar   r   r   r   r   Zsqlalchemy.sql.elementsr   r   r   r   r   Zsqlalchemy.sql.visitorsr   Ztyping_extensionsr   r   r   r    r!   r"   Zsqlalchemy.engine.reflectionr#   Zsqlalchemy.sql.baser$   Zsqlalchemy.sql.compilerr%   Zsqlalchemy.sql.dmlr&   r'   Zsqlalchemy.sql.schemar(   r)   Zsqlalchemy.sql.selectabler*   r+   r,   r5   tuplefindallZ_versr   rZ   Z
sqla_14_26Zsqla_2Zsqlalchemy_versionZsqlalchemy.sql.namingr?   ImportErrorZlegacy_connectionrk   Zsqla_1xrA   r   r   Zhas_computed_reflectionrC   Zhas_identityZ_identity_options_attrsZ_identity_attrsrI   Zsqlalchemy.utilrJ   r.   rK   Z_ConstraintNameDefinedrO   rP   rQ   ZAUTOINCREMENT_DEFAULTcontextmanagerrX   r[   r^   r`   rb   rd   rh   rj   r\   rs   rx   r~   r   r   r   r   r   r   r   Z
TypeEnginer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r3   r3   r4   <module>   s  





		
	(
