o
    9f$                     @   sn   d dl mZmZmZ d dlmZmZ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ejZd	S )
    )utiltypesexc)compilerClauseElement
expression)CreateColumn)
TextClause)to_list)Stringc                       s   e Zd Zdd Zdd Z fddZdd Zd	d
 Zd ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )!ClickHouseDDLCompilerc                 C   sL   |dkrdS t |tttf| t|tr| j|tj	S | jj
|dddS )N z''TF)literal_bindsinclude_table)sa_utilassert_arg_typer   r   r	   
isinstancesql_compilerrender_literal_valuesqltypes
STRINGTYPEprocess)selfdefaultname r   l/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_sqlalchemy/drivers/compilers/ddlcompiler.py_get_default_string
   s   
z)ClickHouseDDLCompiler._get_default_stringc                 K   s$  | j |d | jjj|j|d }|jd }|jd ur)|d| |jj	d 7 }n%|d d ur<|d| |d d 7 }n|d	 d urN|d
| |d	 d 7 }|j
d urc| j|j
t }|d| 7 }|d }|d ur~t|ttfrwd|}|d|7 }|d d ur|d| |d d 7 }|S )N )type_expression
clickhousez	 DEFAULT server_defaultmaterializedz MATERIALIZED clickhouse_materializedaliasz ALIAS clickhouse_alias	 COMMENT codec, z CODEC({0})afterz AFTER clickhouse_after)preparerformat_columndialecttype_compilerr   typedialect_optionsr!   r   argcommentr   r   r   r   r   listtuplejoinformat)r   columnkwcolspecoptsliteralr'   r   r   r   get_column_specification   sH   







z.ClickHouseDDLCompiler.get_column_specificationc                    s4   |j }|j}d|_tt| j|fi |}||_|S )NT)elementnullablesuperr   visit_create_column)r   creater8   r7   r>   rv	__class__r   r   r@   E   s   
z)ClickHouseDDLCompiler.visit_create_columnc                 K      d S Nr   r   
constraintr8   r   r   r   visit_primary_key_constraintS      z2ClickHouseDDLCompiler.visit_primary_key_constraintc                 K   rE   rF   r   rG   r   r   r   visit_foreign_key_constraintW   rJ   z2ClickHouseDDLCompiler.visit_foreign_key_constraintFc                    s    j }t|ttfrt|dkr|r|d }t|ttfr-dd fdd|D  d S t|tjs@t|ds<t	|S |
 }|j|d	d
dS )N   r   (r(   c                 3       | ]}  |V  qd S rF   _compile_param).0elr   r   r   	<genexpr>c   s    

z7ClickHouseDDLCompiler._compile_param.<locals>.<genexpr>)
self_groupFTr   r   )r   r   r3   r4   lenr5   r   ColumnClausehasattrstrrV   r   )r   expropt_listr   r   rS   r   rP   [   s    
z$ClickHouseDDLCompiler._compile_paramc                    sL  |  }|d u rd}n| t|}d|j|}|jr+|d| j|j dd7 }|jr=|d| j|j dd7 }|jra|jsR|d| j|j dd7 }|d| j|j dd7 }|j	rs|d| |j	 d	 7 }|j
r| jj |d
d fdd|j
 D 7 }|jr|dddd t|j D  7 }|S )Nz()z{0}{1}
z PARTITION BY {0}
T)r]   z ORDER BY {0}
z PRIMARY KEY {0}
z SAMPLE BY {0}
r   z	 TTL {0}
z,
     c                 3   s    | ]
} |d ddV  qdS )FTrW   Nr   )rQ   icompiler   r   rT      s
    
z9ClickHouseDDLCompiler.visit_merge_tree.<locals>.<genexpr>z
 SETTINGS r(   c                 s   s"    | ]\}}d j ||dV  qdS )z{key}={value})keyvalueN)r6   )rQ   ra   rb   r   r   r   rT      s    
)get_parametersrP   r
   r6   r   partition_byget_expressions_or_columnsorder_byprimary_key	sample_byttlr   r   r5   settingssorteditems)r   engineparamtextr   r_   r   visit_merge_treep   sf   z&ClickHouseDDLCompiler.visit_merge_treec                    s   |  }|j}|s|S |d7 }g }|D ]"}t|tr+dd fdd|D  d }n |}|| q|d|7 }|d S )NrM   r(   c                 3   rN   rF   rO   )rQ   prS   r   r   rT      s    z5ClickHouseDDLCompiler.visit_engine.<locals>.<genexpr>rU   )rc   r   r   r4   r5   rP   append)r   rm   engine_paramsro   compiled_paramsrn   compiledr   rS   r   visit_engine   s$   

z"ClickHouseDDLCompiler.visit_enginec                 C   s&   |j d d }|rd| j| S dS )Nr    clusterzON CLUSTER r   )r0   r+   quote)r   tablerw   r   r   r   create_table_suffix   s   z)ClickHouseDDLCompiler.create_table_suffixc                 C   s\   t |dd }|std|j d| | }|jd ur,| j|jt	 }|d| 7 }|S )Nrm   zNo engine for table '%s'z
 ENGINE = r&   )
getattrr   CompileErrorr   r   r2   r   r   r   r   )r   ry   rm   ro   r;   r   r   r   post_create_table   s   

z'ClickHouseDDLCompiler.post_create_tablec                 C   s   |j }d}|jr|d7 }|| j|7 }|jr"|d| j|j 7 }|jr2|d| j|jj 7 }n.|d7 }d}|jj	D ]}| 
t|}|d urS||7 }d}||7 }q<|d7 }|| |j7 }|d	7 }|jrk|d
7 }|d| jj
|jdd 7 }|S )Nz
CREATE MATERIALIZED VIEW zIF NOT EXISTS  ON CLUSTER z TO z (r   r(   rU   r   z	POPULATE zAS T)r   )r=   if_not_existsr+   format_tablerw   rx   toinner_tabler   columnsr   r   r}   populater   mv_selectable)r   rA   mvro   	separatorr7   	processedr   r   r   visit_create_materialized_view   s6   

z4ClickHouseDDLCompiler.visit_create_materialized_viewc                 C   P   d}t |ddr|d7 }|| j|j }t |ddr&|d| j|j 7 }|S )Nz
DROP TABLE 	if_existsF
IF EXISTS 
on_clusterr~   r{   r+   r   r=   rx   r   r   dropro   rB   r   r   r   visit_drop_table     z&ClickHouseDDLCompiler.visit_drop_tablec                 C   r   )Nz
DROP VIEW r   Fr   r   r~   r   r   r   r   r   
visit_view  r   z ClickHouseDDLCompiler.visit_viewc                 K   s(   d| j |j| j|jjt f S )Nz ALTER TABLE %s MODIFY COMMENT %s)r+   r   r=   r   r   r2   r   r   r   rA   r8   r   r   r   visit_set_table_comment&  s   z-ClickHouseDDLCompiler.visit_set_table_commentc                 K   s   d| j |j S )Nz ALTER TABLE %s MODIFY COMMENT '')r+   r   r=   r   r   r   r   visit_drop_table_comment.  s   z.ClickHouseDDLCompiler.visit_drop_table_comment)F)__name__
__module____qualname__r   r<   r@   rI   rK   rP   rp   rv   rz   r}   r   r   r   r   r   __classcell__r   r   rC   r   r   	   s     +
=*r   N)
sqlalchemyr   r   r   r   r   sqlalchemy.sqlr   r   r   sqlalchemy.sql.ddlr   sqlalchemy.sql.elementsr	   sqlalchemy.utilr
   sqlalchemy.typesr   DDLCompilerr   r   r   r   r   <module>   s    