o
    vin*                    @  s,  d dl m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	m
Z
mZmZ d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d d	l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( e	rzej)d
krtd dlm*Z* nd dl+m*Z* dZ,dZ-edddZ.G dd deZ/G dd de/Z0G dd dZ1G dd de1Z2G dd de/Z3d=d!d"Z4G d#d$ d$Z5d>d&d'Z6G d(d) d)Z7e3Z8G d*d+ d+Z9G d,d- d-e/eZ:G d.d de/eZ;G d/d0 d0ee. Z<G d1d2 d2Z=G d3d4 d4e=Z>G d5d6 d6e=Z?G d7d8 d8Z@G d9d: d:ZAG d;d< d<ZBdS )?    )annotationsN)Sequence)copy)reduce)TYPE_CHECKINGAnyGenericTypeVar)DialectsJoinTypeReferenceOptionSetOperation)ArithmeticExpression	CriterionEmptyCriterionFieldFunctionIndexNodePeriodCriterionRollupStarTermTupleValueWrapper)JoinExceptionQueryExceptionRollupExceptionSetOperationExceptionbuilderformat_alias_sqlformat_quotesignore_copy)      )SelfzTimothy Heysztheys@kayak.comQBQueryBuilder)boundc                   @  sb   e Zd ZdddZedddZdddZedddZe	dddZ
e	dddZdddZdS )
SelectablealiasstrreturnNonec                 C  
   || _ d S Nr*   selfr*    r3   M/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/pypika/queries.py__init__2      
zSelectable.__init__c                 C  r.   r/   r0   r1   r3   r3   r4   as_5      
zSelectable.as_namer   c                 C     t || dS )Ntabler   r2   r9   r3   r3   r4   field9      zSelectable.fieldr   c                 C  s   t | S r/   )r   r2   r3   r3   r4   star<   s   zSelectable.starc                 C  
   |  |S r/   r?   r>   r3   r3   r4   __getattr__@   r8   zSelectable.__getattr__c                 C  rC   r/   rD   r>   r3   r3   r4   __getitem__D   r8   zSelectable.__getitem__c                 C  s   | j S r/   r0   rA   r3   r3   r4   get_table_nameH   s   zSelectable.get_table_nameN)r*   r+   r,   r-   )r9   r+   r,   r   )r,   r   r,   r+   )__name__
__module____qualname__r5   r   r7   r?   propertyrB   r"   rE   rF   rG   r3   r3   r3   r4   r)   1   s    

r)   c                      s>   e Zd Zdd fdd	ZdddZdddZdddZ  ZS )AliasedQueryNr9   r+   querySelectable | Noner,   r-   c                   s   t  j|d || _|| _d S )Nr0   )superr5   r9   rN   )r2   r9   rN   	__class__r3   r4   r5   M      
zAliasedQuery.__init__kwargsr   c                 K  s"   | j d u r| jS | j jdi |S Nr3   )rN   r9   get_sqlr2   rT   r3   r3   r4   rV   R   s   
zAliasedQuery.get_sqlotherboolc                 C  s   t |to
| j|jkS r/   )
isinstancerM   r9   r2   rX   r3   r3   r4   __eq__W   s   zAliasedQuery.__eq__intc                 C  s   t t| jS r/   )hashr+   r9   rA   r3   r3   r4   __hash__Z      zAliasedQuery.__hash__r/   )r9   r+   rN   rO   r,   r-   rT   r   r,   r+   )rX   rM   r,   rY   r,   r]   )rI   rJ   rK   r5   rV   r\   r_   __classcell__r3   r3   rQ   r4   rM   L   s
    

rM   c                   @  sF   e Zd Zdddd	ZdddZdddZedddZddddZdS )SchemaNr9   r+   parentSchema | Noner,   r-   c                 C     || _ || _d S r/   )_name_parent)r2   r9   re   r3   r3   r4   r5   _      
zSchema.__init__rX   rY   c                 C  s"   t |to| j|jko| j|jkS r/   )rZ   rd   rh   ri   r[   r3   r3   r4   r\   c   s   "zSchema.__eq__c                 C     |  | S r/   r\   r[   r3   r3   r4   __ne__f   r@   zSchema.__ne__itemTablec                 C  r:   )Nschemaro   r2   rn   r3   r3   r4   rE   i      zSchema.__getattr__
quote_char
str | NonerT   r   c                 K  s:   t | j|}| jd urdj| jjdd|i||dS |S )Nz{parent}.{schema}ru   )re   rq   r3   )r!   rh   ri   formatrV   )r2   ru   rT   
schema_sqlr3   r3   r4   rV   m   s   
zSchema.get_sqlr/   )r9   r+   re   rf   r,   r-   )rX   rd   r,   rY   )rn   r+   r,   ro   ru   rv   rT   r   r,   r+   )	rI   rJ   rK   r5   r\   rm   r"   rE   rV   r3   r3   r3   r4   rd   ^   s    

rd   c                   @  s   e Zd ZedddZdS )	Databasern   r+   r,   rd   c                 C  r:   N)re   rd   rs   r3   r3   r4   rE   z   rt   zDatabase.__getattr__N)rn   r+   r,   rd   )rI   rJ   rK   r"   rE   r3   r3   r3   r4   rz   y   s    rz   c                      s   e Zd Zed5ddZ			d6d7 fddZd8ddZd9ddZed:ddZ	ed;ddZ
d8dd Zd<d"d#Zd8d$d%Zd=d'd(Zd>d*d+Zd?d/d0Zd@d1d2Zd?d3d4Z  ZS )Aro   rq   "str | list | tuple | Schema | Noner,   c                 C  sP   t | tr| S t | ttfrtdd | dd  t| d S | d ur&t| S d S )Nc                 S  r:   r{   r|   )objsr3   r3   r4   <lambda>   s    z$Table._init_schema.<locals>.<lambda>   r   )rZ   rd   listtupler   rp   r3   r3   r4   _init_schema   s   
 zTable._init_schemaNr9   r+   Schema | str | Noner*   rv   	query_clstype[Query] | Noner-   c                   sL   t  | || _| || _|pt| _d | _d | _t	| jts$t
dd S )Nz,Expected 'query_cls' to be subclass of Query)rP   r5   _table_namer   _schemaQuery
_query_cls_for_for_portion
issubclass	TypeError)r2   r9   rq   r*   r   rQ   r3   r4   r5      s   
zTable.__init__c                 C  s   | j p| jS r/   )r*   r   rA   r3   r3   r4   rG      r@   zTable.get_table_namerT   r   c                 K  s   | d}t| j|}| jd urdj| jjdi ||d}| jr0dj|| jjdi |d}n| jrAdj|| jjdi |d}t|| j	fi |S )Nru   z{schema}.{table})rq   r<   z{table} FOR {criterion})r<   	criterionz"{table} FOR PORTION OF {criterion}r3   )
getr!   r   r   rw   rV   r   r   r    r*   )r2   rT   ru   	table_sqlr3   r3   r4   rV      s   

zTable.get_sqltemporal_criterionr   c                 C  &   | j rtd| jrtd|| _ d S )N)'Query' object already has attribute for_0'Query' object already has attribute for_portion)r   AttributeErrorr   )r2   r   r3   r3   r4   for_   
   
z
Table.for_period_criterionr   c                 C  r   )Nr   r   )r   r   r   )r2   r   r3   r3   r4   for_portion   r   zTable.for_portionc                 C     | j ddS N"ru   rV   rA   r3   r3   r4   __str__   r@   zTable.__str__rY   c                 C  sB   t |tsdS | j|jkrdS | j|jkrdS | j|jkrdS dS NFT)rZ   ro   r   r   r*   r[   r3   r3   r4   r\      s   
zTable.__eq__c                 C  s"   | j rd| j| j S d| jS )NzTable('{}', schema='{}')zTable('{}'))r   rw   r   rA   r3   r3   r4   __repr__   s   zTable.__repr__rX   c                 C  rk   r/   rl   r[   r3   r3   r4   rm      r@   zTable.__ne__r]   c                 C  s   t t| S r/   )r^   r+   rA   r3   r3   r4   r_      r@   zTable.__hash__terms'int | float | str | bool | Term | Fieldr'   c                 G     | j | j| S )a  
        Perform a SELECT operation on the current table

        :param terms:
            Type:  list[expression]

            A list of terms to select. These can be any type of int, float, str, bool or Term or a Field.

        :return:  QueryBuilder
        )r   from_selectr2   r   r3   r3   r4   r         zTable.selectc                 C  s   | j | S )za
        Perform an UPDATE operation on the current table

        :return: QueryBuilder
        )r   updaterA   r3   r3   r4   r         zTable.updatec                 G  r   )a  
        Perform an INSERT operation on the current table

        :param terms:
            Type: list[expression]

            A list of terms to select. These can be any type of int, float, str, bool or  any other valid data

        :return: QueryBuilder
        )r   intoinsertr   r3   r3   r4   r      r   zTable.insert)rq   r}   r,   r}   NNN)
r9   r+   rq   r   r*   rv   r   r   r,   r-   rH   ra   )r   r   r,   r-   )r   r   r,   r-   )r,   rY   )rX   r   r,   rY   rb   )r   r   r,   r'   r,   r'   )rI   rJ   rK   staticmethodr   r5   rG   rV   r   r   r   r   r\   r   rm   r_   r   r   r   rc   r3   r3   rQ   r4   ro      s*    








ro   namestuple[str, str] | strrT   r   r,   list[Table]c                  O  sr   g }| D ]2}t |tr$t|dkr$t|d |d |d|dd}nt||d|dd}|| q|S )z
    Shortcut to create many tables. If `names` param is a tuple, the first
    position will refer to the `_table_name` while the second will be its `alias`.
    Any other data structure will be treated as a whole as the `_table_name`.
       r   r   rq   r   )r9   r*   rq   r   )r9   rq   r   )rZ   r   lenro   r   append)r   rT   tablesr9   tr3   r3   r4   make_tables   s    r   c                   @  s@   e Zd ZdZ			ddddZdddZdddZdddZdS )ColumnzRepresents a column.Ncolumn_namer+   column_typerv   nullablebool | NonedefaultAny | Term | Noner,   r-   c                 C  s<   || _ || _|| _|d u st|tr|| _d S t|| _d S r/   )r9   typer   rZ   r   r   r   )r2   r   r   r   r   r3   r3   r4   r5     s   *zColumn.__init__rT   r   c                 K  s"   | d}djt| j|d}|S )Nru   z{name}r9   )r   rw   r!   r9   )r2   rT   ru   
column_sqlr3   r3   r4   get_name_sql'  s
   

zColumn.get_name_sqlc                 K  st   dj | jdi || jrd | jnd| jd ur"d | jrdndnd| jr4d d| jjdi | ndd}|S )	Nz{name}{type}{nullable}{default}z {} NULLzNOT NULLzDEFAULT )r9   r   r   r   r3   )rw   r   r   r   r   rV   )r2   rT   r   r3   r3   r4   rV   0  s    $zColumn.get_sqlc                 C  r   r   r   rA   r3   r3   r4   r   :  r@   zColumn.__str__r   )
r   r+   r   rv   r   r   r   r   r,   r-   ra   rH   )rI   rJ   rK   __doc__r5   r   rV   r   r3   r3   r3   r4   r     s    

	
r   list[Column]c                  G  sR   g }| D ]"}t |trt|dkrt|d |d d}nt|d}|| q|S )z
    Shortcut to create many columns. If `names` param is a tuple, the first
    position will refer to the `name` while the second will be its `type`.
    Any other data structure will be treated as a whole as the `name`.
    r   r   r   r   r   )r   )rZ   r   r   r   r   )r   columnsr9   columnr3   r3   r4   make_columns>  s   
r   c                   @  s    e Zd Zddd	ZdddZdS )	PeriodForr9   r+   start_columnstr | Column
end_columnr,   r-   c                 C  s@   || _ t|tr
|nt|| _t|tr|| _d S t|| _d S r/   )r9   rZ   r   r   r   r2   r9   r   r   r3   r3   r4   r5   P  s   "zPeriodFor.__init__rT   r   c                 K  sB   | d}djt| j|| jjdi || jjdi |d}|S )Nru   z9PERIOD FOR {name} ({start_column_name},{end_column_name}))r9   start_column_nameend_column_namer3   )r   rw   r!   r9   r   r   r   )r2   rT   ru   period_for_sqlr3   r3   r4   rV   U  s   

zPeriodFor.get_sqlN)r9   r+   r   r   r   r   r,   r-   ra   )rI   rJ   rK   r5   rV   r3   r3   r3   r4   r   O  s    
r   c                   @  s   e Zd ZdZed<ddZed=d
dZed>ddZed?ddZed@ddZ	edAddZ
edBddZedCd!d"ZedDd#d$ZedEd&d'ZedFd*d+ZedGd.d/ZedHd0d1ZedId4d5ZedJd9d:Zd;S )Kr   ai  
    Query is the primary class and entry point in pypika. It is used to build queries iteratively using the builder
    design
    pattern.

    This class is immutable.

    Examples
    --------
    Simple query

    .. code-block:: python

        from pypika import Query, Field
        q = Query.from_('customers').select('*').where(Field("id") == 1)
    rT   r   r,   r'   c                 K  s   t di |S rU   )r'   )clsrT   r3   r3   r4   _builderw  s   zQuery._builderr<   Selectable | strc                 K     | j di ||S )aH  
        Query builder entry point.  Initializes query building and sets the table to select from.  When using this
        function, the query becomes a SELECT query.

        :param table:
            Type: Table or str

            An instance of a Table object or a string table name.

        :return: QueryBuilder
        Nr3   )r   r   r   r<   rT   r3   r3   r4   r   {     zQuery.from_str | TableCreateQueryBuilderc                 C     t  |S )a(  
        Query builder entry point. Initializes query building and sets the table name to be created. When using this
        function, the query becomes a CREATE statement.

        :param table: An instance of a Table object or a string table name.

        :return: CreateQueryBuilder
        )r   create_tabler   r<   r3   r3   r4   r        
zQuery.create_tableindexstr | IndexCreateIndexBuilderc                 C  r   )z
        Query builder entry point. Initializes query building and sets the index name to be created. When using this
        function, the query becomes a CREATE statement.
        )r   create_indexr   r   r3   r3   r4   r     r   zQuery.create_indexdatabaseDatabase | TableDropQueryBuilderc                 C  r   )a-  
        Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
        function, the query becomes a DROP statement.

        :param database: An instance of a Database object or a string database name.

        :return: DropQueryBuilder
        )r   drop_database)r   r   r3   r3   r4   r     r   zQuery.drop_databasec                 C  r   )a$  
        Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
        function, the query becomes a DROP statement.

        :param table: An instance of a Table object or a string table name.

        :return: DropQueryBuilder
        )r   
drop_tabler   r3   r3   r4   r     r   zQuery.drop_tableuserr+   c                 C  r   )z
        Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
        function, the query becomes a DROP statement.

        :param user: String user name.

        :return: DropQueryBuilder
        )r   	drop_user)r   r   r3   r3   r4   r     r   zQuery.drop_userviewc                 C  r   )z
        Query builder entry point. Initializes query building and sets the table name to be dropped. When using this
        function, the query becomes a DROP statement.

        :param view: String view name.

        :return: DropQueryBuilder
        )r   	drop_view)r   r   r3   r3   r4   r     r   zQuery.drop_viewc                 C  r   )z
        Query builder entry point. Initializes query building and sets the index name to be dropped. When using this
        function, the query becomes a DROP statement.
        )r   
drop_indexr   r3   r3   r4   r     r   zQuery.drop_indexTable | strc                 K  r   )aH  
        Query builder entry point.  Initializes query building and sets the table to insert into.  When using this
        function, the query becomes an INSERT query.

        :param table:
            Type: Table or str

            An instance of a Table object or a string table name.

        :return QueryBuilder
        Nr3   )r   r   r   r3   r3   r4   r     r   z
Query.intostr | Selectabler9   c                 K  s   | j di |||S rU   )r   with_)r   r<   r9   rT   r3   r3   r4   r     s   zQuery.with_r   int | float | str | bool | Termc                 O  s   | j di |j| S )a  
        Query builder entry point.  Initializes query building without a table and selects fields.  Useful when testing
        SQL functions.

        :param terms:
            Type: list[expression]

            A list of terms to select.  These can be any type of int, float, str, bool, or Term.  They cannot be a Field
            unless the function ``Query.from_`` is called first.

        :return: QueryBuilder
        Nr3   )r   r   )r   r   rT   r3   r3   r4   r     s   zQuery.selectc                 K  r   )aD  
        Query builder entry point.  Initializes query building and sets the table to update.  When using this
        function, the query becomes an UPDATE query.

        :param table:
            Type: Table or str

            An instance of a Table object or a string table name.

        :return: QueryBuilder
        Nr3   )r   r   r   r3   r3   r4   r     r   zQuery.update
table_name_TableClassc                 K  s   | |d< t |fi |S )z
        Convenience method for creating a Table that uses this Query class.

        :param table_name:
            Type: str

            A string table name.

        :return: Table
        r   rr   )r   r   rT   r3   r3   r4   ro     s   zQuery.Tabler   r   list[_TableClass]c                 O  s   | |d< t |i |S )a!  
        Convenience method for creating many tables that uses this Query class.
        See ``Query.make_tables`` for details.

        :param names:
            Type: list[str or tuple]

            A list of string table names, or name and alias tuples.

        :return: Table
        r   )r   )r   r   rT   r3   r3   r4   Tables  s   zQuery.TablesN)rT   r   r,   r'   )r<   r   rT   r   r,   r'   )r<   r   r,   r   )r   r   r,   r   )r   r   r,   r   )r<   r   r,   r   )r   r+   r,   r   )r   r+   r,   r   )r   r   r,   r   )r<   r   rT   r   r,   r'   )r<   r   r9   r+   rT   r   r,   r'   )r   r   rT   r   r,   r'   )r<   r   r,   r'   )r   r+   r,   r   )r   r   rT   r   r,   r   )rI   rJ   rK   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   ro   r   r3   r3   r3   r4   r   e  s@    r   c                      s   e Zd ZdZdefd? fddZed@ddZedAddZedBddZ	edCdd Z
edCd!d"ZedCd#d$ZedCd%d&ZedCd'd(ZdDd)d*ZdDd+d,ZdEd-d.ZdFd0d1ZdGdHd6d7ZdIdJd9d:ZdFd;d<ZdFd=d>Z  ZS )K_SetOperationa  
    A Query class wrapper for a all set operations, Union DISTINCT or ALL, Intersect, Except or Minus

    Created via the functions `Query.union`,`Query.union_all`,`Query.intersect`, `Query.except_of`,`Query.minus`.

    This class should not be instantiated directly.
    N
base_queryr'   set_operation_queryset_operationr   r*   rv   wrapper_clstype[ValueWrapper]c                   s:   t  | || _||fg| _g | _d | _d | _|| _d S r/   )rP   r5   r   _set_operation	_orderbys_limit_offset_wrapper_cls)r2   r   r   r   r*   r   rQ   r3   r4   r5   1  s   
z_SetOperation.__init__fieldsr   rT   r   r,   r-   c                 O  sN   |D ]"}t |trt|| jjd dn| j|}| j||df qd S Nr   r;   order)	rZ   r+   r   r   _fromwrap_constantr  r   r   r2   r  rT   r?   r3   r3   r4   orderbyC  s   
z_SetOperation.orderbylimitr]   c                 C  r.   r/   r  r2   r  r3   r3   r4   r  N  r8   z_SetOperation.limitoffsetc                 C  r.   r/   r  r2   r  r3   r3   r4   r  R  r8   z_SetOperation.offsetrX   r)   c                 C     | j tj|f d S r/   )r   r   r   unionr[   r3   r3   r4   r  V     z_SetOperation.unionc                 C  r  r/   )r   r   r   	union_allr[   r3   r3   r4   r  Z  r  z_SetOperation.union_allc                 C  r  r/   )r   r   r   	intersectr[   r3   r3   r4   r  ^  r  z_SetOperation.intersectc                 C  r  r/   )r   r   r   	except_ofr[   r3   r3   r4   r  b  r  z_SetOperation.except_ofc                 C  r  r/   )r   r   r   minusr[   r3   r3   r4   r  f  r  z_SetOperation.minusc                 C  rC   r/   r  r[   r3   r3   r4   __add__j  r6   z_SetOperation.__add__c                 C  rC   r/   r  r[   r3   r3   r4   __mul__m  r6   z_SetOperation.__mul__c                 C  rC   r/   r  r[   r3   r3   r4   __sub__p  r6   z_SetOperation.__sub__r+   c                 C     |   S r/   r   rA   r3   r3   r4   r   s     z_SetOperation.__str__F
with_aliasrY   subqueryc           
      K  s"  d}| d| jj | d| jj | jjd
d| jji|}|}| jD ].\}}|jd
d| jji|}	t| jjt|jkrHt	dj
||	d||j
|j|	d7 }q$| jr`|| jd
i |7 }| jd urk||  7 }| jrt||  7 }|rdj
d
d	|i|}|rt|| jp| jfi |S |S )Nz {type} {query_string}dialectru   r"  zQueries must have an equal number of select statements in a set operation.

Main Query:
{query1}

Set Operations Query:
{query2})query1query2)r   query_string	({query})rN   r3   )
setdefaultr   r#  
QUOTE_CHARrV   wrap_set_operation_queriesr   r   _selectsr   rw   valuer  _orderby_sqlr  
_limit_sqlr  _offset_sqlr    r*   r   )
r2   r!  r"  rT   set_operation_templatebase_querystringquerystringr   r   set_operation_querystringr3   r3   r4   rV   v  s@   

z_SetOperation.get_sqlru   c                 K  s   g }dd | j jD }| jD ]-\}}|jr |j|v r t|j|n	|jd
d|i|}||dur8dj||jdn| qdjd	|d	S )a  
        Produces the ORDER BY part of the query.  This is a list of fields and possibly their directionality, ASC or
        DESC. The clauses are stored in the query under self._orderbys as a list of tuples containing the field and
        directionality (which can be None).

        If an order by field is used in the select clause, determined by a matching , then the ORDER BY clause will use
        the alias, otherwise the field will be rendered as SQL.
        c                 S     h | ]}|j qS r3   r0   .0r   r3   r3   r4   	<setcomp>      z-_SetOperation._orderby_sql.<locals>.<setcomp>ru   N{term} {orient}termorient ORDER BY {orderby},r  r3   )
r   r+  r  r*   r!   rV   r   rw   r,  join)r2   ru   rT   clausesselected_aliasesr?   directionalityr;  r3   r3   r4   r-    s   	
z_SetOperation._orderby_sqlc                 C     dj | jdS )Nz OFFSET {offset})r  )rw   r  rA   r3   r3   r4   r/    r`   z_SetOperation._offset_sqlc                 C  rD  )Nz LIMIT {limit})r  )rw   r  rA   r3   r3   r4   r.    r`   z_SetOperation._limit_sql)
r   r'   r   r'   r   r   r*   rv   r   r   )r  r   rT   r   r,   r-   r  r]   r,   r-   r  r]   r,   r-   )rX   r)   r,   r-   )rX   r)   r,   r   rX   r'   r,   r   rH   FFr!  rY   r"  rY   rT   r   r,   r+   r/   ry   )rI   rJ   rK   r   r   r5   r   r  r  r  r  r  r  r  r  r  r  r  r   rV   r-  r/  r.  rc   r3   r3   rQ   r4   r   (  s:    




-
r   c                      sX  e Zd ZdZdZdZdZdZeZ	dde
ddfd fddZdddZedddZedddZedd!d"Zedd%d&Zed	d)d*Zed
d+d,Zedd-d.Zed	d/d0Zed	d1d2Zed	d3d4Zedd7d8Zedd9d:Zed
d;d<Zed
d=d>Zed
d?d@ZeddCdDZeddFdGZeddHdIZeddJdKZ eddMdNZ!ed
dOdPZ"eddSdTZ#eddVdWZ$ee%j&fdd]d^Z'dd`daZ(ddbdcZ)ddddeZ*ddfdgZ+ddhdiZ,ddjdkZ-ddldmZ.ddndoZ/ddpdqZ0eddtduZ1eddwdxZ2edd{d|Z3edd}d~Z4edddZ5edddZ6edddZ7edddZ8dddZ9dddZ:dddZ;edddZ<d fddZ=e>ddddZ?dddZ@dddZAdddZBdddZCdddZDd ddZEd!ddZFd"ddZGd	ddZHd#ddZId#ddZJd$ddZKd$ddZLd%ddZMd&ddĄZNd'd(ddǄZOd)ddʄZPd*dd̄ZQd*dd΄ZRd#ddЄZSd*dd҄ZTd*ddԄZUd*ddքZVe>d*dd؄ZWd*ddڄZXd+d,dd݄ZYd*dd߄ZZd*ddZ[d+d,ddZ\d+d,ddZ]d*ddZ^d*ddZ_dd-ddZ`dd-ddZa			d.d/ddZb			d.d0ddZcd#ddZddd-ddZedd-ddZfd#ddZgd#ddZhd*dd Zidd Zj  ZkS (1  r'   z
    Query Builder is the main class in pypika which stores the state of a query and offers functions which allow the
    state to be branched immutably.
    r   'NTFr#  Dialects | Noner*  rY   r   r   	immutable
as_keywordc                   s   t  d  g | _d | _d | _d| _d| _g | _g | _g | _	g | _
g | _g | _d| _d| _d| _d | _d | _g | _d| _d | _d | _g | _g | _g | _g | _d | _d | _g | _d| _t | _d| _ d| _!d| _"d| _#|| _$|| _%|| _&|| _'|| _(d S )NFr   ))rP   r5   r  _insert_table_update_table_delete_from_replace_withr+  _force_indexes_use_indexes_columns_values	_distinct_ignore_for_update_wheres
_prewheres	_groupbys_with_totals_havings	_qualifysr  _joins_unions_usingr  r  _updates_select_starset_select_star_tables_mysql_rollup_select_into_subquery_count_foreign_tabler#  rM  r*  r  rL  )r2   r#  r*  r   rL  rM  rQ   r3   r4   r5     sN   
zQueryBuilder.__init__r,   c                 C  s   t | t | }|j| j t| j|_t| j|_t| j|_t| j|_t| j	|_	t| j
|_
t| j|_t| j|_t| j|_t| j|_t| j|_t| j|_t| j|_|S r/   )r   __new____dict__r   r   rf  r  rR  r+  rU  rV  r\  r  r`  ra  rc  rS  rT  )r2   newoner3   r3   r4   __copy__	  s    zQueryBuilder.__copy__
selectableSelectable | Query | strr-   c                 C  sx   | j t|trt|n| t|ttfr8|jdu r:t|tr$|j}nd}t	| j|}d| |_|d | _dS dS dS )a  
        Adds a table to the query. This function can only be called once and will raise an AttributeError if called a
        second time.

        :param selectable:
            Type: ``Table``, ``Query``, or ``str``

            When a ``str`` is passed, a table with the name matching the ``str`` value is used.

        :returns
            A copy of the query with the table added.
        Nr   sq%dr   )
r  r   rZ   r+   ro   r'   r   r*   ri  max)r2   ro  sub_query_countr3   r3   r4   r     s   

zQueryBuilder.from_current_tableTable | None	new_tablec                   s~   fdd| j D | _ | j krn| j| _| j krn| j| _ fdd| jD | _ fdd| jD | _ fdd| jD | _ fdd| jD | _| jr\| j nd| _| j	ri| j	 nd| _	 fdd| j
D | _
| jr| j nd| _| jr| j nd| _ fd	d| jD | _ fd
d| jD | _ | jv r| j  | j dS dS )ak  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across
        queries.

        :param current_table:
            The table instance to be replaces.
        :param new_table:
            The table instance to replace with.
        :return:
            A copy of the query with the tables replaced.
        c                   s   g | ]
}| kr
n|qS r3   r3   )r6  r<   rt  rv  r3   r4   
<listcomp>C      z.QueryBuilder.replace_table.<locals>.<listcomp>c                      g | ]}|  qS r3   replace_table)r6  alias_queryrw  r3   r4   rx  G      c                   rz  r3   r{  r6  r   rw  r3   r4   rx  H  r~  c                   rz  r3   r{  r6  r   rw  r3   r4   rx  I  r~  c                   s    g | ]} fd d|D qS )c                   rz  r3   r{  r6  r,  rw  r3   r4   rx  K  r~  z9QueryBuilder.replace_table.<locals>.<listcomp>.<listcomp>r3   )r6  
value_listrw  r3   r4   rx  J  s    Nc                   rz  r3   r{  )r6  groupbyrw  r3   r4   rx  P  r~  c                   s$   g | ]}|d    |d fqS )r   r   r{  )r6  r  rw  r3   r4   rx  S  s    c                   rz  r3   r{  r6  r@  rw  r3   r4   rx  V  r~  )r  rN  rO  rR  r+  rU  rV  rZ  r|  r[  r\  r^  r_  r  r`  rf  removeaddr2   rt  rv  r3   rw  r4   r|  6  s,   
zQueryBuilder.replace_tabler)   r9   r+   c                 C  s   t ||}| j| d S r/   )rM   rR  r   )r2   ro  r9   r   r3   r3   r4   r   \  s   
zQueryBuilder.with_r<   r   c                 C  sD   | j d urtdd | jrd| _t|tr|| _ d S t|| _ d S )N$'Query' object has no attribute '%s'r   T)rN  r   r+  rh  rZ   ro   r2   r<   r3   r3   r4   r   a  s
   
"zQueryBuilder.intor   r   c                 G  sj   |D ]0}t |tr| | qt |tr| | qt |ttfr'| | q| | j|| j	d qd S N)r   )
rZ   r   _select_fieldr+   _select_field_strr   r   _select_otherr	  r  r2   r   r;  r3   r3   r4   r   k  s   

zQueryBuilder.selectc                 C  s(   | j s	| js	| jrtdd d| _ d S )Nr  deleteT)rP  r+  rO  r   rA   r3   r3   r4   r  w  s   
zQueryBuilder.deletec                 C  sD   | j d us| js| jrtdd t|tr|| _ d S t|| _ d S )Nr  r   )rO  r+  rP  r   rZ   ro   r  r3   r3   r4   r   ~  s   "zQueryBuilder.updatec                 G  sf   | j d u rtdd |rt|d ttfr|d }|D ]}t|tr*t|| j d}| j| qd S )Nr  r   r   r;   )	rN  r   rZ   r   r   r+   r   rU  r   r  r3   r3   r4   r     s   

zQueryBuilder.columnsc                 G     | j |  d| _d S NF_apply_termsrQ  r   r3   r3   r4   r        

zQueryBuilder.insertc                 G  r  NTr  r   r3   r3   r4   replace  r  zQueryBuilder.replacer;  r   c                 G  H   |g|R D ]}t |tr| j| qt |tr!| jt| qd S r/   )rZ   r   rS  r   r+   r2   r;  r   r   r3   r3   r4   force_index     

zQueryBuilder.force_indexc                 G  r  r/   )rZ   r   rT  r   r+   r  r3   r3   r4   	use_index  r  zQueryBuilder.use_indexc                 C  
   d| _ d S r  rW  rA   r3   r3   r4   distinct  r8   zQueryBuilder.distinctc                 C  r  r  rY  rA   r3   r3   r4   
for_update  r8   zQueryBuilder.for_updatec                 C  r  r  )rX  rA   r3   r3   r4   ignore  r8   zQueryBuilder.ignorer   r   c                 C  s2   |  |sd| _| jr|  j|M  _d S || _d S r  )_validate_tablerj  r[  r2   r   r3   r3   r4   prewhere  s
   

zQueryBuilder.prewhereTerm | EmptyCriterionc                 C  s@   t |trd S | |sd| _| jr|  j|M  _d S || _d S r  )rZ   r   r  rj  rZ  r  r3   r3   r4   where  s   


zQueryBuilder.wherec                 C  0   t |trd S | jr|  j|M  _d S || _d S r/   )rZ   r   r^  r  r3   r3   r4   having  
   

zQueryBuilder.havingc                 C  r  r/   )rZ   r   r_  r  r3   r3   r4   qualify  r  zQueryBuilder.qualifystr | int | Termc                 G  s^   |D ]*}t |trt|| jd d}nt |tr&tt|| jd d|}| j| qd S )Nr   r;   )rZ   r+   r   r  r]   r	  r\  r   r  r3   r3   r4   r    s   

zQueryBuilder.groupbyc                 C  r  r  )r]  rA   r3   r3   r4   with_totals  r8   zQueryBuilder.with_totalslist | tuple | set | TermrT   c                 O  s   d| dk}| jrtdd dd |D }|r.|s"| js"tdd| _|  j|7  _d S d	t| jk rIt| jd
 trI| jd
  j|7  _d S | j	t|  d S )Nmysqlvendorr  rollupc                 S  s(   g | ]}t |tttfrt| n|qS r3   )rZ   r   r   re  r   r6  r;  r3   r3   r4   rx    s   ( z'QueryBuilder.rollup.<locals>.<listcomp>zWAt least one group is required. Call Query.groupby(term) or passas parameter to rollup.Tr   )
r   rg  r   r\  r   r   rZ   r   argsr   )r2   r   rT   	for_mysqlr3   r3   r4   r    s   
zQueryBuilder.rollupr  c                 O  sJ   |D ] }t |trt|| jd dn| |}| j||df qd S r  )rZ   r+   r   r  r	  r  r   r   r
  r3   r3   r4   r    s   &zQueryBuilder.orderbyrn   0Table | QueryBuilder | AliasedQuery | Selectablehowr   Joiner[Self]c                 C  s   t |trt| ||ddS t |tr$|jd u r| | t| ||ddS t |tr1t| ||ddS t |tr>t| ||ddS tdt	| )Nr<   )
type_labelr"  zCannot join on type '%s')
rZ   ro   Joinerr'   r*   _tag_subqueryrM   r)   
ValueErrorr   r2   rn   r  r3   r3   r4   r@    s   





zQueryBuilder.join#Table | QueryBuilder | AliasedQueryc                 C     |  |tjS r/   )r@  r   innerrs   r3   r3   r4   
inner_join&  r`   zQueryBuilder.inner_joinc                 C  r  r/   )r@  r   leftrs   r3   r3   r4   	left_join)  r`   zQueryBuilder.left_joinc                 C  r  r/   )r@  r   
left_outerrs   r3   r3   r4   left_outer_join,  r`   zQueryBuilder.left_outer_joinc                 C  r  r/   )r@  r   rightrs   r3   r3   r4   
right_join/  r`   zQueryBuilder.right_joinc                 C  r  r/   )r@  r   right_outerrs   r3   r3   r4   right_outer_join2  r`   zQueryBuilder.right_outer_joinc                 C  r  r/   )r@  r   outerrs   r3   r3   r4   
outer_join5  r`   zQueryBuilder.outer_joinc                 C  r  r/   )r@  r   
full_outerrs   r3   r3   r4   full_outer_join8  r`   zQueryBuilder.full_outer_joinc                 C  r  r/   )r@  r   crossrs   r3   r3   r4   
cross_join;  r`   zQueryBuilder.cross_joinc                 C  r  r/   )r@  r   r^   rs   r3   r3   r4   	hash_join>  r`   zQueryBuilder.hash_joinr  r]   c                 C  r.   r/   r  r  r3   r3   r4   r  A  r8   zQueryBuilder.limitr  c                 C  r.   r/   r  r  r3   r3   r4   r  E  r8   zQueryBuilder.offsetrX   r   c                 C     t | |tj| jdS r  )r   r   r  r  r[   r3   r3   r4   r  I     zQueryBuilder.unionc                 C  r  r  )r   r   r  r  r[   r3   r3   r4   r  M  r  zQueryBuilder.union_allc                 C  r  r  )r   r   r  r  r[   r3   r3   r4   r  Q  r  zQueryBuilder.intersectc                 C  r  r  )r   r   r  r  r[   r3   r3   r4   r  U  r  zQueryBuilder.except_ofc                 C  r  r  )r   r   r  r  r[   r3   r3   r4   r  Y  r  zQueryBuilder.minusr?   Field | strr,  c                 C  sD   t |ts	t|n|}t |ts| j|| jd}| j||f d S r  )rZ   r   r   r	  r  rc  r   )r2   r?   r,  r3   r3   r4   re  ]  s   
zQueryBuilder.setc                 C  rC   r/   r  r[   r3   r3   r4   r  d  r6   zQueryBuilder.__add__c                 C  rC   r/   r  r[   r3   r3   r4   r  g  r6   zQueryBuilder.__mul__c                 C  rC   r/   r  r[   r3   r3   r4   r  j  r6   zQueryBuilder.__sub__slicec                 C  s   |j | _|j| _d S r/   )startr  stopr  )r2   r  r3   r3   r4   r  m  s   zQueryBuilder.sliceQueryBuilder | Fieldc                   s    t |tst |S | |S r/   )rZ   r  rP   rF   rs   rQ   r3   r4   rF   r  s   

zQueryBuilder.__getitem__	field_setSequence[Field]ru   rv   	list[str]c                   s    fdd| D S )Nc                   s   g | ]}|j p|j d qS )r   )r*   rV   r6  r?   r   r3   r4   rx  y  s    z.QueryBuilder._list_aliases.<locals>.<listcomp>r3   )r  ru   r3   r   r4   _list_aliasesw  s   zQueryBuilder._list_aliasesc                 C  sV   dt | jkrtd| d|dkrd| _t g| _d S | t|| jd d d S )Nr   zCannot select z, no FROM table specified.*Tr;   )r   r  r   rd  r   r+  r  r   r2   r;  r3   r3   r4   r  {  s   
zQueryBuilder._select_field_strr   c                   sX   | j rd S  j| jv rd S t tr$ fdd| jD | _| j j | j  d S )Nc                   s&   g | ]}t |d r j|jkr|qS r;   )hasattrr<   r  r;  r3   r4   rx    s    
z.QueryBuilder._select_field.<locals>.<listcomp>)rd  r<   rf  rZ   r   r+  r  r   r  r3   r  r4   r    s   

zQueryBuilder._select_fieldfunctionr   c                 C  s   | j | d S r/   )r+  r   )r2   r  r3   r3   r4   r    s   zQueryBuilder._select_otherlist[Field]c                 C  s   g S r/   r3   rA   r3   r3   r4   fields_     zQueryBuilder.fields_r@  Joinc                   sv   | j | jg | j   | j t fdd D }tjtr3jj	d u r3|r3jj
d j_	| j d S )Nc                 3  s$    | ]}t |toj v V  qd S r/   )rZ   ro   rn   r6  clausebase_tablesr@  r3   r4   	<genexpr>     " z'QueryBuilder.do_join.<locals>.<genexpr>2)r  rO  rR  validater`  anyrZ   rn   ro   r*   r   r   )r2   r@  table_in_queryr3   r  r4   do_join  s   zQueryBuilder.do_joinro   c                   s   t  fdd| jD S )Nc                 3  s    | ]} |j kV  qd S r/   rn   r  r;   r3   r4   r    s    z)QueryBuilder.is_joined.<locals>.<genexpr>)r  r`  r  r3   r;   r4   	is_joined  s   zQueryBuilder.is_joinedr   c                 C  sh   | j | jg }| D ]&}|j|v }|jdd | jD v }t|jdu| | |j| jkgr1 dS qdS )z
        Returns False if the term references a table not already part of the
        FROM clause or JOINS and True otherwise.
        c                 S     g | ]}|j qS r3   r  r  r3   r3   r4   rx    r8  z0QueryBuilder._validate_table.<locals>.<listcomp>NFT)r  rO  r  r<   r`  all)r2   r;  r  r?   table_in_base_tablestable_in_joinsr3   r3   r4   r    s   

	zQueryBuilder._validate_tabler"  c                 C  s   d| j  |_|  j d7  _ d S )Nrq  r   )ri  r*   )r2   r"  r3   r3   r4   r    s   zQueryBuilder._tag_subqueryc                   s`    j du rtdd |sdS t|d tttfs|g}|D ]} j fdd|D  qdS )z
        Handy function for INSERT and REPLACE statements in order to check if
        terms are introduced and how append them to `self._values`
        Nr  r   r   c                   s$   g | ]}t |tr|n |qS r3   )rZ   r   r	  r  rA   r3   r4   rx    s   $ z-QueryBuilder._apply_terms.<locals>.<listcomp>)rN  r   rZ   r   r   re  rV  r   )r2   r   valuesr3   rA   r4   r    s   
zQueryBuilder._apply_termsc                 C  s   | j | jdS )N)r#  )rV   r#  rA   r3   r3   r4   r     r`   zQueryBuilder.__str__c                 C  r  r/   r   rA   r3   r3   r4   r     r   zQueryBuilder.__repr__c                 C  s"   t |tsdS | j|jksdS dS r   )rZ   r'   r*   r[   r3   r3   r4   r\     s
   
zQueryBuilder.__eq__c                 C  rk   r/   rl   r[   r3   r3   r4   rm     r@   zQueryBuilder.__ne__c                 C  s   t | jtdd | jD  S )Nc                 s  s    | ]}t |V  qd S r/   )r^   r  r3   r3   r4   r    s    z(QueryBuilder.__hash__.<locals>.<genexpr>)r^   r*   sumr  rA   r3   r3   r4   r_        zQueryBuilder.__hash__dictc                 C  sJ   | d| j | d| j | d| j | d| j | d| j d S )Nru   secondary_quote_charalias_quote_charrM  r#  )r(  r)  SECONDARY_QUOTE_CHARALIAS_QUOTE_CHARrM  r#  rW   r3   r3   r4   _set_kwargs_defaults  s
   z!QueryBuilder._set_kwargs_defaultsr!  c           
        sJ  |    | js| js| js| jsdS | jr| js| jsdS | jr&| js&dS t| j}dt	| j
k }dt	| j
k o@t| j
d t}| j}| joI| j
}t|||||g d< | jr| jrc| jdi  nd}	|	| jdi  7 }	| jr|	dd fdd| jD  7 }	|	| jdi  7 }	| j
r|	| jdi  7 }	| jr|	| jdi  7 }	| jd ur|	|  7 }	|	S | jr| jdi  }	n}| js| jr| jr| jdi  nd}	| jr|	| jdi  7 }	n
|	| jdi  7 }	| jr|	| jdi  7 }	| jr
|	| j di  7 }	|	S |	d| j!di   7 }	n&| jr#| jdi  nd}	|	| j!di  7 }	| jr=|	| j"di  7 }	| j
rK|	| jdi  7 }	| j#rY|	| j$di  7 }	| j%rg|	| j&di  7 }	| j'ru|	| j(di  7 }	| jr|	dd fdd| jD  7 }	| j)r|	| j*di  7 }	| jr|	| jdi  7 }	| j+r|	| j,di  7 }	| j-r|	| . 7 }	| j/r|	| j0di  7 }	| j1r|	| j2di  7 }	| j3r|	| j4di  7 }	| j5|	fi  }	| j6r|	| j7di  7 }	|rd	j8|	d
}	|r#| j9d u r| j:n| j9 d< t;|	| j<fi  S |	S )Nr   r   r   with_namespace c                 3       | ]}|j di  V  qd S rU   r   r  rT   r3   r4   r        z'QueryBuilder.get_sql.<locals>.<genexpr>c                 3  r  rU   r   r  r  r3   r4   r  J  r  r'  rN   r  r3   )=r  r+  rN  rP  rO  rV  rc  rY   r`  r   r  rZ   r'   rj  r  rR  	_with_sql_update_sqlr@  _set_sql	_from_sqlrZ  
_where_sqlr  r.  _delete_sqlrh  rQ  _replace_sql_insert_sqlrU  _columns_sql_values_sql_select_sql	_into_sqlrb  
_using_sqlrS  _force_index_sqlrT  _use_index_sqlr[  _prewhere_sqlr\  
_group_sqlrg  _rollup_sqlr^  _having_sqlr_  _qualify_sqlr  r-  _apply_paginationrY  _for_update_sqlrw   QUERY_ALIAS_QUOTE_CHARr  r    r*   )
r2   r!  r"  rT   	has_joinshas_multiple_from_clauseshas_subquery_from_clausehas_reference_to_foreign_tablehas_update_fromr2  r3   r  r4   rV     s   


"
"zQueryBuilder.get_sqlr2  c                 K  s,   | j d ur||  7 }| jr||  7 }|S r/   )r  r.  r  r/  )r2   r2  rT   r3   r3   r4   r  p  s
   
zQueryBuilder._apply_paginationc                   s   dd  fdd| jD  S )NzWITH r>  c                 3  s4    | ]}|j d  |jdddd  d V  qdS )z AS (Fr"  r!  z) Nr3   )r9   rV   r  r  r3   r4   r  z  s
    "
z)QueryBuilder._with_sql.<locals>.<genexpr>)r@  rR  rW   r3   r  r4   r  y  s   
zQueryBuilder._with_sqlc                 K     | j rd}|S d}|S )Nz	DISTINCT r   r  )r2   rT   r  r3   r3   r4   _distinct_sql     
zQueryBuilder._distinct_sqlc                 K  r#  )Nz FOR UPDATEr   r  )r2   rT   r  r3   r3   r4   r    r%  zQueryBuilder._for_update_sqlc                   s0   dj | jdi  d fdd| jD dS )NzSELECT {distinct}{select}r>  c                 3  &    | ]}|j dd d d V  qdS T)r!  r"  Nr3   r   r  r  r3   r4   r       $ z+QueryBuilder._select_sql.<locals>.<genexpr>)r  r   r3   )rw   r$  r@  r+  rW   r3   r  r4   r    s   zQueryBuilder._select_sqlc                 K  s*   dj | jjdi || jrddS ddS )NzINSERT {ignore}INTO {table}zIGNORE r   )r<   r  r3   )rw   rN  rV   rX  rW   r3   r3   r4   r    s   zQueryBuilder._insert_sqlc                 K     dj | jjdi |dS )NzREPLACE INTO {table}r;   r3   rw   rN  rV   rW   r3   r3   r4   r       zQueryBuilder._replace_sqlc                  K     dS )NDELETEr3   r  r3   r3   r4   r    r  zQueryBuilder._delete_sqlc                 K  r)  )NzUPDATE {table}r;   r3   )rw   rO  rV   rW   r3   r3   r4   r    s   zQueryBuilder._update_sqlr   c                   "   dj d fdd| jD dS )z
        SQL for Columns clause for INSERT queries
        :param with_namespace:
            Remove from kwargs, never format the column terms with namespaces since only one table can be inserted into
        z ({columns})r>  c                 3  s$    | ]}|j dd di V  qdS )r   FNr3   r   r  r  r3   r4   r    r  z,QueryBuilder._columns_sql.<locals>.<genexpr>r   )rw   r@  rU  r2   r   rT   r3   r  r4   r    s   zQueryBuilder._columns_sqlc                   r.  )Nz VALUES ({values})z),(c                 3  s(    | ]}d   fdd|D V  qdS )r>  c                 3  r&  r'  r   r  r  r3   r4   r    r(  z5QueryBuilder._values_sql.<locals>.<genexpr>.<genexpr>N)r@  )r6  rowr  r3   r4   r    s    
z+QueryBuilder._values_sql.<locals>.<genexpr>)r  )rw   r@  rV  rW   r3   r  r4   r    s
   zQueryBuilder._values_sqlc                 K  s   dj | jjdddi|dS )Nz INTO {table}r!  Fr;   r3   r*  rW   r3   r3   r4   r    s   zQueryBuilder._into_sqlc                   r.  )Nz FROM {selectable}r>  c                 3  r&  Tr"  Nr3   r   r  r  r3   r4   r    r(  z)QueryBuilder._from_sql.<locals>.<genexpr>ro  )rw   r@  r  r0  r3   r  r4   r	       zQueryBuilder._from_sqlc                   r.  )Nz USING {selectable}r>  c                 3  r&  r2  r   r  r  r3   r4   r    r(  z*QueryBuilder._using_sql.<locals>.<genexpr>r3  )rw   r@  rb  r0  r3   r  r4   r    r4  zQueryBuilder._using_sqlc                   r.  )Nz FORCE INDEX ({indexes})r>  c                 3  r  rU   r   r6  r   r  r3   r4   r    r  z0QueryBuilder._force_index_sql.<locals>.<genexpr>indexes)rw   r@  rS  rW   r3   r  r4   r    r4  zQueryBuilder._force_index_sqlc                   r.  )Nz USE INDEX ({indexes})r>  c                 3  r  rU   r   r5  r  r3   r4   r    r  z.QueryBuilder._use_index_sql.<locals>.<genexpr>r6  )rw   r@  rT  rW   r3   r  r4   r    r4  zQueryBuilder._use_index_sqlc                 K      dj | jjd|dd|dS )Nz PREWHERE {prewhere}Tru   r"  )r  r3   )rw   r[  rV   r2   ru   rT   r3   r3   r4   r    s   zQueryBuilder._prewhere_sqlc                 K  r8  )Nz WHERE {where}Tr9  )r  r3   )rw   rZ  rV   r:  r3   r3   r4   r
    s    zQueryBuilder._where_sqlr  groupby_aliasc           	      K  s   g }dd | j D }| jD ]&}|r%|jr%|j|v r%|t|j|p!| q||jd	||d| qdjd|d}| jrD|d S |S )
a  
        Produces the GROUP BY part of the query.  This is a list of fields. The clauses are stored in the query under
        self._groupbys as a list fields.

        If an groupby field is used in the select clause,
        determined by a matching alias, and the groupby_alias is set True
        then the GROUP BY clause will use the alias,
        otherwise the entire field will be rendered as SQL.
        c                 S  r4  r3   r0   r5  r3   r3   r4   r7    r8  z*QueryBuilder._group_sql.<locals>.<setcomp>ru   r  z GROUP BY {groupby}r>  )r  z WITH TOTALSNr3   )	r+  r\  r*   r   r!   rV   rw   r@  r]  )	r2   ru   r  r;  rT   rA  rB  r?   sqlr3   r3   r4   r    s   
zQueryBuilder._group_sqlorderby_aliasc           
      K  s   g }dd | j D }| jD ]2\}}|r#|jr#|j|v r#t|j|p!|n
|jd
||d|}	||dur<dj|	|jdn|	 qdjd|d	S )a  
        Produces the ORDER BY part of the query.  This is a list of fields and possibly their directionality, ASC or
        DESC. The clauses are stored in the query under self._orderbys as a list of tuples containing the field and
        directionality (which can be None).

        If an order by field is used in the select clause,
        determined by a matching, and the orderby_alias
        is set True then the ORDER BY clause will use
        the alias, otherwise the field will be rendered as SQL.
        c                 S  r4  r3   r0   r5  r3   r3   r4   r7    r8  z,QueryBuilder._orderby_sql.<locals>.<setcomp>r<  Nr9  r:  r=  r>  r?  r3   )	r+  r  r*   r!   rV   r   rw   r,  r@  )
r2   ru   r  r>  rT   rA  rB  r?   rC  r;  r3   r3   r4   r-    s   
zQueryBuilder._orderby_sqlc                 C  r,  )Nz WITH ROLLUPr3   rA   r3   r3   r4   r       zQueryBuilder._rollup_sqlc                 K     dj | jjdd|i|dS )Nz HAVING {having}ru   )r  r3   )rw   r^  rV   r:  r3   r3   r4   r    r  zQueryBuilder._having_sqlc                 K  r@  )Nz QUALIFY {qualify}ru   )r  r3   )rw   r_  rV   r:  r3   r3   r4   r    r  zQueryBuilder._qualify_sqlc                 C     d| j  S )Nz OFFSET r  rA   r3   r3   r4   r/    r@   zQueryBuilder._offset_sqlc                 C  rA  )Nz LIMIT r  rA   r3   r3   r4   r.    r@   zQueryBuilder._limit_sqlc                   r.  )Nz
 SET {set}r>  c              	   3  sB    | ]\}}d j |jdi t dd|jdi  dV  qdS )z{field}={value}F)r   )r?   r,  Nr3   )rw   rV   r  )r6  r?   r,  r  r3   r4   r  #  s    $
z(QueryBuilder._set_sql.<locals>.<genexpr>)re  )rw   r@  rc  rW   r3   r  r4   r  !  s
   zQueryBuilder._set_sqlc                 O  s   || g|R i |S )a  Call a function on the current object and return the result.

        Example usage:

        .. code-block:: python

            from pypika import Query, functions as fn
            from pypika.queries import QueryBuilder

            def rows_by_group(query: QueryBuilder, *groups) -> QueryBuilder:
                return (
                    query
                    .select(*groups, fn.Count("*").as_("n_rows"))
                    .groupby(*groups)
                )

            base_query = Query.from_("table")

            col1_agg = base_query.pipe(rows_by_group, "col1")
            col2_agg = base_query.pipe(rows_by_group, "col2")
            col1_col2_agg = base_query.pipe(rows_by_group, "col1", "col2")

        Makes chaining functions together easier, especially when the functions are
        defined elsewhere. For example, you could define a function that filters
        rows by a date range and then group by a set of columns:


        .. code-block:: python

            from datetime import datetime, timedelta

            from pypika import Field

            def days_since(query: QueryBuilder, n_days: int) -> QueryBuilder:
                return (
                    query
                    .where("date" > fn.Date(datetime.now().date() - timedelta(days=n_days)))
                )

            (
                base_query
                .pipe(days_since, n_days=7)
                .pipe(rows_by_group, "col1", "col2")
            )
        r3   )r2   funcr  rT   r3   r3   r4   pipe+  s   .zQueryBuilder.pipe)
r#  rK  r*  rY   r   r   rL  rY   rM  rY   r   )ro  rp  r,   r-   rt  ru  rv  ru  r,   r-   )ro  r)   r9   r+   r,   r-   )r<   r   r,   r-   )r   r   r,   r-   r,   r-   )r;  r   r   r   r,   r-   )r   r   r,   r-   r   r  r,   r-   )r   r  r,   r-   )r   r  rT   r   r,   r-   )r  r   rT   r   r,   r-   )rn   r  r  r   r,   r  )rn   r  r,   r  rE  rF  rG  )r?   r  r,  r   r,   r-   )r  r  r,   r-   )rn   r   r,   r  r/   )r  r  ru   rv   r,   r  )r;  r+   r,   r-   )r;  r   r,   r-   )r  r   r,   r-   )r,   r  )r@  r  r,   r-   )r<   ro   r,   rY   )r;  r   r,   rY   )r"  r'   r,   r-   rH   )rX   r'   r,   rY   rb   rT   r  r,   r-   rH  rI  )r2  r+   r,   r+   ra   )F)r   rY   rT   r   r,   r+   ry   )NNT)
ru   rv   r  rv   r;  rY   rT   r   r,   r+   )
ru   rv   r  rv   r>  rY   rT   r   r,   r+   )lrI   rJ   rK   r   r)  r  r  r  r   	QUERY_CLSr   r5   rn  r   r   r|  r   r   r   r  r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r@  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r  r  r  rF   r   r  r  r  r  r  r  r  r  r  r  r   r   r\   rm   r_   r  rV   r  r  r$  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r
  r  r-  r  r  r  r/  r.  r  rC  rc   r3   r3   rQ   r4   r'     s$   ;%						}	
! 
c                   @  s@   e Zd ZdddZddddZdddZdddZd ddZdS )!r  rN   r&   rn   r  r  r   r  r+   r,   r-   c                 C  s   || _ || _|| _|| _d S r/   )rN   rn   r  r  )r2   rN   rn   r  r  r3   r3   r4   r5   ]     
zJoiner.__init__Nr   Criterion | Nonecollaterv   c                 C  s:   |d u rt dj| jd| jt| j| j|| | jS )NzIParameter 'criterion' is required for a {type} JOIN but was not supplied.r   )r   rw   r  rN   r  JoinOnrn   r  )r2   r   rK  r3   r3   r4   onc  s   z	Joiner.onr  r   c                 G  sx   |st dj| jdd }|D ]}t|| jjd dt|| jdk}|d u r(|n||@ }q| jt| j| j	| | jS )NzFParameter 'fields' is required for a {type} JOIN but was not supplied.rL  r   r;   )
r   rw   r  r   rN   r  rn   r  rM  r  )r2   r  r   r?   constituentr3   r3   r4   on_fieldm  s   "zJoiner.on_fieldc                 G  s4   |st d| jt| j| jdd |D  | jS )NzUParameter 'fields' is required when joining with a using clause but was not supplied.c                 S  s   g | ]}t |qS r3   r=   r  r3   r3   r4   rx    s    z Joiner.using.<locals>.<listcomp>)r   rN   r  	JoinUsingrn   r  )r2   r  r3   r3   r4   using{  s   "zJoiner.usingc                 C  s   | j t| jtj | j S )zReturn cross join)rN   r  r  rn   r   r  rA   r3   r3   r4   r    s   zJoiner.cross)
rN   r&   rn   r  r  r   r  r+   r,   r-   r/   )r   rJ  rK  rv   r,   r&   )r  r   r,   r&   )r,   r&   )rI   rJ   rK   r5   rN  rP  rR  r  r3   r3   r3   r4   r  \  s    



r  c                   @  s8   e Zd ZdddZdddZdddZedddZdS )r  rn   r   r  r   r,   r-   c                 C  rg   r/   )rn   r  r  r3   r3   r4   r5     rj   zJoin.__init__rT   r   r+   c                 K  s>   dj | jjdddd|d}| jjrdj || jjdS |S )NzJOIN {table}Tr"  r;   z{type} {join})r@  r   r3   )rw   rn   rV   r  r,  )r2   rT   r=  r3   r3   r4   rV     s   zJoin.get_sqlr  Sequence[Table]r`  c                 C     d S r/   r3   r2   r  r`  r3   r3   r4   r    r?  zJoin.validatert  ru  rv  c                 C  s   | j ||| _ dS X  
        Replaces all occurrences of the specified table with the new table. Useful when reusing
        fields across queries.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            A copy of the join with the tables replaced.
        N)rn   r|  r  r3   r3   r4   r|    s   zJoin.replace_tableN)rn   r   r  r   r,   r-   ra   r  rS  r`  rS  r,   r-   rD  )rI   rJ   rK   r5   rV   r  r   r|  r3   r3   r3   r4   r    s    


	r  c                      sF   e Zd Zdd fddZd fddZd ddZed!ddZ  ZS )"rM  Nrn   r   r  r   criteriar'   rK  rv   r,   r-   c                   s   t  || || _|| _d S r/   )rP   r5   r   rK  )r2   rn   r  rY  rK  rQ   r3   r4   r5     rS   zJoinOn.__init__rT   r   r+   c                   sJ   t  jdi |}dj|| jjdddi|| jr!d| j dS ddS )Nz{join} ON {criterion}{collate}r"  Tz	 COLLATE r   )r@  r   rK  r3   )rP   rV   rw   r   rK  r2   rT   join_sqlrQ   r3   r4   rV     s   zJoinOn.get_sqlr  rS  r`  c                 C  sb   t dd | j D }t |dd |D B | jhB }|| }|r/tdjdtt|dd S )Nc                 S  r  r3   r;   )r6  fr3   r3   r4   rx    r8  z#JoinOn.validate.<locals>.<listcomp>c                 S  r4  r3   r  r  r3   r3   r4   r7    r8  z"JoinOn.validate.<locals>.<setcomp>zInvalid join criterion. One field is required from the joined item and another from the selected table or an existing join.  Found [{tables}], )r   )	re  r   r  rn   r   rw   r@  mapr+   )r2   r  r`  criterion_tablesavailable_tablesmissing_tablesr3   r3   r4   r    s   zJoinOn.validatert  ru  rv  c                 C  s*   | j |kr|n| j | _ | j||| _dS rV  )rn   r   r|  r  r3   r3   r4   r|    s   zJoinOn.replace_tabler/   )
rn   r   r  r   rY  r'   rK  rv   r,   r-   ra   rX  rD  	rI   rJ   rK   r5   rV   r  r   r|  rc   r3   r3   rQ   r4   rM    s    
rM  c                      sD   e Zd Zd fd	d
Zd fddZdddZedddZ  ZS )rQ  rn   r   r  r   r  r  r,   r-   c                   s   t  || || _d S r/   )rP   r5   r  )r2   rn   r  r  rQ   r3   r4   r5     s   
zJoinUsing.__init__rT   r   r+   c                   s6   t  jdi  }dj|d fdd| jD dS )Nz{join} USING ({fields})r>  c                 3  r  rU   r   r  r  r3   r4   r    r  z$JoinUsing.get_sql.<locals>.<genexpr>)r@  r  r3   )rP   rV   rw   r@  r  rZ  rQ   r  r4   rV     s
   zJoinUsing.get_sqlr  rS  r`  c                 C  rT  r/   r3   rU  r3   r3   r4   r    r?  zJoinUsing.validatert  ru  rv  c                   s2   | j  krn| j | _  fdd| jD | _dS )rW  c                   rz  r3   r{  r  rw  r3   r4   rx    r~  z+JoinUsing.replace_table.<locals>.<listcomp>N)rn   r  r  r3   rw  r4   r|    s   zJoinUsing.replace_table)rn   r   r  r   r  r  r,   r-   ra   rX  rD  rb  r3   r3   rQ   r4   rQ    s    
rQ  c                   @  sX  e Zd ZdZdZdZdZeZdSdTd	d
Z	dUddZ
edVddZedWddZedWddZedWddZedXddZedYd d!ZedZd"d#ZedZd$d%Ze		d[d\d-d.Zed]d1d2ZedWd3d4Zd^d7d8Zd^d9d:Zd_d;d<Zd`d>d?Zd`d@dAZd`dBdCZd_dDdEZd_dFdGZd_dHdIZd^dJdKZ dadMdNZ!d_dOdPZ"d_dQdRZ#dS )br   z5
    Query builder used to build CREATE queries.
    r   rJ  Nr#  rK  r,   r-   c                 C  sd   d | _ d| _d| _d | _g | _g | _d| _d | _g | _d| _	|| _
d | _d | _d | _d | _d | _d S r  )_create_table
_temporary	_unlogged
_as_selectrU  _period_fors_with_system_versioning_primary_key_uniques_if_not_existsr#  _foreign_key_foreign_key_reference_table_foreign_key_reference_foreign_key_on_update_foreign_key_on_deleter2   r#  r3   r3   r4   r5     s    
zCreateQueryBuilder.__init__rT   r  c                 C  .   | d| j | d| j | d| j d S Nru   r  r#  r(  r)  r  r#  rW   r3   r3   r4   r       z'CreateQueryBuilder._set_kwargs_defaultsr<   r   c                 C  s0   | j rtdt|tr|| _ dS t|| _ dS )z
        Creates the table.

        :param table:
            An instance of a Table object or a string table name.

        :raises AttributeError:
            If the table is already created.

        :return:
            CreateQueryBuilder.
        z1'Query' object already has attribute create_tableN)rc  r   rZ   ro   r  r3   r3   r4   r     s   "zCreateQueryBuilder.create_tablec                 C  
   d| _ dS )z^
        Makes the table temporary.

        :return:
            CreateQueryBuilder.
        TN)rd  rA   r3   r3   r4   	temporary)     
zCreateQueryBuilder.temporaryc                 C  rv  )z]
        Makes the table unlogged.

        :return:
            CreateQueryBuilder.
        TN)re  rA   r3   r3   r4   unlogged3  rx  zCreateQueryBuilder.unloggedc                 C  rv  )z[
        Adds system versioning.

        :return:
            CreateQueryBuilder.
        TNrh  rA   r3   r3   r4   with_system_versioning=  rx  z)CreateQueryBuilder.with_system_versioningr   str | tuple[str, str] | Columnc                 G  sZ   | j rtd|D ]!}t|trt|}nt|tr$t|d |d d}| j| q	dS )a  
        Adds the columns.

        :param columns:
            Type:  Union[str, TypedTuple[str, str], Column]

            A list of columns.

        :raises AttributeError:
            If the table is an as_select table.

        :return:
            CreateQueryBuilder.
        z.'Query' object already has attribute as_selectr   r   r   N)rf  r   rZ   r+   r   r   rU  r   r2   r   r   r3   r3   r4   r   G  s   


zCreateQueryBuilder.columnsr   r   r   c                 C  s   | j t||| dS )a&  
        Adds a PERIOD FOR clause.

        :param name:
            The period name.

        :param start_column:
            The column that starts the period.

        :param end_column:
            The column that ends the period.

        :return:
            CreateQueryBuilder.
        N)rg  r   r   r   r3   r3   r4   
period_fora  s   zCreateQueryBuilder.period_forc                 G  s   | j | | dS )z
        Adds a UNIQUE constraint.

        :param columns:
            Type:  Union[str, Column]

            A list of columns.

        :return:
            CreateQueryBuilder.
        N)rj  r   _prepare_columns_inputr2   r   r3   r3   r4   uniquet  r   zCreateQueryBuilder.uniquec                 G  s   | j rtd| || _ dS )a  
        Adds a primary key constraint.

        :param columns:
            Type:  Union[str, Column]

            A list of columns.

        :raises AttributeError:
            If the primary key is already defined.

        :return:
            CreateQueryBuilder.
        z0'Query' object already has attribute primary_keyN)ri  r   r  r  r3   r3   r4   primary_key  s   zCreateQueryBuilder.primary_keylist[str | Column]reference_tabler   reference_columns	on_deleter   	on_updatec                 C  s<   | j rtd| || _ || _| || _|| _|| _dS )a  
        Adds a foreign key constraint.

        :param columns:
            Type:  List[Union[str, Column]]

            A list of foreign key columns.

        :param reference_table:
            Type: Union[str, Table]

            The parent table name.

        :param reference_columns:
            Type: List[Union[str, Column]]

            Parent key columns.

        :param on_delete:
            Type: ReferenceOption

            Delete action.

        :param on_update:
            Type: ReferenceOption

            Update option.

        :raises AttributeError:
            If the foreign key is already defined.

        :return:
            CreateQueryBuilder.
        z0'Query' object already has attribute foreign_keyN)rl  r   r  rm  rn  rp  ro  )r2   r   r  r  r  r  r3   r3   r4   foreign_key  s   +
zCreateQueryBuilder.foreign_keyquery_builderr'   c                 C  s*   | j rtdt|tstd|| _dS )z
        Creates the table from a select statement.

        :param query_builder:
            The query.

        :raises AttributeError:
            If columns have been defined for the table.

        :return:
            CreateQueryBuilder.
        z,'Query' object already has attribute columnsz.Expected 'item' to be instance of QueryBuilderN)rU  r   rZ   r'   r   rf  )r2   r  r3   r3   r4   	as_select  s
   

zCreateQueryBuilder.as_selectc                 C  r  r  rk  rA   r3   r3   r4   if_not_exists  r8   z CreateQueryBuilder.if_not_existsr   r+   c                 K  s   |  | | js
dS | js| jsdS | jdi |}| jr'|| jdi | S | jdi |}| jdi |}| d| d| S )zr
        Gets the sql statement string.

        :return: The create table statement.
        :rtype: str
        r   z ()Nr3   )r  rc  rU  rf  _create_table_sql_as_select_sql	_body_sql_table_options_sql)r2   rT   r   bodytable_optionsr3   r3   r4   rV     s   
zCreateQueryBuilder.get_sqlc                 K  sF   d}| j rd}n| jrd}d}| jrd}dj||| jjdi |dS )Nr   z
TEMPORARY z	UNLOGGED zIF NOT EXISTS z/CREATE {table_type}TABLE {if_not_exists}{table})
table_typer  r<   r3   )rd  re  rk  rw   rc  rV   )r2   rT   r  r  r3   r3   r4   r    s   z$CreateQueryBuilder._create_table_sqlc                 K  s   d}| j r	|d7 }|S )Nr   z WITH SYSTEM VERSIONINGrz  )r2   rT   r  r3   r3   r4   r    s   z%CreateQueryBuilder._table_options_sqlr  c                       fdd| j D S )Nc                      g | ]
}|j d i  qS r3   r   r  r  r3   r4   rx    ry  z6CreateQueryBuilder._column_clauses.<locals>.<listcomp>)rU  rW   r3   r  r4   _column_clauses     z"CreateQueryBuilder._column_clausesc                   r  )Nc                   r  r  r   )r6  r~  r  r3   r4   rx    ry  z:CreateQueryBuilder._period_for_clauses.<locals>.<listcomp>)rg  rW   r3   r  r4   _period_for_clauses  r  z&CreateQueryBuilder._period_for_clausesc                   r  )Nc                   s,   g | ]}d j d fdd|D dqS )zUNIQUE ({unique})r>  c                 3  r  rU   r   r  r  r3   r4   r    r  zDCreateQueryBuilder._unique_key_clauses.<locals>.<listcomp>.<genexpr>)r  )rw   r@  )r6  r  r  r3   r4   rx    s    z:CreateQueryBuilder._unique_key_clauses.<locals>.<listcomp>)rj  rW   r3   r  r4   _unique_key_clauses  s   
z&CreateQueryBuilder._unique_key_clausesc                   r.  )NzPRIMARY KEY ({columns})r>  c                 3  r  rU   r  r  r  r3   r4   r  $  r  z9CreateQueryBuilder._primary_key_clause.<locals>.<genexpr>r/  )rw   r@  ri  rW   r3   r  r4   _primary_key_clause"  r4  z&CreateQueryBuilder._primary_key_clausec                   sz   dj d fdd| jD | jjd	i  d fdd| jD d}| jr0|d| jj 7 }| jr;|d| jj 7 }|S )
NzEFOREIGN KEY ({columns}) REFERENCES {table_name} ({reference_columns})r>  c                 3  r  rU   r  r  r  r3   r4   r  )  r  z9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>c                 3  r  rU   r  r  r  r3   r4   r  +  r  )r   r   r  z ON DELETE z ON UPDATE r3   )	rw   r@  rl  rm  rV   rn  rp  r,  ro  )r2   rT   r  r3   r  r4   _foreign_key_clause'  s   z&CreateQueryBuilder._foreign_key_clausec                 K  sz   | j di |}|| jdi |7 }|| jdi |7 }| jr*|| jdi | | jr8|| jdi | d|S )Nr>  r3   )	r  r  r  ri  r   r  rl  r  r@  )r2   rT   rA  r3   r3   r4   r  4  s   
zCreateQueryBuilder._body_sqlc                 K  r)  )Nz AS ({query})r  r3   )rw   rf  rV   rW   r3   r3   r4   r  @  r+  z!CreateQueryBuilder._as_select_sqlr   c                 C  s   dd |D S )Nc                 S  s"   g | ]}t |tr|nt|qS r3   )rZ   r   r  r3   r3   r4   rx  F  s   " z=CreateQueryBuilder._prepare_columns_input.<locals>.<listcomp>r3   r  r3   r3   r4   r  E  r`   z)CreateQueryBuilder._prepare_columns_inputc                 C  r  r/   r   rA   r3   r3   r4   r   H  r   zCreateQueryBuilder.__str__c                 C  r  r/   r  rA   r3   r3   r4   r   K  r   zCreateQueryBuilder.__repr__r/   r#  rK  r,   r-   rG  r<   r   r,   r-   rE  r   r|  r,   r-   )r   r   r   r   r,   r-   )r   r   r,   r-   )NN)r   r  r  r   r  r  r  r   r  r   r,   r-   )r  r'   r,   r-   ra   rH   )r,   r  )r   r  r,   r   )$rI   rJ   rK   r   r)  r  r  r   rH  r5   r  r   r   rw  ry  r{  r   r~  r  r  r  r  r  rV   r  r  r  r  r  r  r  r  r  r  r   r   r3   r3   r3   r4   r     sZ    
			2











r   c                   @  s   e Zd Zd!ddZed"ddZed#ddZed$ddZed%ddZed!ddZ	ed!ddZ
d&ddZd&ddZd&ddZd S )'r   r,   r-   c                 C  s(   d | _ g | _d | _d | _d| _d| _d S r  )_indexrU  _tablerZ  
_is_uniquerk  rA   r3   r3   r4   r5   P  s   
zCreateIndexBuilder.__init__r   r   c                 C  r.   r/   )r  r2   r   r3   r3   r4   r   X  r8   zCreateIndexBuilder.create_indexr   r|  c                 G  sL   |D ]!}t |trt|}nt |trt|d |d d}| j| qd S )Nr   r   r   )rZ   r+   r   r   rU  r   r}  r3   r3   r4   r   \  s   


zCreateIndexBuilder.columnsr<   r   c                 C  r.   r/   )r  r  r3   r3   r4   rN  e  r8   zCreateIndexBuilder.onr   r  c                 C  s"   | j r|  j |M  _ dS || _ dS )z-
        Partial index where clause.
        N)rZ  r  r3   r3   r4   r  i  s   
zCreateIndexBuilder.wherec                 C  r  r  )r  rA   r3   r3   r4   r  s  r8   zCreateIndexBuilder.uniquec                 C  r  r  r  rA   r3   r3   r4   r  w  r8   z CreateIndexBuilder.if_not_existsr+   c                 C  s   | j r
t| j dkrtd| jstdddd | j D }| jr%dnd}| jr,d	nd}d
| d| d| j d| j d| d}| jrM|d| j 7 }|	ddS )Nr   z#Cannot create index without columnsz!Cannot create index without tabler]  c                 S  r  r3   r   )r6  cr3   r3   r4   rx    r8  z.CreateIndexBuilder.get_sql.<locals>.<listcomp>UNIQUEr   zIF NOT EXISTSzCREATE z INDEX r  z ON (r  z WHERE z  )
rU  r   r   r  r@  r  rk  r  rZ  r  )r2   columns_str
unique_strif_not_exists_strbase_sqlr3   r3   r4   rV   {  s   (zCreateIndexBuilder.get_sqlc                 C  r  r/   r   rA   r3   r3   r4   r     r   zCreateIndexBuilder.__str__c                 C  r  r/   r  rA   r3   r3   r4   r     r   zCreateIndexBuilder.__repr__NrE  )r   r   r,   r-   r  r  rF  rH   )rI   rJ   rK   r5   r   r   r   rN  r  r  r  rV   r   r   r3   r3   r3   r4   r   O  s"    
	

r   c                   @  s   e Zd ZdZdZdZdZeZd/d0d	d
Z	d1ddZ
ed2ddZed3ddZed4ddZed5ddZed6dd Zed7d!d"Zd8d&d'Zd9d)d*Zd:d+d,Zd:d-d.ZdS );r   z3
    Query builder used to build DROP queries.
    r   rJ  Nr#  rK  r,   r-   c                 C  s   d | _ d| _d | _|| _d S )Nr   )_drop_target_kind_drop_target
_if_existsr#  rq  r3   r3   r4   r5     rI  zDropQueryBuilder.__init__rT   r  c                 C  rr  rs  rt  rW   r3   r3   r4   r    ru  z%DropQueryBuilder._set_kwargs_defaultsr   Database | strc                 C  &   t |tr|nt|}| d| d S )NDATABASE)rZ   rz   _set_target)r2   r   targetr3   r3   r4   r        zDropQueryBuilder.drop_databaser<   r   c                 C  r  )NTABLE)rZ   ro   r  )r2   r<   r  r3   r3   r4   r     r  zDropQueryBuilder.drop_tabler   r+   c                 C     |  d| d S )NUSERr  )r2   r   r3   r3   r4   r        zDropQueryBuilder.drop_userr   c                 C  r  )NVIEWr  )r2   r   r3   r3   r4   r     r  zDropQueryBuilder.drop_viewr   c                 C  r  )NINDEXr  r  r3   r3   r4   r     r  zDropQueryBuilder.drop_indexc                 C  r  r  )r  rA   r3   r3   r4   	if_exists  r8   zDropQueryBuilder.if_existskindr  Database | Table | strc                 C  s   | j rtd|| _|| _ d S )Nz4'DropQuery' object already has attribute drop_target)r  r   r  )r2   r  r  r3   r3   r4   r    s   
zDropQueryBuilder._set_targetr   c                 K  s`   |  | | jr
dnd}d}t| jttfr | jjdi |}nt| j| j}dj	| j
||dS )Nz
IF EXISTS r   zDROP {kind} {if_exists}{name})r  r  r9   r3   )r  r  rZ   r  rz   ro   rV   r!   r)  rw   r  )r2   rT   r  target_namer3   r3   r4   rV     s   
zDropQueryBuilder.get_sqlc                 C  r  r/   r   rA   r3   r3   r4   r     r   zDropQueryBuilder.__str__c                 C  r  r/   r  rA   r3   r3   r4   r     r   zDropQueryBuilder.__repr__r/   r  rG  )r   r  r,   r-   r  )r   r+   r,   r-   )r   r+   r,   r-   )r   r+   r,   r-   rE  )r  r+   r  r  r,   r-   ra   rH   )rI   rJ   rK   r   r)  r  r  r   rH  r5   r  r   r   r   r   r   r   r  r  rV   r   r   r3   r3   r3   r4   r     s0    



r   )r   r   rT   r   r,   r   )r   r   r,   r   )C
__future__r   syscollections.abcr   r   	functoolsr   typingr   r   r   r	   pypika.enumsr
   r   r   r   pypika.termsr   r   r   r   r   r   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r    r!   r"   version_infor%   typing_extensions
__author__	__email__r&   r)   rM   rd   rz   ro   r   r   r   r   r   r   r   r'   r  r  rM  rQ  r   r   r   r3   r3   r3   r4   <module>   s`    <(
 

& D        !-!+   \@