
    jD                     ^   d dl Zd dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ  G d de          Z ej        e          d             Z G d	 d
e          Z ej        e          d             Z	 	 	 ddZ	 	 ddZ	 ddZ G d de	e          Z ej        e          d             ZddZdS )    N)compiler)
DDLElementPrimaryKeyConstraint)ClauseElement
Executable)get_columnsc                       e Zd ZddZdS )
CreateViewFc                 0    || _         || _        || _        d S N)name
selectablematerialized)selfr   r   r   s       _/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/sqlalchemy_utils/view.py__init__zCreateView.__init__
   s    	$(    NF__name__
__module____qualname__r    r   r   r
   r
   	   s(        ) ) ) ) ) )r   r
   c                     d                     | j        rdnd|j        j                            | j                  |j                            | j        d                    S )NzCREATE {}VIEW {} AS {}MATERIALIZED  T)literal_binds)	formatr   dialectidentifier_preparerquoter   sql_compilerprocessr   elementr   kws      r    compile_create_materialized_viewr'      s^    #**"/7R,227<@@%%g&8%MM  r   c                       e Zd ZddZdS )DropViewFTc                 0    || _         || _        || _        d S r   )r   r   cascade)r   r   r   r+   s       r   r   zDropView.__init__   s    	(r   N)FTr   r   r   r   r)   r)      s(             r   r)   c                     d                     | j        rdnd|j        j                            | j                  | j        rdnd          S )NzDROP {}VIEW IF EXISTS {} {}r   r   CASCADE)r   r   r   r    r!   r   r+   r$   s      r   compile_drop_materialized_viewr.       sP    (//"/7R,227<@@_,		"  r   c                 \   |g }|t          j                    }i fdt          |          D             |z   }t          j        | |g|R i |}t	          d t          |          D                       s3|                    t          d t          |          D                         |S )Nc           
          g | ]G}t          j        |j        |j                            |j        |j                  |j                   HS ))keyprimary_key)saColumnr   typegetr2   ).0caliasess     r   
<listcomp>z0create_table_from_selectable.<locals>.<listcomp>7   s`         		FFAFAF++		
 	
 	
  r   c                     g | ]	}|j         
S r   )r2   r7   r8   s     r   r:   z0create_table_from_selectable.<locals>.<listcomp>B   s    ???!???r   c                     g | ]	}|j         
S r   )r   r<   s     r   r:   z0create_table_from_selectable.<locals>.<listcomp>D   s    "K"K"Ka16"K"K"Kr   )r3   MetaDatar   Tableanyappend_constraintr   )r   r   indexesmetadatar9   kwargsargstables       `   r   create_table_from_selectablerG   )   s     ;==    Z((   	D HT85d555f55E??{:'>'>???@@ 
 "K"K;z3J3J"K"K"KL	
 	
 	
 Lr   c           	      H   t          | ||d|          t          j                            |dt	          | |d                     t          j                            |d          fd            }t          j                            |dt          | d                     S )ai   Create a view on a given metadata

    :param name: The name of the view to create.
    :param selectable: An SQLAlchemy selectable e.g. a select() statement.
    :param metadata:
        An SQLAlchemy Metadata instance that stores the features of the
        database being described.
    :param indexes: An optional list of SQLAlchemy Index instances.
    :param aliases:
        An optional dictionary containing with keys as column names and values
        as column aliases.

    Same as for ``create_view`` except that a ``CREATE MATERIALIZED VIEW``
    statement is emitted instead of a ``CREATE VIEW``.

    N)r   r   rB   rC   r9   after_createT)r   c                 F    j         D ]}|                    |           d S r   rB   createtarget
connectionr&   idxrF   s       r   create_indexesz0create_materialized_view.<locals>.create_indexesn   3    = 	# 	#CJJz""""	# 	#r   before_droprG   r3   eventlistenr
   listens_forr)   )r   r   rC   rB   r9   rQ   rF   s         @r   create_materialized_viewrX   I   s    . )  E HOO4$777   X(N33# # # # 43# HOOD)))  
 Lr   Tc                 @   t          | |d          t          j                            |dt	          | |                     t          j                            |d          fd            }t          j                            |dt          | |                     S )a5   Create a view on a given metadata

    :param name: The name of the view to create.
    :param selectable: An SQLAlchemy selectable e.g. a select() statement.
    :param metadata:
        An SQLAlchemy Metadata instance that stores the features of the
        database being described.

    The process for creating a view is similar to the standard way that a
    table is constructed, except that a selectable is provided instead of
    a set of columns. The view is created once a ``CREATE`` statement is
    executed against the supplied metadata (e.g. ``metadata.create_all(..)``),
    and dropped when a ``DROP`` is executed against the metadata.

    To create a view that performs basic filtering on a table. ::

        metadata = MetaData()
        users = Table('users', metadata,
                Column('id', Integer, primary_key=True),
                Column('name', String),
                Column('fullname', String),
                Column('premium_user', Boolean, default=False),
            )

        premium_members = select(users).where(users.c.premium_user == True)
        # sqlalchemy 1.3:
        # premium_members = select([users]).where(users.c.premium_user == True)
        create_view('premium_users', premium_members, metadata)

        metadata.create_all(engine) # View is created at this point

    N)r   r   rC   rI   c                 F    j         D ]}|                    |           d S r   rK   rM   s       r   rQ   z#create_view.<locals>.create_indexes   rR   r   rS   )r+   rT   )r   r   rC   cascade_on_droprQ   rF   s        @r   create_viewr\   {   s    L )  E HOOHnjz.J.JKKKX(N33# # # # 43# HOO///  
 Lr   c                       e Zd ZdZd ZdS )RefreshMaterializedViewTc                 "    || _         || _        d S r   )r   concurrently)r   r   r`   s      r   r   z RefreshMaterializedView.__init__   s    	(r   N)r   r   r   inherit_cacher   r   r   r   r^   r^      s(        M) ) ) ) )r   r^   c                     d                     | j        rdnd|j        j                            | j                            S )Nz.REFRESH MATERIALIZED VIEW {concurrently}{name}zCONCURRENTLY r   )r`   r   )r   r`   r   r    r!   r   )r%   r   s     r   !compile_refresh_materialized_viewrc      sH    ;BB(/(<D__"177EE C   r   Fc                 t    |                                   |                     t          ||                     dS )aD   Refreshes an already existing materialized view

    :param session: An SQLAlchemy Session instance.
    :param name: The name of the materialized view to refresh.
    :param concurrently:
        Optional flag that causes the ``CONCURRENTLY`` parameter
        to be specified when the materialized view is refreshed.
    N)flushexecuter^   )sessionr   r`   s      r   refresh_materialized_viewrh      s4     MMOOOOO+D,??@@@@@r   )NNN)NN)Tr   )
sqlalchemyr3   sqlalchemy.extr   sqlalchemy.schemar   r   sqlalchemy.sql.expressionr   r   sqlalchemy_utils.functionsr   r
   compilesr'   r)   r.   rG   rX   r\   r^   rc   rh   r   r   r   <module>ro      s       # # # # # # > > > > > > > > ? ? ? ? ? ? ? ? 2 2 2 2 2 2) ) ) ) ) ) ) ) :      z    8      H / / / /l 	8 8 8 8v) ) ) ) )j- ) ) ) *++  ,+A A A A A Ar   