
    g                    |   d dl m Z  d dlmZ d dl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 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mZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' dZ(dZ) G d	 d
e      Z* G d de*      Z+ G d d      Z, G d de,      Z- G d de*      Z.dee	e/e/f   e/f   dedee.   fdZ0 G d d      Z1dee	e/e/f   e/f   dee1   fdZ2 G d d      Z3e.Z4 G d d      Z5 G d de*e      Z6 G d  d!e*e      Z7 G d" d#      Z8 G d$ d%      Z9 G d& d'e9      Z: G d( d)e9      Z; G d* d+      Z< G d, d-      Z=y.)/    )copy)reduce)AnyListOptionalSequenceTupleTypeUnionSet)DialectsJoinTypeReferenceOptionSetOperation)ArithmeticExpression	CriterionEmptyCriterionFieldFunctionIndexNodeRollupStarTermr	   ValueWrapperr   PeriodCriterion)JoinExceptionQueryExceptionRollupExceptionSetOperationExceptionbuilderformat_alias_sqlformat_quotesignore_copyzTimothy Heysztheys@kayak.comc                       e Zd ZdeddfdZededd fd       ZdedefdZe	de
fd       Zededefd	       Zededefd
       ZdefdZy)
SelectablealiasreturnNc                     || _         y Nr'   selfr'   s     C/var/www/openai/venv/lib/python3.12/site-packages/pypika/queries.py__init__zSelectable.__init__&   s	    
    c                     || _         y r*   r+   r,   s     r.   as_zSelectable.as_)   s	    
r0   namec                     t        ||       S )Ntable)r   r-   r3   s     r.   fieldzSelectable.field-   s    T&&r0   c                     t        |       S r*   )r   r-   s    r.   starzSelectable.star0   s    Dzr0   c                 $    | j                  |      S r*   r8   r7   s     r.   __getattr__zSelectable.__getattr__4       zz$r0   c                 $    | j                  |      S r*   r=   r7   s     r.   __getitem__zSelectable.__getitem__8   r?   r0   c                     | j                   S r*   r+   r:   s    r.   get_table_namezSelectable.get_table_name<   s    zzr0   )__name__
__module____qualname__strr/   r!   r2   r   r8   propertyr   r;   r$   r>   rA   rC    r0   r.   r&   r&   %   s    c d     '# '% ' d                   r0   r&   c                   `     e Zd Zddedee   ddf fdZdedefdZdd de	fd	Z
defd
Z xZS )AliasedQueryNr3   queryr(   c                 B    t         |   |       || _        || _        y )Nr+   )superr/   r3   rL   )r-   r3   rL   	__class__s      r.   r/   zAliasedQuery.__init__A   s!    t$	
r0   kwargsc                 j    | j                   | j                  S  | j                   j                  di |S NrI   )rL   r3   get_sqlr-   rP   s     r.   rS   zAliasedQuery.get_sqlF   s0    ::99!tzz!!+F++r0   otherc                 X    t        |t              xr | j                  |j                  k(  S r*   )
isinstancerK   r3   r-   rU   s     r.   __eq__zAliasedQuery.__eq__K   s!    %.J499

3JJr0   c                 >    t        t        | j                              S r*   )hashrG   r3   r:   s    r.   __hash__zAliasedQuery.__hash__N   s    C		N##r0   r*   )rD   rE   rF   rG   r   r&   r/   r   rS   boolrY   intr\   __classcell__rO   s   @r.   rK   rK   @   sW    S *)=  
, , ,
KN Kt K$# $r0   rK   c                   ~    e Zd Zddeded    ddfdZdd defdZdd defdZe	d	edd
fd       Z
ddee   dedefdZy)SchemaNr3   parentr(   c                      || _         || _        y r*   )_name_parent)r-   r3   rc   s      r.   r/   zSchema.__init__S   s    
r0   rU   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r*   )rW   rb   re   rf   rX   s     r.   rY   zSchema.__eq__W   s6    %(hTZZ5;;-Fh4<<[`[h[hKhhr0   c                 &    | j                  |       S r*   rY   rX   s     r.   __ne__zSchema.__ne__Z       ;;u%%%r0   itemTablec                     t        ||       S )Nschemarm   r-   rl   s     r.   r>   zSchema.__getattr__]   s    T$''r0   
quote_charrP   c                     t        | j                  |      }| j                  /dj                   | j                  j                  dd|i||      S |S )Nz{parent}.{schema}rs   )rc   rp   rI   )r#   re   rf   formatrS   )r-   rs   rP   
schema_sqls       r.   rS   zSchema.get_sqla   s[    "4::z:
<<#&--+t||++LzLVL! .  
 r0   r*   )rD   rE   rF   rG   r   r/   r]   rY   rj   r$   r>   r   rS   rI   r0   r.   rb   rb   R   s    S (8*<  iH i i&H & & ( ( ( (
(3- 
# 
# 
r0   rb   c                   &    e Zd Zededefd       Zy)Databaserl   r(   c                     t        ||       S N)rc   rb   rr   s     r.   r>   zDatabase.__getattr__o   s    d4((r0   N)rD   rE   rF   r$   rG   rb   r>   rI   r0   r.   rx   rx   n   s"    ) ) ) )r0   rx   c                   z    e Zd Zedeeeeedf   deeeeedf   fd       Z		 	 	 ddede
eeef      de
e   de
ed      ddf
 fd	Zdefd
ZdedefdZededd fd       Zededd fd       ZdefdZdefdZdefdZdedefdZdefdZdeeeeeeeef      ddfdZ ddZ!deeeeeeef   ddfdZ" xZ#S )rm   rp   Nr(   c                     t        | t              r| S t        | t        t        f      rt	        d | dd  t        | d               S | t        |       S y )Nc                     t        ||       S rz   r{   )objss     r.   <lambda>z$Table._init_schema.<locals>.<lambda>|   s    #)>r0      r   )rW   rb   listtupler   ro   s    r.   _init_schemazTable._init_schemau   sV     ff%MftUm,>qr
FSYZ[S\L]^^&>!r0   r3   r'   	query_clsQueryc                     t         |   |       || _        | j                  |      | _        |xs t
        | _        d | _        d | _        t        | j                  t
              st        d      y )Nz,Expected 'query_cls' to be subclass of Query)rN   r/   _table_namer   _schemar   
_query_cls_for_for_portion
issubclass	TypeError)r-   r3   rp   r'   r   rO   s        r.   r/   zTable.__init__   sf     	((0#,u	 $//51JKK 2r0   c                 6    | j                   xs | j                  S r*   )r'   r   r:   s    r.   rC   zTable.get_table_name   s    zz-T---r0   rP   c                    |j                  d      }t        | j                  |      }| j                  -dj	                   | j                  j
                  di ||      }| j                  r.dj	                  | | j                  j
                  di |      }n9| j                  r-dj	                  | | j                  j
                  di |      }t        || j                  fi |S )Nrs   z{schema}.{table})rp   r6   z{table} FOR {criterion})r6   	criterionz"{table} FOR PORTION OF {criterion}rI   )
getr#   r   r   ru   rS   r   r   r"   r'   )r-   rP   rs   	table_sqls       r.   rS   zTable.get_sql   s    ZZ-
!$"2"2J?	<<#*119M9M9M9WPV9W_h1iI99188yTeTXT]T]TeTeTohnTo8pI<CC+D4+<+<+D+D+Nv+N D I  	4::@@@r0   temporal_criterionc                 n    | j                   rt        d      | j                  rt        d      || _         y )N)'Query' object already has attribute for_0'Query' object already has attribute for_portion)r   AttributeErrorr   )r-   r   s     r.   for_z
Table.for_   s1    99 !LMM !STT&	r0   period_criterionc                 n    | j                   rt        d      | j                  rt        d      || _         y )Nr   r   )r   r   r   )r-   r   s     r.   for_portionzTable.for_portion   s2     !STT99 !LMM,r0   c                 &    | j                  d      S N"rs   rS   r:   s    r.   __str__zTable.__str__       ||s|++r0   c                     t        |t              sy| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ryyNFT)rW   rm   r   r   r'   rX   s     r.   rY   zTable.__eq__   sO    %'u000<<5==(::$r0   c                     | j                   r&dj                  | j                  | j                         S dj                  | j                        S )NzTable('{}', schema='{}')zTable('{}'))r   ru   r   r:   s    r.   __repr__zTable.__repr__   s=    <<-44T5E5Et||TT##D$4$455r0   rU   c                 &    | j                  |       S r*   ri   rX   s     r.   rj   zTable.__ne__   rk   r0   c                 *    t        t        |             S r*   )r[   rG   r:   s    r.   r\   zTable.__hash__   s    CIr0   termsQueryBuilderc                 R     | j                   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r-   r   s     r.   r   zTable.select   s&     2t$$T*11599r0   c                 8    | j                   j                  |       S )za
        Perform an UPDATE operation on the current table

        :return: QueryBuilder
        )r   updater:   s    r.   r   zTable.update   s     %%d++r0   c                 R     | j                   j                  |       j                  | S )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   s     r.   r   zTable.insert   s&     1t##D)00%88r0   NNNr(   r   )$rD   rE   rF   staticmethodr   rG   r   r   rb   r   r   r
   r/   rC   r   rS   r!   r   r   r   r   r   r]   rY   r   rj   r^   r\   r   floatr   r   r   r   r   r_   r`   s   @r.   rm   rm   t   s   	U3eVT#AB 	uSRVX]_egkMkGl 	 	 04#-1LL vs{+,L }	L
 DM*L 
L . .A A A" 'y 'W ' ' -O - - -, ,t 6# 6
&C &D &# :XeCT4,N&OP :Uc :,9U3sD$#EF 9> 9r0   rm   namesrP   r(   c            	      6   g }| D ]  }t        |t              rBt        |      dk(  r4t        |d   |d   |j	                  d      |j	                  d            }n,t        ||j	                  d      |j	                  d            }|j                  |        |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   rp   r   )r3   r'   rp   r   )r3   rp   r   )rW   r   lenrm   r   append)r   rP   tablesr3   ts        r.   make_tablesr      s     FdE"s4yA~!W1gzz(+ **[1	A zz(+ **[1A
 	a  Mr0   c                   |    e Zd ZdZ	 	 	 ddedee   dee   deeee	f      ddf
dZ
d	edefd
Zd	edefdZdefdZy)ColumnzRepresents a column.Ncolumn_namecolumn_typenullabledefaultr(   c                     || _         || _        || _        |t        |t              r|| _        y t        |      | _        y r*   )r3   typer   rW   r   r   r   )r-   r   r   r   r   s        r.   r/   zColumn.__init__  s:      		 ")/Z5NwT`ahTir0   rP   c                 t    |j                  d      }dj                  t        | j                  |            }|S )Nrs   z{name})r3   )r   ru   r#   r3   )r-   rP   rs   
column_sqls       r.   get_name_sqlzColumn.get_name_sql  s9    ZZ-
__tyy*5 % 

 r0   c                 h   dj                   | j                  di || j                  rdj                  | j                        nd| j                  dj                  | j                  rdnd      nd| j                  r.dj                  d | j                  j
                  di |z         nd      }|S )	Nz{name}{type}{nullable}{default}z {} NULLzNOT NULLzDEFAULT )r3   r   r   r   rI   )ru   r   r   r   r   rS   )r-   rP   r   s      r.   rS   zColumn.get_sql&  s    6==""",V,,0IIdii(2NRmmNgU\\DMM&zJmoQUQ]Q]ELL.Bdll.B.B.LV.L!LMce	 > 

 r0   c                 &    | j                  d      S r   r   r:   s    r.   r   zColumn.__str__0  r   r0   r   )rD   rE   rF   __doc__rG   r   r]   r   r   r   r/   r   rS   r   rI   r0   r.   r   r     s    
 &*#'.2
j
j c]
j 4.	
j
 %T	*+
j 

jS S   , ,r0   r   c                      g }| D ]Q  }t        |t              r"t        |      dk(  rt        |d   |d         }nt        |      }|j	                  |       S |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   )rW   r   r   r   r   )r   columnsr3   columns       r.   make_columnsr   4  sX     GdE"s4yA~QT!WEF-Fv  Nr0   c                   H    e Zd Zdedeeef   deeef   ddfdZdedefdZy)		PeriodForr3   start_column
end_columnr(   Nc                     || _         t        |t              r|n
t        |      | _        t        |t              r|| _        y t        |      | _        y r*   )r3   rW   r   r   r   r-   r3   r   r   s       r.   r/   zPeriodFor.__init__F  s?    	,6|V,LLRXYeRf(2:v(F*FS]L^r0   rP   c           	          |j                  d      }dj                  t        | j                  |       | j                  j
                  di | | j                  j
                  di |      }|S )Nrs   z9PERIOD FOR {name} ({start_column_name},{end_column_name}))r3   start_column_nameend_column_namerI   )r   ru   r#   r3   r   r   r   )r-   rP   rs   period_for_sqls       r.   rS   zPeriodFor.get_sqlK  sl    ZZ-
T[[tyy*5<d//<<FvF8DOO88B6B \ 
 r0   )	rD   rE   rF   rG   r   r   r/   r   rS   rI   r0   r.   r   r   E  sR    _S _c6k0B _PUVY[aVaPb _gk _
	 	 	r0   r   c            	          e Zd ZdZededdfd       Zedeee	f   deddfd       Z
edee	ef   ddfd	       Zed
eeef   ddfd       Zedee	ef   ddfd       Zede	ddfd       Zede	ddfd       Zedeee	f   deddfd       Zedee	ef   de	deddfd       Zedeeee	eef   deddfd       Zedee	ef   ddfd       Zede	defd       Zedeee	e	f   e	f   dedee   fd       Zy)r   z
    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.
    rP   r(   r   c                     t        di |S rR   )r   )clsrP   s     r.   _builderzQuery._builderd  s    %f%%r0   r6   c                 D     | j                   di |j                  |      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.

        :returns QueryBuilder
        rI   )r   r   r   r6   rP   s      r.   r   zQuery.from_h  s#     s||%f%++E22r0   CreateQueryBuilderc                 4    t               j                  |      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   r6   s     r.   r   zQuery.create_tablew  s     "#0077r0   databaseDropQueryBuilderc                 4    t               j                  |      S )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   s     r.   r   zQuery.drop_database  s      !//99r0   c                 4    t               j                  |      S )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   s     r.   r   zQuery.drop_table  s      !,,U33r0   userc                 4    t               j                  |      S )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   s     r.   r   zQuery.drop_user        !++D11r0   viewc                 4    t               j                  |      S )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   s     r.   r   zQuery.drop_view  r   r0   c                 D     | j                   di |j                  |      S )aI  
        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.

        :returns QueryBuilder
        rI   )r   r   r   s      r.   r   z
Query.into  s#     s||%f%**511r0   r3   c                 F     | j                   di |j                  ||      S rR   )r   with_)r   r6   r3   rP   s       r.   r   zQuery.with_  s#    s||%f%++E488r0   r   c                 @      | 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.

        :returns QueryBuilder
        rI   )r   r   )r   r   rP   s      r.   r   zQuery.select  s%     -|s||%f%,,e44r0   c                 D     | j                   di |j                  |      S )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.

        :returns QueryBuilder
        rI   )r   r   r   s      r.   r   zQuery.update  s#     s||%f%,,U33r0   
table_namec                 $    | |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.

        :returns Table
        r   rq   )r   r   rP   s      r.   rm   zQuery.Table  s     "{Z*6**r0   r   c                 "    | |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.

        :returns Table
        r   )r   )r   r   rP   s      r.   TableszQuery.Tables  s     "{E,V,,r0   N)rD   rE   rF   r   classmethodr   r   r   r&   rG   r   rm   r   rx   r   r   r   r   r   r   r^   r   r]   r   r   r   _TableClass
TypedTupler   r   rI   r0   r.   r   r   [  sZ    & & & & 3%
C0 3C 3N 3 3 	8sEz!2 	87K 	8 	8 	:U8U?%; 	:@R 	: 	: 	4uS%Z0 	45G 	4 	4 	2S 	2%7 	2 	2 	2S 	2%7 	2 	2 2ucz* 2c 2n 2 2 9%Z0 9 9s 9~ 9 9 5E#uc4"=> 5# 5R` 5 5 45e, 4> 4 4 +s + + + -E*S#X"6";< - -PTU`Pa - -r0   r   c                       e Zd ZdZdefdddddedee   dee   f
 fd	Z	e
d
ededd fd       Ze
dedd fd       Ze
dedd fd       Ze
dedd fd       Ze
dedd fd       Ze
dedd fd       Ze
dedd fd       Ze
dedd fd       Zdedd fdZdedd fdZd#dZdefdZd$dedededefdZd%dee   dedefd Zdefd!Zdefd"Z xZ S )&_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'   wrapper_clsc                 ~    t         |   |       || _        ||fg| _        g | _        d | _        d | _        || _        y r*   )rN   r/   r  _set_operation	_orderbys_limit_offset_wrapper_cls)r-   r  r  r  r'   r	  rO   s         r.   r/   z_SetOperation.__init__  sG     	$ -/BCD'r0   fieldsrP   r(   c                    |D ]}  }t        |t              r$t        || j                  j                  d         n| j                  j                  |      }| j                  j                  ||j                  d      f        y Nr   r5   order)	rW   rG   r   r  _fromwrap_constantr  r   r   r-   r  rP   r8   s       r.   orderbyz_SetOperation.orderby   sl    E eS) e4??#8#8#;<__2259  NN!!5&**W*=">? r0   limitc                     || _         y r*   r  r-   r  s     r.   r  z_SetOperation.limit+  	    r0   offsetc                     || _         y r*   r  r-   r  s     r.   r  z_SetOperation.offset/  	    r0   rU   c                 Z    | j                   j                  t        j                  |f       y r*   )r  r   r   unionrX   s     r.   r#  z_SetOperation.union3  !    ""L$6$6#>?r0   c                 Z    | j                   j                  t        j                  |f       y r*   )r  r   r   	union_allrX   s     r.   r&  z_SetOperation.union_all7  !    ""L$:$:E#BCr0   c                 Z    | j                   j                  t        j                  |f       y r*   )r  r   r   	intersectrX   s     r.   r)  z_SetOperation.intersect;  r'  r0   c                 Z    | j                   j                  t        j                  |f       y r*   )r  r   r   	except_ofrX   s     r.   r+  z_SetOperation.except_of?  r'  r0   c                 Z    | j                   j                  t        j                  |f       y r*   )r  r   r   minusrX   s     r.   r-  z_SetOperation.minusC  r$  r0   c                 $    | j                  |      S r*   r#  rX   s     r.   __add__z_SetOperation.__add__G      zz%  r0   c                 $    | j                  |      S r*   r&  rX   s     r.   __mul__z_SetOperation.__mul__J      ~~e$$r0   c                 $    | j                  |      S r*   r-  rX   s     r.   __sub__z_SetOperation.__sub__M  r1  r0   c                 "    | j                         S r*   r   r:   s    r.   r   z_SetOperation.__str__P      ||~r0   
with_aliassubqueryc                    d}|j                  d| j                  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                        k7  rt        dj                  ||	            ||j                  |j                  |	      z  } | j                  r| | j                  d
i |z  }| j                  || j                         z  }| j                   r|| j#                         z  }|r dj                  d
d	|i|}|r%t%        || j&                  xs | j(                  fi |S |S )Nz {type} {query_string}dialectrs   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})rL   rI   )
setdefaultr  r>  
QUOTE_CHARrS   wrap_set_operation_queriesr  r   _selectsr    ru   valuer  _orderby_sqlr  
_limit_sqlr  _offset_sqlr"   r'   r   )
r-   r;  r<  rP   set_operation_templatebase_querystringquerystringr  r  set_operation_querystrings
             r.   rS   z_SetOperation.get_sqlS  s   !9)T__%<%<= 	,(B(BC24??22qDOO<f<fqjpq&262E2E.M.(C(;(C(C )CC)GM)% 4??++,4G4P4P0QQ+SSYSY/8Q TZ T  188"((7P 9  K 3F" >>,4,,6v66K;;"4??,,K<<4++--K,+,,I;I&IK#K1Ot?O?OZSYZZr0   rs   c                    g }| j                   j                  D ch c]  }|j                   }}| j                  D ]y  \  }}|j                  r$|j                  |v rt	        |j                  |      n |j
                  dd|i|}|j                  |dj                  ||j                        n|       { dj                  dj                  |            S c c}w )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.
        rs   {term} {orient}termorient ORDER BY {orderby},r  rI   )
r  rF  r'   r  r#   rS   r   ru   rG  join)	r-   rs   rP   clausesr   selected_aliasesr8   directionalityrR  s	            r.   rH  z_SetOperation._orderby_sql  s     -1__-E-EF-EAGG-EF%)^^!E> ;;5;;2B#B ekk:6"U]]CjCFC  NNTbTn!((d>;O;O(Ptx &4 %++CHHW4E+FF Gs   Cc                 :    dj                  | j                        S Nz OFFSET {offset})r  ru   r  r:   s    r.   rJ  z_SetOperation._offset_sql      !(((==r0   c                 :    dj                  | j                        S Nz LIMIT {limit})r  ru   r  r:   s    r.   rI  z_SetOperation._limit_sql      &&T[[&99r0   )rU   r   r(   r  FFr*   )!rD   rE   rF   r   r   r   r   rG   r
   r/   r!   r   r   r  r^   r  r  r&   r#  r&  r)  r+  r-  r0  r4  r8  r   r]   rS   rH  rJ  rI  r_   r`   s   @r.   r  r    s     $*6("( ,( $	(
 }( ,'($ @u @ @ @ @ 3 ?   S _   @: @/ @ @ Dz Do D D Dz Do D D Dz Do D D @: @/ @ @!Z !O !%Z %O %! +$ +$ +RU +Z] +ZGx} Gs Gs G0>S >:C :r0   r  c                       e Zd ZdZdZdZdZdZeZ	dde
ddfdee   ded	ee
   d
edef
 fdZddZedeeeef   dd fd       Zedee   dee   dd fd       Zedededd fd       Zedeeef   dd fd       Zededd fd       Zedd       Zedeeef   dd fd       Zededd fd       Zededd fd       Zededd fd       Z edeee!f   deee!f   dd fd        Z"edeee!f   deee!f   dd fd!       Z#edd"       Z$edd#       Z%edd$       Z&ed%e'dd fd&       Z(ed%ee)e*f   dd fd'       Z+ed%ee)e*f   dd fd(       Z,edeee-e)f   dd fd)       Z.edd*       Z/edee0e1e2e)f   d+edd fd,       Z3ed-ed+edd fd.       Z4ee5jl                  fd/eed e7ef   d0e5dd1fd2       Z8d/eed e7f   dd1fd3Z9d/eed e7f   dd1fd4Z:d/eed e7f   dd1fd5Z;d/eed e7f   dd1fd6Z<d/eed e7f   dd1fd7Z=d/eed e7f   dd1fd8Z>d/eed e7f   dd1fd9Z?d/eed e7f   dd1fd:Z@d/eed e7f   dd1fd;ZAed<e-dd fd=       ZBed>e-dd fd?       ZCed@d deDfdA       ZEed@d deDfdB       ZFed@d deDfdC       ZGed@d deDfdD       ZHed@d deDfdE       ZIedFeeJef   dGedd fdH       Z2d@d deDfdIZKd@d deDfdJZLd@d deDfdKZMedLeNdd fdM       ZNd/eded eJf   f fdNZOePddOeQeJ   dPee   deRe   fdQ       ZSdeddfdRZTdeJddfdSZUdTeVddfdUZWdeReJ   fdVZXddWZYdedefdXZZde)defdYZ[dd[Z\deddfd\Z]defd]Z^defd^Z_d@d defd_Z`d@d defd`Zade-fdaZbd+ecddfdbZdddcedZed+edefddZedeedefdfZfd+edefdgZgd+edefdhZhdefdiZid+edefdjZjd+edefdkZkd+edefdlZlePd+edefdm       Zmd+edefdnZnddoed+edefdpZod+edefdqZpd+edefdrZqddoed+edefdsZrddoed+edefdtZsd+edefduZtd+edefdvZuddPee   d+edefdwZvddPee   d+edefdxZw	 	 	 ddPee   dyee   dzed+edef
d{Zx	 	 	 ddPee   dyee   d|ed+edef
d}Zydefd~ZzddPee   d+edefdZ{defdZ|defdZ}d+edefdZ~ xZS )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>  rE  r	  	immutable
as_keywordc                 :   t         |   d        g | _        d | _        d | _        d| _        d| _        g | _        g | _        g | _	        g | _
        g | _        g | _        d| _        d| _        d| _        d | _        d | _        g | _        d| _        d | _        g | _        g | _        g | _        g | _        d | _        d | _        g | _        d| _        t;               | _        d| _        d| _         d| _!        d| _"        || _#        || _$        || _%        || _&        || _'        y )NFr   )(rN   r/   r  _insert_table_update_table_delete_from_replace_withrF  _force_indexes_use_indexes_columns_values	_distinct_ignore_for_update_wheres
_prewheres	_groupbys_with_totals_havingsr  _joins_unions_usingr  r  _updates_select_starset_select_star_tables_mysql_rollup_select_into_subquery_count_foreign_tabler>  rg  rE  r  rf  )r-   r>  rE  r	  rf  rg  rO   s         r.   r/   zQueryBuilder.__init__  s&    	
!!!
  !!#&5 "! #$*D''"r0   r(   c                 :   t        |       j                  t        |             }|j                  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   r  r  rm  rF  rp  rq  rw  r  rz  r{  r}  rn  ro  )r-   newones     r.   __copy__zQueryBuilder.__copy__  s   d##DJ/t}}-%)$*B*B%C"DJJ'DJJ't}}-t}}-dll+//T[[)dll+t}}- $T%8%8 9"4#4#45r0   
selectablec                 J   | j                   j                  t        |t              rt	        |      n|       t        |t
        t        f      rW|j                  Jt        |t
              r|j                  }nd}t        | j                  |      }d|z  |_        |dz   | _        yyy)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   rW   rG   rm   r   r  r'   r  max)r-   r  sub_query_counts      r.   r   zQueryBuilder.from_  s     	

z*c/J%
+PZ[j<"?@ZEUEUE]*l3","<"<"#!$"6"6HO%7J#2Q#6D  F^@r0   current_table	new_tablec                    | j                   D cg c]  }||k(  r|n| c}| _         | j                  |k(  r|n| j                  | _        | j                  |k(  r|n| j                  | _        | j                  D cg c]  }|j	                  ||       c}| _        | j
                  D cg c]  }|j	                  ||       c}| _        | j                  D cg c]  }|j	                  ||       c}| _        | j                  D cg c]"  }|D cg c]  }|j	                  ||       c}$ c}}| _        | j                  r| j                  j	                  ||      nd| _        | j                  r| j                  j	                  ||      nd| _	        | j                  D 	cg c]  }	|	j	                  ||       c}	| _
        | j                  r| j                  j	                  ||      nd| _        | j                  D 
cg c]  }
|
d   j	                  ||      |
d   f c}
| _        | j                  D cg c]  }|j	                  ||       c}| _        || j                  v r7| j                  j                  |       | j                  j!                  |       yyc c}w c c}w c c}w c c}w c c}w c c}}w c c}	w c c}
w c c}w )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.
        Nr   r   )r  ri  rj  rm  replace_tablerF  rp  rq  ru  rv  rw  ry  r  rz  r  removeadd)r-   r  r  r6   alias_queryr   r   
value_listrG  groupbyr  rW  s               r.   r  zQueryBuilder.replace_table  s    SWR\R\]R\5M#9iuDR\]
*.*<*<*MYSWSeSe*.*<*<*MYSWSeSe]a]g]gh]gkk//yI]gh
VZVcVcdVcF--mYGVcdVZVcVcdVcF--mYGVcdfjfrfr
frXb
S
uU  	:
Sfr
 PT||t||11-KaeUYUdUd$//77yQjnY]YgYghYgg'//yIYghQUQ^Q^33M9Mdh\`\j\j
\jQXWQZ%%mY?L\j
 QUP[P[\P[t))-CP[\D444$$++M:$$((3 5) ^ iddS
 i
 ]sA   J9J$(J)J.	J8J3)J8#J>!K8K3J8r3   c                 R    t        ||      }| j                  j                  |       y r*   )rK   rm  r   )r-   r  r3   r   s       r.   r   zQueryBuilder.with_7  s     z*

!r0   r6   c                     | j                   t        ddz        | j                  rd| _        t	        |t
              r|| _         y t        |      | _         y )N$'Query' object has no attribute '%s'r   T)ri  r   rF  r  rW   rm   r-   r6   s     r.   r   zQueryBuilder.into<  sJ    ) !G&!PQQ== $D&0&>UE%Lr0   r   c                 B   |D ]  }t        |t              r| j                  |       %t        |t              r| j	                  |       Gt        |t
        t        f      r| j                  |       o| j                  | j                  || j                                y N)r	  )
rW   r   _select_fieldrG   _select_field_strr   r   _select_otherr  r  r-   r   rR  s      r.   r   zQueryBuilder.selectF  s~    D$&""4(D#&&&t,D8-A"BC""4(""4#5#5dHYHY#5#Z[ r0   c                 v    | j                   s| j                  s| j                  rt        ddz        d| _         y )Nr  deleteT)rk  rF  rj  r   r:   s    r.   r  zQueryBuilder.deleteR  s2    1C1C !G(!RSS r0   c                     | j                   | j                  s| j                  rt        ddz        t	        |t
              r|| _         y t        |      | _         y )Nr  r   )rj  rF  rk  r   rW   rm   r  s     r.   r   zQueryBuilder.updateY  sI    )T]]d>O>O !G(!RSS&0&>UE%Lr0   c                 
   | j                   t        ddz        |rt        |d   t        t        f      r|d   }|D ]D  }t        |t
              rt        || j                         }| j                  j                  |       F y )Nr  r   r   r5   )	ri  r   rW   r   r   rG   r   rp  r   r  s      r.   r   zQueryBuilder.columns`  st    % !G(!RSSZa4-8!HED$$T););<MM  & r0   c                 0     | j                   |  d| _        y NF_apply_termsrl  r   s     r.   r   zQueryBuilder.insertm  s    5!r0   c                 0     | j                   |  d| _        y NTr  r   s     r.   replacezQueryBuilder.replacer  s    5!r0   rR  c                     |g|D ]c  }t        |t              r| j                  j                  |       /t        |t              s@| j                  j                  t        |             e y r*   )rW   r   rn  r   rG   r-   rR  r   r   s       r.   force_indexzQueryBuilder.force_indexw  sR    A!U###**1-As###**584	  r0   c                     |g|D ]c  }t        |t              r| j                  j                  |       /t        |t              s@| j                  j                  t        |             e y r*   )rW   r   ro  r   rG   r  s       r.   	use_indexzQueryBuilder.use_index  sR    A!U#!!((+As#!!((q2	  r0   c                     d| _         y r  rr  r:   s    r.   distinctzQueryBuilder.distinct  s	    r0   c                     d| _         y r  rt  r:   s    r.   
for_updatezQueryBuilder.for_update  s
    r0   c                     d| _         y r  )rs  r:   s    r.   ignorezQueryBuilder.ignore  s	    r0   r   c                     | j                  |      sd| _        | j                  r| xj                  |z  c_        y || _        y r  )_validate_tabler  rv  r-   r   s     r.   prewherezQueryBuilder.prewhere  s4    ##I."&D??OOy(O'DOr0   c                     t        |t              ry | j                  |      sd| _        | j                  r| xj                  |z  c_        y || _        y r  )rW   r   r  r  ru  r  s     r.   wherezQueryBuilder.where  sA    i0##I."&D<<LLI%L$DLr0   c                 x    t        |t              ry | j                  r| xj                  |z  c_        y || _        y r*   )rW   r   ry  r  s     r.   havingzQueryBuilder.having  s+    i0==MMY&M%DMr0   c                 "   |D ]  }t        |t              rt        || j                  d         }nBt        |t              r2t        t        |      | j                  d         j                  |      }| j                  j                  |        y )Nr   r5   )rW   rG   r   r  r^   r  rw  r   r  s      r.   r  zQueryBuilder.groupby  si    D$$TA7D#&SYdjjm<JJ4PNN!!$' r0   c                     d| _         y r  )rx  r:   s    r.   with_totalszQueryBuilder.with_totals  s
     r0   rP   c           	      0   d|j                  d      k(  }| j                  rt        ddz        |D cg c]'  }t        |t        t
        t        f      rt        | n|) }}|r6|s| j                  st        d      d| _        | xj                  |z  c_        y dt        | j                        k  r@t        | j                  d   t              r#| j                  d   xj                  |z  c_        y | j                  j                  t        |        y c c}w )	Nmysqlvendorr  rollupzWAt least one group is required. Call Query.groupby(term) or passas parameter to rollup.Tr   )r   r  r   rW   r   r   r  r	   rw  r   r   r   argsr   )r-   r   rP   	for_mysqlrR  s        r.   r  zQueryBuilder.rollup  s    vzz(33	 !G(!RSS\ab\aTXD42D!E4O\ab%p  "&DNNe#NT^^$$DNN24F)ONN2##u,# NN!!&%.1# cs   ,Dr  c                     |D ]i  }t        |t              rt        || j                  d         n| j	                  |      }| j
                  j                  ||j                  d      f       k y r  )rW   rG   r   r  r  r  r   r   r  s       r.   r  zQueryBuilder.orderby  sX    E9CE39OE%tzz!}5UYUgUghmUnENN!!5&**W*=">? r0   rl   howJoinerc                 b   t        |t              rt        | ||d      S t        |t              r,|j                  | j                  |       t        | ||d      S t        |t              rt        | ||d      S t        |t              rt        | ||d      S t        dt        |      z        )Nr6   )
type_labelr<  zCannot join on type '%s')
rW   rm   r  r   r'   _tag_subqueryrK   r&   
ValueErrorr   r-   rl   r  s      r.   rW  zQueryBuilder.join  s     dE"$cg>>l+zz!""4($cjAAl+$cg>>j)$cjAA3d4j@AAr0   c                 B    | j                  |t        j                        S r*   )rW  r   innerrr   s     r.   
inner_joinzQueryBuilder.inner_join      yyx~~..r0   c                 B    | j                  |t        j                        S r*   )rW  r   leftrr   s     r.   	left_joinzQueryBuilder.left_join      yyx}}--r0   c                 B    | j                  |t        j                        S r*   )rW  r   
left_outerrr   s     r.   left_outer_joinzQueryBuilder.left_outer_join      yyx2233r0   c                 B    | j                  |t        j                        S r*   )rW  r   rightrr   s     r.   
right_joinzQueryBuilder.right_join   r  r0   c                 B    | j                  |t        j                        S r*   )rW  r   right_outerrr   s     r.   right_outer_joinzQueryBuilder.right_outer_join  s    yyx3344r0   c                 B    | j                  |t        j                        S r*   )rW  r   outerrr   s     r.   
outer_joinzQueryBuilder.outer_join  r  r0   c                 B    | j                  |t        j                        S r*   )rW  r   
full_outerrr   s     r.   full_outer_joinzQueryBuilder.full_outer_join	  r  r0   c                 B    | j                  |t        j                        S r*   )rW  r   crossrr   s     r.   
cross_joinzQueryBuilder.cross_join  r  r0   c                 B    | j                  |t        j                        S r*   )rW  r   r[   rr   s     r.   	hash_joinzQueryBuilder.hash_join  r  r0   r  c                     || _         y r*   r  r  s     r.   r  zQueryBuilder.limit  r  r0   r  c                     || _         y r*   r  r   s     r.   r  zQueryBuilder.offset  r!  r0   rU   c                 P    t        | |t        j                  | j                        S r  )r  r   r#  r  rX   s     r.   r#  zQueryBuilder.union      T5,*<*<$J[J[\\r0   c                 P    t        | |t        j                  | j                        S r  )r  r   r&  r  rX   s     r.   r&  zQueryBuilder.union_all      T5,*@*@dN_N_``r0   c                 P    t        | |t        j                  | j                        S r  )r  r   r)  r  rX   s     r.   r)  zQueryBuilder.intersect"  r  r0   c                 P    t        | |t        j                  | j                        S r  )r  r   r+  r  rX   s     r.   r+  zQueryBuilder.except_of&  r  r0   c                 P    t        | |t        j                  | j                        S r  )r  r   r-  r  rX   s     r.   r-  zQueryBuilder.minus*  r  r0   r8   rG  c                     t        |t              st        |      n|}| j                  j                  || j	                  |      f       y r*   )rW   r   r}  r   r  )r-   r8   rG  s      r.   r  zQueryBuilder.set.  s8    $.ue$<e%eT%6%6u%=>?r0   c                 $    | j                  |      S r*   r/  rX   s     r.   r0  zQueryBuilder.__add__3  r1  r0   c                 $    | j                  |      S r*   r3  rX   s     r.   r4  zQueryBuilder.__mul__6  r5  r0   c                 $    | j                  |      S r*   r7  rX   s     r.   r8  zQueryBuilder.__sub__9  r1  r0   slicec                 H    |j                   | _        |j                  | _        y r*   )startr  stopr  )r-   r  s     r.   r  zQueryBuilder.slice<  s    {{jjr0   c                 d    t        |t              st        |   |      S | j                  |      S r*   )rW   r  rN   rA   )r-   rl   rO   s     r.   rA   zQueryBuilder.__getitem__A  s,    $&7&t,,zz$r0   	field_setrs   c                 h    | D cg c]"  }|j                   xs |j                  |      $ c}S c c}w )Nr   )r'   rS   )r  rs   r8   s      r.   _list_aliaseszQueryBuilder._list_aliasesF  s3    QZ[QZCu}}
}CCQZ[[[s   '/c                     dt        | j                        k(  rt        dj                  |            |dk(  rd| _        t               g| _        y | j                  t        || j                  d                y )Nr   z.Cannot select {term}, no FROM table specified.)rR  *Tr5   )	r   r  r   ru   r~  r   rF  r  r   )r-   rR  s     r.   r  zQueryBuilder._select_field_strJ  sg    DJJ !Q!X!X^b!X!cdd3; $D!VHDM5TZZ];<r0   c                    | j                   ry |j                  | j                  v ry t        |t              rj| j
                  D cg c]*  }t        |d      r|j                  |j                  k7  s)|, c}| _        | j                  j                  |j                         | j
                  j                  |       y c c}w )Nr6   )	r~  r6   r  rW   r   rF  hasattrr  r   )r-   rR  r   s      r.   r  zQueryBuilder._select_fieldU  s    ::111dD!%)]]%26'&':RVZV`V`djdpdpVp]DM $$((4T"s   *B=0B=functionc                 :    | j                   j                  |       y r*   )rF  r   )r-   r
  s     r.   r  zQueryBuilder._select_otherf  s    X&r0   c                     g S r*   rI   r:   s    r.   fields_zQueryBuilder.fields_i  s    	r0   c                    | j                   | j                  gz   | j                  z   j                  | j                         t        fdD              }t        j                  t              r@j                  j                  *|r(j                  j                  dz   j                  _	        | j                  j                         y )Nc              3   ^   K   | ]$  }t        |t              xr j                  v  & y wr*   )rW   rm   rl   ).0clausebase_tablesrW  s     r.   	<genexpr>z'QueryBuilder.do_join.<locals>.<genexpr>q  s-     nbmX^Z6S499;SSbms   *-2)r  rj  rm  validaterz  anyrW   rl   rm   r'   r   r   )r-   rW  table_in_queryr  s    ` @r.   do_joinzQueryBuilder.do_joinm  s    jjD$6$6#77$**Dk4;;/nbmnndii'DIIOO,C #ii33c9DIIO4 r0   c                 @    t        fd| j                  D              S )Nc              3   <   K   | ]  }|j                   k(    y wr*   )rl   )r  rW  r6   s     r.   r  z)QueryBuilder.is_joined.<locals>.<genexpr>z  s     >+$5DII%+s   )r  rz  r  s    `r.   	is_joinedzQueryBuilder.is_joinedy  s    >$++>>>r0   c                 T   | j                   | j                  gz   }|j                         D ]v  }|j                  |v }|j                  | j                  D cg c]  }|j
                   c}v }t        |j                  du| | |j                  | j                  k7  g      sv y yc c}w )z
        Returns False if the term references a table not already part of the
        FROM clause or JOINS and True otherwise.
        NFT)r  rj  r  r6   rz  rl   all)r-   rR  r  r8   table_in_base_tablesrW  table_in_joinss          r.   r  zQueryBuilder._validate_table|  s    
 jjD$6$6#77\\^E#(;;+#= "[[4;;,O;4TYY;,OONKKt+,,&&KK4#5#55	  $  -Ps   B%r<  c                 V    d| j                   z  |_        | xj                   dz  c_         y )Nr  r   )r  r'   )r-   r<  s     r.   r  zQueryBuilder._tag_subquery  s%    $"6"66!r0   c           
      ,   | j                   t        ddz        |syt        |d   t        t        t
        f      s|g}|D ]L  }| j                  j                  |D cg c]%  }t        |t              r|n| j                  |      ' c}       N yc c}w )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   )
ri  r   rW   r   r   r  rq  r   r   r  )r-   r   valuesrG  s       r.   r  zQueryBuilder._apply_terms  s    
 % !G(!RSS%(T5#$67GEFLLnt untej*UD*AtGYGYZ_G`!`nt uv  us   *B
c                 :    | j                  | j                        S )N)r>  )rS   r>  r:   s    r.   r   zQueryBuilder.__str__  s    ||DLL|11r0   c                 "    | j                         S r*   r   r:   s    r.   r   zQueryBuilder.__repr__  r:  r0   c                 Z    t        |t              sy| j                  |j                  k(  syyr   )rW   r   r'   rX   s     r.   rY   zQueryBuilder.__eq__  s%    %.zzU[[(r0   c                 &    | j                  |       S r*   ri   rX   s     r.   rj   zQueryBuilder.__ne__  rk   r0   c                 f    t        | j                        t        d | j                  D              z   S )Nc              3   2   K   | ]  }t        |        y wr*   )r[   )r  r  s     r.   r  z(QueryBuilder.__hash__.<locals>.<genexpr>  s     %Lvd6ls   )r[   r'   sumr  r:   s    r.   r\   zQueryBuilder.__hash__  s%    DJJ#%L%L"LLLr0   c                    |j                  d| j                         |j                  d| j                         |j                  d| j                         |j                  d| j                         |j                  d| j
                         y )Nrs   secondary_quote_charalias_quote_charrg  r>  )rC  rD  SECONDARY_QUOTE_CHARALIAS_QUOTE_CHARrg  r>  rT   s     r.   _set_kwargs_defaultsz!QueryBuilder._set_kwargs_defaults  sl    ,80$2K2KL,d.C.CD,8)T\\2r0   r;  c                 
   | j                         | j                  s%| j                  s| j                  s| j                  sy| j                  r| j                  s| j
                  sy| j                  r| j                  syt        | j                        }dt        | j                        k  }dt        | j                        k  xr t        | j                  d   t              }| j                  }| j                  xr | j                  }t        |||||g      d<   | j                  r| j                  r | j                   di }	nd}	|	 | j"                  di z  }	| j                  r*|	ddj%                  fd| j                  D              z   z  }	|	 | j&                  di z  }	| j                  r|	 | j(                  di z  }	| j*                  r|	 | j,                  di z  }	| j.                  |	| j1                         z  }	|	S | j                  r | j2                  di }	n$| j4                  s| j                  r| j                  r | j                   di }	nd}	| j6                  r|	 | j8                  di z  }	n|	 | j:                  di z  }	| j<                  r|	 | j>                  di z  }	| j
                  r|	 | j@                  di z  }	|	S |	d | jB                  di z   z  }	nW| j                  r | j                   di }	nd}	|	 | jB                  di z  }	| j                  r|	 | jD                  di z  }	| j                  r|	 | j(                  di z  }	| jF                  r|	 | jH                  di z  }	| jJ                  r|	 | jL                  di z  }	| jN                  r|	 | jP                  di z  }	| j                  r*|	ddj%                  fd| j                  D              z   z  }	| jR                  r|	 | jT                  di z  }	| j*                  r|	 | j,                  di z  }	| jV                  r4|	 | jX                  di z  }	| jZ                  r|	| j]                         z  }	| j^                  r|	 | j`                  di z  }	| jb                  r|	 | jd                  di z  }	| jg                  |	      }	| jh                  r|	 | jj                  di z  }	|rdjm                  |		      }	|r>| jn                  | jp                  n| jn                  d
<   ts        |	| jt                  fi S |	S )Nr   r   r   with_namespace c              3   B   K   | ]  } |j                   di   y wrR   r   r  rW  rP   s     r.   r  z'QueryBuilder.get_sql.<locals>.<genexpr>  s"     -]Q\ldll.DV.DQ\   c              3   B   K   | ]  } |j                   di   y wrR   r   r5  s     r.   r  z'QueryBuilder.get_sql.<locals>.<genexpr>"  s      )Y[T,$,,*@*@[r6  rB  rL   r-  rI   );r0  rF  ri  rk  rj  rq  r}  r]   rz  r   r  rW   r   r  r  rm  	_with_sql_update_sqlrW  _set_sql	_from_sqlru  
_where_sqlr  rI  _delete_sqlr  rl  _replace_sql_insert_sqlrp  _columns_sql_values_sql_select_sql	_into_sqlr|  
_using_sqlrn  _force_index_sqlro  _use_index_sqlrv  _prewhere_sqlrw  
_group_sqlr  _rollup_sqlry  _having_sqlr  rH  _apply_paginationrt  _for_update_sqlru   QUERY_ALIAS_QUOTE_CHARr/  r"   r'   )
r-   r;  r<  rP   	has_joinshas_multiple_from_clauseshas_subquery_from_clausehas_reference_to_foreign_tablehas_update_fromrM  s
      `      r.   rS   zQueryBuilder.get_sql  s'   !!&)!3!3t7H7HDL^L^t}}dmm%	$%DJJ$7!#$s4::#6#b:djjQRmUa;b )-)<)<&,,;#&)(.$
  zz,dnn6v6 +4++5f55K{{sSXX-]QUQ\Q\-]%]]]=4==2622Kzz~t~~777||t888{{&t00*$**4V4K""t'9'9zz,dnn6v6 }}0t00:6::/t//9&99}}0t00:6::||/t//9&99""s%5T%5%5%?%??? zz,dnn6v6 +4++5f55K!!~t~~777::>4>>3F33K;;?4??4V44K0400:6::K.4..888K;;3)YT[[)Y!YYYK??-4--777K<<?4??4V44K>>?4??4V44K!!t//11==+4++5f55K>>,4,,6v66K,,[9/4//9&99K%,,;,?K)-)D)D)L%%RVRmRm %& $KFvFFr0   rM  c                     | j                   || j                         z  }| j                  r|| j                         z  }|S r*   )r  rI  r  rJ  )r-   rM  s     r.   rL  zQueryBuilder._apply_paginationE  s=    ;;"4??,,K<<4++--Kr0   c                 R    ddj                  fd| j                  D              z   S )NzWITH rU  c              3   n   K   | ],  }|j                   d z    |j                  ddddz   dz    . yw)z AS (Fr<  r;  z) NrI   )r3   rS   r  r  rP   s     r.   r  z)QueryBuilder._with_sql.<locals>.<genexpr>O  sC      "
$ KK'!NFNN$^Ee$^W]$^^aee$s   25)rW  rm  rT   s    `r.   r9  zQueryBuilder._with_sqlN  s,     "
**"
 
 
 	
r0   c                 *    | j                   rd}|S d}|S )Nz	DISTINCT r   r  )r-   rP   r  s      r.   _distinct_sqlzQueryBuilder._distinct_sqlT  s!    >>"H  Hr0   c                 *    | j                   rd}|S d}|S )Nz FOR UPDATEr   r  )r-   rP   r  s      r.   rM  zQueryBuilder._for_update_sql\  s%    &J  Jr0   c                     dj                   | j                  di dj                  fd| j                  D                    S )NzSELECT {distinct}{select}rU  c              3   H   K   | ]  } |j                   dd d d  ywT)r;  r<  NrI   r   r  rR  rP   s     r.   r  z+QueryBuilder._select_sql.<locals>.<genexpr>g  s*     m_lW[LDLLRD4R6R_l   ")r  r   rI   )ru   rZ  rW  rF  rT   s    `r.   rC  zQueryBuilder._select_sqld  sG    *11'T''1&188m_c_l_lmm 2 
 	
r0   c                     dj                   | j                  j                  di || j                  rd      S d      S )NzINSERT {ignore}INTO {table}zIGNORE r   )r6   r  rI   )ru   ri  rS   rs  rT   s     r.   r@  zQueryBuilder._insert_sqlj  sN    ,33,$$$,,6v6 $9 4 
 	
24 4 
 	
r0   c                 Z    dj                   | j                  j                  di |      S )NzREPLACE INTO {table}r5   rI   ru   ri  rS   rT   s     r.   r?  zQueryBuilder._replace_sqlp  s3    %,,,$$$,,6v6 - 
 	
r0   c                       y)NDELETErI   )rP   s    r.   r>  zQueryBuilder._delete_sqlu  s    r0   c                 Z    dj                   | j                  j                  di |      S )NzUPDATE {table}r5   rI   )ru   rj  rS   rT   s     r.   r:  zQueryBuilder._update_sqly  s-    &&-GT-?-?-G-G-Q&-Q&RRr0   r2  c                 l    dj                  dj                  fd| j                  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})rU  c              3   F   K   | ]  } |j                   dd di  yw)r2  FNrI   r   r_  s     r.   r  z,QueryBuilder._columns_sql.<locals>.<genexpr>  s'     dVcd\T\\II&IVcs   !r   )ru   rW  rp  r-   r2  rP   s     `r.   rA  zQueryBuilder._columns_sql|  s6     $$HHdVZVcVcdd % 
 	
r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz VALUES ({values})z),(c              3   R   K   | ]  }d j                  fd|D                 yw)rU  c              3   H   K   | ]  } |j                   dd d d  ywr^  r   r_  s     r.   r  z5QueryBuilder._values_sql.<locals>.<genexpr>.<genexpr>  s*     `\_TXOOO\_r`  N)rW  )r  rowrP   s     r.   r  z+QueryBuilder._values_sql.<locals>.<genexpr>  s'      lxeh`\_``lxs   $')r"  )ru   rW  rq  rT   s    `r.   rB  zQueryBuilder._values_sql  s:    #**:: lplxlx  + 
 	
r0   c                 ^    dj                   | j                  j                  dddi|      S )Nz INTO {table}r;  Fr5   rI   rc  rT   s     r.   rD  zQueryBuilder._into_sql  s8    %%,$$$,,HHH & 
 	
r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz FROM {selectable}rU  c              3   H   K   | ]  } |j                   dd d d  ywTrW  NrI   r   rX  s     r.   r  z)QueryBuilder._from_sql.<locals>.<genexpr>  s+     rgq]c X XQW Xgqr`  r  )ru   rW  r  rj  s     `r.   r<  zQueryBuilder._from_sql  s4    #**xxrgkgqgqrr + 
 	
r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz USING {selectable}rU  c              3   H   K   | ]  } |j                   dd d d  ywrr  r   rX  s     r.   r  z*QueryBuilder._using_sql.<locals>.<genexpr>  s+     sgr]c X XQW Xgrr`  rs  )ru   rW  r|  rj  s     `r.   rE  zQueryBuilder._using_sql  s4    $++xxsgkgrgrss , 
 	
r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz FORCE INDEX ({indexes})rU  c              3   B   K   | ]  } |j                   di   y wrR   r   r  indexrP   s     r.   r  z0QueryBuilder._force_index_sql.<locals>.<genexpr>  s"     VBU]U]]4V4BUr6  indexes)ru   rW  rn  rT   s    `r.   rF  zQueryBuilder._force_index_sql  s3    )00HHV$BUBUVV 1 
 	
r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz USE INDEX ({indexes})rU  c              3   B   K   | ]  } |j                   di   y wrR   r   rx  s     r.   r  z.QueryBuilder._use_index_sql.<locals>.<genexpr>  s"     TBS]U]]4V4BSr6  rz  )ru   rW  ro  rT   s    `r.   rG  zQueryBuilder._use_index_sql  s3    '..HHT$BSBSTT / 
 	
r0   c                 `    dj                   | j                  j                  d|dd|      S )Nz PREWHERE {prewhere}Trs   r<  )r  rI   )ru   rv  rS   r-   rs   rP   s      r.   rH  zQueryBuilder._prewhere_sql  s9    %,,,T__,,\
T\U[\ - 
 	
r0   c                 `    dj                   | j                  j                  d|dd|      S )Nz WHERE {where}Tr  )r  rI   )ru   ru  rS   r  s      r.   r=  zQueryBuilder._where_sql  s4    &&-AT\\-A-A-qZbf-qjp-q&rrr0   r-  groupby_aliasc           	         g }| j                   D ch c]  }|j                   }}| j                  D ]l  }|rD|j                  r8|j                  |v r*|j                  t	        |j                  |xs |             I|j                   |j
                  d||d|       n dj                  dj                  |            }	| j                  r|	dz   S |	S c c}w )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.
        rs   r-  z GROUP BY {groupby}rU  )r  z WITH TOTALSrI   )	rF  r'   rw  r   r#   rS   ru   rW  rx  )
r-   rs   r-  r  rP   rX  r   rY  r8   sqls
             r.   rI  zQueryBuilder._group_sql  s      -1]];]AGG];^^E@P1P}U[[:J:XjYZ}u}}p
Uepiopq	 $ $**388G3D*E''
 <s   Corderby_aliasc                    g }| j                   D ch c]  }|j                   }}| j                  D ]  \  }}	|r4|j                  r(|j                  |v rt        |j                  |xs |      n |j                  d||d|}
|j                  |	dj                  |
|	j                        n|
        dj                  dj                  |            S c c}w )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.
        r  rP  rQ  rT  rU  rV  rI   )	rF  r'   r  r#   rS   r   ru   rG  rW  )r-   rs   r-  r  rP   rX  r   rY  r8   rZ  rR  s              r.   rH  zQueryBuilder._orderby_sql  s    " -1]];]AGG];%)^^!E> !U[[U[[DT5T ekk+;+IzJ"U]]fjK[f_ef  NNTbTn!((d>;O;O(Ptx &4 %++CHHW4E+FF <s   Cc                      y)Nz WITH ROLLUPrI   r:   s    r.   rJ  zQueryBuilder._rollup_sql  s    r0   c                 ^    dj                   | j                  j                  dd|i|      S )Nz HAVING {having}rs   )r  rI   )ru   ry  rS   r  s      r.   rK  zQueryBuilder._having_sql  s2    !((0E0E0E0fQ[0f_e0f(ggr0   c                 :    dj                  | j                        S r\  r]  r:   s    r.   rJ  zQueryBuilder._offset_sql  r^  r0   c                 :    dj                  | j                        S r`  ra  r:   s    r.   rI  zQueryBuilder._limit_sql  rb  r0   c                 l    dj                  dj                  fd| j                  D                    S )Nz
 SET {set}rU  c              3      K   | ]E  \  }}d j                   |j                  di t        d       |j                  di        G yw)z{field}={value}F)r2  )r8   rG  NrI   )ru   rS   dict)r  r8   rG  rP   s      r.   r  z(QueryBuilder._set_sql.<locals>.<genexpr>  s^       %2LE5 "(('%--M$ve*LMUbUZUbUbUlekUl )  %2s   AA)r  )ru   rW  r}  rT   s    `r.   r;  zQueryBuilder._set_sql  s:    ""  %)MM	  # 
 	
r0   r   r*   )rW  Joinr(   N)r<  r   r(   Nrc  )F)NNT)rD   rE   rF   r   rD  r.  r/  rN  r   	QUERY_CLSr   r   r   r]   r
   r/   r  r!   r   r&   rG   r   rm   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  rK   rW  r  r  r  r  r  r  r  r  r  r  r  r  r#  r&  r)  r+  r-  r   r0  r4  r8  r  rA   r   r   r   r  r  r  r   r  r  r  r  r  r  r  r   r   rY   rj   r\   r  r0  rS   rL  r9  rZ  rM  rC  r@  r?  r>  r:  rA  rB  rD  r<  rE  rF  rG  rH  r=  rI  rH  rJ  rK  rJ  rI  r;  r_   r`   s   @r.   r   r     s
   
 J!I '++/*6 8#(#8# %)8# ,'	8#
 8# 8#t$ 7j%&< = 7. 7 74 "48E? "4xPU "4[i "4 "4H 
 # .   Q%U
+ Q Q Q 	\S 	\^ 	\ 	\ ! ! QE#u*- Q. Q Q 
'c 
'n 
' 
' S ^   c n   5c5j 1 55e;L 5Q_ 5 5 3eCJ/ 3sEz9J 3~ 3 3         () ( ( ( 
%uT>%9: 
%~ 
% 
% &dN&: ; & & & (eCdN3 ( ( ( ! ! 2U4T#9: 2c 2n 2 22 @s @c @n @ @ \d\j\jB%zIJBQYB	B B&/uUNL%HI /h /.eE><$GH .X .4E%*M$N 4S[ 4/uUNL%HI /h /5U5.,+N%O 5T\ 5/uUNL%HI /h /4E%*M$N 4S[ 4/uUNL%HI /h /.eE><$GH .X . 3 >   S ^   ]> ]m ] ] a~ a- a a a~ a- a a a~ a- a a ]> ]m ] ] @ucz* @3 @> @ @!^ ! !%^ % %!^ ! ! !5 !^ ! !   ne.C(D  
 \% \hsm \W[\_W` \ \	=c 	=d 	=#% #D #"'h '4 'e 
!?u ? ?D T *"w3 w4 w"2 2# N t &N &t &M# M34 3D 3A$ A$ ARU AZ] AFS S 
# 
# 
c c 3 
C 
C 

C 
C 

S 
S 

 c c  SC SC S
4 
3 
3 

C 
C 

# 
# 


 
 
 


 
 
 


 
 


s 
s 


 
 
PS 

sXc] sS sS s
 %)*."	SM #3- 	
  
B %)*."	GSMG #3-G 	G
 G 
G@S hhsm hc hc h>S >:C :
 
 
r0   r   c            
           e Zd Zdedeedef   dededdf
dZ	dd	e
e   d
e
e   defdZdedefdZdedefdZdefdZy)r  rL   rl   r   r  r  r(   Nc                 <    || _         || _        || _        || _        y r*   )rL   rl   r  r  )r-   rL   rl   r  r  s        r.   r/   zJoiner.__init__  s      
	$r0   r   collatec                     |%t        dj                  | j                              | j                  j	                  t        | j                  | j                  ||             | j                  S )NzIParameter 'criterion' is required for a {type} JOIN but was not supplied.r   )r   ru   r  rL   r  JoinOnrl   r  )r-   r   r  s      r.   onz	Joiner.on  s[    44:FF4P 
 	

6$))TXXy'JKzzr0   r  c                 x   |s%t        dj                  | j                              d }|D ]G  }t        || j                  j
                  d         t        || j                        k(  }||n||z  }I | j                  j                  t        | j                  | j                  |             | j                  S )NzFParameter 'fields' is required for a {type} JOIN but was not supplied.r  r   r5   )
r   ru   r  r   rL   r  rl   r  r  r  )r-   r  r   r8   
consituents        r.   on_fieldzJoiner.on_field  s    [bbhlhwhwbx  	EuDJJ,<,<Q,?@E%W[W`W`DaaJ&/&7
Y=SI  	

6$))TXXyABzzr0   c                     |st        d      | j                  j                  t        | j                  | j
                  |D cg c]  }t        |       c}             | j                  S c c}w )NzUParameter 'fields' is required when joining with a using clause but was not supplied.)r   rL   r  	JoinUsingrl   r  r   )r-   r  r8   s      r.   usingzJoiner.using%  sZ     wxx

9TYYU[:\U[E5<U[:\]^zz ;]s   A+c                     | j                   j                  t        | j                  t        j
                               | j                   S )zReturn cross join)rL   r  r  rl   r   r  r:   s    r.   r  zJoiner.cross,  s-    

4		8>>:;zzr0   r*   )rD   rE   rF   r   r   rm   rK   r   rG   r/   r   r   r  r   r  r  r  rI   r0   r.   r  r    s    %!%).unl/R)S%Zb%ps%	%HY/ (3- S_   S \ | r0   r  c                   z    e Zd ZdededdfdZdedefdZde	e
   d	e	e
   ddfd
Zedee
   dee
   dd fd       Zy)r  rl   r  r(   Nc                      || _         || _        y r*   )rl   r  r  s      r.   r/   zJoin.__init__4  s    	r0   rP   c                     dj                   | j                  j                  dddd|      }| j                  j                  r'dj                  || j                  j                        S |S )NzJOIN {table}TrW  r5   z{type} {join})rW  r   rI   )ru   rl   rS   r  rG  )r-   rP   r  s      r.   rS   zJoin.get_sql8  se    ###$))##MTdMfM $ 
 88>>"))s)HH
r0   r  rz  c                      y r*   rI   r-   r  rz  s      r.   r  zJoin.validateA      r0   r  r  c                 F    | j                   j                  ||      | _         yaX  
        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)rl   r  r-   r  r  s      r.   r  zJoin.replace_tableD  s     II++M9E	r0   )rD   rE   rF   r   r   r/   r   rG   rS   r   rm   r  r!   r   r  rI   r0   r.   r  r  3  s    T  T   huo x 4  F8E? FxPU F[a F Fr0   r  c                        e Zd Zddedededee   ddf
 fdZde	def fd	Z
d
ee   dee   ddfdZedee   dee   dd fd       Z xZS )r  Nrl   r  criteriar  r(   c                 B    t         |   ||       || _        || _        y r*   )rN   r/   r   r  )r-   rl   r  r  r  rO   s        r.   r/   zJoinOn.__init__U  s     s#!r0   rP   c                     t        |   di |}dj                  | | j                  j                  dddi|| j                  r dj                  | j                              S d      S )Nz{join} ON {criterion}{collate}r<  Tz COLLATE {}r   )rW  r   r  rI   )rN   rS   ru   r   r  r-   rP   join_sqlrO   s      r.   rS   zJoinOn.get_sqlZ  sy    7?,V,/66,dnn,,EdEfE:>,,M((6 7 
 	
 MO 7 
 	
r0   r  rz  c           
      t   t        | j                  j                         D cg c]  }|j                   c}      }t        |      |D ch c]  }|j                   c}z  | j                  hz  }||z
  }|r8t        dj                  dj                  t        t        |                        y c c}w c c}w )NzInvalid join criterion. One field is required from the joined item and another from the selected table or an existing join.  Found [{tables}]z, )r   )
r  r   r  r6   rl   r   ru   rW  maprG   )r-   r  rz  fcriterion_tablesrW  available_tablesmissing_tabless           r.   r  zJoinOn.validateb  s    1G1G1IJ1IA1IJKu:v(Fvtv(FF$))T),<<YY_Y_99Sn%=> Z` Z    K(Fs   B0
B5r  r  c                     | j                   |k(  r|n| j                   | _         | j                  j                  ||      | _        yr  )rl   r   r  r  s      r.   r  zJoinOn.replace_tablen  s4     "&m!;I	55mYOr0   r*   )rD   rE   rF   r   r   r   r   rG   r/   r   rS   r   rm   r  r!   r  r_   r`   s   @r.   r  r  T  s    T  L S[\_S` lp 

 
 

huo 
x 
4 
 P8E? PxPU P[c P Pr0   r  c                        e Zd Zdededee   ddf fdZdede	f fdZ
d	ee   d
ee   ddfdZedee   dee   dd fd       Z xZS )r  rl   r  r  r(   Nc                 4    t         |   ||       || _        y r*   )rN   r/   r  )r-   rl   r  r  rO   s       r.   r/   zJoinUsing.__init__  s    s#r0   rP   c                     t        |   di }dj                  |dj                  fd| j                  D                    S )Nz{join} USING ({fields})rU  c              3   B   K   | ]  } |j                   di   y wrR   r   )r  r8   rP   s     r.   r  z$JoinUsing.get_sql.<locals>.<genexpr>  s      MMEMM3F3r6  )rW  r  rI   )rN   rS   ru   rW  r  r  s    ` r.   rS   zJoinUsing.get_sql  sE    7?,V,(//88MMM 0 
 	
r0   r  rz  c                      y r*   rI   r  s      r.   r  zJoinUsing.validate  r  r0   r  r  c                     | j                   |k(  r|n| j                   | _         | j                  D cg c]  }|j                  ||       c}| _        yc c}w r  )rl   r  r  )r-   r  r  r8   s       r.   r  zJoinUsing.replace_table  sJ     "&m!;I	RVR]R]^R]u**=)DR]^^s   A)rD   rE   rF   r   r   r   r   r/   r   rG   rS   rm   r  r!   r   r  r_   r`   s   @r.   r  r    s    T  (5/ d 
 
 
huo x 4  _8E? _xPU _[f _ _r0   r  c                      e Zd ZdZdZdZdZeZd+de	e
   ddfdZdeddfd	Zed
eeef   dd fd       Zed,d       Zed,d       Zed,d       Zedeeeeef   ef   dd fd       Zedeeef   deeef   dd fd       Zedeeef   dd fd       Zedeeef   dd fd       Ze	 	 d-deeeef      deeef   deeeef      dededd fd       Zededd fd       Z ed,d       Z!de"defdZ#de"defdZ$defd Z%dee   fd!Z&dee   fd"Z'dee   fd#Z(defd$Z)defd%Z*defd&Z+de"defd'Z,deeeef      dee   fd(Z-defd)Z.defd*Z/y).r   z5
    Query builder used to build CREATE queries.
    r   re  Nr>  r(   c                     d | _         d| _        d| _        d | _        g | _        g | _        d| _        d | _        g | _        d| _	        || _
        d | _        d | _        d | _        d | _        d | _        y r  )_create_table
_temporary	_unlogged
_as_selectrp  _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r-   r>  s     r.   r/   zCreateQueryBuilder.__init__  s|    !',$ # ,0)&*#7;#7;#r0   rP   c                     |j                  d| j                         |j                  d| j                         |j                  d| j                         y Nrs   r,  r>  rC  rD  r.  r>  rT   s     r.   r0  z'CreateQueryBuilder._set_kwargs_defaults  A    ,80$2K2KL)T\\2r0   r6   c                     | j                   rt        d      t        |t              r|| _         yt        |      | _         y)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)r  r   rW   rm   r  s     r.   r   zCreateQueryBuilder.create_table  s5      !TUU&0&>UE%Lr0   c                     d| _         y)z^
        Makes the table temporary.

        :return:
            CreateQueryBuilder.
        TN)r  r:   s    r.   	temporaryzCreateQueryBuilder.temporary  s     r0   c                     d| _         y)z]
        Makes the table unlogged.

        :return:
            CreateQueryBuilder.
        TN)r  r:   s    r.   unloggedzCreateQueryBuilder.unlogged  s     r0   c                     d| _         y)z[
        Adds system versioning.

        :return:
            CreateQueryBuilder.
        TNr  r:   s    r.   with_system_versioningz)CreateQueryBuilder.with_system_versioning  s     (,$r0   r   c                     | j                   rt        d      |D ]\  }t        |t              rt	        |      }n#t        |t
              rt	        |d   |d         }| j                  j                  |       ^ y)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)r  r   rW   rG   r   r   rp  r   r-   r   r   s      r.   r   zCreateQueryBuilder.columns  sd      ?? !QRRF&#&FE*F1I6!9MMM  ( r0   r   r   c                 P    | j                   j                  t        |||             y)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)r  r   r   r   s       r.   
period_forzCreateQueryBuilder.period_for  s!    & 	  4z!JKr0   c                 X    | j                   j                  | j                  |             y)z
        Adds a UNIQUE constraint.

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

            A list of columns.

        :return:
            CreateQueryBuilder.
        N)r  r   _prepare_columns_inputr-   r   s     r.   uniquezCreateQueryBuilder.unique   s!     	T88ABr0   c                 ^    | j                   rt        d      | j                  |      | _         y)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)r  r   r  r  s     r.   primary_keyzCreateQueryBuilder.primary_key/  s,       !STT 77@r0   reference_tablereference_columns	on_delete	on_updatec                     | j                   rt        d      | j                  |      | _         || _        | j                  |      | _        || _        || _        y)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)r  r   r  r  r  r  r  )r-   r   r  r  r  r  s         r.   foreign_keyzCreateQueryBuilder.foreign_keyC  sY    V  !STT 77@,;)&*&A&ABS&T#&/#&/#r0   query_builderc                 v    | j                   rt        d      t        |t              st	        d      || _        y)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)rp  r   rW   r   r   r  )r-   r  s     r.   	as_selectzCreateQueryBuilder.as_selectv  s4     == !OPP-6LMM'r0   c                     d| _         y r  )r  r:   s    r.   if_not_existsz CreateQueryBuilder.if_not_exists  s
    "r0   c                 F   | j                  |       | j                  sy| j                  s| j                  sy | j                  di |}| j                  r| | j
                  di |z   S  | j                  di |} | j                  di |}dj                  |||      S )zr
        Gets the sql statement string.

        :return: The create table statement.
        :rtype: str
        r   z&{create_table} ({body}){table_options})r   bodytable_optionsrI   )	r0  r  rp  r  _create_table_sql_as_select_sql	_body_sql_table_options_sqlru   )r-   rP   r   r  r  s        r.   rS   zCreateQueryBuilder.get_sql  s     	!!&)!!}}T__-t--77??"5$"5"5"?"???t~~''///9&97>>%D ? 
 	
r0   c           	          d}| j                   rd}n| j                  rd}d}| j                  rd}dj                  || | j                  j
                  di |      S )Nr   z
TEMPORARY z	UNLOGGED zIF NOT EXISTS z/CREATE {table_type}TABLE {if_not_exists}{table})
table_typer  r6   rI   )r  r  r  ru   r  rS   )r-   rP   r  r  s       r.   r  z$CreateQueryBuilder._create_table_sql  sj    
??%J^^$J,M@GG!',$$$,,6v6 H 
 	
r0   c                 ,    d}| j                   r|dz  }|S )Nr   z WITH SYSTEM VERSIONINGr  )r-   rP   r  s      r.   r  z%CreateQueryBuilder._table_options_sql  s!    ''66Mr0   c                 `    | j                   D cg c]  } |j                  di | c}S c c}w rR   )rp  rS   )r-   rP   r   s      r.   _column_clausesz"CreateQueryBuilder._column_clauses  s,    7;}}E}V((}EEE   +c                 `    | j                   D cg c]  } |j                  di | c}S c c}w rR   )r  rS   )r-   rP   r  s      r.   _period_for_clausesz&CreateQueryBuilder._period_for_clauses  s3    ?C?P?PQ?P"
"",V,?PQQQr  c           	          | j                   D cg c],  }dj                  dj                  fd|D                    . c}S c c}w )NzUNIQUE ({unique})rU  c              3   B   K   | ]  } |j                   di   y wrR   r   r  r   rP   s     r.   r  z9CreateQueryBuilder._unique_key_clauses.<locals>.<genexpr>  s&     6jciY_7Jv7J7J7TV7Tcir6  )r  )r  ru   rW  )r-   rP   r  s    ` r.   _unique_key_clausesz&CreateQueryBuilder._unique_key_clauses  sL     --
'  &&chh6jci6j.j&k'
 	
 
s   1Ac                 l    dj                  dj                  fd| j                  D                    S )NzPRIMARY KEY ({columns})rU  c              3   B   K   | ]  } |j                   di   y wrR   r  r  s     r.   r  z9CreateQueryBuilder._primary_key_clause.<locals>.<genexpr>  %     [IZv0V00:6:IZr6  ri  )ru   rW  r  rT   s    `r.   _primary_key_clausez&CreateQueryBuilder._primary_key_clause  s3    (//HH[IZIZ[[ 0 
 	
r0   c                    dj                  dj                  fd| j                  D               | j                  j                  di dj                  fd| j
                  D                    }| j                  r|d| j                  j                  z   z  }| j                  r|d| j                  j                  z   z  }|S )	NzEFOREIGN KEY ({columns}) REFERENCES {table_name} ({reference_columns})rU  c              3   B   K   | ]  } |j                   di   y wrR   r  r  s     r.   r  z9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>  r  r6  c              3   B   K   | ]  } |j                   di   y wrR   r  r  s     r.   r  z9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>  s%     &oSn':v':':'DV'DSnr6  )r   r   r  z ON DELETE z ON UPDATE rI   )	ru   rW  r  r  rS   r  r  rG  r  )r-   rP   r  s    ` r.   _foreign_key_clausez&CreateQueryBuilder._foreign_key_clause  s    X__HH[IZIZ[[@t88@@J6J!hh&oSWSnSn&oo ` 

 &&md&A&A&G&GGGF&&md&A&A&G&GGGFr0   c                 P    | j                   di |}| | j                  di |z  }| | j                  di |z  }| j                  r!|j	                   | j
                  di |       | j                  r!|j	                   | j                  di |       dj                  |      S )NrU  rI   )	r  r  r   r  r   r  r  r  rW  )r-   rP   rX  s      r.   r  zCreateQueryBuilder._body_sql  s    &$&&00+4++5f55+4++5f55NN3433=f=>NN3433=f=>xx  r0   c                 Z    dj                   | j                  j                  di |      S )Nz AS ({query})r8  rI   )ru   r  rS   rT   s     r.   r  z!CreateQueryBuilder._as_select_sql  s1    %%)$//))3F3 & 
 	
r0   c                 b    |D cg c]  }t        |t              r|n
t        |      ! c}S c c}w r*   )rW   r   r  s      r.   r  z)CreateQueryBuilder._prepare_columns_input  s.    Y`aY`v:ff56&>IY`aaas   $,c                 "    | j                         S r*   r   r:   s    r.   r   zCreateQueryBuilder.__str__  r:  r0   c                 "    | j                         S r*   r%  r:   s    r.   r   zCreateQueryBuilder.__repr__  r:  r0   r*   )r(   r   )NN)0rD   rE   rF   r   rD  r.  r/  r   r  r   r   r/   r  r0  r!   r   rm   rG   r   r  r  r  r  r   r   r  r  r  r   r   r  r   r  r  r   rS   r  r  r  r  r   r  r  r  r  r  r   r   rI   r0   r.   r   r     s"    JI< 2 <d <$34 3D 3
 Q%s
"3 Q8L Q Q$     , , )c:c3h+?&G H )Ma ) )2 L"'V"4LBGVBTL	L L( CuS&[1 C6J C C AE#v+$6 A;O A A&  &*%)00eCK()00 sEz*00  c6k 23	00
 #00 #00 
00 00d (| (8L ( (* # #
 
 
6
# 
# 
"c F49 FRtCy R
tCy 

s 

s 
!S 
!
s 
s 

bd5f3E.F b4PV< b # r0   r   c                      e Zd ZdZdZdZdZeZdde	e
   ddfdZdeddfd	Zed
eeef   dd fd       Zedeeef   dd fd       Zededd fd       Zededd fd       Zedd       Zdedeeeef   ddfdZdedefdZdefdZdefdZy)r   z3
    Query builder used to build DROP queries.
    r   re  Nr>  r(   c                 <    d | _         d| _        d | _        || _        y )Nr   )_drop_target_kind_drop_target
_if_existsr>  r  s     r.   r/   zDropQueryBuilder.__init__  s     !%9;r0   rP   c                     |j                  d| j                         |j                  d| j                         |j                  d| j                         y r  r  rT   s     r.   r0  z%DropQueryBuilder._set_kwargs_defaults  r  r0   r   c                 b    t        |t              r|n
t        |      }| j                  d|       y )NDATABASE)rW   rx   _set_target)r-   r   targets      r.   r   zDropQueryBuilder.drop_database  s'    '(;(ASV,r0   r6   c                 b    t        |t              r|n
t        |      }| j                  d|       y )NTABLE)rW   rm   r  )r-   r6   r  s      r.   r   zDropQueryBuilder.drop_table  s&    $UE2e&)r0   r   c                 (    | j                  d|       y )NUSERr  )r-   r   s     r.   r   zDropQueryBuilder.drop_user      &r0   r   c                 (    | j                  d|       y )NVIEWr  )r-   r   s     r.   r   zDropQueryBuilder.drop_view   r  r0   c                     d| _         y r  )r  r:   s    r.   	if_existszDropQueryBuilder.if_exists$  s	    r0   kindr  c                 N    | j                   rt        d      || _        || _         y )Nz4'DropQuery' object already has attribute drop_target)r  r   r  )r-   r"  r  s      r.   r  zDropQueryBuilder._set_target(  s'     !WXX!%"r0   c                    | j                  |       | j                  rdnd}d}t        | j                  t              r | j                  j
                  di |}nWt        | j                  t              r | j                  j
                  di |}n t        | j                  | j                        }dj                  | j                  ||      S )Nz
IF EXISTS r   zDROP {kind} {if_exists}{name})r"  r!  r3   rI   )r0  r  rW   r  rx   rS   rm   r#   rD  ru   r  )r-   rP   r!  target_names       r.   rS   zDropQueryBuilder.get_sql.  s    !!&)$(OOL	d''23$++33=f=K))513$++33=f=K'(9(94??KK.55''9; 6 
 	
r0   c                 "    | j                         S r*   r   r:   s    r.   r   zDropQueryBuilder.__str__?  r:  r0   c                 "    | j                         S r*   r%  r:   s    r.   r   zDropQueryBuilder.__repr__B  r:  r0   r*   )r(   r   )rD   rE   rF   r   rD  r.  r/  r   r  r   r   r/   r  r0  r!   r   rx   rG   r   rm   r   r   r   r!  r  r   rS   r   r   rI   r0   r.   r   r     sM    JI 2 d 34 3D 3
 -eHcM&: -?Q - - *eSj 1 *6H * * 'c '&8 ' ' 'c '&8 ' '  # #U8UC3G-H #T #
 
 
" # r0   r   N)>r   	functoolsr   typingr   r   r   r   r	   r  r
   r   r   pypika.enumsr   r   r   r   pypika.termsr   r   r   r   r   r   r   r   r   r   r   r   pypika.utilsr   r   r   r    r!   r"   r#   r$   
__author__	__email__r&   rK   rb   rx   rm   rG   r   r   r   r   r  r   r  r   r  r  r  r  r   r   rI   r0   r.   <module>r/     s|     W W W J J    	 	 	 
	 6$: $$ 8)v )~9J ~9Bjc2C78 C DQVK 2#, #,Lz#s(3S89 d6l " & g- g-TW:J W:tb
:t b
J, ,^F FB(PT (PV_ _@[ [|
F Fr0   