
    2i                       S SK J r   S SKJr  S SKJrJrJrJrJr	J
r
JrJr  S SKJrJrJrJr  S SKJrJrJrJrJrJrJrJrJrJrJrJrJrJr  S SKJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'  Sr(Sr) " S	 S
\5      r* " S S\*5      r+ " S S5      r, " S S\,5      r- " S S\*5      r.S\\	\/\/4   \/4   S\S\\.   4S jr0 " S S5      r1S\\	\/\/4   \/4   S\\1   4S jr2 " S S5      r3\.r4 " S S5      r5 " S S\*\5      r6 " S  S!\*\5      r7 " S" S#5      r8 " S$ S%5      r9 " S& S'\95      r: " S( S)\95      r; " S* S+5      r< " S, S-5      r=g.)/    )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                       \ rS rSrS\SS4S jr\S\SS 4S j5       rS\S\4S jr	\
S\4S	 j5       r\S\S\4S
 j5       r\S\S\4S j5       rS\4S jrSrg)
Selectable%   aliasreturnNc                     Xl         g Nr(   selfr(   s     H/home/james-whalen/.local/lib/python3.13/site-packages/pypika/queries.py__init__Selectable.__init__&   s    
    c                     Xl         g r+   r,   r-   s     r/   as_Selectable.as_)   s    
r2   namec                     [        XS9$ )Ntable)r   r.   r6   s     r/   fieldSelectable.field-   s    T&&r2   c                     [        U 5      $ r+   )r   r.   s    r/   starSelectable.star0   s    Dzr2   c                 $    U R                  U5      $ r+   r;   r:   s     r/   __getattr__Selectable.__getattr__4       zz$r2   c                 $    U R                  U5      $ r+   rB   r:   s     r/   __getitem__Selectable.__getitem__8   rE   r2   c                     U R                   $ r+   r,   r>   s    r/   get_table_nameSelectable.get_table_name<   s    zzr2   r,   )__name__
__module____qualname____firstlineno__strr0   r!   r4   r   r;   propertyr   r?   r$   rC   rG   rJ   __static_attributes__ r2   r/   r&   r&   %   s    c d     '# '% ' d                   r2   r&   c                   t   ^  \ rS rSrSS\S\\   SS4U 4S jjjrS\S\4S jr	S	S S\
4S
 jrS\4S jrSrU =r$ )AliasedQuery@   Nr6   queryr)   c                 8   > [         TU ]  US9  Xl        X l        g )Nr,   )superr0   r6   rW   )r.   r6   rW   	__class__s      r/   r0   AliasedQuery.__init__A   s    t$	
r2   kwargsc                 l    U R                   c  U R                  $ U R                   R                  " S0 UD6$ NrS   )rW   r6   get_sqlr.   r\   s     r/   r_   AliasedQuery.get_sqlF   s.    ::99zz!!+F++r2   otherc                 b    [        U[        5      =(       a    U R                  UR                  :H  $ r+   )
isinstancerU   r6   r.   rb   s     r/   __eq__AliasedQuery.__eq__K   s!    %.J499

3JJr2   c                 >    [        [        U R                  5      5      $ r+   )hashrP   r6   r>   s    r/   __hash__AliasedQuery.__hash__N   s    C		N##r2   )r6   rW   r+   )rL   rM   rN   rO   rP   r   r&   r0   r   r_   boolrf   intrj   rR   __classcell__rZ   s   @r/   rU   rU   @   sa    S *)=   
, , ,
KN Kt K$# $ $r2   rU   c                       \ rS rSrSS\S\S    SS4S jjrSS S\4S jrSS S\4S	 jr	\
S
\SS4S j5       rSS\\   S\S\4S jjrSrg)SchemaR   Nr6   parentr)   c                     Xl         X l        g r+   _name_parent)r.   r6   rs   s      r/   r0   Schema.__init__S   s    
r2   rb   c                     [        U[        5      =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r+   )rd   rq   rv   rw   re   s     r/   rf   Schema.__eq__W   s6    %(hTZZ5;;-Fh4<<[`[h[hKhhr2   c                 .    U R                  U5      (       + $ r+   rf   re   s     r/   __ne__Schema.__ne__Z       ;;u%%%r2   itemTablec                     [        XS9$ )Nschemar   r.   r   s     r/   rC   Schema.__getattr__]   s    T''r2   
quote_charr\   c                     [        U R                  U5      nU R                  b,  SR                  U R                  R                  " SSU0UD6US9$ U$ )Nz{parent}.{schema}r   )rs   r   rS   )r#   rv   rw   formatr_   )r.   r   r\   
schema_sqls       r/   r_   Schema.get_sqla   sY    "4::z:
<<#&--||++LzLVL! .  
 r2   ru   r+   )rL   rM   rN   rO   rP   r   r0   rl   rf   r}   r$   rC   r   r_   rR   rS   r2   r/   rq   rq   R   s    S (8*<  iH i i&H & & ( ( ( (
(3- 
# 
# 
 
r2   rq   c                   0    \ rS rSr\S\S\4S j5       rSrg)Databasen   r   r)   c                     [        XS9$ N)rs   rq   r   s     r/   rC   Database.__getattr__o   s    d((r2   rS   N)	rL   rM   rN   rO   r$   rP   rq   rC   rR   rS   r2   r/   r   r   n   s"    ) ) ) )r2   r   c                     ^  \ rS rSr\S\\\\\	S4   S\\\\\	S4   4S j5       r
   SS\S\\\	\4      S\\   S\\S	      SS4
U 4S
 jjjrS\4S jrS\S\4S jr\S\SS 4S j5       r\S\SS 4S j5       rS\4S jrS\4S jrS\4S jrS\S\4S jrS\4S jrS\\\\\\\\ 4      SS4S jr!SS jr"S\\\\\\\ 4   SS4S jr#Sr$U =r%$ ) r   t   r   Nr)   c                     [        U [        5      (       a  U $ [        U [        [        45      (       a  [	        S U SS  [        U S   5      5      $ U b  [        U 5      $ g )Nc                     [        XS9$ r   r   )objss     r/   <lambda>$Table._init_schema.<locals>.<lambda>|   s	    )>r2      r   )rd   rq   listtupler   r   s    r/   _init_schemaTable._init_schemau   s\     ff%%MftUm,,>qr
FSYZ[S\L]^^&>!r2   r6   r(   	query_clsQueryc                    > [         TU ]  U5        Xl        U R                  U5      U l        U=(       d    [
        U l        S U l        S U l        [        U R                  [
        5      (       d  [        S5      eg )Nz,Expected 'query_cls' to be subclass of Query)rY   r0   _table_namer   _schemar   
_query_cls_for_for_portion
issubclass	TypeError)r.   r6   r   r(   r   rZ   s        r/   r0   Table.__init__   sg     	((0#,u	 $//511JKK 2r2   c                 @    U R                   =(       d    U R                  $ r+   )r(   r   r>   s    r/   rJ   Table.get_table_name   s    zz-T---r2   r\   c                    UR                  S5      n[        U R                  U5      nU R                  b*  SR	                  U R                  R
                  " S0 UD6US9nU R                  (       a*  SR	                  X0R                  R
                  " S0 UD6S9nO:U R                  (       a)  SR	                  X0R                  R
                  " S0 UD6S9n[        X0R                  40 UD6$ )Nr   z{schema}.{table})r   r9   z{table} FOR {criterion})r9   	criterionz"{table} FOR PORTION OF {criterion}rS   )
getr#   r   r   r   r_   r   r   r"   r(   )r.   r\   r   	table_sqls       r/   r_   Table.get_sql   s    ZZ-
!$"2"2J?	<<#*119M9M9WPV9W_h1iI99188yT]T]TeTeTohnTo8pI<CC+<+<+D+D+Nv+N D I  	::@@@r2   temporal_criterionc                     U R                   (       a  [        S5      eU R                  (       a  [        S5      eXl         g )N)'Query' object already has attribute for_0'Query' object already has attribute for_portion)r   AttributeErrorr   )r.   r   s     r/   for_
Table.for_   s/    99 !LMM !STT&	r2   period_criterionc                     U R                   (       a  [        S5      eU R                  (       a  [        S5      eXl         g )Nr   r   )r   r   r   )r.   r   s     r/   for_portionTable.for_portion   s0     !STT99 !LMM,r2   c                      U R                  SS9$ N"r   r_   r>   s    r/   __str__Table.__str__       ||s|++r2   c                     [        U[        5      (       d  gU R                  UR                  :w  a  gU R                  UR                  :w  a  gU R                  UR                  :w  a  ggNFT)rd   r   r   r   r(   re   s     r/   rf   Table.__eq__   sR    %''u000<<5==(::$r2   c                     U R                   (       a&  SR                  U R                  U R                   5      $ SR                  U R                  5      $ )NzTable('{}', schema='{}')zTable('{}'))r   r   r   r>   s    r/   __repr__Table.__repr__   s=    <<-44T5E5Et||TT##D$4$455r2   rb   c                 .    U R                  U5      (       + $ r+   r|   re   s     r/   r}   Table.__ne__   r   r2   c                 *    [        [        U 5      5      $ r+   )ri   rP   r>   s    r/   rj   Table.__hash__   s    CIr2   termsQueryBuilderc                 R    U R                   R                  U 5      R                  " U6 $ )z
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   Table.select   s$     $$T*11599r2   c                 8    U R                   R                  U 5      $ )zI
Perform an UPDATE operation on the current table

:return: QueryBuilder
)r   updater>   s    r/   r   Table.update   s     %%d++r2   c                 R    U R                   R                  U 5      R                  " U6 $ )z
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   Table.insert   s$     ##D)00%88r2   )r   r   r   r   r   NNNr)   r   )&rL   rM   rN   rO   staticmethodr   rP   r   r   rq   r   r   r
   r0   rJ   r   r_   r!   r   r   r   r   r   rl   rf   r   r}   rm   rj   r   floatr   r   r   r   r   rR   rn   ro   s   @r/   r   r   t   s   	U3eVT#AB 	uSRVX]_egkMkGl 	 	 04#-1LL vs{+,L }	L
 DM*L 
L L . .A A A" 'y 'W ' ' -O - - -, ,t 6# 6
&C &D &# :XeCT4,N&OP :Uc :,9U3sD$#EF 9> 9 9r2   r   namesr\   r)   c            	      :   / nU  H  n[        U[        5      (       a@  [        U5      S:X  a1  [        US   US   UR	                  S5      UR	                  S5      S9nO)[        UUR	                  S5      UR	                  S5      S9nUR                  U5        M     U$ )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   r   r   )r6   r(   r   r   )r6   r   r   )rd   r   lenr   r   append)r   r\   tablesr6   ts        r/   make_tablesr      s     FdE""s4yA~!W1gzz(+ **[1	A zz(+ **[1A
 	a  Mr2   c                       \ rS rSrSr   SS\S\\   S\\   S\\\	\
4      SS4
S	 jjrS
\	S\4S jrS
\	S\4S jrS\4S jrSrg)Columni  zRepresents a column.Ncolumn_namecolumn_typenullabledefaultr)   c                     Xl         X l        X0l        Ub  [        U[        5      (       a  X@l        g [        U5      U l        g r+   )r6   typer   rd   r   r   r   )r.   r   r   r   r   s        r/   r0   Column.__init__  s5      		 ")/Z5N5NwT`ahTir2   r\   c                 n    UR                  S5      nSR                  [        U R                  U5      S9nU$ )Nr   z{name})r6   )r   r   r#   r6   )r.   r\   r   
column_sqls       r/   get_name_sqlColumn.get_name_sql  s9    ZZ-
__tyy*5 % 

 r2   c                    SR                  U R                  " S0 UD6U R                  (       a  SR                  U R                  5      OSU R                  b$  SR                  U R                  (       a  SOS5      OSU R                  (       a.  SR                  SU R                  R
                  " S0 UD6-   5      OSS9nU$ )	Nz{name}{type}{nullable}{default}z {} NULLzNOT NULLzDEFAULT )r6   r   r   r   rS   )r   r   r   r   r   r_   )r.   r\   r   s      r/   r_   Column.get_sql&  s    6=="",V,,0IIdii(2NRmmNgU\\DMM&zJmoQUQ]Q]ELLdll.B.B.LV.L!LMce	 > 

 r2   c                      U R                  SS9$ r   r   r>   s    r/   r   Column.__str__0  r   r2   )r   r6   r   r   r   )rL   rM   rN   rO   __doc__rP   r   rl   r   r   r   r0   r   r_   r   rR   rS   r2   r/   r   r     s    
 &*#'.2
j
j c]
j 4.	
j
 %T	*+
j 

jS S   , ,r2   r   c                      / nU  HR  n[        U[        5      (       a   [        U5      S:X  a  [        US   US   S9nO	[        US9nUR	                  U5        MT     U$ )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   )rd   r   r   r   r   )r   columnsr6   columns       r/   make_columnsr  4  s[     GdE""s4yA~QT!WEF-Fv  Nr2   c                   T    \ rS rSrS\S\\\4   S\\\4   SS4S jrS\S\4S	 jr	S
r
g)	PeriodForiE  r6   start_column
end_columnr)   Nc                     Xl         [        U[        5      (       a  UO
[        U5      U l        [        U[        5      (       a  X0l        g [        U5      U l        g r+   )r6   rd   r   r  r  r.   r6   r  r  s       r/   r0   PeriodFor.__init__F  sA    	,6|V,L,LLRXYeRf(2:v(F(F*FS]L^r2   r\   c           	          UR                  S5      nSR                  [        U R                  U5      U R                  R
                  " S0 UD6U R                  R
                  " S0 UD6S9nU$ )Nr   z9PERIOD FOR {name} ({start_column_name},{end_column_name}))r6   start_column_nameend_column_namerS   )r   r   r#   r6   r  r   r  )r.   r\   r   period_for_sqls       r/   r_   PeriodFor.get_sqlK  sh    ZZ-
T[[tyy*5"//<<FvF OO88B6B \ 
 r2   )r  r6   r  )rL   rM   rN   rO   rP   r   r   r0   r   r_   rR   rS   r2   r/   r  r  E  sR    _S _c6k0B _PUVY[aVaPb _gk _
	 	 	r2   r  c            	          \ rS rSrSr\S\SS4S j5       r\S\\	\
4   S\SS4S j5       r\S\\
\4   SS	4S
 j5       r\S\\\4   SS4S j5       r\S\\
\4   SS4S j5       r\S\
SS4S j5       r\S\
SS4S j5       r\S\\\
4   S\SS4S j5       r\S\\
\	4   S\
S\SS4S j5       r\S\\\\
\\4   S\SS4S j5       r\S\\
\4   SS4S j5       r\S\
S\4S j5       r\S\\\
\
4   \
4   S\S\\   4S j5       rSrg)r   i[  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.
r\   r)   r   c                     [        S0 UD6$ r^   )r   )clsr\   s     r/   _builderQuery._builderd  s    %f%%r2   r9   c                 D    U R                   " S0 UD6R                  U5      $ )a  
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
rS   )r  r   r  r9   r\   s      r/   r   Query.from_h  s!     ||%f%++E22r2   CreateQueryBuilderc                 4    [        5       R                  U5      $ )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  r9   s     r/   r  Query.create_tablew  s     "#0077r2   databaseDropQueryBuilderc                 4    [        5       R                  U5      $ )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  Query.drop_database  s      !//99r2   c                 4    [        5       R                  U5      $ )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 table: An instance of a Table object or a string table name.

:return: DropQueryBuilder
)r  
drop_tabler  s     r/   r"  Query.drop_table  s      !,,U33r2   userc                 4    [        5       R                  U5      $ )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&  Query.drop_user        !++D11r2   viewc                 4    [        5       R                  U5      $ )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+  Query.drop_view  r(  r2   c                 D    U R                   " S0 UD6R                  U5      $ )a  
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
rS   )r  r   r  s      r/   r   
Query.into  s!     ||%f%**511r2   r6   c                 D    U R                   " S0 UD6R                  X5      $ r^   )r  with_)r  r9   r6   r\   s       r/   r0  Query.with_  s    ||%f%++E88r2   r   c                 @    U R                   " S0 UD6R                  " U6 $ )al  
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
rS   )r  r   )r  r   r\   s      r/   r   Query.select  s!     ||%f%,,e44r2   c                 D    U R                   " S0 UD6R                  U5      $ )a  
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
rS   )r  r   r  s      r/   r   Query.update  s!     ||%f%,,U33r2   
table_namec                 "    XS'   [        U40 UD6$ )z
Convenience method for creating a Table that uses this Query class.

:param table_name:
    Type: str

    A string table name.

:returns Table
r   r   )r  r6  r\   s      r/   r   Query.Table  s     "{Z*6**r2   r   c                      XS'   [        U0 UD6$ )z
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   r\   s      r/   TablesQuery.Tables  s     "{E,V,,r2   rS   N) rL   rM   rN   rO   r   classmethodr   r  r   r&   rP   r   r   r  r   r  r"  r&  r+  r   r0  rm   r   rl   r   r   r   _TableClass
TypedTupler   r:  rR   rS   r2   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 - -r2   r   c                     ^  \ rS rSrSrS\4SSSSS\S\\   S	\	\   4
U 4S
 jjjr
\S\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       rS\SS 4S jrS\SS 4S jrS%S jrS\4S jrS&S\S\S\S\4S jjrS'S \\   S\S\4S! jjrS\4S" jrS\4S# jr S$r!U =r"$ )(_SetOperationi  a  
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                 x   > [         TU ]  U5        Xl        X24/U l        / U l        S U l        S U l        XPl        g r+   )rY   r0   rA  _set_operation	_orderbys_limit_offset_wrapper_cls)r.   rA  rB  rC  r(   rD  rZ   s         r/   r0   _SetOperation.__init__  s@     	$ -CD'r2   fieldsr\   r)   c                    U H~  n[        U[        5      (       a   [        X0R                  R                  S   S9OU R                  R                  U5      nU R                  R                  X2R                  S5      45        M     g Nr   r8   order)	rd   rP   r   rA  _fromwrap_constantrG  r   r   r.   rL  r\   r;   s       r/   orderby_SetOperation.orderby   sk    E eS)) e??#8#8#;<__2259  NN!!5**W*=">? r2   limitc                     Xl         g r+   rH  r.   rU  s     r/   rU  _SetOperation.limit+      r2   offsetc                     Xl         g r+   rI  r.   r[  s     r/   r[  _SetOperation.offset/      r2   rb   c                 Z    U R                   R                  [        R                  U45        g r+   )rF  r   r   unionre   s     r/   rb  _SetOperation.union3  !    ""L$6$6#>?r2   c                 Z    U R                   R                  [        R                  U45        g r+   )rF  r   r   	union_allre   s     r/   rf  _SetOperation.union_all7  !    ""L$:$:E#BCr2   c                 Z    U R                   R                  [        R                  U45        g r+   )rF  r   r   	intersectre   s     r/   rj  _SetOperation.intersect;  rh  r2   c                 Z    U R                   R                  [        R                  U45        g r+   )rF  r   r   	except_ofre   s     r/   rm  _SetOperation.except_of?  rh  r2   c                 Z    U R                   R                  [        R                  U45        g r+   )rF  r   r   minusre   s     r/   rp  _SetOperation.minusC  rd  r2   c                 $    U R                  U5      $ r+   rb  re   s     r/   __add___SetOperation.__add__G      zz%  r2   c                 $    U R                  U5      $ r+   rf  re   s     r/   __mul___SetOperation.__mul__J      ~~e$$r2   c                 $    U R                  U5      $ r+   rp  re   s     r/   __sub___SetOperation.__sub__M  rv  r2   c                 "    U R                  5       $ r+   r   r>   s    r/   r   _SetOperation.__str__P      ||~r2   
with_aliassubqueryc                    SnUR                  SU R                  R                  5        UR                  SU R                  R                  5        U R                  R                  " S
SU R                  R
                  0UD6nUnU R                   H  u  pxUR                  " S
SU R                  R
                  0UD6n	[        U R                  R                  5      [        UR                  5      :w  a  [        SR                  XYS95      eXdR                  UR                  U	S9-  nM     U R                  (       a  X`R                  " S
0 UD6-  nU R                  b  X`R                  5       -  nU R                   (       a  X`R#                  5       -  nU(       a  SR                  " S
S	U0UD6nU(       a)  [%        X`R&                  =(       d    U R(                  40 UD6$ U$ )Nz {type} {query_string}dialectr   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})rW   rS   )
setdefaultrA  r  
QUOTE_CHARr_   wrap_set_operation_queriesrF  r   _selectsr    r   valuerG  _orderby_sqlrH  
_limit_sqlrI  _offset_sqlr"   r(   r   )
r.   r  r  r\   set_operation_templatebase_querystringquerystringrC  rB  set_operation_querystrings
             r/   r_   _SetOperation.get_sqlS  s   !9)T__%<%<= 	,(B(BC??22qDOO<f<fqjpq&262E2E.M(;(C(C )CC)GM)% 4??++,4G4P4P0QQ+SSYSY/ TZ T  88"((7P 9  K 3F" >>,,6v66K;;"??,,K<<++--K%,,I;I&IK#K1Ot?O?OZSYZZr2   r   c                    / nU R                   R                   Vs1 s H  oDR                  iM     nnU R                   H}  u  pgUR                  (       a&  UR                  U;   a  [	        UR                  U5      OUR
                  " SSU0UD6nUR                  Ub  SR                  XR                  S9OU5        M     SR                  SR                  U5      S9$ s  snf )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.
r   {term} {orient}termorient ORDER BY {orderby},rS  rS   )
rA  r  r(   rG  r#   r_   r   r   r  join)	r.   r   r\   clausesr   selected_aliasesr;   directionalityr  s	            r/   r  _SetOperation._orderby_sql  s     -1__-E-EF-EGG-EF%)^^!E ;;5;;2B#B ekk:6]]CjCFC  NNTbTn!((d;O;O(Ptx &4 %++CHHW4E+FF Gs   Cc                 4    SR                  U R                  S9$ Nz OFFSET {offset})r[  r   rI  r>   s    r/   r  _SetOperation._offset_sql      !(((==r2   c                 4    SR                  U R                  S9$ Nz LIMIT {limit})rU  r   rH  r>   s    r/   r  _SetOperation._limit_sql      &&T[[&99r2   )rH  rI  rG  rF  rJ  rA  )rb   r   r)   r@  FFr+   )#rL   rM   rN   rO   r   r   r   r   rP   r
   r0   r!   r   r   rS  rm   rU  r[  r&   rb  rf  rj  rm  rp  rt  ry  r~  r   rl   r_   r  r  r  rR   rn   ro   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 : :r2   r@  c                   	  ^  \ rS rSrSrSrSrSrSr\	r
SS\SS4S\\   S	\S
\\   S\S\4
U 4S jjjrSS jr\S\\\	\4   SS 4S j5       r\S\\   S\\   SS 4S j5       r\S\S\SS 4S j5       r\S\\\4   SS 4S j5       r\S\SS 4S j5       r\SS j5       r\S\\\4   SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r \S\SS 4S j5       r!\S \\\"4   S\\\"4   SS 4S! j5       r#\S \\\"4   S\\\"4   SS 4S" j5       r$\SS# j5       r%\SS$ j5       r&\SS% j5       r'\S&\(SS 4S' j5       r)\S&\\*\+4   SS 4S( j5       r,\S&\\*\+4   SS 4S) j5       r-\S\\\.\*4   SS 4S* j5       r/\SS+ j5       r0\S\\1\2\3\*4   S,\SS 4S- j5       r4\S.\S,\SS 4S/ j5       r5\\6Rn                  4S0\\S \8\4   S1\6SS24S3 jj5       r9S0\\S \84   SS24S4 jr:S0\\S \84   SS24S5 jr;S0\\S \84   SS24S6 jr<S0\\S \84   SS24S7 jr=S0\\S \84   SS24S8 jr>S0\\S \84   SS24S9 jr?S0\\S \84   SS24S: jr@S0\\S \84   SS24S; jrAS0\\S \84   SS24S< jrB\S=\.SS 4S> j5       rC\S?\.SS 4S@ j5       rD\SAS S\E4SB j5       rF\SAS S\E4SC j5       rG\SAS S\E4SD j5       rH\SAS S\E4SE j5       rI\SAS S\E4SF j5       rJ\SG\\K\4   SH\SS 4SI j5       r3SAS S\E4SJ jrLSAS S\E4SK jrMSAS S\E4SL jrN\SM\OSS 4SN j5       rOS0\S\S \K4   4U 4SO jjrP\QSSP\R\K   SQ\\   S\S\   4SR jj5       rTS \SS4SS jrUS \KSS4ST jrVSU\WSS4SV jrXS\S\K   4SW jrYSSX jrZS\S\4SY jr[S \*S\4SZ jr\SS\ jr]S\SS4S] jr^S\4S^ jr_S\4S_ jr`SAS S\4S` jraSAS S\4Sa jrbS\.4Sb jrcS,\dSS4Sc jreSSd\S[\S,\S\4Se jjrfSf\S\4Sg jrgS,\S\4Sh jrhS,\S\4Si jriS\4Sj jrjS,\S\4Sk jrkS,\S\4Sl jrlS,\S\4Sm jrm\QS,\S\4Sn j5       rnS,\S\4So jroSSp\S,\S\4Sq jjrpS,\S\4Sr jrqS,\S\4Ss jrrSSp\S,\S\4St jjrsSSp\S,\S\4Su jjrtS,\S\4Sv jruS,\S\4Sw jrvSSQ\\   S,\S\4Sx jjrwSSQ\\   S,\S\4Sy jjrx   SSQ\\   Sz\\   S{\S,\S\4
S| jjry   SSQ\\   Sz\\   S}\S,\S\4
S~ jjrzS\4S jr{SSQ\\   S,\S\4S jjr|S\4S jr}S\4S jr~S,\S\4S jrSrU =r$ )r   i  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  r  rD  	immutable
as_keywordc                 0  > [         TU ]  S 5        / U l        S U l        S U l        SU l        SU l        / U l        / U l        / U l	        / U l
        / U l        / U l        SU l        SU l        SU l        S U l        S U l        / U l        SU l        S U l        / U l        / U l        / U l        / U l        S U l        S U l        / U l        SU l        [;        5       U l        SU l        SU l         SU l!        SU l"        Xl#        XPl$        X l%        X0l&        X@l'        g )NFr   )(rY   r0   rP  _insert_table_update_table_delete_from_replace_withr  _force_indexes_use_indexes_columns_values	_distinct_ignore_for_update_wheres
_prewheres	_groupbys_with_totals_havingsrG  _joins_unions_usingrH  rI  _updates_select_starset_select_star_tables_mysql_rollup_select_into_subquery_count_foreign_tabler  r  r  rJ  r  )r.   r  r  rD  r  r  rZ   s         r/   r0   QueryBuilder.__init__  s    	
!!!
  !!#&5 "! #$*D''"r2   r)   c                 :   [        U 5      R                  [        U 5      5      nUR                  R                  U R                  5        [	        U R
                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul	        [	        U R                  5      Ul
        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                  5      Ul        [	        U R                   5      Ul        [	        U R"                  5      Ul        U$ r+   )r   __new____dict__r   r   r  rP  r  r  r  r  r  rG  r  r  r  r  r  )r.   newones     r/   __copy__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r2   
selectablec                 j   U R                   R                  [        U[        5      (       a  [	        U5      OU5        [        U[
        [        45      (       a]  UR                  cO  [        U[
        5      (       a  UR                  nOSn[        U R                  U5      nSU-  Ul        US-   U l        ggg)aL  
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   )
rP  r   rd   rP   r   r   r@  r(   r  max)r.   r  sub_query_counts      r/   r   QueryBuilder.from_  s     	

z*c/J/J%
+PZ[j<"?@@ZEUEUE]*l33","<"<"#!$"6"6HO%7J#2Q#6D  F^@r2   current_table	new_tablec                    U R                    Vs/ s H  o3U:X  a  UOUPM     snU l         U R                  U:X  a  UOU R                  U l        U R                  U:X  a  UOU R                  U l        U R                   Vs/ s H  oDR	                  X5      PM     snU l        U R
                   Vs/ s H  oUR	                  X5      PM     snU l        U R                   Vs/ s H  ofR	                  X5      PM     snU l        U R                   VVs/ s H#  ow Vs/ s H  oR	                  X5      PM     snPM%     snnU l        U R                  (       a  U R                  R	                  X5      OSU l        U R                  (       a  U R                  R	                  X5      OSU l	        U R                   V	s/ s H  oR	                  X5      PM     sn	U l
        U R                  (       a  U R                  R	                  X5      OSU l        U R                   V
s/ s H  oS   R	                  X5      U
S   4PM     sn
U l        U R                   Vs/ s H  oR	                  X5      PM     snU l        XR                  ;   a7  U R                  R                  U5        U R                  R!                  U5        ggs  snf s  snf s  snf s  snf s  snf s  snnf s  sn	f s  sn
f s  snf )a#  
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   )rP  r  r  r  replace_tabler  r  r  r  r  r  r  rG  r  r  removeadd)r.   r  r  r9   alias_queryr   r  
value_listr  groupbyrS  r  s               r/   r  QueryBuilder.replace_table  sn    SWR\R\]R\M#9iuDR\]
*.*<*<*MYSWSeSe*.*<*<*MYSWSeSe]a]g]gh]gk//I]gh
VZVcVcdVcF--mGVcdVZVcVcdVcF--mGVcdfjfrfr
frXb
S
u  :
Sfr
 PT||t||11-KaeUYUdUd$//77QjnY]YgYghYgg//IYghQUQ^Q^33MMdh\`\j\j
\jQXQZ%%m?L\j
 QUP[P[\P[))-CP[\444$$++M:$$((3 5) ^ iddS
 i
 ]sA   J:>J?.KK		KK2K6K"KK#Kr6   c                 P    [        X!5      nU R                  R                  U5        g r+   )rU   r  r   )r.   r  r6   r   s       r/   r0  QueryBuilder.with_7  s    *

!r2   r9   c                     U R                   b  [        SS-  5      eU R                  (       a  SU l        [	        U[
        5      (       a  Xl         g [        U5      U l         g )N$'Query' object has no attribute '%s'r   T)r  r   r  r  rd   r   r.   r9   s     r/   r   QueryBuilder.into<  sK    ) !G&!PQQ== $D&0&>&>UE%Lr2   r   c                 b   U H  n[        U[        5      (       a  U R                  U5        M+  [        U[        5      (       a  U R	                  U5        MS  [        U[
        [        45      (       a  U R                  U5        M  U R                  U R                  X R                  S95        M     g N)rD  )
rd   r   _select_fieldrP   _select_field_strr   r   _select_otherrQ  rJ  r.   r   r  s      r/   r   QueryBuilder.selectF  s    D$&&""4(D#&&&&t,D8-A"BCC""4(""4#5#5dHYHY#5#Z[ r2   c                     U R                   (       d"  U R                  (       d  U R                  (       a  [        SS-  5      eSU l         g )Nr  deleteT)r  r  r  r   r>   s    r/   r  QueryBuilder.deleteR  s2    1C1C !G(!RSS r2   c                     U R                   c"  U R                  (       d  U R                  (       a  [        SS-  5      e[	        U[
        5      (       a  Xl         g [        U5      U l         g )Nr  r   )r  r  r  r   rd   r   r  s     r/   r   QueryBuilder.updateY  sJ    )T]]d>O>O !G(!RSS&0&>&>UE%Lr2   c                 &   U R                   c  [        SS-  5      eU(       a#  [        US   [        [        45      (       a  US   nU HF  n[        U[
        5      (       a  [        X R                   S9nU R                  R                  U5        MH     g )Nr  r   r   r8   )	r  r   rd   r   r   rP   r   r  r   r  s      r/   r   QueryBuilder.columns`  sx    % !G(!RSSZa4-88!HED$$$T););<MM  & r2   c                 0    U R                   " U6   SU l        g NF_apply_termsr  r   s     r/   r   QueryBuilder.insertm  s    5!r2   c                 0    U R                   " U6   SU l        g NTr  r   s     r/   replaceQueryBuilder.replacer  s    5!r2   r  c                     U/UQ7 Hp  n[        U[        5      (       a  U R                  R                  U5        M5  [        U[        5      (       d  ML  U R                  R                  [        U5      5        Mr     g r+   )rd   r   r  r   rP   r.   r  r   r   s       r/   force_indexQueryBuilder.force_indexw  sX    A!U####**1-As####**584	  r2   c                     U/UQ7 Hp  n[        U[        5      (       a  U R                  R                  U5        M5  [        U[        5      (       d  ML  U R                  R                  [        U5      5        Mr     g r+   )rd   r   r  r   rP   r  s       r/   	use_indexQueryBuilder.use_index  sX    A!U##!!((+As##!!((q2	  r2   c                     SU l         g r  r  r>   s    r/   distinctQueryBuilder.distinct  s	    r2   c                     SU l         g r  r  r>   s    r/   
for_updateQueryBuilder.for_update  s
    r2   c                     SU l         g r  )r  r>   s    r/   ignoreQueryBuilder.ignore  s	    r2   r   c                     U R                  U5      (       d  SU l        U R                  (       a  U =R                  U-  sl        g Xl        g r  )_validate_tabler  r  r.   r   s     r/   prewhereQueryBuilder.prewhere  s5    ##I.."&D??OOy(O'Or2   c                     [        U[        5      (       a  g U R                  U5      (       d  SU l        U R                  (       a  U =R                  U-  sl        g Xl        g r  )rd   r   r  r  r  r  s     r/   whereQueryBuilder.where  sE    i00##I.."&D<<LLI%L$Lr2   c                     [        U[        5      (       a  g U R                  (       a  U =R                  U-  sl        g Xl        g r+   )rd   r   r  r  s     r/   havingQueryBuilder.having  s,    i00==MMY&M%Mr2   c                 ,   U H  n[        U[        5      (       a  [        X R                  S   S9nOD[        U[        5      (       a/  [        [        U5      U R                  S   S9R                  U5      nU R                  R                  U5        M     g )Nr   r8   )rd   rP   r   rP  rm   rQ  r  r   r  s      r/   r  QueryBuilder.groupby  sm    D$$$TA7D#&&SYdjjm<JJ4PNN!!$' r2   c                     SU l         g r  )r  r>   s    r/   with_totalsQueryBuilder.with_totals  s
     r2   r\   c           	      t   SUR                  S5      :H  nU R                  (       a  [        SS-  5      eU Vs/ s H-  n[        U[        [
        [        45      (       a  [        U6 OUPM/     nnU(       a@  U(       d  U R                  (       d  [        S5      eSU l        U =R                  U-  sl        g S[        U R                  5      :  aE  [        U R                  S   [        5      (       a#  U R                  S   =R                  U-  sl        g U R                  R                  [        U6 5        g s  snf )	Nmysqlvendorr  rollupzWAt least one group is required. Call Query.groupby(term) or passas parameter to rollup.Tr   )r   r  r   rd   r   r   r  r	   r  r   r   r   argsr   )r.   r   r\   	for_mysqlr  s        r/   r*  QueryBuilder.rollup  s    vzz(33	 !G(!RSS\ab\aTXD42D!E!E4O\ab%p  "&DNNe#NT^^$$DNN24F)O)ONN2##u,# NN!!&%.1# cs   4D5rL  c                     U Hj  n[        U[        5      (       a  [        X0R                  S   S9OU R	                  U5      nU R
                  R                  X2R                  S5      45        Ml     g rN  )rd   rP   r   rP  rQ  rG  r   r   rR  s       r/   rS  QueryBuilder.orderby  sW    E9CE39O9OE%zz!}5UYUgUghmUnENN!!5**W*=">? r2   r   howJoinerc                 l   [        U[        5      (       a  [        XUSS9$ [        U[        5      (       a)  UR                  c  U R                  U5        [        XUSS9$ [        U[        5      (       a  [        XUSS9$ [        U[        5      (       a  [        XUSS9$ [        S[        U5      -  5      e)Nr9   )
type_labelr  zCannot join on type '%s')
rd   r   r2  r   r(   _tag_subqueryrU   r&   
ValueErrorr   r.   r   r1  s      r/   r  QueryBuilder.join  s     dE""$cg>>l++zz!""4($cjAAl++$cg>>j))$cjAA3d4j@AAr2   c                 B    U R                  U[        R                  5      $ r+   )r  r   innerr   s     r/   
inner_joinQueryBuilder.inner_join      yyx~~..r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   leftr   s     r/   	left_joinQueryBuilder.left_join      yyx}}--r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   
left_outerr   s     r/   left_outer_joinQueryBuilder.left_outer_join      yyx2233r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   rightr   s     r/   
right_joinQueryBuilder.right_join   r=  r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   right_outerr   s     r/   right_outer_joinQueryBuilder.right_outer_join  s    yyx3344r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   outerr   s     r/   
outer_joinQueryBuilder.outer_join  r=  r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   
full_outerr   s     r/   full_outer_joinQueryBuilder.full_outer_join	  rG  r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   crossr   s     r/   
cross_joinQueryBuilder.cross_join  r=  r2   c                 B    U R                  U[        R                  5      $ r+   )r  r   ri   r   s     r/   	hash_joinQueryBuilder.hash_join  rB  r2   rU  c                     Xl         g r+   rW  rX  s     r/   rU  QueryBuilder.limit  rZ  r2   r[  c                     Xl         g r+   r]  r^  s     r/   r[  QueryBuilder.offset  r`  r2   rb   c                 H    [        X[        R                  U R                  S9$ r  )r@  r   rb  rJ  re   s     r/   rb  QueryBuilder.union      T,*<*<$J[J[\\r2   c                 H    [        X[        R                  U R                  S9$ r  )r@  r   rf  rJ  re   s     r/   rf  QueryBuilder.union_all      T,*@*@dN_N_``r2   c                 H    [        X[        R                  U R                  S9$ r  )r@  r   rj  rJ  re   s     r/   rj  QueryBuilder.intersect"  rh  r2   c                 H    [        X[        R                  U R                  S9$ r  )r@  r   rm  rJ  re   s     r/   rm  QueryBuilder.except_of&  rh  r2   c                 H    [        X[        R                  U R                  S9$ r  )r@  r   rp  rJ  re   s     r/   rp  QueryBuilder.minus*  re  r2   r;   r  c                     [        U[        5      (       d  [        U5      OUnU R                  R                  XR	                  U5      45        g r+   )rd   r   r  r   rJ  )r.   r;   r  s      r/   r  QueryBuilder.set.  s9    $.ue$<$<e%e%6%6u%=>?r2   c                 $    U R                  U5      $ r+   rs  re   s     r/   rt  QueryBuilder.__add__3  rv  r2   c                 $    U R                  U5      $ r+   rx  re   s     r/   ry  QueryBuilder.__mul__6  r{  r2   c                 $    U R                  U5      $ r+   r}  re   s     r/   r~  QueryBuilder.__sub__9  rv  r2   slicec                 H    UR                   U l        UR                  U l        g r+   )startrI  stoprH  )r.   rw  s     r/   rw  QueryBuilder.slice<  s    {{jjr2   c                 n   > [        U[        5      (       d  [        TU ]  U5      $ U R                  U5      $ r+   )rd   rw  rY   rG   )r.   r   rZ   s     r/   rG   QueryBuilder.__getitem__A  s/    $&&7&t,,zz$r2   	field_setr   c                 p    U  Vs/ s H$  o"R                   =(       d    UR                  US9PM&     sn$ s  snf )Nr   )r(   r_   )r~  r   r;   s      r/   _list_aliasesQueryBuilder._list_aliasesF  s1    QZ[QZCu}}
}CCQZ[[[s   +3c                     S[        U R                  5      :X  a  [        SR                  US95      eUS:X  a  SU l        [        5       /U l        g U R                  [        XR                  S   S95        g )Nr   z.Cannot select {term}, no FROM table specified.)r  *Tr8   )	r   rP  r   r   r  r   r  r  r   )r.   r  s     r/   r  QueryBuilder._select_field_strJ  se    DJJ !Q!X!X^b!X!cdd3; $D!VHDM5ZZ];<r2   c                    U R                   (       a  g UR                  U R                  ;   a  g [        U[        5      (       at  U R
                   Vs/ s H2  n[        US5      (       a  UR                  UR                  :w  d  M0  UPM4     snU l        U R                  R                  UR                  5        U R
                  R                  U5        g s  snf )Nr9   )	r  r9   r  rd   r   r  hasattrr  r   )r.   r  r   s      r/   r  QueryBuilder._select_fieldU  s    ::111dD!!%)]]%26'&':R:RVZV`V`djdpdpVp]DM $$((4T"s   /CCfunctionc                 :    U R                   R                  U5        g r+   )r  r   )r.   r  s     r/   r  QueryBuilder._select_otherf  s    X&r2   c                     / $ r+   rS   r>   s    r/   fields_QueryBuilder.fields_i  s    	r2   c                   ^^ U R                   U R                  /-   U R                  -   mTR                  TU R                  5        [        UU4S jT 5       5      n[        TR                  [        5      (       aF  TR                  R                  c/  U(       a(  TR                  R                  S-   TR                  l	        U R                  R                  T5        g )Nc              3   p   >#    U  H+  n[        U[        5      =(       a    TR                  T;   v   M-     g 7fr+   )rd   r   r   ).0clausebase_tablesr  s     r/   	<genexpr>'QueryBuilder.do_join.<locals>.<genexpr>q  s,     nbmX^Z6S499;SSbms   362)rP  r  r  validater  anyrd   r   r   r(   r   r   )r.   r  table_in_queryr  s    ` @r/   do_joinQueryBuilder.do_joinm  s    jjD$6$6#77$**Dk4;;/nbmnndii''DIIOO,C #ii33c9DIIO4 r2   c                 B   ^ [        U4S jU R                   5       5      $ )Nc              3   B   >#    U  H  nTUR                   :H  v   M     g 7fr+   )r   )r  r  r9   s     r/   r  )QueryBuilder.is_joined.<locals>.<genexpr>z  s     >+$5DII%+s   )r  r  r  s    `r/   	is_joinedQueryBuilder.is_joinedy  s    >$++>>>r2   c                 z   U R                   U R                  /-   nUR                  5        H  nUR                  U;   nUR                  U R                   Vs/ s H  oUR
                  PM     sn;   n[        UR                  SLU(       + U(       + UR                  U R                  :g  /5      (       d  M    g   gs  snf )zo
Returns False if the term references a table not already part of the
FROM clause or JOINS and True otherwise.
NFT)rP  r  r  r9   r  r   all)r.   r  r  r;   table_in_base_tablesr  table_in_joinss          r/   r  QueryBuilder._validate_table|  s    
 jjD$6$6#77\\^E#(;;+#= "[[4;;,O;4YY;,OONKKt+,,&&KK4#5#55	   $  -Ps   B8r  c                 V    SU R                   -  Ul        U =R                   S-  sl         g )Nr  r   )r  r(   )r.   r  s     r/   r5  QueryBuilder._tag_subquery  s%    $"6"66!r2   c           
      V   U R                   c  [        SS-  5      eU(       d  g[        US   [        [        [
        45      (       d  U/nU HU  nU R                  R                  U Vs/ s H+  n[        U[        5      (       a  UOU R                  U5      PM-     sn5        MW     gs  snf )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   )
r  r   rd   r   r   r  r  r   r   rQ  )r.   r   valuesr  s       r/   r  QueryBuilder._apply_terms  s    
 % !G(!RSS%(T5#$677GEFLLnt untej*UD*A*AtGYGYZ_G`!`nt uv  us   (2B&
c                 4    U R                  U R                  S9$ )N)r  )r_   r  r>   s    r/   r   QueryBuilder.__str__  s    ||DLL|11r2   c                 "    U R                  5       $ r+   r   r>   s    r/   r   QueryBuilder.__repr__  r  r2   c                 f    [        U[        5      (       d  gU R                  UR                  :X  d  ggr   )rd   r   r(   re   s     r/   rf   QueryBuilder.__eq__  s(    %..zzU[[(r2   c                 .    U R                  U5      (       + $ r+   r|   re   s     r/   r}   QueryBuilder.__ne__  r   r2   c                 f    [        U R                  5      [        S U R                   5       5      -   $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr+   )ri   )r  r  s     r/   r  (QueryBuilder.__hash__.<locals>.<genexpr>  s     %Lvd6lls   )ri   r(   sumrP  r>   s    r/   rj   QueryBuilder.__hash__  s%    DJJ#%L%L"LLLr2   c                    UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        UR                  SU R
                  5        g )Nr   secondary_quote_charalias_quote_charr  r  )r  r  SECONDARY_QUOTE_CHARALIAS_QUOTE_CHARr  r  r`   s     r/   _set_kwargs_defaults!QueryBuilder._set_kwargs_defaults  sl    ,80$2K2KL,d.C.CD,8)T\\2r2   r  c                   ^ U R                  T5        U R                  (       d4  U R                  (       d#  U R                  (       d  U R                  (       d  gU R                  (       a#  U R                  (       d  U R
                  (       d  gU R                  (       a  U R                  (       d  g[        U R                  5      nS[        U R                  5      :  nS[        U R                  5      :  =(       a    [        U R                  S   [        5      nU R                  nU R                  =(       a    U R                  n[        UUUUU/5      TS'   U R                  (       a  U R                  (       a  U R                   " S0 TD6n	OSn	XR"                  " S0 TD6-  n	U R                  (       a+  U	SSR%                  U4S jU R                   5       5      -   -  n	XR&                  " S0 TD6-  n	U R                  (       a  XR(                  " S0 TD6-  n	U R*                  (       a  XR,                  " S0 TD6-  n	U R.                  b  XR1                  5       -  n	U	$ U R                  (       a  U R2                  " S0 TD6n	GOFU R4                  (       d  U R                  (       a  U R                  (       a  U R                   " S0 TD6n	OSn	U R6                  (       a  XR8                  " S0 TD6-  n	OXR:                  " S0 TD6-  n	U R<                  (       a  XR>                  " S0 TD6-  n	U R
                  (       a  XR@                  " S0 TD6-  n	U	$ U	SU RB                  " S0 TD6-   -  n	O_U R                  (       a  U R                   " S0 TD6n	OSn	XRB                  " S0 TD6-  n	U R                  (       a  XRD                  " S0 TD6-  n	U R                  (       a  XR(                  " S0 TD6-  n	U RF                  (       a  XRH                  " S0 TD6-  n	U RJ                  (       a  XRL                  " S0 TD6-  n	U RN                  (       a  XRP                  " S0 TD6-  n	U R                  (       a+  U	SSR%                  U4S jU R                   5       5      -   -  n	U RR                  (       a  XRT                  " S0 TD6-  n	U R*                  (       a  XR,                  " S0 TD6-  n	U RV                  (       a7  XRX                  " S0 TD6-  n	U RZ                  (       a  XR]                  5       -  n	U R^                  (       a  XR`                  " S0 TD6-  n	U Rb                  (       a  XRd                  " S0 TD6-  n	U Rg                  U	5      n	U Rh                  (       a  XRj                  " S0 TD6-  n	U(       a  SRm                  U	S	9n	U(       a>  U Rn                  c  U Rp                  OU Rn                  TS
'   [s        XRt                  40 TD6$ U	$ )Nr   r   r   with_namespace c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   r  r  r\   s     r/   r  'QueryBuilder.get_sql.<locals>.<genexpr>  s     -]Q\ll.DV.DQ\   !c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   r  s     r/   r  r  "  s     )Y[T,,*@*@[r  r  rW   r  rS   );r  r  r  r  r  r  r  rl   r  r   rP  rd   r   r  r  r  	_with_sql_update_sqlr  _set_sql	_from_sqlr  
_where_sqlrH  r  _delete_sqlr  r  _replace_sql_insert_sqlr  _columns_sql_values_sql_select_sql	_into_sqlr  
_using_sqlr  _force_index_sqlr  _use_index_sqlr  _prewhere_sqlr  
_group_sqlr  _rollup_sqlr  _having_sqlrG  r  _apply_paginationr  _for_update_sqlr   QUERY_ALIAS_QUOTE_CHARr  r"   r(   )
r.   r  r  r\   	has_joinshas_multiple_from_clauseshas_subquery_from_clausehas_reference_to_foreign_tablehas_update_fromr  s
      `      r/   r_   QueryBuilder.get_sql  s   !!&)!3!3t7H7HDL^L^t}}dmm%	$%DJJ$7!#$s4::#6#b:djjQRmUa;b )-)<)<&,,;#&)(.$
  zz"nn6v6 ++5f55K{{sSXX-]QUQ\Q\-]%]]]==2622Kzz~~777||888{{&00**4V4K""t'9'9zz"nn6v6 }}00:6:://9&99}}00:6::||//9&99""sT%5%5%?%??? zz"nn6v6 ++5f55K!!~~777::>>3F33K;;??4V44K00:6::K..888K;;3)YT[[)Y!YYYK??--777K<<??4V44K>>??4V44K!!//11==++5f55K>>,,6v66K,,[9//9&99K%,,;,?K)-)D)D)L%%RVRmRm %& $KFvFFr2   r  c                     U R                   b  XR                  5       -  nU R                  (       a  XR                  5       -  nU$ r+   )rH  r  rI  r  )r.   r  s     r/   r  QueryBuilder._apply_paginationE  s9    ;;"??,,K<<++--Kr2   c                 T   ^ SSR                  U4S jU R                   5       5      -   $ )NzWITH r  c              3   t   >#    U  H-  nUR                   S -   UR                  " SSSS.TD6-   S-   v   M/     g7f)z AS (Fr  r  z) NrS   )r6   r_   r  r  r\   s     r/   r  )QueryBuilder._with_sql.<locals>.<genexpr>O  s@      "
$ KK'!FNN$^Ee$^W]$^^aee$s   58)r  r  r`   s    `r/   r  QueryBuilder._with_sqlN  s,     "
**"
 
 
 	
r2   c                 4    U R                   (       a  SnU$ SnU$ )Nz	DISTINCT r   r  )r.   r\   r  s      r/   _distinct_sqlQueryBuilder._distinct_sqlT  s!    >>"H  Hr2   c                 4    U R                   (       a  SnU$ SnU$ )Nz FOR UPDATEr   r  )r.   r\   r  s      r/   r  QueryBuilder._for_update_sql\  s%    &J  Jr2   c                    ^ SR                  U R                  " S0 TD6SR                  U4S jU R                   5       5      S9$ )NzSELECT {distinct}{select}r  c              3   L   >#    U  H  oR                   " SS S S.TD6v   M     g7fT)r  r  NrS   r   r  r  r\   s     r/   r  +QueryBuilder._select_sql.<locals>.<genexpr>g  s%     m_lW[LLRD4R6R_l   !$)r  r   rS   )r   r  r  r  r`   s    `r/   r  QueryBuilder._select_sqld  sE    *11''1&188m_c_l_lmm 2 
 	
r2   c                     SR                  U R                  R                  " S0 UD6U R                  (       a  SS9$ SS9$ )NzINSERT {ignore}INTO {table}zIGNORE r   )r9   r  rS   )r   r  r_   r  r`   s     r/   r  QueryBuilder._insert_sqlj  sL    ,33$$,,6v6 $9 4 
 	
24 4 
 	
r2   c                 T    SR                  U R                  R                  " S0 UD6S9$ )NzREPLACE INTO {table}r8   rS   r   r  r_   r`   s     r/   r  QueryBuilder._replace_sqlp  s1    %,,$$,,6v6 - 
 	
r2   c                      g)NDELETErS   )r\   s    r/   r  QueryBuilder._delete_sqlu  s    r2   c                 T    SR                  U R                  R                  " S0 UD6S9$ )NzUPDATE {table}r8   rS   )r   r  r_   r`   s     r/   r  QueryBuilder._update_sqly  s*    &&T-?-?-G-G-Q&-Q&RRr2   r  c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )z
SQL for Columns clause for INSERT queries
:param with_namespace:
    Remove from kwargs, never format the column terms with namespaces since only one table can be inserted into
z ({columns})r  c              3   J   >#    U  H  oR                   " SS S0TD6v   M     g7f)r  FNrS   r   r  s     r/   r  ,QueryBuilder._columns_sql.<locals>.<genexpr>  s"     dVcd\\II&IVcs    #r   )r   r  r  r.   r  r\   s     `r/   r  QueryBuilder._columns_sql|  s6     $$HHdVZVcVcdd % 
 	
r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz VALUES ({values})z),(c              3   Z   >#    U  H   nS R                  U4S jU 5       5      v   M"     g7f)r  c              3   L   >#    U  H  oR                   " SS S S.TD6v   M     g7fr  r   r  s     r/   r  5QueryBuilder._values_sql.<locals>.<genexpr>.<genexpr>  s%     `\_TXOOO\_r  N)r  )r  rowr\   s     r/   r  +QueryBuilder._values_sql.<locals>.<genexpr>  s)      lxeh`\_```lxs   (+)r  )r   r  r  r`   s    `r/   r  QueryBuilder._values_sql  s:    #**:: lplxlx  + 
 	
r2   c                 X    SR                  U R                  R                  " SSS0UD6S9$ )Nz INTO {table}r  Fr8   rS   r  r`   s     r/   r  QueryBuilder._into_sql  s6    %%$$,,HHH & 
 	
r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz FROM {selectable}r  c              3   L   >#    U  H  oR                   " SS S S.TD6v   M     g7fTr  NrS   r   r  s     r/   r  )QueryBuilder._from_sql.<locals>.<genexpr>  s&     rgq]c X XQW Xgqr  r  )r   r  rP  r  s     `r/   r  QueryBuilder._from_sql  s4    #**xxrgkgqgqrr + 
 	
r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz USING {selectable}r  c              3   L   >#    U  H  oR                   " SS S S.TD6v   M     g7fr  r   r  s     r/   r  *QueryBuilder._using_sql.<locals>.<genexpr>  s&     sgr]c X XQW Xgrr  r  )r   r  r  r  s     `r/   r  QueryBuilder._using_sql  s4    $++xxsgkgrgrss , 
 	
r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz FORCE INDEX ({indexes})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   r  indexr\   s     r/   r  0QueryBuilder._force_index_sql.<locals>.<genexpr>  s     VBU]]4V4BUr  indexes)r   r  r  r`   s    `r/   r  QueryBuilder._force_index_sql  s3    )00HHV$BUBUVV 1 
 	
r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz USE INDEX ({indexes})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   r  s     r/   r  .QueryBuilder._use_index_sql.<locals>.<genexpr>  s     TBS]]4V4BSr  r   )r   r  r  r`   s    `r/   r  QueryBuilder._use_index_sql  s3    '..HHT$BSBSTT / 
 	
r2   c                 Z    SR                  U R                  R                  " SUSS.UD6S9$ )Nz PREWHERE {prewhere}Tr   r  )r  rS   )r   r  r_   r.   r   r\   s      r/   r  QueryBuilder._prewhere_sql  s7    %,,__,,\
T\U[\ - 
 	
r2   c                 Z    SR                  U R                  R                  " SUSS.UD6S9$ )Nz WHERE {where}Tr(  )r  rS   )r   r  r_   r)  s      r/   r  QueryBuilder._where_sql  s1    &&T\\-A-A-qZbf-qjp-q&rrr2   r  groupby_aliasc           	         / nU R                    Vs1 s H  ofR                  iM     nnU R                   H~  nU(       aQ  UR                  (       a@  UR                  U;   a0  UR                  [	        UR                  U=(       d    U5      5        M[  UR                  UR
                  " SXS.UD65        M     SR                  SR                  U5      S9n	U R                  (       a  U	S-   $ U	$ s  snf )af  
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.
r   r  z GROUP BY {groupby}r  )r  z WITH TOTALSrS   )	r  r(   r  r   r#   r_   r   r  r  )
r.   r   r  r-  r\   r  r   r  r;   sqls
             r/   r  QueryBuilder._group_sql  s      -1]];]GG];^^E@P1P}U[[:J:XjYZu}}p
piopq	 $ $**388G3D*E''
 <s   C,orderby_aliasc                    / nU R                    Vs1 s H  ofR                  iM     nnU R                   H  u  pU(       a@  UR                  (       a/  UR                  U;   a  [        UR                  U=(       d    U5      OUR                  " SXS.UD6n
UR                  U	b  SR                  XR                  S9OU
5        M     SR                  SR                  U5      S9$ s  snf )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/  r  r  r  r  r  rS   )	r  r(   rG  r#   r_   r   r   r  r  )r.   r   r  r2  r\   r  r   r  r;   r  r  s              r/   r  QueryBuilder._orderby_sql  s    " -1]];]GG];%)^^!E !U[[U[[DT5T ekk+;+IzJ]]fjf_ef  NNTbTn!((d;O;O(Ptx &4 %++CHHW4E+FF <s   C#c                     g)Nz WITH ROLLUPrS   r>   s    r/   r  QueryBuilder._rollup_sql  s    r2   c                 X    SR                  U R                  R                  " SSU0UD6S9$ )Nz HAVING {having}r   )r   rS   )r   r  r_   r)  s      r/   r  QueryBuilder._having_sql  s/    !((0E0E0fQ[0f_e0f(ggr2   c                 4    SR                  U R                  S9$ r  r  r>   s    r/   r  QueryBuilder._offset_sql  r  r2   c                 4    SR                  U R                  S9$ r  r  r>   s    r/   r  QueryBuilder._limit_sql  r  r2   c                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )Nz
 SET {set}r  c              3      >#    U  H?  u  pS R                  UR                  " S0 [        TSS9D6UR                  " S0 TD6S9v   MA     g7f)z{field}={value}F)r  )r;   r  NrS   )r   r_   dict)r  r;   r  r\   s      r/   r  (QueryBuilder._set_sql.<locals>.<genexpr>  sV       %2LE "((--M$ve*LMUZUbUbUlekUl )  %2s   AA
)r  )r   r  r  r`   s    `r/   r  QueryBuilder._set_sql  s:    ""  %)MM	  # 
 	
r2   )%r  r  r  r  r  r  rP  r  r  r  r  r  rH  r  rI  rG  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ  r  r  r  r  r   r+   )r  Joinr)   N)r  r   r)   Nr  )F)NNT)rL   rM   rN   rO   r   r  r  r  r  r   	QUERY_CLSr   r   r   rl   r
   r0   r  r!   r   r&   rP   r   r   r  r0  r   r   r   r  r   r   r   r  r   r  r
  r  r  r  r   r  r   r   r  r   rm   r  r%  r   r   r  r*  rS  r   r:  rU   r  r;  r@  rE  rJ  rN  rR  rV  rZ  r]  rU  r[  r@  rb  rf  rj  rm  rp  r   rt  ry  r~  rw  rG   r   r   r   r  r  r  r   r  r  r  r  r  r5  r  r   r   rf   r}   rj   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  rR   rn   ro   s   @r/   r   r     s
   
 J!I '++/*6 8#(#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 :
 
 
 
r2   r   c            
           \ rS rSrS\S\\S\4   S\S\	SS4
S	 jr
SS
\\   S\\	   S\4S jjrS\S\4S jrS\S\4S jrS\4S jrSrg)r2  i  rW   r   r   r1  r4  r)   Nc                 4    Xl         X l        X0l        X@l        g r+   )rW   r   r1  r4  )r.   rW   r   r1  r4  s        r/   r0   Joiner.__init__  s     
	$r2   r   collatec                     Uc"  [        SR                  U R                  S95      eU R                  R	                  [        U R                  U R                  X5      5        U R                  $ )NzIParameter 'criterion' is required for a {type} JOIN but was not supplied.r   )r   r   r4  rW   r  JoinOnr   r1  )r.   r   rG  s      r/   on	Joiner.on  sY    44:FF4P 
 	

6$))TXXyJKzzr2   rL  c                 p   U(       d"  [        SR                  U R                  S95      eS nU H@  n[        X0R                  R
                  S   S9[        X0R                  S9:H  nUc  UOX$-  nMB     U R                  R                  [        U R                  U R                  U5      5        U R                  $ )NzFParameter 'fields' is required for a {type} JOIN but was not supplied.rI  r   r8   )
r   r   r4  r   rW   rP  r   r  rJ  r1  )r.   rL  r   r;   
consituents        r/   on_fieldJoiner.on_field  s    [bbhlhwhwbx  	EuJJ,<,<Q,?@E%W`W`DaaJ&/&7
Y=SI  	

6$))TXXyABzzr2   c                     U(       d  [        S5      eU R                  R                  [        U R                  U R
                  U Vs/ s H  n[        U5      PM     sn5      5        U R                  $ s  snf )NzUParameter 'fields' is required when joining with a using clause but was not supplied.)r   rW   r  	JoinUsingr   r1  r   )r.   rL  r;   s      r/   usingJoiner.using%  sZ     wxx

9TYYU[:\U[E5<U[:\]^zz ;]s   A3c                     U R                   R                  [        U R                  [        R
                  5      5        U R                   $ )zReturn cross join)rW   r  rB  r   r   rY  r>   s    r/   rY  Joiner.cross,  s-    

4		8>>:;zzr2   )r1  r   rW   r4  r+   )rL   rM   rN   rO   r   r   r   rU   r   rP   r0   r   r   rK  r   rO  rS  rY  rR   rS   r2   r/   r2  r2    s    %!%).unl/R)S%Zb%ps%	%HY/ (3- S_   S \ | r2   r2  c                       \ rS rSrS\S\SS4S jrS\S\4S jr	S	\
\   S
\
\   SS4S jr\S\\   S\\   SS 4S j5       rSrg)rB  i3  r   r1  r)   Nc                     Xl         X l        g r+   )r   r1  r7  s      r/   r0   Join.__init__4  s    	r2   r\   c                     SR                  U R                  R                  " SSSS.UD6S9nU R                  R                  (       a#  SR                  X R                  R                  S9$ U$ )NzJOIN {table}Tr  r8   z{type} {join})r  r   rS   )r   r   r_   r1  r  )r.   r\   r0  s      r/   r_   Join.get_sql8  sa    ##))##MTdMfM $ 
 88>>"))s)HH
r2   rP  r  c                     g r+   rS   r.   rP  r  s      r/   r  Join.validateA      r2   r  r  c                 D    U R                   R                  X5      U l         ga  
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)r   r  r.   r  r  s      r/   r  Join.replace_tableD  s     II++ME	r2   )r1  r   )rL   rM   rN   rO   r   r   r0   r   rP   r_   r   r   r  r!   r   r  rR   rS   r2   r/   rB  rB  3  s    T  T   huo x 4  F8E? FxPU F[a F Fr2   rB  c                      ^  \ rS rSrSS\S\S\S\\   SS4
U 4S jjjr	S	\
S\4U 4S
 jjrS\\   S\\   SS4S jr\S\\   S\\   SS 4S j5       rSrU =r$ )rJ  iT  Nr   r1  criteriarG  r)   c                 <   > [         TU ]  X5        X0l        X@l        g r+   )rY   r0   r   rG  )r.   r   r1  re  rG  rZ   s        r/   r0   JoinOn.__init__U  s    #!r2   r\   c                    > [         TU ]  " S0 UD6nSR                  UU R                  R                  " SSS0UD6U R                  (       a  SR                  U R                  5      S9$ SS9$ )Nz{join} ON {criterion}{collate}r  Tz COLLATE {}r   )r  r   rG  rS   )rY   r_   r   r   rG  r.   r\   join_sqlrZ   s      r/   r_   JoinOn.get_sqlZ  sw    7?,V,/66nn,,EdEfE:>,,M((6 7 
 	
 MO 7 
 	
r2   rP  r  c           
      ~   [        U R                  R                  5        Vs/ s H  o3R                  PM     sn5      n[        U5      U Vs1 s H  oUR                  iM     sn-  U R                  1-  nXF-
  nU(       a5  [        SR                  SR                  [        [        U5      5      S95      eg s  snf s  snf )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  r9   r   r   r   r  maprP   )r.   rP  r  fcriterion_tablesr  available_tablesmissing_tabless           r/   r  JoinOn.validateb  s    1G1G1IJ1IA1IJKu:v(Fvtv(FF$))T)<YY_Y_99Sn%=> Z` Z    K(Fs   B5B:r  r  c                     U R                   U:X  a  UOU R                   U l         U R                  R                  X5      U l        gra  )r   r   r  rb  s      r/   r  JoinOn.replace_tablen  s2     "&m!;I	55mOr2   )rG  r   r   r+   )rL   rM   rN   rO   r   r   r   r   rP   r0   r   r_   r   r   r  r!   r  rR   rn   ro   s   @r/   rJ  rJ  T  s    T  L S[\_S` lp  

 
 

huo 
x 
4 
 P8E? PxPU P[c P Pr2   rJ  c                      ^  \ rS rSrS\S\S\\   SS4U 4S jjrS\	S\
4U 4S	 jjrS
\\   S\\   SS4S jr\S\\   S\\   SS 4S j5       rSrU =r$ )rR  i  r   r1  rL  r)   Nc                 0   > [         TU ]  X5        X0l        g r+   )rY   r0   rL  )r.   r   r1  rL  rZ   s       r/   r0   JoinUsing.__init__  s    #r2   r\   c                    >^ [         TU ]  " S0 TD6nSR                  USR                  U4S jU R                   5       5      S9$ )Nz{join} USING ({fields})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   )r  r;   r\   s     r/   r  $JoinUsing.get_sql.<locals>.<genexpr>  s     MMM3F3r  )r  rL  rS   )rY   r_   r   r  rL  ri  s    ` r/   r_   JoinUsing.get_sql  sE    7?,V,(//88MMM 0 
 	
r2   rP  r  c                     g r+   rS   r]  s      r/   r  JoinUsing.validate  r_  r2   r  r  c                     U R                   U:X  a  UOU R                   U l         U R                   Vs/ s H  o3R                  X5      PM     snU l        gs  snf ra  )r   rL  r  )r.   r  r  r;   s       r/   r  JoinUsing.replace_table  sF     "&m!;I	RVR]R]^R]**=DR]^^s   A)rL  r   )rL   rM   rN   rO   r   r   r   r   r0   r   rP   r_   r   r  r!   r   r  rR   rn   ro   s   @r/   rR  rR    s    T  (5/ d 
 
 
huo x 4  _8E? _xPU _[f _ _r2   rR  c                      \ rS rSrSrSrSrSr\r	S-S\
\   SS4S jjrS	\SS4S
 jr\S\\\4   SS 4S j5       r\S.S j5       r\S.S j5       r\S.S j5       r\S\\\\\4   \4   SS 4S j5       r\S\\\4   S\\\4   SS 4S j5       r\S\\\4   SS 4S j5       r\S\\\4   SS 4S j5       r\  S/S\\\\4      S\\\4   S\\\\4      S\S\SS 4S jj5       r\S\ SS 4S j5       r!\S.S j5       r"S	\#S\4S jr$S	\#S\4S  jr%S\4S! jr&S\\   4S" jr'S\\   4S# jr(S\\   4S$ jr)S\4S% jr*S\4S& jr+S\4S' jr,S	\#S\4S( jr-S\\\\4      S\\   4S) jr.S\4S* jr/S\4S+ jr0S,r1g)0r  i  z-
Query builder used to build CREATE queries.
r   r  Nr  r)   c                     S U l         SU l        SU l        S U l        / U l        / U l        SU l        S U l        / U l        SU l	        Xl
        S U l        S U l        S U l        S U l        S U l        g r  )_create_table
_temporary	_unlogged
_as_selectr  _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/   r0   CreateQueryBuilder.__init__  sz    !',$ # ,0)&*#7;#7;#r2   r\   c                     UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        g Nr   r  r  r  r  r  r  r`   s     r/   r  'CreateQueryBuilder._set_kwargs_defaults  A    ,80$2K2KL)T\\2r2   r9   c                     U R                   (       a  [        S5      e[        U[        5      (       a  Xl         g[        U5      U l         g)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   rd   r   r  s     r/   r  CreateQueryBuilder.create_table  s6      !TUU&0&>&>UE%Lr2   c                     SU l         g)z>
Makes the table temporary.

:return:
    CreateQueryBuilder.
TN)r  r>   s    r/   	temporaryCreateQueryBuilder.temporary  s     r2   c                     SU l         g)z=
Makes the table unlogged.

:return:
    CreateQueryBuilder.
TN)r  r>   s    r/   unloggedCreateQueryBuilder.unlogged  s     r2   c                     SU l         g)z;
Adds system versioning.

:return:
    CreateQueryBuilder.
TNr  r>   s    r/   with_system_versioning)CreateQueryBuilder.with_system_versioning  s     (,$r2   r   c                    U R                   (       a  [        S5      eU Hd  n[        U[        5      (       a  [	        U5      nO%[        U[
        5      (       a  [	        US   US   S9nU R                  R                  U5        Mf     g)z
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   rd   rP   r   r   r  r   r.   r   r  s      r/   r   CreateQueryBuilder.columns  sj      ?? !QRRF&#&&FE**F1I6!9MMM  ( r2   r  r  c                 N    U R                   R                  [        XU5      5        g)z
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_forCreateQueryBuilder.period_for  s    & 	  4z!JKr2   c                 X    U R                   R                  U R                  U5      5        g)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/   uniqueCreateQueryBuilder.unique   s!     	T88ABr2   c                 h    U R                   (       a  [        S5      eU R                  U5      U l         g)z
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_keyCreateQueryBuilder.primary_key/  s,       !STT 77@r2   reference_tablereference_columns	on_delete	on_updatec                     U R                   (       a  [        S5      eU R                  U5      U l         X l        U R                  U5      U l        X@l        XPl        g)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_keyCreateQueryBuilder.foreign_keyC  sS    V  !STT 77@,;)&*&A&ABS&T#&/#&/#r2   query_builderc                     U R                   (       a  [        S5      e[        U[        5      (       d  [	        S5      eXl        g)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)r  r   rd   r   r   r  )r.   r  s     r/   	as_selectCreateQueryBuilder.as_selectv  s5     == !OPP-66LMM'r2   c                     SU l         g r  )r  r>   s    r/   if_not_exists CreateQueryBuilder.if_not_exists  s
    "r2   c                 d   U R                  U5        U R                  (       d  gU R                  (       d  U R                  (       d  gU R                  " S0 UD6nU R                  (       a  X R
                  " S0 UD6-   $ U R                  " S0 UD6nU R                  " S0 UD6nSR                  X#US9$ )zR
Gets the sql statement string.

:return: The create table statement.
:rtype: str
r   z&{create_table} ({body}){table_options})r  bodytable_optionsrS   )	r  r  r  r  _create_table_sql_as_select_sql	_body_sql_table_options_sqlr   )r.   r\   r  r  r  s        r/   r_   CreateQueryBuilder.get_sql  s     	!!&)!!}}T__--77??"5"5"?"???~~''//9&97>>% ? 
 	
r2   c           	          SnU R                   (       a  SnOU R                  (       a  SnSnU R                  (       a  SnSR                  UUU R                  R
                  " S0 UD6S9$ )Nr   z
TEMPORARY z	UNLOGGED zIF NOT EXISTS z/CREATE {table_type}TABLE {if_not_exists}{table})
table_typer  r9   rS   )r  r  r  r   r  r_   )r.   r\   r  r  s       r/   r  $CreateQueryBuilder._create_table_sql  sh    
??%J^^$J,M@GG!'$$,,6v6 H 
 	
r2   c                 6    SnU R                   (       a  US-  nU$ )Nr   z WITH SYSTEM VERSIONINGr  )r.   r\   r  s      r/   r  %CreateQueryBuilder._table_options_sql  s!    ''66Mr2   c                 d    U R                    Vs/ s H  o"R                  " S0 UD6PM     sn$ s  snf r^   )r  r_   )r.   r\   r  s      r/   _column_clauses"CreateQueryBuilder._column_clauses  s(    7;}}E}V((}EEE   -c                 d    U R                    Vs/ s H  o"R                  " S0 UD6PM     sn$ s  snf r^   )r  r_   )r.   r\   r  s      r/   _period_for_clauses&CreateQueryBuilder._period_for_clauses  s.    ?C?P?PQ?P"",V,?PQQQr  c           	         ^ U R                    Vs/ s H+  nSR                  SR                  U4S jU 5       5      S9PM-     sn$ s  snf )NzUNIQUE ({unique})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r   r  r  r\   s     r/   r  9CreateQueryBuilder._unique_key_clauses.<locals>.<genexpr>  s      6jciY_7J7J7TV7Tcir  )r  )r  r   r  )r.   r\   r  s    ` r/   _unique_key_clauses&CreateQueryBuilder._unique_key_clauses  sL     --
'  &&chh6jci6j.j&k'
 	
 
s   2Ac                 h   ^ SR                  SR                  U4S jU R                   5       5      S9$ )NzPRIMARY KEY ({columns})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r  r  s     r/   r  9CreateQueryBuilder._primary_key_clause.<locals>.<genexpr>       [IZv00:6:IZr  r  )r   r  r  r`   s    `r/   _primary_key_clause&CreateQueryBuilder._primary_key_clause  s3    (//HH[IZIZ[[ 0 
 	
r2   c                   ^ SR                  SR                  U4S jU R                   5       5      U R                  R                  " S0 TD6SR                  U4S jU R
                   5       5      S9nU R                  (       a  USU R                  R                  -   -  nU R                  (       a  USU R                  R                  -   -  nU$ )	NzEFOREIGN KEY ({columns}) REFERENCES {table_name} ({reference_columns})r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r  r  s     r/   r  9CreateQueryBuilder._foreign_key_clause.<locals>.<genexpr>  r  r  c              3   F   >#    U  H  oR                   " S0 TD6v   M     g 7fr^   r  r  s     r/   r  r    s     &oSn':':'DV'DSnr  )r   r6  r  z ON DELETE z ON UPDATE rS   )	r   r  r  r  r_   r  r  r  r  )r.   r\   r  s    ` r/   _foreign_key_clause&CreateQueryBuilder._foreign_key_clause  s    X__HH[IZIZ[[88@@J6J!hh&oSWSnSn&oo ` 

 &&md&A&A&G&GGGF&&md&A&A&G&GGGFr2   c                 `   U R                   " S0 UD6nX R                  " S0 UD6-  nX R                  " S0 UD6-  nU R                  (       a!  UR	                  U R
                  " S0 UD65        U R                  (       a!  UR	                  U R                  " S0 UD65        SR                  U5      $ )Nr  rS   )	r  r  r  r  r   r  r  r  r  )r.   r\   r  s      r/   r  CreateQueryBuilder._body_sql  s    &&00++5f55++5f55NN433=f=>NN433=f=>xx  r2   c                 T    SR                  U R                  R                  " S0 UD6S9$ )Nz AS ({query})r  rS   )r   r  r_   r`   s     r/   r  !CreateQueryBuilder._as_select_sql  s/    %%//))3F3 & 
 	
r2   c                 r    U Vs/ s H%  n[        U[        5      (       a  UO
[        U5      PM'     sn$ s  snf r+   )rd   r   r  s      r/   r  )CreateQueryBuilder._prepare_columns_input  s1    Y`aY`v:ff556&>IY`aaas   ,4c                 "    U R                  5       $ r+   r   r>   s    r/   r   CreateQueryBuilder.__str__  r  r2   c                 "    U R                  5       $ r+   r  r>   s    r/   r   CreateQueryBuilder.__repr__  r  r2   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+   )r)   r  )NN)2rL   rM   rN   rO   r   r  r  r  r   rC  r   r   r0   r?  r  r!   r   r   rP   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   rR   rS   r2   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 # r2   r  c                   >   \ rS rSrSrSrSrSr\r	SS\
\   SS4S jjrS	\SS4S
 jr\S\\\4   SS 4S j5       r\S\\\4   SS 4S j5       r\S\SS 4S j5       r\S\SS 4S j5       r\SS j5       rS\S\\\\4   SS4S jrS	\S\4S jrS\4S jrS\4S jrSrg)r  i  z+
Query builder used to build DROP queries.
r   r  Nr  r)   c                 :    S U l         SU l        S U l        Xl        g )Nr   )_drop_target_kind_drop_target
_if_existsr  r  s     r/   r0   DropQueryBuilder.__init__  s    !%9;r2   r\   c                     UR                  SU R                  5        UR                  SU R                  5        UR                  SU R                  5        g r  r  r`   s     r/   r  %DropQueryBuilder._set_kwargs_defaults  r  r2   r  c                 l    [        U[        5      (       a  UO
[        U5      nU R                  SU5        g )NDATABASE)rd   r   _set_target)r.   r  targets      r/   r  DropQueryBuilder.drop_database  s*    '(;;(ASV,r2   r9   c                 l    [        U[        5      (       a  UO
[        U5      nU R                  SU5        g )NTABLE)rd   r   r  )r.   r9   r  s      r/   r"  DropQueryBuilder.drop_table  s)    $UE22e&)r2   r$  c                 (    U R                  SU5        g )NUSERr  )r.   r$  s     r/   r&  DropQueryBuilder.drop_user      &r2   r)  c                 (    U R                  SU5        g )NVIEWr  )r.   r)  s     r/   r+  DropQueryBuilder.drop_view   r  r2   c                     SU l         g r  )r  r>   s    r/   	if_existsDropQueryBuilder.if_exists$  s	    r2   kindr  c                 T    U R                   (       a  [        S5      eXl        X l         g )Nz4'DropQuery' object already has attribute drop_target)r  r   r  )r.   r  r  s      r/   r  DropQueryBuilder._set_target(  s#     !WXX!%"r2   c                    U R                  U5        U R                  (       a  SOSnSn[        U R                  [        5      (       a  U R                  R
                  " S0 UD6nO\[        U R                  [        5      (       a  U R                  R
                  " S0 UD6nO [        U R                  U R                  5      nSR                  U R                  X#S9$ )Nz
IF EXISTS r   zDROP {kind} {if_exists}{name})r  r	  r6   rS   )r  r  rd   r  r   r_   r   r#   r  r   r  )r.   r\   r	  target_names       r/   r_   DropQueryBuilder.get_sql.  s    !!&)$(OOL	d''22++33=f=K))511++33=f=K'(9(94??KK.55''9 6 
 	
r2   c                 "    U R                  5       $ r+   r   r>   s    r/   r   DropQueryBuilder.__str__?  r  r2   c                 "    U R                  5       $ r+   r  r>   s    r/   r   DropQueryBuilder.__repr__B  r  r2   )r  r  r  r  r+   )r)   r  )rL   rM   rN   rO   r   r  r  r  r   rC  r   r   r0   r?  r  r!   r   r   rP   r  r   r"  r&  r+  r	  r  r   r_   r   r   rR   rS   r2   r/   r  r    sM    JI 2 d 34 3D 3
 -eHcM&: -?Q - - *eSj 1 *6H * * 'c '&8 ' ' 'c '&8 ' '  # #U8UC3G-H #T #
 
 
" # r2   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&   rU   rq   r   r   rP   r   r   r  r  r=  r   r@  r   r2  rB  rJ  rR  r  r  rS   r2   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r2   