
    D6iW                     >   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y)    N)compiler)
DDLElementPrimaryKeyConstraint)ClauseElement
Executable)get_columnsc                       e Zd ZddZy)
CreateViewc                 Z    |r|rt        d      || _        || _        || _        || _        y )Nz4Cannot use CREATE OR REPLACE with materialized views)
ValueErrorname
selectablematerializedreplace)selfr   r   r   r   s        X/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/sqlalchemy_utils/view.py__init__zCreateView.__init__
   s0    GSTT	$(    N)FF__name__
__module____qualname__r    r   r   r
   r
   	   s    r   r
   c           	         dj                  | j                  rdnd| j                  rdnd|j                  j                  j                  | j                        |j                  j                  | j                  d            S )NzCREATE {}{}VIEW {} AS {}zOR REPLACE  MATERIALIZED T)literal_binds)
formatr   r   dialectidentifier_preparerquoter   sql_compilerprocessr   elementr   kws      r    compile_create_materialized_viewr'      sj    %,, b"//R,,227<<@%%g&8&8%M	 r   c                       e Zd ZddZy)DropViewc                 .    || _         || _        || _        y N)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                  | j                  rdnd|j                  j                  j	                  | j
                        | j                  rd      S d      S )NzDROP {}VIEW IF EXISTS {} {}r   r   CASCADE)r   r   r   r    r!   r   r,   r$   s      r   compile_drop_materialized_viewr/   $   sX    (//"//R,,227<<@__	  +- r   c                 F   |g }|t        j                         }|i }t        |      D cg c]]  }t        j                  |j                  |j
                  |j                  |j                  |j                        |j                        _ c}|z   }t        j                  | |g|i |}t        t        |      D cg c]  }|j                   c}      s8|j                  t        t        |      D cg c]  }|j                   c}        |S c c}w c c}w c c}w )N)keyprimary_key)saMetaDatar   Columnr   typegetr2   Tableanyappend_constraintr   )	r   r   indexesmetadataaliaseskwargscargstables	            r   create_table_from_selectablerB   -   s     ;;=
 Z(	  			FFAFFAFFAFF ;	

 	D HHT85d5f5E{:'>?!?@ ;z3J"Ka166"KL	
 L @"Ks   A"D D7Dc           	      *   t        | ||d|      t        j                  j                  |dt	        | |d             t        j                  j                  |d      fd       }t        j                  j                  |dt        | d             S )ah  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   r;   r<   r=   after_createT)r   c                 J    j                   D ]  }|j                  |        y r+   r;   createtarget
connectionr&   idxrA   s       r   create_indexesz0create_materialized_view.<locals>.create_indexesb   "    == 	#CJJz"	#r   before_droprB   r3   eventlistenr
   listens_forr)   )r   r   r<   r;   r=   rL   rA   s         @r   create_materialized_viewrS   E   s    " )E HHOO.*T:D"Q XX(N3# 4# HHOOHmXd-NOLr   c           	      &   t        | |d      t        j                  j                  |dt	        | ||             t        j                  j                  |d      fd       }t        j                  j                  |dt        | |             S )a  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 cascade_on_drop: If ``True`` the view will be dropped with
        ``CASCADE``, deleting all dependent objects as well.
    :param replace: If ``True`` the view will be created with ``OR REPLACE``,
        replacing an existing view with the same name.

    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)
        create_view('premium_users', premium_members, metadata)

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

    N)r   r   r<   rD   )r   c                 J    j                   D ]  }|j                  |        y r+   rF   rH   s       r   rL   z#create_view.<locals>.create_indexes   rM   r   rN   )r,   rO   )r   r   r<   cascade_on_dropr   rL   rA   s         @r   create_viewrW   k   s    R )j4E HHOO4W5 XX(N3# 4# HHOOHmXdO-TULr   c                       e Zd ZdZd Zy)RefreshMaterializedViewTc                      || _         || _        y r+   )r   concurrently)r   r   r[   s      r   r   z RefreshMaterializedView.__init__   s    	(r   N)r   r   r   inherit_cacher   r   r   r   rY   rY      s    M)r   rY   c                     dj                  | j                  rdnd|j                  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_viewr^      sF    ;BB(/(<(<_"1177E C  r   c                 Z    | j                          | j                  t        ||             y)aC  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executerY   )sessionr   r[   s      r   refresh_materialized_viewrc      s!     MMOOO+D,?@r   )NNN)NN)TF)F)
sqlalchemyr3   sqlalchemy.extr   sqlalchemy.schemar   r   sqlalchemy.sql.expressionr   r   sqlalchemy_utils.functionsr   r
   compilesr'   r)   r/   rB   rS   rW   rY   r^   rc   r   r   r   <module>rj      s     # > ? 2  : z  8  <@0#T 9x)j- ) *+ ,Ar   