a
    g	gq$                     @  sh  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	rVd 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% G dd dZ&d S )!    )annotations)Any)Dict)List)Optional)Sequence)Tuple)TYPE_CHECKING)Unionschema)Column)
Constraint)Index)Integer)NULLTYPE   )util)sqla_compat)ColumnElement)
TextClause)CheckConstraint)
ForeignKey)ForeignKeyConstraint)MetaData)PrimaryKeyConstraint)Table)UniqueConstraint)
TypeEngine)MigrationContextc                   @  s  e Zd Zd<dddddZd=ddd	d
ddddZd>dddddd
d
dd
d
d
d
ddddZd?ddd	d
ddddZd@dddd
ddddZdAddd
d
ddd d!Zd"d#d$d%Z	dd&d'd(d)Z
dd*d+d,d-d.ZdBd
d
d/d
d0d1d2d3Zdd4d5d6d7Zd"d8dd9d:d;ZdS )CSchemaObjectsNzOptional[MigrationContext]None)migration_contextreturnc                 C  s
   || _ d S N)r"   )selfr"    r&   _/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/alembic/operations/schemaobj.py__init__&   s    zSchemaObjects.__init__z,Optional[sqla_compat._ConstraintNameDefined]strzSequence[str]zOptional[str]r   )name
table_namecolsr   r#   c           	        sV   |   }dd |D }tj||g|R d|i tj fdd|D d|i|}|S )Nc                 S  s   g | ]}t |tqS r&   	sa_schemar   r   .0nr&   r&   r'   
<listcomp>4       z8SchemaObjects.primary_key_constraint.<locals>.<listcomp>r   c                   s   g | ]} j | qS r&   cr/   tr&   r'   r2   9   r3   r*   )metadatar.   r   r   )	r%   r*   r+   r,   r   
dialect_kwmcolumnspr&   r6   r'   primary_key_constraint+   s    z$SchemaObjects.primary_key_constraintz	List[str]zOptional[bool]r   )r*   sourcereferent
local_colsremote_colsonupdateondelete
deferrablesource_schemareferent_schema	initiallymatchr#   c                   s   |   }||kr"|	|
kr"|| }n(|}tj||gdd |D R d|
i tj||gdd |D R d|	i}|
r~d|
|f n| ||d< tj| fdd|D f|||||d|}|| |S )	Nc                 S  s   g | ]}t |tqS r&   r-   r/   r&   r&   r'   r2   U   r3   z8SchemaObjects.foreign_key_constraint.<locals>.<listcomp>r   c                 S  s   g | ]}t |tqS r&   r-   r/   r&   r&   r'   r2   \   r3   %s.%srH   c                   s   g | ]}d  |f qS )rI   r&   r/   tnamer&   r'   r2   j   r3   )r*   rB   rC   rD   rG   )r8   r.   r   r   append_constraint)r%   r*   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   r9   r:   Zt1_colst1fr&   rJ   r'   foreign_key_constraint=   sN    
	

z$SchemaObjects.foreign_key_constraintr   )r*   r>   r@   r   r#   c                   s\   t j||  gdd |D R d|i ||d< t j fdd|D i |} | |S )Nc                 S  s   g | ]}t |tqS r&   r-   r/   r&   r&   r'   r2      r3   z3SchemaObjects.unique_constraint.<locals>.<listcomp>r   r*   c                   s   g | ]} j | qS r&   r4   r/   r6   r&   r'   r2      r3   )r.   r   r8   r   rL   )r%   r*   r>   r@   r   kwZuqr&   r6   r'   unique_constraintv   s    
zSchemaObjects.unique_constraintz*Union[str, TextClause, ColumnElement[Any]]zUnion[CheckConstraint])r*   r>   	conditionr   r#   c                 K  sB   t j||  t dt|d}t j|fd|i|}|| |S )Nxr   r*   )r.   r   r8   r   r   r   rL   )r%   r*   r>   rR   r   rP   r7   Zckr&   r&   r'   check_constraint   s    

zSchemaObjects.check_constraintr   )r*   r+   type_r   r#   c           
   
   K  s   | j ||d}dd tjtjdd tjd}z|| }W nF ty~ }	 z.tddtdd	 |D  |	W Y d }	~	n"d }	~	0 0 ||d
}|	| |S d S )Nr   c                 S  s   t jg g | dS )Nr*   )r.   r   rV   r&   r&   r'   <lambda>   s   z2SchemaObjects.generic_constraint.<locals>.<lambda>c                 S  s   t jd| dS )N rV   )r.   r   rV   r&   r&   r'   rW      r3   )Z
foreignkeyZprimaryuniquecheckNz'type' can be one of %sz, c                 s  s   | ]}t |V  qd S r$   )repr)r0   rS   r&   r&   r'   	<genexpr>   r3   z3SchemaObjects.generic_constraint.<locals>.<genexpr>rV   )
tabler.   r   r   r   KeyError	TypeErrorjoinsortedrL   )
r%   r*   r+   rU   r   rP   r7   typesconstZker&   r&   r'   generic_constraint   s(    	

z SchemaObjects.generic_constraintr   )r#   c                 C  sJ   i }| j d ur:d| j jv r:| j jd }t|dr:|j|d< tjf i |S )NZtarget_metadatanaming_convention)r"   optshasattrre   r.   r   )r%   rP   mtr&   r&   r'   r8      s    


zSchemaObjects.metadatar   )r*   r#   c                   s   |   }dd |D }|dd}|r<|D ]}d |_|_q*tj||g|R i |  fdd|D }|D ]}	 |	 ql jD ]}
| ||
 q S )Nc                 S  s.   g | ]&}t |tr|jd ur&t|n|qS r$   )
isinstancer   r]   r   _copy)r0   r5   r&   r&   r'   r2      s   
z'SchemaObjects.table.<locals>.<listcomp>_constraints_includedFc                   sL   g | ]D}t |ttfrt|d d urDt|d ddurDtj| dn|qS )parentN)Ztarget_table)ri   r   r   getattrr   rj   )r0   elemr6   r&   r'   r2      s   )	r8   poprY   indexr.   r   rL   Zforeign_keys_ensure_table_for_fk)r%   r*   r;   rP   r:   r,   rk   r5   constraintsrc   rN   r&   r6   r'   r]      s"    
	
zSchemaObjects.tabler   r   )r*   rU   r#   c                 K  s   t j||fi |S r$   )r.   r   )r%   r*   rU   rP   r&   r&   r'   column   s    zSchemaObjects.columnz4Sequence[Union[str, TextClause, ColumnElement[Any]]]r   )r*   	tablenamer;   r   r#   c                   sJ   t j|p
d|  |d  |d< t j|g fdd|D R i |}|S )NZno_tabler   Z_tablec                   s   g | ]}t j |qS r&   )r   r   Z_textual_index_columnr/   r6   r&   r'   r2      r3   z'SchemaObjects.index.<locals>.<listcomp>)r.   r   r8   r   )r%   r*   rt   r;   r   rP   idxr&   r6   r'   rp      s    zSchemaObjects.indexzTuple[Optional[str], str])	table_keyr#   c                 C  s>   d|v r.| d}d|dd }|d }n|}d }||fS )N.r   )splitr`   )r%   rv   tokenssnamerK   r&   r&   r'   _parse_table_key  s    

zSchemaObjects._parse_table_keyr   )r8   fkr#   c                 C  sr   t |jtrn|jdd\}}| |\}}||jvrHtj|||d}n
|j| }||jvrn|	t
|t dS )zUcreate a placeholder Table object for the referent of a
        ForeignKey.

        rw      r   N)ri   Z_colspecr)   rsplitr|   Ztablesr.   r   r5   Zappend_columnr   r   )r%   r8   r}   rv   cnamer{   rK   Zrel_tr&   r&   r'   rq     s    


z"SchemaObjects._ensure_table_for_fk)N)N)NNNNNNN)N)N)N)N)__name__
__module____qualname__r(   r=   rO   rQ   rT   rd   r8   r]   rs   rp   r|   rq   r&   r&   r&   r'   r    %   s2    
        (>   % 
r    N)'
__future__r   typingr   r   r   r   r   r   r	   r
   Z
sqlalchemyr   r.   Zsqlalchemy.sql.schemar   r   r   Zsqlalchemy.typesr   r   rX   r   r   Zsqlalchemy.sql.elementsr   r   r   r   r   r   r   r   r   Zsqlalchemy.sql.type_apir   Zruntime.migrationr   r    r&   r&   r&   r'   <module>   s:   