o
    hYg                     @  s  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' 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&l0m1Z1 d'd(l2m3Z3 d'd)l4m5Z5 d'd*l6m7Z7 d'd+l6m8Z8 d'd,l9m:Z: d'd-l9m;Z; d'd.l3m<Z< eryd d/lm=Z= d d0lm>Z> d d1lm?Z? d d2l@mAZA d d3lBmCZC d d4lDmEZE d d5lFmGZG d d6lFmHZH d d7lmIZI d d8lmJZJ d d9lmKZK d d:lLmMZM d d;lLmNZN d d<lOmPZP dd=l%mQZQ d'd>lRmSZS d'd?lTmUZU d'd@lVmWZW eXeYZZG dAdB dBe1Z[G dCdD dDe(Z\e*e/dEdpdLdMZ]e*e\dEdqdNdOZ^e*e)dEdrdQdRZ_e*e.dEdsdTdUZ`e;adVe:adVdWe7jbcdXG dYdZ dZe7jbZde5jefeddtd^d_Zge5jhfedudddeZidvdfdgZjdwdjdkZkdxdndoZldS )y    )annotationsN)Any)cast)Dict)List)Optional)Sequence)Tuple)TYPE_CHECKING)Union)Column)literal_column)Numeric)text)types)BIGINT)ExcludeConstraint)INTEGER)CreateIndex)	operators)ColumnClause)
TextClause)UnaryExpression)FunctionElement)NULLTYPE   )alter_column)alter_table)AlterColumn)ColumnComment)compiles)format_column_name)format_table_name)format_type)IdentityColumnDefault)RenameTable)DefaultImpl   )util)render)ops)	schemaobj)BatchOperations)
Operations)sqla_compat)Literal)Index)UniqueConstraint)ARRAY)PGDDLCompiler)HSTORE)JSON)JSONB)ClauseElement)ColumnElement)quoted_name)MetaData)Table)
TypeEngine)_ServerDefault)AutogenContext)_f_name)MigrationContextc                      s  e Zd ZdZdZejddhf Zd]ddZdd Zdd Z											d^d_ fd%d&Z
d'd( Zd)d* Zd`d-d.Zdad1d2Zdbd6d7Zdcd8d9Zddd<d=ZdedAdBZdfdDdEZ		dgdh fdIdJZdidOdPZdjdRdSZdkdUdVZdldXdYZdmd[d\Z  ZS )nPostgresqlImpl
postgresqlTFLOATzDOUBLE PRECISIONindexr0   kwr   returnNonec                 K  sV   |j dd pd}|D ]}||jjvr|jt|tj q| t	|fi | d S )Npostgresql_include )
kwargsgettablecappend_columnr   sqltypesNullType_execr   )selfrD   rE   rH   colrI   rI   Y/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/alembic/ddl/postgresql.pycreate_indexS   s   
zPostgresqlImpl.create_indexc                 C  s0   |j D ]}|jd ur|j|jv r| | qd S N)constraintsnamenamed_constraintsdrop_constraint)rR   
batch_implrL   
constraintrI   rI   rT   prep_table_for_batch_   s   


z#PostgresqlImpl.prep_table_for_batchc                 C  s   |j r||jju rdS |}||k}|rdS d |||jfv r | S |jj}t|tr@t|jts<t	
dd|}d| d}t|}| jtt||k S )NFz^'|'$ ')primary_keyrL   _autoincrement_columnserver_defaultarg
isinstancestrtyper   resubr   
connectionscalarr.   _select)rR   inspector_columnmetadata_columnrendered_metadata_defaultrendered_inspector_defaultconn_col_defaultdefaults_equalmetadata_defaultrI   rI   rT   compare_server_defaultg   s2   	

z%PostgresqlImpl.compare_server_defaultNF
table_namere   column_namenullableOptional[bool]rb   %Union[_ServerDefault, Literal[False]]rX   Optional[str]type_Optional[TypeEngine]schemaautoincrementexisting_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementc                   sz   | dd }|d ur|d u rtd|d ur&| t||||||	|
|d t j||f||||||	|
||d	| d S )Npostgresql_usingz6postgresql_using must be used with the type_ parameter)r|   usingr~   r   r   )	rv   rb   rX   r|   r}   r~   r   r   r   )popr(   CommandErrorrQ   PostgresqlColumnTypesuperr   )rR   rt   ru   rv   rb   rX   rz   r|   r}   r~   r   r   r   rE   r   	__class__rI   rT   r      sD   
zPostgresqlImpl.alter_columnc                 C  s   | drAt|d ttfrCtd|d }|rEtj|td|	dd
 }|rG|\}}||d krItd||j| |d= d S d S d S d S d S d S )	Ndefaultrf   znextval\('(.+?)'::regclass\)a+  select c.relname, a.attname from pg_class as c join pg_depend d on d.objid=c.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass join pg_class t on t.oid=d.refobjid join pg_attribute a on a.attrelid=t.oid and a.attnum=d.refobjsubid where c.relkind='S' and c.relname=:seqnamer   )seqnamerX   z^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rK   rd   r   r   rg   matchr.   _exec_on_inspectorr   groupfirstloginforX   )rR   	inspectorrL   column_info	seq_matchr   r   colnamerI   rI   rT   autogen_column_reflect   s<   

z%PostgresqlImpl.autogen_column_reflectc                 C  s<   dd |D }|D ]}| | q	tjs| || d S d S )Nc                 S  s   h | ]
}|j d r|qS )duplicates_constraint)r   rK   ).0rD   rI   rI   rT   	<setcomp>   s    
zAPostgresqlImpl.correct_for_autogen_constraints.<locals>.<setcomp>)remover.   sqla_2_skip_functional_indexes)rR   conn_unique_constraintsconn_indexesmetadata_unique_constraintsmetadata_indexesdoubled_constraintsixrI   rI   rT   correct_for_autogen_constraints   s   z.PostgresqlImpl.correct_for_autogen_constraintsexprremove_suffixc                 C  s   |  dddd}|jd ur||jj   dd}|r@|d dkr@|d dkr@|d	d }|r@|d dkr@|d dks,d
|v rKtdd|}|r[||r[|d t|  }|S )N"r^   r_   .r   ()r   z::z(::[\w ]+\w))lowerreplacerL   rX   rg   rh   endswithlen)rR   rD   r   r   rI   rI   rT   _cleanup_index_expr   s   
z"PostgresqlImpl._cleanup_index_exprexpr7   c                 C  s   d}t |tr[|jd u r|j}nF|j}t |jtr|jj}nd }|d u r8|tjkr.d}	 |S |tjkr5d}	 |S |tjkrG|tjkrGd}	 |S |tjkrS|tjkrSd}	 |S t |ts|S )Nr^   z ascz nulls lastz asc nulls lastz nulls first)	rd   r   modifierelementr   asc_opnullslast_opdesc_opnullsfirst_op)rR   r   	to_removeopinner_oprI   rI   rT   _default_modifiers  s:   









z!PostgresqlImpl._default_modifiersitemUnion[Index, UniqueConstraint]Tuple[Any, ...]c                 C  s   |j drdS dS )Npostgresql_nulls_not_distinct)nulls_not_distinctrI   )dialect_kwargsrK   )rR   r   rI   rI   rT   _dialect_sig6  s   zPostgresqlImpl._dialect_sigc                   s$   t  fdd jD   S )Nc                 3  sD    | ]}j  gt|tr|d fn	||fR  V  qdS )r^   N)r   rd   re   _compile_elementr   )r   erD   rR   rI   rT   	<genexpr>@  s    	

z2PostgresqlImpl.create_index_sig.<locals>.<genexpr>)tupleexpressionsr   )rR   rD   rI   r   rT   create_index_sig?  s
   	
zPostgresqlImpl.create_index_sigconstr1   c                 C  s"   t tdd |jD | | S )Nc                 S  s   g | ]}|j qS rI   )rX   )r   rS   rI   rI   rT   
<listcomp>P  s    z?PostgresqlImpl.create_unique_constraint_sig.<locals>.<listcomp>)r   sortedcolumnsr   )rR   r   rI   rI   rT   create_unique_constraint_sigL  s
   z+PostgresqlImpl.create_unique_constraint_sigreflected_optionsDict[str, Any]kindc                 C  s*   | di  }| ds|dd  |S )Ndialect_optionsrH   )rK   copyr   )rR   r   r   optionsrI   rI   rT    adjust_reflected_dialect_optionsS  s   
z/PostgresqlImpl.adjust_reflected_dialect_optionsr   c                 C  s   |j | jddddjS )NTF)literal_bindsinclude_table)dialectcompile_kwargs)compiler   string)rR   r   rI   rI   rT   r   \  s   zPostgresqlImpl._compile_elementis_server_defaultboolis_indexc                   s0   |rt |ts| }t j|f||d|S )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        )r   r   )rd   r   
self_groupr   render_ddl_sql_expr)rR   r   r   r   rE   r   rI   rT   r   b  s   z"PostgresqlImpl.render_ddl_sql_exprr<   autogen_contextr>   Union[str, Literal[False]]c                 C  sF   t |j}|dsdS t| d|j r!t| d|j }|||S dS )Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)rf   
__module__
startswithhasattr__visit_name__getattr)rR   rz   r   modmethrI   rI   rT   render_typey  s   


zPostgresqlImpl.render_typer4   c                 C     t tt||ddS )N	text_typez(.+?\(.*text_type=)r   re   r)   _render_type_w_subtyperR   rz   r   rI   rI   rT   _render_HSTORE_type     z"PostgresqlImpl._render_HSTORE_typer2   c                 C  r   )N	item_typez(.+?\()r   r   rI   rI   rT   _render_ARRAY_type  r   z!PostgresqlImpl._render_ARRAY_typer5   c                 C  r   Nastext_typez(.+?\(.*astext_type=)r   r   rI   rI   rT   _render_JSON_type  r   z PostgresqlImpl._render_JSON_typer6   c                 C  r   r   r   r   rI   rI   rT   _render_JSONB_type  r   z!PostgresqlImpl._render_JSONB_type)rD   r0   rE   r   rF   rG   )
NFNNNNNNNN)rt   re   ru   re   rv   rw   rb   rx   rX   ry   rz   r{   r|   ry   r}   rw   r~   r{   r   r   r   rw   r   rw   rE   r   rF   rG   )rD   r0   r   re   r   re   rF   re   )r   r7   rF   re   )r   r   rF   r   )rD   r0   rF   r   )r   r1   rF   r   )r   r   r   re   rF   r   )r   r7   rF   re   )FF)
r   r7   r   r   r   r   rE   r   rF   re   )rz   r<   r   r>   rF   r   )rz   r4   r   r>   rF   re   )rz   r2   r   r>   rF   re   )rz   r5   r   r>   rF   re   )rz   r6   r   r>   rF   re   )__name__r   __qualname____dialect__transactional_ddlr&   type_synonymsrU   r]   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rI   rI   r   rT   rA   L   sJ    
/4&


"
	


		






rA   c                      s   e Zd Zd
 fdd	Z  ZS )r   rX   re   ru   rz   r<   rF   rG   c                   s8   | dd }t j||fi | t|| _|| _d S )Nr   )r   r   __init__rO   to_instancerz   r   )rR   rX   ru   rz   rE   r   r   rI   rT   r     s   
zPostgresqlColumnType.__init__)rX   re   ru   re   rz   r<   rF   rG   )r   r   r   r   r   rI   rI   r   rT   r     s    r   rB   r   r%   compilerr3   rF   re   c                 K  s"   dt || j| jt|| jd f S )Nz%s RENAME TO %s)r   rt   r|   r"   new_table_namer   r   rE   rI   rI   rT   visit_rename_table  s   r  c                 K  sD   dt || j| jt|| jdt|| j | jrd| j f S df S )Nz%s %s %s %szTYPE %szUSING %sr^   )r   rt   r|   r   ru   r#   rz   r   r  rI   rI   rT   visit_column_type  s   
r  r   c                 K  sJ   d}| j d ur|j| j t nd}|jt|| j| jt	|| j
|dS )Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}NULL)rt   ru   comment)r  sql_compilerrender_literal_valuerO   Stringformatr"   rt   r|   r!   ru   )r   r   rE   ddlr  rI   rI   rT   visit_column_comment  s   



r  r$   c                 K  s   dt || j| jt|| jf }| jd u r|d7 }|S | jd u r.|d7 }||| j7 }|S | j	| j| j\}}}| j}t
|D ]&}|dkrS|d|jrNdnd 7 }qA|d|tjd	i |t||i 7 }qA|S )
Nz%s %s zDROP IDENTITYzADD alwayszSET GENERATED %s ALWAYSz
BY DEFAULTzSET %s rI   )r   rt   r|   r   ru   r   r   visit_identity_columnimpl_compare_identity_defaultr   r  get_identity_optionsr.   Identityr   )r   r   rE   r   diff_identityattrrI   rI   rT   r    s0   




r  create_exclude_constraintbatch_create_exclude_constraintexclude_constraintc                   @  s^   e Zd ZdZdZ			d'd(ddZed)ddZ	d*d+ddZed,d"d#Z	ed-d%d&Z
dS ).CreateExcludeConstraintOpz0Represent a create exclude constraint operation.excludeNconstraint_namesqla_compat._ConstraintNamert   Union[str, quoted_name]elementsIUnion[Sequence[Tuple[str, str]], Sequence[Tuple[ColumnClause[Any], str]]]where)Optional[Union[ColumnElement[bool], str]]r|   ry   _orig_constraintOptional[ExcludeConstraint]rF   rG   c                 K  s.   || _ || _|| _|| _|| _|| _|| _d S rV   )r  rt   r   r"  r|   r$  rE   )rR   r  rt   r   r"  r|   r$  rE   rI   rI   rT   r     s   
z"CreateExcludeConstraintOp.__init__r\   r   c                 C  sD   t |}| |j|jdd |jD td|j|j||j|j|j	d	S )Nc                 S  s   g | ]	\}}}||fqS rI   rI   )r   r   rX   r   rI   rI   rT   r   /  s    z=CreateExcludeConstraintOp.from_constraint.<locals>.<listcomp>zColumnElement[bool] | None)r"  r|   r$  
deferrable	initiallyr   )
r.   _table_for_constraintrX   _render_exprsr   r"  r|   r&  r'  r   )clsr\   constraint_tablerI   rI   rT   from_constraint'  s   

z)CreateExcludeConstraintOp.from_constraintmigration_contextOptional[MigrationContext]c                 C  sx   | j d ur| j S t|}|j| j| jd}t| j| j| j	d| j
}|jD ]\}}}|t|t q'|| |S )N)r|   )rX   r"  )r$  r+   SchemaObjectsrL   rt   r|   r   r   r  r"  rE   r)  rN   r   r   append_constraint)rR   r-  
schema_objtexclr   rX   operrI   rI   rT   to_constraint;  s&   



z'CreateExcludeConstraintOp.to_constraint
operationsr-   re   r   rE   Optional[Table]c                 O  s   | |||fi |}| |S )a  Issue an alter to create an EXCLUDE constraint using the
        current migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        e.g.::

            from alembic import op

            op.create_exclude_constraint(
                "user_excl",
                "user",
                ("period", "&&"),
                ("group", "="),
                where=("group != 'some group'"),
            )

        Note that the expressions work the same way as that of
        the ``ExcludeConstraint`` object itself; if plain strings are
        passed, quoting rules must be applied manually.

        :param name: Name of the constraint.
        :param table_name: String name of the source table.
        :param elements: exclude conditions.
        :param where: SQL expression or SQL string with optional WHERE
         clause.
        :param deferrable: optional bool. If set, emit DEFERRABLE or
         NOT DEFERRABLE when issuing DDL for this constraint.
        :param initially: optional string. If set, emit INITIALLY <value>
         when issuing DDL for this constraint.
        :param schema: Optional schema name to operate within.

        )invoke)r*  r6  r  rt   r   rE   r   rI   rI   rT   r  Q  s   +
z3CreateExcludeConstraintOp.create_exclude_constraintr,   c                 O  s.   |j j|d< | ||j j|fi |}||S )a3  Issue a "create exclude constraint" instruction using the
        current batch migration context.

        .. note::  This method is Postgresql specific, and additionally
           requires at least SQLAlchemy 1.0.

        .. seealso::

            :meth:`.Operations.create_exclude_constraint`

        r|   )r  r|   rt   r8  )r*  r6  r  r   rE   r   rI   rI   rT   r    s   
z9CreateExcludeConstraintOp.batch_create_exclude_constraint)NNN)r  r  rt   r  r   r!  r"  r#  r|   ry   r$  r%  rF   rG   )r\   r   rF   r  rV   )r-  r.  rF   r   )r6  r-   r  re   rt   re   r   r   rE   r   rF   r7  )r6  r,   r  re   r   r   rE   r   )r   r   r   __doc__constraint_typer   classmethodr,  r5  r  r  rI   rI   rI   rT   r    s    
-r  r   r>   r   c                 C  s   t | | ddS )NT)alter)_exclude_constraintr5  )r   r   rI   rI   rT   _add_exclude_constraint  s   r>  r\   r   namespace_metadatar:   c                 C  s&   t d| |}|dur|S t| |dS )Nr  F)r)   _user_defined_renderr=  )r\   r   r?  renderedrI   rI   rT   !_render_inline_exclude_constraint  s   rB  c                 C  s   | j }|d ur|d dS )Nz*from sqlalchemy.dialects import postgresqlzpostgresql.)importsadd)r   rC  rI   rI   rT   _postgresql_autogenerate_prefix  s   
rE  r<  r   c                   s*  g  j }jrdtjf jrdtjf jr,dtjf |s@|r@jjr@dt	jjf |sQj
rQdt j
f  fdd}|rtt j
g}|ss|tt	jj
g7 }||  dt d	|d
 S | }dt d	|d
 S )Nr&  r'  r   r|   rX   c                    sN    fddj D } jd ur| dtj   | dd D  | S )Nc                   s$   g | ]\}}}d t | |f qS )z(%s, %r))_render_potential_column)r   sqltextrX   opstring)r   rI   rT   r     s    zC_exclude_constraint.<locals>.do_expr_where_opts.<locals>.<listcomp>zwhere=%sc                 S  s   g | ]
\}}d ||f qS )z%s=%rrI   )r   kvrI   rI   rT   r     s    )r)  r"  appendr)   _render_potential_exprextend)argsr   r\   optsrI   rT   do_expr_where_opts  s   

z/_exclude_constraint.<locals>.do_expr_where_optsz-%(prefix)screate_exclude_constraint(%(args)s)z, )prefixrN  z%%(prefix)sExcludeConstraint(%(args)s))
_has_batchr&  rK  re   r'  r   rL   r|   r)   _identrX   _render_gen_namereprrM  _alembic_autogenerate_prefixjoinrE  )r\   r   r<  	has_batchrQ  rN  rI   rO  rT   r=    s<   
r=  valueGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]]c                 C  sJ   t | tr| jrd}nd}|t|| jd S tj| |t | ttfdS )Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))rR  rX   )wrap_in_text)	rd   r   
is_literalr)   _sqlalchemy_autogenerate_prefixrX   rL  r   r   )rZ  r   templaterI   rI   rT   rF    s   
rF  )r   r%   r   r3   rF   re   )r   r   r   r3   rF   re   )r   r   r   r3   rF   re   )r   r$   r   r3   )r   r>   r   r  rF   re   )r\   r   r   r>   r?  r:   rF   re   )r   r>   rF   re   )r\   r   r   r>   r<  r   rF   re   )rZ  r[  r   r>   rF   re   )m
__future__r   loggingrg   typingr   r   r   r   r   r   r	   r
   r   
sqlalchemyr   r   r   r   r   rO   sqlalchemy.dialects.postgresqlr   r   r   sqlalchemy.schemar   sqlalchemy.sqlr   sqlalchemy.sql.elementsr   r   r   sqlalchemy.sql.functionsr   sqlalchemy.typesr   baser   r   r   r   r    r!   r"   r#   r$   r%   r  r&   r^   r(   autogenerater)   r6  r*   r+   operations.baser,   r-   r.   r/   r0   r1   $sqlalchemy.dialects.postgresql.arrayr2   #sqlalchemy.dialects.postgresql.baser3   %sqlalchemy.dialects.postgresql.hstorer4   #sqlalchemy.dialects.postgresql.jsonr5   r6   r7   r8   r9   sqlalchemy.sql.schemar:   r;   sqlalchemy.sql.type_apir<   r=   autogenerate.apir>   autogenerate.renderr?   runtime.migrationr@   	getLoggerr   r   rA   r   r  r  r  r  register_operationAddConstraintOpregister_add_constraintr  	renderersdispatch_forr>  _constraint_renderersrB  rE  r=  rF  rI   rI   rI   rT   <module>   s    
  e
	"
 



<