o
    ED©iá  ã                   @   s8   d dl mZ d dlmZ G dd„ deeƒZd	dd„ZdS )
é    )Ú	Immutable)Ú
FromClausec                       sh   e Zd ZdZdZdZdZdZd‡ fdd„	Ze	dd	„ ƒZ
e	d
d„ ƒZe	dd„ ƒZdd„ Zddd„Z‡  ZS )Ú	ArrayJoinz'Represents ClickHouse ARRAY JOIN clauseÚ
array_joinTFNc                    s,   t ƒ  ¡  || _|| _|| _|| _d| _dS )a#  Initialize ARRAY JOIN clause

        Args:
            left: The left side (table or subquery)
            array_column: The array column to join
            alias: Optional alias for the joined array elements
            is_left: If True, use LEFT ARRAY JOIN instead of ARRAY JOIN
        N)ÚsuperÚ__init__ÚleftÚarray_columnÚaliasÚis_leftÚ_is_clone_of)Úselfr   r	   r
   r   ©Ú	__class__© úe/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_connect/cc_sqlalchemy/sql/clauses.pyr      s   
	
zArrayJoin.__init__c                 C   s   | j S )z%Return the selectable for this clause©r   ©r   r   r   r   Ú
selectable   s   zArrayJoin.selectablec                 C   s   | j gS )zJHide the left table from the FROM clause since it's part of the ARRAY JOINr   r   r   r   r   Ú_hide_froms#   ó   zArrayJoin._hide_fromsc                 C   s   | j jS )z4Return all FROM objects referenced by this construct)r   Ú_from_objectsr   r   r   r   r   (   r   zArrayJoin._from_objectsc                 K   s$   | j  | j ¡}| j ¡ |_| |_|S )zReturn a copy of this ArrayJoin)r   Ú__new__Ú__dict__Úcopyr   )r   ÚkwÚcr   r   r   Ú_clone-   s   zArrayJoin._clonec                 K   s@   dd„ }|du r
|}|| j fi |¤Ž| _ || jfi |¤Ž| _dS )zÖCopy internal state for cloning

        This ensures that when queries are cloned (e.g., for subqueries, unions, or CTEs),
        the left FromClause and array_column references are properly deep-cloned.
        c                 [   s   | S ©Nr   )ÚelemÚkwargsr   r   r   Ú_default_clone:   s   z1ArrayJoin._copy_internals.<locals>._default_cloneN)r   r	   )r   Úcloner   r!   r   r   r   Ú_copy_internals4   s
   zArrayJoin._copy_internals©NFr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__visit_name__Ú_is_from_containerÚnamed_with_columnÚ_is_joinr   Úpropertyr   r   r   r   r#   Ú__classcell__r   r   r   r   r      s    


r   NFc                 C   s   t | |||ƒS )aª  Create an ARRAY JOIN clause

    Args:
        left: The left side (table or subquery)
        array_column: The array column to join
        alias: Optional alias for the joined array elements
        is_left: If True, use LEFT ARRAY JOIN instead of ARRAY JOIN

    Returns:
        ArrayJoin: An ArrayJoin clause element

    Example:
        from clickhouse_connect.cc_sqlalchemy.sql.clauses import array_join

        # Basic ARRAY JOIN
        query = select(table).select_from(array_join(table, table.c.tags))

        # LEFT ARRAY JOIN with alias
        query = select(table).select_from(
            array_join(table, table.c.tags, alias='tag', is_left=True)
        )
    )r   )r   r	   r
   r   r   r   r   r   F   s   r   r$   )Úsqlalchemy.sql.baser   Úsqlalchemy.sql.selectabler   r   r   r   r   r   r   Ú<module>   s    @