U
    #it                     @  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/m0Z0 d%d'l1m2Z2 d%d(l3m4Z4 d%d)l3m5Z5 d%d*l6m7Z7 d%d+l6m8Z8 d%d,l0m9Z9 d%d-l:m;Z; erd d.lm<Z< d d/lm=Z= d d0lm>Z> d d1l?m@Z@ d d2lAmBZB d d3lCmDZD d d4lEmFZF d d5lEmGZG d d6lmHZH d d7lmIZI d d8lmJZJ d d9lKmLZL d d:lKmMZM d d;lNmOZO dd<l"mPZP d%d=lQmRZR d%d>lSmTZT d%d?lUmVZV eWeXZYG d@dA dAe.ZZG dBdC dCe%Z[e;e+dDdEdFdGdHdIdJZ\e;e[dDdCdFdGdHdKdLZ]e;e&dDdMdFdGdHdNdOZ^e;e*dDdPdFdQdRdSZ_e8`dTe7`dTdUe4jabdVG dWdX dXe4jaZce2jdeecdYdXdGdZd[d\Zfe2jgeed]dYd^dGd_d`daZhdYdGdbdcddZid]dYdedGdfdgdhZjdidYdGdjdkdlZkdS )m    )annotationsN)Any)cast)Dict)List)Optional)Sequence)Tuple)TYPE_CHECKING)Union)Column)literal_column)Numeric)text)types)BIGINT)ExcludeConstraint)INTEGER)CreateIndex)ColumnClause)
TextClause)FunctionElement)NULLTYPE   )alter_column)alter_table)AlterColumn)ColumnComment)format_column_name)format_table_name)format_type)IdentityColumnDefault)RenameTable)ComparisonResult)DefaultImpl   )util)render)ops)	schemaobj)BatchOperations)
Operations)sqla_compat)compiles)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dd	d
Zdd Zdd Z	dRddddddddddddddd fddZ
dd Zdd Zededed ed!ed"fZdddd#d$d%Zd&d'd(d)d*Zddd+d,d-d.Zd/d/d+d0d1d2Zd3dd3d4d5d6Zd7dd8d9d:ZdSd;d<d<ddd= fd>d?Zd@dAdBdCdDdEZdFdAddCdGdHZdIdAddCdJdKZdLdAddCdMdNZdOdAddCdPdQZ  ZS )TPostgresqlImpl
postgresqlTFLOATzDOUBLE PRECISIONr/   r   None)indexkwreturnc                 K  sR   |j dd pd}|D ]$}||jjkr|jt|tj q| t	|f| d S )Npostgresql_include )
kwargsgettablecappend_columnr   sqltypesZNullType_execr   )selfrD   rE   rG   colrH   rH   ^/var/www/html/me.goteku.com/backend/venv/lib/python3.8/site-packages/alembic/ddl/postgresql.pycreate_indexU   s    
zPostgresqlImpl.create_indexc                 C  s0   |j D ]$}|jd k	r|j|jkr| | qd S N)constraintsnameZnamed_constraintsZdrop_constraint)rP   Z
batch_implrK   
constraintrH   rH   rR   prep_table_for_batcha   s    

z#PostgresqlImpl.prep_table_for_batchc           	      C  s   |j r||jjkrdS |}||k}|r*dS d |||jfkr@| S |jj}t|trt|jtsxt	
dd|}d| d}t|}| j}|d k	st|tt||k S )NFz^'|'$ ')Zprimary_keyrK   Z_autoincrement_columnserver_defaultarg
isinstancestrtyper   resubr   
connectionAssertionErrorZscalarr,   _select)	rP   Zinspector_columnZmetadata_columnZrendered_metadata_defaultZrendered_inspector_defaultZconn_col_defaultZdefaults_equalZmetadata_defaultconnrH   rH   rR   compare_server_defaulti   s8    	


z%PostgresqlImpl.compare_server_defaultNFr^   zOptional[bool]z%Union[_ServerDefault, Literal[False]]Optional[str]zOptional[TypeEngine]zOptional[_ServerDefault])
table_namecolumn_namenullabler[   rV   type_schemaautoincrementexisting_typeexisting_server_defaultexisting_nullableexisting_autoincrementrE   rF   c                   sz   | dd }|d k	r&|d kr&td|d k	rL| t||||||	|
|d t j||f||||||	|
||d	| d S )NZpostgresql_usingz6postgresql_using must be used with the type_ parameter)rl   usingrn   ro   rp   )	rj   r[   rV   rl   rm   rn   ro   rp   rq   )popr&   CommandErrorrO   PostgresqlColumnTypesuperr   )rP   rh   ri   rj   r[   rV   rk   rl   rm   rn   ro   rp   rq   rE   rr   	__class__rH   rR   r      sD    zPostgresqlImpl.alter_columnc                 C  s   | dr~t|d ttfr~td|d }|r~tj|td|	dd
 }|r~|\}}||d kr~td||j| |d= d S )	Ndefaultr_   znextval\('(.+?)'::regclass\)a9  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.oid=cast(:seqname as regclass)r   )seqnamerV   z^Detected sequence named '%s' as owned by integer column '%s(%s)', assuming SERIAL and omitting)rJ   r]   r   r   r`   matchr,   Z_exec_on_inspectorr   groupfirstloginforV   )rP   Z	inspectorrK   Zcolumn_infoZ	seq_matchr   rz   ZcolnamerH   rH   rR   autogen_column_reflect   s4      

z%PostgresqlImpl.autogen_column_reflectc                 C  s8   dd |D }|D ]}| | qtjs4| || d S )Nc                 S  s   h | ]}|j d r|qS )Zduplicates_constraint)r   rJ   ).0rD   rH   rH   rR   	<setcomp>   s   zAPostgresqlImpl.correct_for_autogen_constraints.<locals>.<setcomp>)remover,   Zsqla_2Z_skip_functional_indexes)rP   Zconn_unique_constraintsZconn_indexesZmetadata_unique_constraintsZmetadata_indexesZdoubled_constraintsZixrH   rH   rR   correct_for_autogen_constraints   s    z.PostgresqlImpl.correct_for_autogen_constraintsz( asc nulls last)$z(?<! desc)( nulls last)$z( asc)$z( asc) nulls first$z desc( nulls first)$)rD   exprrF   c                 C  s*  |  dddd}|jd k	r<||jj   dd}d|krRtdd|}|r||d dkr||d	 d
kr||dd	 }qR| jD ]<}|| }r|d\}}|d | ||d   } qq|r|d dkr|d	 d
kr|dd	 }qt	d}|
|r|d|}tdd|}|dd}|S )N"rY   rZ   .z::z(::[\w ]+\w)r   ()r   z	cast\s*\(zas\s+[^)]+\) )lowerreplacerK   rV   r`   ra   _default_modifiers_researchspancompiler{   )rP   rD   r   rsr{   startendZcast_rerH   rH   rR   _cleanup_index_expr  s(    


z"PostgresqlImpl._cleanup_index_exprzUnion[Index, UniqueConstraint]zTuple[Any, ...])itemrF   c                 C  s   |j drdS dS )NZpostgresql_nulls_not_distinct)Znulls_not_distinctrH   )Zdialect_kwargsrJ   )rP   r   rH   rH   rR   _dialect_options9  s    zPostgresqlImpl._dialect_optionsr#   )metadata_indexreflected_indexrF   c              
   C  s  g }|  ||}|r|| |j}|j}t|t|krX|dt| dt|  |rft|S g }tt||dD ]\}\}	}
| |	}| 	||}| |
}| 	||}||krqzqz|
 drd|ksd|kr|d| d|d td	| d|d
|jd qz|d| d|d| qz| |}| |}||krl|d| d|  |r|t|S |rt|S t S d S )Nzexpression number  to r   Z_opsr   r   zexpression #z' detected as including operator clause.zExpression #z
 in index a   detected to include an operator clause. Expression compare cannot proceed. Please move the operator clause to the ``postgresql_ops`` dict to enable proper compare of the index expressions: https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#operator-classeszoptions )Z_compare_index_uniqueappendZexpressionslenr#   	Different	enumeratezip_compile_elementr   stripendswithr&   warnrV   r   extendZSkipEqual)rP   r   r   msgZ
unique_msgZm_exprsZr_exprsskipposZm_eZr_eZ	m_compileZm_textZ	r_compileZr_textZ	m_optionsZ	r_optionsrH   rH   rR   compare_indexesB  sT     









zPostgresqlImpl.compare_indexesr0   )metadata_constraintreflected_constraintrF   c           	      C  s|   |  |}| |}|j}|j}||kr>td| d| S | |j}| |j}||krttd| d| S t S )Nzexpression r   )Z_create_metadata_constraint_sigZ _create_reflected_constraint_sigunnamedr#   r   r   constr   )	rP   r   r   Zmetadata_tupZreflected_tupZmeta_sigZconn_sigZmetadata_doZconn_dorH   rH   rR   compare_unique_constraint~  s&    z(PostgresqlImpl.compare_unique_constraintzDict[str, Any])reflected_optionskindrF   c                 C  s*   | di  }| ds&|dd  |S )NZdialect_optionsrG   )rJ   copyrs   )rP   r   r   optionsrH   rH   rR    adjust_reflected_dialect_options  s    
z/PostgresqlImpl.adjust_reflected_dialect_optionszUnion[ClauseElement, str])elementrF   c                 C  s&   t |tr|S |j| jddddjS )NTF)Zliteral_bindsZinclude_table)dialectcompile_kwargs)r]   r^   r   r   string)rP   r   rH   rH   rR   r     s    
zPostgresqlImpl._compile_elementr6   bool)r   is_server_defaultis_indexrE   rF   c                   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   )r]   r   Z
self_grouprv   render_ddl_sql_expr)rP   r   r   r   rE   rw   rH   rR   r     s     z"PostgresqlImpl.render_ddl_sql_exprr;   r=   zUnion[str, Literal[False]])rk   autogen_contextrF   c                 C  sF   t |j}|dsdS t| d|j rBt| d|j }|||S dS )Nzsqlalchemy.dialects.postgresqlFz_render_%s_type)r_   
__module__
startswithhasattrZ__visit_name__getattr)rP   rk   r   modmethrH   rH   rR   render_type  s    


zPostgresqlImpl.render_typer3   c                 C  s   t tt||ddS )N	text_typez(.+?\(.*text_type=)r   r^   r'   Z_render_type_w_subtyperP   rk   r   rH   rH   rR   _render_HSTORE_type  s       z"PostgresqlImpl._render_HSTORE_typer1   c                 C  s   t tt||ddS )NZ	item_typez(.+?\()r   r   rH   rH   rR   _render_ARRAY_type  s       z!PostgresqlImpl._render_ARRAY_typer4   c                 C  s   t tt||ddS NZastext_typez(.+?\(.*astext_type=)r   r   rH   rH   rR   _render_JSON_type  s       z PostgresqlImpl._render_JSON_typer5   c                 C  s   t tt||ddS r   r   r   rH   rH   rR   _render_JSONB_type  s       z!PostgresqlImpl._render_JSONB_type)
NFNNNNNNNN)FF)__name__r   __qualname__Z__dialect__Ztransactional_ddlr$   Ztype_synonymsrS   rX   rf   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rH   rH   rw   rR   r@   N   sR   1          .4'"	<	  


r@   c                      s(   e Zd Zddddd fddZ  ZS )ru   r^   r;   rC   )rV   ri   rk   rF   c                   s4   | dd }t j||f| t|| _|| _d S )Nrr   )rs   rv   __init__rN   Zto_instancerk   rr   )rP   rV   ri   rk   rE   rr   rw   rH   rR   r     s    zPostgresqlColumnType.__init__)r   r   r   r   r   rH   rH   rw   rR   ru     s   ru   rA   r"   r2   r^   )r   compilerrF   c                 K  s"   dt || j| jt|| jd f S )Nz%s RENAME TO %s)r   rh   rl   r   Znew_table_namer   r   rE   rH   rH   rR   visit_rename_table  s    r   c                 K  s@   dt || j| jt|| jdt|| j | jr8d| j ndf S )Nz%s %s %s %szTYPE %szUSING %srY   )r   rh   rl   r   ri   r    rk   rr   r   rH   rH   rR   visit_column_type  s    
r   r   c                 K  sJ   d}| j d k	r"|j| j t nd}|jt|| j| jt	|| j
|dS )Nz9COMMENT ON COLUMN {table_name}.{column_name} IS {comment}ZNULL)rh   ri   comment)r   Zsql_compilerZrender_literal_valuerN   Stringformatr   rh   rl   r   ri   )r   r   rE   Zddlr   rH   rH   rR   visit_column_comment  s"       
r   r!   )r   r   c                 K  s   dt || j| jt|| jf }| jd kr6|d7 }|S | jd kr\|d7 }||| j7 }|S | j	| j| j\}}}| j}t
|D ]H}|dkr|d|jrdnd 7 }q|d|tjf |t||i 7 }q|S d S )	Nz%s %s zDROP IDENTITYzADD alwayszSET GENERATED %s ZALWAYSz
BY DEFAULTzSET %s )r   rh   rl   r   ri   ry   ro   visit_identity_columnimplZ_compare_identity_defaultsortedr   Zget_identity_optionsr,   ZIdentityr   )r   r   rE   r   diff_identityattrrH   rH   rR   r   .  s2    


 

r   create_exclude_constraintbatch_create_exclude_constraintZexclude_constraintc                	   @  s   e Zd ZdZdZd!dddddd	d
dddZedd dddZd"dddddZedddddddddZ	edddddddd Z
dS )#CreateExcludeConstraintOpz0Represent a create exclude constraint operation.excludeNzsqla_compat._ConstraintNamezUnion[str, quoted_name]zIUnion[Sequence[Tuple[str, str]], Sequence[Tuple[ColumnClause[Any], str]]]z)Optional[Union[ColumnElement[bool], str]]rg   zOptional[ExcludeConstraint]rC   )constraint_namerh   elementswhererl   _orig_constraintrF   c                 K  s.   || _ || _|| _|| _|| _|| _|| _d S rT   )r   rh   r   r   rl   r   rE   )rP   r   rh   r   r   rl   r   rE   rH   rH   rR   r   [  s    z"CreateExcludeConstraintOp.__init__r   )rW   rF   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 rH   rH   )r   r   rV   oprH   rH   rR   
<listcomp>x  s    z=CreateExcludeConstraintOp.from_constraint.<locals>.<listcomp>zColumnElement[bool] | None)r   rl   r   
deferrable	initiallyrr   )
r,   Z_table_for_constraintrV   _render_exprsr   r   rl   r   r   rr   )clsrW   Zconstraint_tablerH   rH   rR   from_constraintp  s    

z)CreateExcludeConstraintOp.from_constraintzOptional[MigrationContext])migration_contextrF   c                 C  sx   | j d k	r| j S t|}|j| j| jd}t| j| j| j	d| j
}|jD ]\}}}|t|t qN|| |S )N)rl   )rV   r   )r   r)   ZSchemaObjectsrK   rh   rl   r   r   r   r   rE   r   rM   r   r   Zappend_constraint)rP   r   Z
schema_objtZexclr   rV   operrH   rH   rR   to_constraint  s&    



z'CreateExcludeConstraintOp.to_constraintr+   r^   r   zOptional[Table])
operationsr   rh   r   rE   rF   c                 O  s   | |||f|}| |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   r   r   rh   r   rE   r   rH   rH   rR   r     s    +z3CreateExcludeConstraintOp.create_exclude_constraintr*   )r   r   r   rE   rF   c                 O  s*   |j j|d< | ||j j|f|}||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`

        rl   )r   rl   rh   r   )r   r   r   r   rE   r   rH   rH   rR   r     s    z9CreateExcludeConstraintOp.batch_create_exclude_constraint)NNN)N)r   r   r   __doc__Zconstraint_typer   classmethodr   r   r   r   rH   rH   rH   rR   r   Q  s   
    -r   r=   )r   r   rF   c                 C  s   t | | ddS )NT)alter)_exclude_constraintr   )r   r   rH   rH   rR   _add_exclude_constraint  s    r   r   r9   )rW   r   namespace_metadatarF   c                 C  s&   t d| |}|dk	r|S t| |dS )Nr   F)r'   Z_user_defined_renderr   )rW   r   r   renderedrH   rH   rR   !_render_inline_exclude_constraint  s      r   )r   rF   c                 C  s   | j }|d k	r|d dS )Nz*from sqlalchemy.dialects import postgresqlzpostgresql.)importsadd)r   r   rH   rH   rR   _postgresql_autogenerate_prefix  s    
r   r   )rW   r   r   rF   c                   s0  g  j }jr$dtjf jr>dtjf jrXdtjf |s|rjjrdt	jjf |sj
rdt j
f  fdd}|rtt j
g}|s|tt	jj
g7 }||  dt d	|d
 S | }dt d	|d
 S d S )Nr   r   rr   rl   rV   c                    sN    fddj D } jd k	r6| dtj   | dd D  | S )Nc                   s$   g | ]\}}}d t | |f qS )z(%s, %r))_render_potential_column)r   ZsqltextrV   Zopstring)r   rH   rR   r     s   	zC_exclude_constraint.<locals>.do_expr_where_opts.<locals>.<listcomp>zwhere=%sc                 S  s   g | ]\}}d ||f qS )z%s=%rrH   )r   kvrH   rH   rR   r   %  s     )r   r   r   r'   _render_potential_exprr   )argsr   rW   optsrH   rR   do_expr_where_opts  s    
	
 z/_exclude_constraint.<locals>.do_expr_where_optsz-%(prefix)screate_exclude_constraint(%(args)s)z, )prefixr  z%%(prefix)sExcludeConstraint(%(args)s))Z
_has_batchr   r   r^   r   rr   rK   rl   r'   _identrV   Z_render_gen_namereprr   Z_alembic_autogenerate_prefixjoinr   )rW   r   r   Z	has_batchr  r  rH   r  rR   r     s<    
r   zGUnion[ColumnClause[Any], Column[Any], TextClause, FunctionElement[Any]])valuer   rF   c                 C  sN   t | tr0| jrd}nd}|t|| jd S tj| |t | ttfdS d S )Nz"%(prefix)sliteral_column(%(name)r)z%(prefix)scolumn(%(name)r))r  rV   )Zwrap_in_text)	r]   r   Z
is_literalr'   Z_sqlalchemy_autogenerate_prefixrV   r  r   r   )r  r   templaterH   rH   rR   r   ;  s    
r   )l
__future__r   loggingr`   typingr   r   r   r   r   r   r	   r
   r   Z
sqlalchemyr   r   r   r   r   rN   Zsqlalchemy.dialects.postgresqlr   r   r   Zsqlalchemy.schemar   Zsqlalchemy.sql.elementsr   r   Zsqlalchemy.sql.functionsr   Zsqlalchemy.typesr   baser   r   r   r   r   r   r    r!   r"   r   r#   r$   rY   r&   Zautogenerater'   r   r(   r)   Zoperations.baser*   r+   r,   Zutil.sqla_compatr-   r.   r/   r0   Z$sqlalchemy.dialects.postgresql.arrayr1   Z#sqlalchemy.dialects.postgresql.baser2   Z%sqlalchemy.dialects.postgresql.hstorer3   Z#sqlalchemy.dialects.postgresql.jsonr4   r5   r6   r7   r8   Zsqlalchemy.sql.schemar9   r:   Zsqlalchemy.sql.type_apir;   r<   Zautogenerate.apir=   Zautogenerate.renderr>   Zruntime.migrationr?   	getLoggerr   r~   r@   ru   r   r   r   r   Zregister_operationZAddConstraintOpZregister_add_constraintr   Z	renderersZdispatch_forr   Z_constraint_renderersr   r   r   r   rH   rH   rH   rR   <module>   s   
   -
	" 
 


?