
    g                     F   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z# er
d dl$m%Z%m&Z&m'Z' dZ(d	Z) ed
d      Z* G d d      Z+ G d de+      Z, G d de,      Z- G d de-      Z. G d de-      Z/ G d de-      Z0 G d de-      Z1 G d de-      Z2 G d de,      Z3 G d de,      Z4 G d  d!e,      Z5 G d" d#e,      Z6 G d$ d%e,      Z7 G d& d'e7      Z8 G d( d)e7      Z9 G d* d+e,      Z: G d, d-e:      Z; G d. d/e:e5      Z< G d0 d1e,      Z= G d2 d3e<      Z> G d4 d5e:      Z? G d6 d7e?      Z@ G d8 d9e?      ZA G d: d;e:      ZB G d< d=e:      ZC G d> d?e:      ZD G d@ dAe:      ZE G dB dCe:      ZF G dD dEeF      ZG G dF dGeF      ZH G dH dIe:      ZI G dJ dKe:      ZJ G dL dMeJ      ZK G dN dOeC      ZL G dP dQe,      ZM G dR dSe:      ZN G dT dUe:      ZO G dV dWe:      ZP G dX dY      ZQ G dZ d[e:      ZR G d\ d]eR      ZS G d^ d_eS      ZT ed`da      ZU G db dceT      ZV G dd deeT      ZW G df dge+      ZX G dh dieR      ZY G dj dkeR      ZZ G dl dmeR      Z[ G dn doe,      Z\ G dp dqe,      Z]y)r    N)date)Enum)TYPE_CHECKINGAnyIterableIteratorListOptionalSequenceSetTypeTypeVarUnion)
ArithmeticBoolean
ComparatorDialectsEqualityJSONOperatorsMatchingOrder)CaseExceptionFunctionExceptionbuilderformat_alias_sqlformat_quotesignore_copyresolve_is_aggregate)QueryBuilder
SelectableTablezTimothy Heysztheys@kayak.comNodeTNode)boundc                   >    e Zd ZdZdee   fdZdee   dee   fdZ	y)r#   Nreturnc              #      K   |  y wN selfs    A/var/www/openai/venv/lib/python3.12/site-packages/pypika/terms.pynodes_zNode.nodes_!   s     
s   typec                 b    | j                         D cg c]  }t        ||      s| c}S c c}w r(   )r-   
isinstance)r+   r.   nodes      r,   find_z
Node.find_$   s)    !%I*T42HIIIs   ,,)
__name__
__module____qualname__is_aggregater   r"   r-   r   r	   r2   r)       r,   r#   r#      s5    L J$u+ J$u+ Jr7   c                   P   e Zd ZdZdcdee   ddfdZededd fd       Ze	de
d   fd       Zde
d	   fd
Ze	 dcdeed       deeeddddf   fd       Ze	 dcded dddeeef   ded   fd       Zded   ded   dd fdZdeddfdZdddZdedZdfdZdedd fd!Zdeddfd"Zdeddfd#Zdeddfd$Zdeddfd%Z deddfd&Z!d'eddfd(Z"d'eddfd)Z#d'eddfd*Z$d'eddfd+Z%d'eddfd,Z&d'eddfd-Z'd.eddfd/Z(d.eddfd0Z)d1ed2edd3fd4Z*d5ed6edd7fd8Z+d'eddfd9Z,dgd:Z-d;ee.e/e0d f   dd<fd=Z1d;ee.e/e0d f   dd<fd>Z2d.eddfd?Z3ded@Z4deddAfdBZ5deddAfdCZ6dedDZ7dhdEZ8didFZ9deddAfdGZ:deddAfdHZ;deddAfdIZ<deddAfdJZ=deddKfdLZ>deddMfdNZ?deddAfdOZ@deddAfdPZAdeddAfdQZBdeddAfdRZCdeddAfdSZDdeddAfdTZEdeddAfdUZFdeddAfdVZGdeddfdWZHdeddfdXZIdeddfdYZJdeddfdZZKdeddfd[ZLdeddfd\ZMd]eNdd3fd^ZOdefd_ZPdefd`ZQdaedefdbZRy)jTermFNaliasr&   c                     || _         y r(   r:   r+   r:   s     r,   __init__zTerm.__init__+   s	    
r7   c                     || _         y r(   r<   r=   s     r,   as_zTerm.as_.   s	    
r7   r!   c                 B    ddl m} t        | j                  |            S )Nr   )r!   )pypikar!   setr2   )r+   r!   s     r,   tables_zTerm.tables_2   s     4::e$%%r7   Fieldc                 >    t        | j                  t                    S r(   )rC   r2   rE   r*   s    r,   fields_zTerm.fields_8   s    4::e$%%r7   wrapper_clsLiteralValueArrayTupleValueWrapperc                     t        | t              r| S | 
t               S t        | t              rt	        |  S t        | t
              rt        |  S |xs t        } ||       S )a,  
        Used for wrapping raw inputs such as numbers in Criterions and Operator.

        For example, the expression F('abc')+1 stores the integer part in a ValueWrapper object.

        :param val:
            Any value.
        :param wrapper_cls:
            A pypika class which wraps a constant value so it can be handled as a component of the query.
        :return:
            Raw string, number, or decimal values will be returned in a ValueWrapper.  Fields and other parts of the
            querybuilder will be returned as inputted.

        )r0   r#   	NullValuelistrJ   tuplerK   rL   )valrH   s     r,   wrap_constantzTerm.wrap_constant;   s_    & c4 J;;c4 #;c5!#; "1\3r7   rQ   r   Interval)r9   r   rS   rN   rL   JSONc                     ddl m} t        | t        |t        f      r| S | 
t               S t        | t        t        t        f      r|xs t        } ||       S t        |       S )N   )r   )queriesr   r0   r9   rS   rN   strintboolrL   rT   )rQ   rH   r   s      r,   	wrap_jsonzTerm.wrap_json[   sZ     	*cD,9:J;;cCd+,%5Ks##Cyr7   current_table	new_tablec                     | S )a  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.
        The base implementation returns self because not all terms have a table property.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            Self.
        r)   r+   r\   r]   s      r,   replace_tablezTerm.replace_tablek   s	     r7   otherBasicCriterionc                     | |k(  S r(   r)   r+   ra   s     r,   eqzTerm.eqy       u}r7   c                     t        |       S r(   )NullCriterionr*   s    r,   isnullzTerm.isnull|   s    T""r7   c                 >    | j                         j                         S r(   )ri   negater*   s    r,   notnullzTerm.notnull   s    {{}##%%r7   c                     t        |       S r(   )NotNullCriterionr*   s    r,   	isnotnullzTerm.isnotnull   s    %%r7   valueBitwiseAndCriterionc                 8    t        | | j                  |            S r(   )rq   rR   r+   rp   s     r,   
bitwiseandzTerm.bitwiseand   s    "4););E)BCCr7   c                     | |kD  S r(   r)   rd   s     r,   gtzTerm.gt       e|r7   c                     | |k\  S r(   r)   rd   s     r,   gtezTerm.gte   rf   r7   c                     | |k  S r(   r)   rd   s     r,   ltzTerm.lt   rw   r7   c                     | |k  S r(   r)   rd   s     r,   ltezTerm.lte   rf   r7   c                     | |k7  S r(   r)   rd   s     r,   nezTerm.ne   rf   r7   exprc                 V    t        t        j                  | | j                  |            S r(   )rb   r   globrR   r+   r   s     r,   r   z	Term.glob        hmmT43E3Ed3KLLr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   likerR   r   s     r,   r   z	Term.like   r   r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   not_likerR   r   s     r,   r   zTerm.not_like   s"    h//t7I7I$7OPPr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   ilikerR   r   s     r,   r   z
Term.ilike        hnndD4F4Ft4LMMr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   	not_ilikerR   r   s     r,   r   zTerm.not_ilike   s"    h00$8J8J48PQQr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   rlikerR   r   s     r,   r   z
Term.rlike   r   r7   patternc                 V    t        t        j                  | | j                  |            S r(   )rb   r   regexrR   r+   r   s     r,   r   z
Term.regex   s     hnndD4F4Fw4OPPr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   regexprR   r   s     r,   r   zTerm.regexp   s     hootT5G5G5PQQr7   lowerupperBetweenCriterionc                 X    t        | | j                  |      | j                  |            S r(   )r   rR   r+   r   r   s      r,   betweenzTerm.between   s(    d&8&8&?ASASTYAZ[[r7   startendPeriodCriterionc                 X    t        | | j                  |      | j                  |            S r(   )r   rR   )r+   r   r   s      r,   from_tozTerm.from_to   s(    tT%7%7%>@R@RSV@WXXr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   as_ofrR   r   s     r,   r   z
Term.as_of   r   r7   c                     t        |       S r(   )Allr*   s    r,   all_z	Term.all_       4yr7   argContainsCriterionc                     t        |t        t        t        f      r/t	        | t        |D cg c]  }| j                  |       c}       S t	        | |      S c c}w r(   )r0   rO   rP   rC   r   rK   rR   )r+   r   rp   s      r,   isinz	Term.isin   sV    cD%-.$T5Z]2^Z]QV43E3Ee3LZ]2^+_`` s++ 3_s   Ac                 @    | j                  |      j                         S r(   )r   rk   r+   r   s     r,   notinz
Term.notin   s    yy~$$&&r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   	bin_regexrR   r   s     r,   r   zTerm.bin_regex   s"    h00$8J8J78STTr7   c                     t        |       S r(   Notr*   s    r,   rk   zTerm.negate   r   r7   ArithmeticExpressionc                     | |z  S r(   r)   rd   s     r,   lshiftzTerm.lshift   rf   r7   c                     | |z	  S r(   r)   rd   s     r,   rshiftzTerm.rshift   rf   r7   c                     t        |       S r(   r   r*   s    r,   
__invert__zTerm.__invert__   r   r7   c                     | S r(   r)   r*   s    r,   __pos__zTerm.__pos__   s    r7   c                     t        |       S r(   )Negativer*   s    r,   __neg__zTerm.__neg__   s    ~r7   c                 V    t        t        j                  | | j                  |            S r(   r   r   addrR   rd   s     r,   __add__zTerm.__add__        #JNND$:L:LU:STTr7   c                 V    t        t        j                  | | j                  |            S r(   r   r   subrR   rd   s     r,   __sub__zTerm.__sub__   r   r7   c                 V    t        t        j                  | | j                  |            S r(   r   r   mulrR   rd   s     r,   __mul__zTerm.__mul__   r   r7   c                 V    t        t        j                  | | j                  |            S r(   r   r   divrR   rd   s     r,   __truediv__zTerm.__truediv__   r   r7   Powc                     t        | |      S r(   )r   rd   s     r,   __pow__zTerm.__pow__       4r7   Modc                     t        | |      S r(   )r   rd   s     r,   __mod__zTerm.__mod__   r   r7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __radd__zTerm.__radd__        #JNND4F4Fu4MtTTr7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __rsub__zTerm.__rsub__   r   r7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __rmul__zTerm.__rmul__   r   r7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __rtruediv__zTerm.__rtruediv__   r   r7   c                 V    t        t        j                  | | j                  |            S r(   r   r   r   rR   rd   s     r,   
__lshift__zTerm.__lshift__   #    #J$5$5tT=O=OPU=VWWr7   c                 V    t        t        j                  | | j                  |            S r(   r   r   r   rR   rd   s     r,   
__rshift__zTerm.__rshift__   r   r7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __rlshift__zTerm.__rlshift__   #    #J$5$5t7I7I%7PRVWWr7   c                 V    t        t        j                  | j                  |      |       S r(   r   rd   s     r,   __rrshift__zTerm.__rrshift__   r   r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   re   rR   rd   s     r,   __eq__zTerm.__eq__       hkk41C1CE1JKKr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   r   rR   rd   s     r,   __ne__zTerm.__ne__  r   r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   rv   rR   rd   s     r,   __gt__zTerm.__gt__  r   r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   ry   rR   rd   s     r,   __ge__zTerm.__ge__       hllD$2D2DU2KLLr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   r{   rR   rd   s     r,   __lt__zTerm.__lt__  r   r7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   r}   rR   rd   s     r,   __le__zTerm.__le__  r   r7   itemc                     t        |t              st        d      | j                  |j                  |j
                        S )Nz"Field' object is not subscriptable)r0   slice	TypeErrorr   r   stop)r+   r   s     r,   __getitem__zTerm.__getitem__  s1    $&@AA||DJJ		22r7   c                 (    | j                  dd      S )N"'
quote_charsecondary_quote_charget_sqlr*   s    r,   __str__zTerm.__str__  s    ||s|EEr7   c                 :    t        | j                  dd            S )NT)
with_aliaswith_namespace)hashr  r*   s    r,   __hash__zTerm.__hash__  s    DLLDLFGGr7   kwargsc                     t               r(   NotImplementedErrorr+   r  s     r,   r  zTerm.get_sql      !##r7   r(   )r&   rh   )r&   r   )r&   rn   )r&   r   )r&   r9   )r&   r   )Sr3   r4   r5   r6   r
   rX   r>   r   r@   propertyr   rD   rG   staticmethodr   r   
ValueErrorr"   rR   rY   rZ   r[   r`   r   re   ri   rl   ro   rt   rv   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   rP   rC   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r)   r7   r,   r9   r9   (   sf   Lhsm t      &W & &
&W & 37 "4<0 	z5.'7NR	S   > Z^6>:tS#tKL	V	W 8G+< RYIZ _e   0 #&&D D(= D  0  !1   0  !1   0 M M!1 MM M!1 MQS Q%5 QN# N"2 NRc R&6 RN# N"2 NQS Q%5 QRc R&6 R\S \ \1C \YS Ys Y/@ YN# N"2 N,dE367 ,<O ,
'tUC78 '=P 'U U)9 UC $: C $: US U%; UUS U%; UUS U%; UU U)? U S  U   S  U  Uc U&< UUc U&< UUc U&< UU# U*@ UX X(> XX X(> XX X)? XX X)? XLC L$4 LLC L$4 LLC L$4 LMC M$4 MLC L$4 LMC M$4 M3 3*< 3
F FH# H$ $ $r7   r9   c                   F     e Zd ZdZdeeef   ddf fdZdedefdZ	 xZ
S )	ParameterNplaceholderr&   c                 0    t         |           || _        y r(   )superr>   r  )r+   r  	__class__s     r,   r>   zParameter.__init__&  s    &r7   r  c                 ,    t        | j                        S r(   )rX   r  r  s     r,   r  zParameter.get_sql*  s    4##$$r7   )r3   r4   r5   r6   r   rX   rY   r>   r   r  __classcell__r  s   @r,   r  r  #  s6    L'E#s(O ' '% % %r7   r  c                   (    e Zd ZdZddZdedefdZy)QmarkParameterz)Question mark style, e.g. ...WHERE name=?r&   Nc                      y r(   r)   r*   s    r,   r>   zQmarkParameter.__init__1      r7   r  c                      y)N?r)   r  s     r,   r  zQmarkParameter.get_sql4  s    r7   r&   Nr3   r4   r5   __doc__r>   r   rX   r  r)   r7   r,   r!  r!  .  s    3  r7   r!  c                        e Zd ZdZdedefdZy)NumericParameterz0Numeric, positional style, e.g. ...WHERE name=:1r  r&   c                 :    dj                  | j                        S Nz:{placeholder}r  formatr  r  s     r,   r  zNumericParameter.get_sql;      &&43C3C&DDr7   Nr3   r4   r5   r(  r   rX   r  r)   r7   r,   r*  r*  8  s    :E E Er7   r*  c                        e Zd ZdZdedefdZy)NamedParameterz%Named style, e.g. ...WHERE name=:namer  r&   c                 :    dj                  | j                        S r,  r.  r  s     r,   r  zNamedParameter.get_sqlB  r0  r7   Nr1  r)   r7   r,   r3  r3  ?  s    /E E Er7   r3  c                   (    e Zd ZdZddZdedefdZy)FormatParameterz1ANSI C printf format codes, e.g. ...WHERE name=%sr&   Nc                      y r(   r)   r*   s    r,   r>   zFormatParameter.__init__I  r#  r7   r  c                      y)Nz%sr)   r  s     r,   r  zFormatParameter.get_sqlL  s    r7   r&  r'  r)   r7   r,   r6  r6  F  s    ;  r7   r6  c                        e Zd ZdZdedefdZy)PyformatParameterz9Python extended format codes, e.g. ...WHERE name=%(name)sr  r&   c                 :    dj                  | j                        S )Nz%({placeholder})sr-  r.  r  s     r,   r  zPyformatParameter.get_sqlS  s    "))d6F6F)GGr7   Nr1  r)   r7   r,   r:  r:  P  s    CH H Hr7   r:  c                   T     e Zd Zdeddf fdZedee   fd       Zde	de
fdZ xZS )r   termr&   Nc                 0    t         |           || _        y r(   r  r>   r=  r+   r=  r  s     r,   r>   zNegative.__init__X  s    	r7   c                 .    | j                   j                  S r(   r=  r6   r*   s    r,   r6   zNegative.is_aggregate\      yy%%%r7   r  c                 Z    dj                   | j                  j                  di |      S )Nz-{term}r=  r)   )r/  r=  r  r  s     r,   r  zNegative.get_sql`  s+    %6TYY%6%6%@%@AAr7   )r3   r4   r5   r9   r>   r  r
   rZ   r6   r   rX   r  r  r  s   @r,   r   r   W  sK    T d  &htn & &B B Br7   r   c            	       ~     e Zd ZdZddedee   ddf fdZdedefdZe	defd       Z
dd	ee   d
ededefdZ xZS )rL   Nrp   r:   r&   c                 2    t         |   |       || _        y r(   r  r>   rp   r+   rp   r:   r  s      r,   r>   zValueWrapper.__init__g      
r7   r  c                 <     | j                   | j                  fi |S r(   )get_formatted_valuerp   r  s     r,   get_value_sqlzValueWrapper.get_value_sqlk  s    't''

=f==r7   c                 r   |j                  d      xs d}t        |t              r |j                  di |S t        |t              r | j
                  |j                  fi |S t        |t              r! | j
                  |j                         fi |S t        |t              r!|j                  ||dz        }t        ||      S t        |t              rt        j                  t        |            S t        |t        j                        r | j
                  t        |      fi |S |yt        |      S )Nr      nullr)   )getr0   r9   r  r   rL  rp   r   	isoformatrX   replacer   rZ   r   uuidUUID)clsrp   r  r  s       r,   rL  z ValueWrapper.get_formatted_valuen  s	   ZZ 67=2
 eT" 5==*6**eT"*3**5;;A&AAeT"*3**5??+<GGGeS!MM*j1n=E 
33eT"99SZ((eTYY'*3**3u:@@@=5zr7   r  r  c                 ^     | j                   d||d|}t        || j                  fd|i|S )Nr  r  r)   )rM  r   r:   )r+   r  r  r  sqls        r,   r  zValueWrapper.get_sql  s;     d  lJMaleklTZZQJQ&QQr7   r(   )Nr  )r3   r4   r5   r6   r   r
   rX   r>   rM  classmethodrL  r  r  r  s   @r,   rL   rL   d  s    Lc (3- 4 >c >c >   *R(3- Rc Rcf Rkn Rr7   rL   c            
       R    e Zd ZdZddedee   ddf fdZdededefdZde	dedefdZ
dededefd	Zedded
ededefd       ZddededefdZdeeef   ddfdZdeeef   ddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZ xZS )rT   Nrp   r:   r&   c                 2    t         |   |       || _        y r(   rH  rI  s      r,   r>   zJSON.__init__  rJ  r7   r  c                     t        |t              r | j                  |fi |S t        |t              r | j                  |fi |S t        |t
              r | j                  |fi |S t        |      S r(   )r0   dict_get_dict_sqlrO   _get_list_sqlrX   _get_str_sql)r+   rp   r  s      r,   _recursive_get_sqlzJSON._recursive_get_sql  sr    eT"%4%%e6v66eT"%4%%e6v66eS!$4$$U5f555zr7   c                     |j                         D cg c]:  \  }}dj                   | j                  |fi | | j                  |fi |      < }}}dj                  ddj                  |      dg      S c c}}w )Nz{key}:{value})keyrp   rO  {,})itemsr/  rb  join)r+   rp   r  kvpairss         r,   r_  zJSON._get_dict_sql  s     

 &1	 ""+D++A88-d--a:6: #  & 	 
 wwSXXe_c233
s   ?A9c                     |D cg c]  } | j                   |fi | }}dj                  ddj                  |      dg      S c c}w )NrO  [rf  ])rb  ri  )r+   rp   r  rk  rl  s        r,   r`  zJSON._get_list_sql  sM    ?DEu!(((5f5uEwwSXXe_c233 Fs   Ar  c                     t        | |      S r(   )r   )rp   r  r  s      r,   ra  zJSON._get_str_sql  s    UJ//r7   r  c                 z    t        | j                  | j                        |      }t        || j                  fi |S r(   )r   rb  rp   r   r:   )r+   r  r  rY  s       r,   r  zJSON.get_sql  s4    D33DJJ?AUVTZZ:6::r7   key_or_indexrb   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   GET_JSON_VALUErR   r+   rr  s     r,   get_json_valuezJSON.get_json_value  #    m::D$BTBTUaBbccr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   GET_TEXT_VALUErR   ru  s     r,   get_text_valuezJSON.get_text_value  rw  r7   	path_jsonc                 V    t        t        j                  | | j                  |            S r(   )rb   r   GET_PATH_JSON_VALUEr[   r+   r{  s     r,   get_path_json_valuezJSON.get_path_json_value  !    m??t~~V_G`aar7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   GET_PATH_TEXT_VALUEr[   r~  s     r,   get_path_text_valuezJSON.get_path_text_value  r  r7   ra   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   HAS_KEYr[   rd   s     r,   has_keyzJSON.has_key  s     m33T4>>%;PQQr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   CONTAINSr[   rd   s     r,   containszJSON.contains  s     m44dDNN5<QRRr7   c                 V    t        t        j                  | | j                  |            S r(   )rb   r   CONTAINED_BYr[   rd   s     r,   contained_byzJSON.contained_by  s     m88$u@UVVr7   c                 D    t        t        j                  | t        |       S r(   )rb   r   HAS_KEYSrJ   rd   s     r,   has_keyszJSON.has_keys  s    m44dE5MJJr7   c                 D    t        t        j                  | t        |       S r(   )rb   r   HAS_ANY_KEYSrJ   rd   s     r,   has_any_keyszJSON.has_any_keys  s    m88$uNNr7   NN)r  )r  )r3   r4   r5   tabler   r
   rX   r>   rb  r^  r_  rO   r`  r  ra  r  r   rY   rv  rz  r  r  r  r  r  r   r  r  r  r  s   @r,   rT   rT     s   Ec # $  s s 44 43 43 444 43 43 4 0C 0S 0# 0# 0 0;C ; ; ;d5c? d?O dd5c? d?O dbS b5E bbS b5E bRS R%5 RSc S&6 SW# W*: WKh K+; KO( O/? Or7   rT   c                   N     e Zd Zdeedf   ddf fdZd	dee   dedefdZ xZ	S )
ValuesfieldrE   r&   Nc                 t    t         |   d        t        |t              st        |      | _        y || _        y r(   )r  r>   r0   rE   r  )r+   r  r  s     r,   r>   zValues.__init__  s*    )3E5)AU5\
u
r7   r  r  c                 ^    dj                   | j                  j                  dd|i|      S )NzVALUES({value})r  rp   r)   )r/  r  r  r+   r  r  s      r,   r  zValues.get_sql  s1     ''.@djj.@.@.aJ.aZ`.a'bbr7   r(   )
r3   r4   r5   r   rX   r>   r
   r   r  r  r  s   @r,   r  r    sD    MeCL1 Md Mc(3- c# c# cr7   r  c                   @     e Zd Zddee   ddf fdZdedefdZ xZS )rI   Nr:   r&   c                 2    t         |   |       || _        y r(   )r  r>   _valuerI  s      r,   r>   zLiteralValue.__init__  s    r7   r  c                 D    t        | j                  | j                  fi |S r(   )r   r  r:   r  s     r,   r  zLiteralValue.get_sql  s    TZZB6BBr7   r(   )	r3   r4   r5   r
   rX   r>   r   r  r  r  s   @r,   rI   rI     s0    Xc] d C C Cr7   rI   c                   0     e Zd Zddee   ddf fdZ xZS )rN   Nr:   r&   c                 &    t         |   d|       y )NNULLr  r>   r+   r:   r  s     r,   r>   zNullValue.__init__  s    'r7   r(   r3   r4   r5   r
   rX   r>   r  r  s   @r,   rN   rN     s    (hsm (t ( (r7   rN   c                   0     e Zd Zddee   ddf fdZ xZS )SystemTimeValueNr:   r&   c                 &    t         |   d|       y )NSYSTEM_TIMEr  r  s     r,   r>   zSystemTimeValue.__init__  s    .r7   r(   r  r  s   @r,   r  r    s    /hsm /t / /r7   r  c                       e Zd ZdeddfdZdeddfdZdeddfdZeddee	   ddfd	       Z
eddee   ddfd
       ZdefdZy)	Criterionra   r&   ComplexCriterionc                 8    t        t        j                  | |      S r(   )r  r   and_rd   s     r,   __and__zCriterion.__and__      dE::r7   c                 8    t        t        j                  | |      S r(   )r  r   or_rd   s     r,   __or__zCriterion.__or__  s    T599r7   c                 8    t        t        j                  | |      S r(   )r  r   xor_rd   s     r,   __xor__zCriterion.__xor__  r  r7   termsEmptyCriterionc                 2    t               }| D ]  }||z  }	 |S r(   r  r  critr=  s      r,   anyzCriterion.any  $    DDLD  r7   c                 2    t               }| D ]  }||z  }	 |S r(   r  r  s      r,   allzCriterion.all  r  r7   c                     t               r(   r  r*   s    r,   r  zCriterion.get_sql  r  r7   N)r)   )r3   r4   r5   r   r  r  r  r  r   r9   r  r  rX   r  r)   r7   r,   r  r    s    ;S ;%7 ;:C :$6 :;S ;%7 ; 8D> +;   8C= *:  $ $r7   r  c                   `    e Zd ZdZ e       Zded   fdZdedefdZ	dedefdZ
dedefdZy)	r  Nr&   rE   c                     t               S r(   )rC   r*   s    r,   rG   zEmptyCriterion.fields_  s	    ur7   ra   c                     |S r(   r)   rd   s     r,   r  zEmptyCriterion.__and__      r7   c                     |S r(   r)   rd   s     r,   r  zEmptyCriterion.__or__  r  r7   c                     |S r(   r)   rd   s     r,   r  zEmptyCriterion.__xor__  r  r7   )r3   r4   r5   r6   rC   rD   r   rG   r   r  r  r  r)   r7   r,   r  r    sW    LeGW S S C C S S r7   r  c            
            e Zd Z	 ddedee   deeedf      ddf fdZdee   fdZ	e
d	ed
   ded
   dd fd       ZdedefdZ xZS )rE   Nnamer:   r  r    r&   c                 B    t         |   |       || _        || _        y Nr<   )r  r>   r  r  )r+   r  r:   r  r  s       r,   r>   zField.__init__  s#     	u%	
r7   c              #   v   K   |  | j                   #| j                   j                         E d {    y y 7 wr(   r  r-   r*   s    r,   r-   zField.nodes_   3     
::!zz((*** "*   .979r\   r!   r]   c                 T    | j                   |k(  r|| _         y| j                   | _         yaQ  
        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 field with the tables replaced.
        Nr  r_   s      r,   r`   zField.replace_table%  s      #'**"=Y
4::
r7   r  c                    |j                  dd      }|j                  dd      }|j                  dd       }t        | j                  |      }| j                  rO|s| j                  j                  r7| j                  j                         }dj                  t        ||      |      }t        | dd       }|rt        ||fd|i|S |S )Nr
  Fr  r  z{namespace}.{name})	namespacer  r:   )	popr   r  r  r:   get_table_namer/  getattrr   )r+   r  r
  r  r  	field_sql
table_namefield_aliass           r,   r  zField.get_sql3  s    ZZe4
$4e<ZZd3
!$))Z8	 ::>TZZ-=-=224J,33'
J? 4 I
 dGT2#I{\z\U[\\r7   r  )r3   r4   r5   rX   r
   r   r>   r   r"   r-   r   r`   r   r  r  r  s   @r,   rE   rE     s    bf (=EeCQ]L]F^=_	+ +
 N8G+< NRYIZ N_f N N  r7   rE   c                   P     e Zd Zd	dedee   ddf fdZd	dee   dedefdZ xZS )
IndexNr  r:   r&   c                 2    t         |   |       || _        y r(   r  r>   r  )r+   r  r:   r  s      r,   r>   zIndex.__init__I      	r7   r  r  c                 .    t        | j                  |      S r(   )r   r  r  s      r,   r  zIndex.get_sqlM  s    TYY
33r7   r(   )	r3   r4   r5   rX   r
   r>   r   r  r  r  s   @r,   r  r  H  s?    S # $ 4(3- 4# 4# 4r7   r  c                   r     e Zd Zddeeedf      ddf fdZdee   fdZ		 dde
de
d	ee   d
edef
dZ xZS )StarNr  r    r&   c                 (    t         |   d|       y )N*r  r  )r+   r  r  s     r,   r>   zStar.__init__R  s    E*r7   c              #   v   K   |  | j                   #| j                   j                         E d {    y y 7 wr(   r  r*   s    r,   r-   zStar.nodes_U  r  r  r
  r  r  r  c                     | j                   ra|s| j                   j                  rI| j                   j                  xs t        | j                   d      }dj                  t	        ||            S y)N_table_namez{}.*r  )r  r:   r  r/  r   )r+   r
  r  r  r  r  s         r,   r  zStar.get_sqlZ  sQ     ::>TZZ-=-=

((NGDJJ,NI==y*!EFFr7   r(   )FFN)r3   r4   r5   r
   r   rX   r>   r   r"   r-   rZ   r   r  r  r  s   @r,   r  r  Q  so    +huS,->'?@ +D ++ + cg8<RZ[^R_ru	r7   r  c                        e Zd Zdeddf fdZdee   fdZdedefdZ	e
defd       Zed	ed
   ded
   dd fd       Z xZS )rK   valuesr&   Nc                 t    t         |           |D cg c]  }| j                  |       c}| _        y c c}w r(   )r  r>   rR   r  )r+   r  rp   r  s      r,   r>   zTuple.__init__e  s2    >DEfUt))%0fEEs   5c              #   j   K   |  | j                   D ]  }|j                         E d {     y 7 wr(   )r  r-   rs   s     r,   r-   zTuple.nodes_i  s+     
[[E||~%% !%   '313r  c                     dj                  dj                  fd| j                  D                    }t        || j                  fi S )N({})rf  c              3   B   K   | ]  } |j                   di   y wNr)   r  .0r=  r  s     r,   	<genexpr>z Tuple.get_sql.<locals>.<genexpr>o  s      $T\T\\%;F%;   )r/  ri  r  r   r:   r+   r  rY  s    ` r,   r  zTuple.get_sqln  s:    mmCHH$T$TTUTZZ:6::r7   c                 f    t        | j                  D cg c]  }|j                   c}      S c c}w r(   )r   r  r6   )r+   rQ   s     r,   r6   zTuple.is_aggregater  s)    #$M#S%5%5$MNN$M   .r\   r!   r]   c                 l    | j                   D cg c]  }|j                  ||       c}| _         yc c}w r  )r  r`   )r+   r\   r]   rp   s       r,   r`   zTuple.replace_tablev  s4     SWR]R]^R]u**=)DR]^^   1)r3   r4   r5   r   r>   r   r"   r-   rX   r  r  rZ   r6   r   r
   r`   r  r  s   @r,   rK   rK   d  s    F F F& &
; ; ; Od O O _8G+< _RYIZ __f _ _r7   rK   c                       e Zd ZdedefdZy)rJ   r  r&   c                 F   j                  dd       }dj                  fd| j                  D              }dj                  |      }|t        j
                  t        j                  fv r!t        |      dkD  rdj                  |      nd}t        || j                  fi S )Ndialectrf  c              3   B   K   | ]  } |j                   di   y wr  r  r  s     r,   r  z Array.get_sql.<locals>.<genexpr>  s      I[T,$,,00[r  z[{}]r   z	ARRAY[{}]z'{}')
rR  ri  r  r/  r   
POSTGRESQLREDSHIFTlenr   r:   )r+   r  r  r  rY  s    `   r,   r  zArray.get_sql  s    **Y-IT[[IImmF#x**H,=,=>>03Fa+$$V,VCTZZ:6::r7   Nr3   r4   r5   r   rX   r  r)   r7   r,   rJ   rJ     s    ; ; ;r7   rJ   c                   (     e Zd Zdeddf fdZ xZS )Bracketr=  r&   Nc                 $    t         |   |       y r(   r  r@  s     r,   r>   zBracket.__init__  s    r7   r3   r4   r5   r   r>   r  r  s   @r,   r  r    s    S T  r7   r  c                        e Zd Z	 ddedddedededee   d	df fd
Zd	ee	   fdZ
ed	ee   fd       Zeded   ded   d	d fd       Zddeded	efdZ xZS )NestedCriterionN
comparatornested_comparatorr  leftrightnestedr:   r&   c                 j    t         |   |       || _        || _        || _        || _        || _        y r(   )r  r>   r
  r  r	  r  r  )r+   r  r	  r
  r  r  r:   r  s          r,   r>   zNestedCriterion.__init__  s6     		$!2
r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    | j                  j                         E d {    y 7 I7 )7 	wr(   )r  r-   r
  r  r*   s    r,   r-   zNestedCriterion.nodes_  sZ     
::$$&&&99##%%%;;%%''' 	'%'3   "A4A.!A4A0!A4(A2)A40A42A4c                     t        | j                  | j                  | j                  fD cg c]  }|j                   c}      S c c}w r(   )r   r
  r  r  r6   r+   r=  s     r,   r6   zNestedCriterion.is_aggregate  s=    #DIItzz[_[f[fCg$hCg4T%6%6Cg$hii$hs   Ar\   r!   r]   c                     | j                   j                  ||      | _         | j                  j                  ||      | _        | j                  j                  ||      | _        yaU  
        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 criterion with the tables replaced.
        N)r
  r`   r  r  r_   s      r,   r`   zNestedCriterion.replace_table  sL     II++M9E	ZZ--mYG
jj..}iHr7   r
  r  c                 R   dj                   | j                  j                  di || j                  j                   | j
                  j                  di || j                  j                   | j                  j                  di |      }|rt        d|| j                  d|S |S )Nz4{left}{comparator}{right}{nested_comparator}{nested})r
  r  r  r	  r  )rY  r:   r)   )
r/  r
  r  r  rp   r  r	  r  r   r:   r+   r
  r  rY  s       r,   r  zNestedCriterion.get_sql  s    DKK""",V,,,$$**$$.v."44::&4;;&&00 L 
 #H4::HHH
r7   r(   F)r3   r4   r5   r   r   r
   rX   r>   r   r"   r-   r  rZ   r6   r   r`   r  r  r  s   @r,   r  r    s      $ . 	
   } 
 ( ( jhtn j j I8G+< IRYIZ I_p I I$ # # r7   r  c                        e Zd Zddedededee   ddf
 fdZdee	   fdZ
edee   fd	       Zed
ed   ded   dd fd       ZddedededefdZ xZS )rb   Nr  r
  r  r:   r&   c                 N    t         |   |       || _        || _        || _        y)a  
        A wrapper for a basic criterion such as equality or inequality. This wraps three parts, a left and right term
        and a comparator which defines the type of comparison.


        :param comparator:
            Type: Comparator
            This defines the type of comparison, such as {quote}={quote} or {quote}>{quote}.
        :param left:
            The term on the left side of the expression.
        :param right:
            The term on the right side of the expression.
        N)r  r>   r  r
  r  )r+   r  r
  r  r:   r  s        r,   r>   zBasicCriterion.__init__  s'     	$	
r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr(   )r  r-   r
  r*   s    r,   r-   zBasicCriterion.nodes_  s@     
::$$&&&99##%%% 	'%!   "AA!AAAAc                 ~    t        | j                  | j                  fD cg c]  }|j                   c}      S c c}w r(   )r   r
  r  r6   r  s     r,   r6   zBasicCriterion.is_aggregate  s4    #DIItzzCZ$[CZ4T%6%6CZ$[\\$[s   :r\   r!   r]   c                     | j                   j                  ||      | _         | j                  j                  ||      | _        yr  r
  r`   r  r_   s      r,   r`   zBasicCriterion.replace_table  4     II++M9E	ZZ--mYG
r7   r  r
  r  c           	          dj                  | j                  j                   | j                  j                  dd|i| | j
                  j                  dd|i|      }|rt        || j                  fi |S |S )Nz{left}{comparator}{right}r  r  r
  r  r)   )r/  r  rp   r
  r  r  r   r:   )r+   r  r
  r  rY  s        r,   r  zBasicCriterion.get_sql  s|    )00,,"""CjCFC$$**$$E
EfE 1 

 #C>v>>
r7   r(   )r  F)r3   r4   r5   r   r9   r
   rX   r>   r   r"   r-   r  rZ   r6   r   r`   r   r  r  r  s   @r,   rb   rb     s    : T $ xX[} hl && &
 ]htn ] ] H8G+< HRYIZ H_o H H#  QT Y\ r7   rb   c            	            e Zd Zddededee   ddf fdZdee	   fdZ
edee   fd       Zed	ed
   ded
   dd fd       ZddededefdZedd       Z xZS )r   Nr=  	containerr:   r&   c                 N    t         |   |       || _        || _        d| _        y)a  
        A wrapper for a "IN" criterion.  This wraps two parts, a term and a container.  The term is the part of the
        expression that is checked for membership in the container.  The container can either be a list or a subquery.


        :param term:
            The term to assert membership for within the container.
        :param container:
            A list or subquery.
        FN)r  r>   r=  r"  _is_negated)r+   r=  r"  r:   r  s       r,   r>   zContainsCriterion.__init__  s(     		" r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr(   )r=  r-   r"  r*   s    r,   r-   zContainsCriterion.nodes_  s@     
99##%%%>>((*** 	&*r  c                 .    | j                   j                  S r(   rB  r*   s    r,   r6   zContainsCriterion.is_aggregate  rC  r7   r\   r!   r]   c                 F    | j                   j                  ||      | _         yr  r=  r`   r_   s      r,   r`   zContainsCriterion.replace_table!       II++M9E	r7   subqueryr  c                     dj                   | j                  j                  di | | j                  j                  dddi|| j                  rdnd      }t        || j                  fi |S )Nz{term} {not_}IN {container}r*  TNOT rO  )r=  r"  not_r)   )r/  r=  r  r"  r$  r   r:   )r+   r*  r  rY  s       r,   r  zContainsCriterion.get_sql/  so    +22""",V,,dnn,,EdEfE++ 3 

  TZZ:6::r7   c                     d| _         y NTr$  r*   s    r,   rk   zContainsCriterion.negate7  s
    r7   r(   )r&   r   )r3   r4   r5   r   r9   r
   rX   r>   r   r"   r-   r  rZ   r6   r   r`   r  rk   r  r  s   @r,   r   r     s    !S !T !(3- !SW ! + +
 &htn & & F8G+< FRYIZ F_r F F; ;c ;c ;    r7   r   c                   ,     e Zd Zd fd	Zd Zd Z xZS )ExistsCriterionc                 H    t         t        |   |       || _        d| _        y NF)r  r2  r>   r"  r$  )r+   r"  r:   r  s      r,   r>   zExistsCriterion.__init__=  s!    ot-e4" r7   c                     dj                   | j                  j                  di || j                  rd      S d      S )Nz{not_}EXISTS {container}r,  rO  )r"  r-  r)   )r/  r"  r  r$  r  s     r,   r  zExistsCriterion.get_sqlB  sM    )00,dnn,,6v6tGWGWV 1 
 	
]_ 1 
 	
r7   c                     d| _         | S r/  r0  r*   s    r,   rk   zExistsCriterion.negateH  s    r7   r(   )r3   r4   r5   r>   r  rk   r  r  s   @r,   r2  r2  <  s    !

r7   r2  c                   j     e Zd Zd	dedededee   def
 fdZdee	   fdZ
edee   fd       Z xZS )
RangeCriterionr=  r   r   r:   r&   c                 N    t         |   |       || _        || _        || _        y r(   )r  r>   r=  r   r   )r+   r=  r   r   r:   r  s        r,   r>   zRangeCriterion.__init__N  s%    	
r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    | j                  j                         E d {    y 7 I7 )7 	wr(   )r=  r-   r   r   r*   s    r,   r-   zRangeCriterion.nodes_T  sX     
99##%%%::$$&&&88??$$$ 	&&$r  c                 .    | j                   j                  S r(   rB  r*   s    r,   r6   zRangeCriterion.is_aggregateZ  rC  r7   r(   )r3   r4   r5   r9   r   r
   rX   r>   r   r"   r-   r  rZ   r6   r  r  s   @r,   r8  r8  M  s_    T # C  Y\ % % &htn & &r7   r8  c                   F    e Zd Zeded   ded   dd fd       ZdedefdZy)	r   r\   r!   r]   r&   c                 F    | j                   j                  ||      | _         yr  r(  r_   s      r,   r`   zBetweenCriterion.replace_table`  r)  r7   r  c           	          dj                   | j                  j                  di | | j                  j                  di | | j                  j                  di |      }t        || j                  fi |S )Nz {term} BETWEEN {start} AND {end}r=  r   r   r)   r/  r=  r  r   r   r   r:   r  s      r,   r  zBetweenCriterion.get_sqln  st    077""",V,$$**$$.v.   *6* 8 

  TZZ:6::r7   N)	r3   r4   r5   r   r
   r`   r   rX   r  r)   r7   r,   r   r   _  sM    F8G+< FRYIZ F_q F F; ; ;r7   r   c                       e Zd ZdedefdZy)r   r  r&   c           	          dj                   | j                  j                  di | | j                  j                  di | | j                  j                  di |      }t        || j                  fi |S )Nz{term} FROM {start} TO {end}r?  r)   r@  r  s      r,   r  zPeriodCriterion.get_sqly  st    ,33""",V,$$**$$.v.   *6* 4 

  TZZ:6::r7   Nr  r)   r7   r,   r   r   x  s    ; ; ;r7   r   c            	            e Zd Zddededee   ddf fdZdee	   fdZ
eded	   d
ed	   dd fd       ZdedefdZ xZS )rq   Nr=  rp   r:   r&   c                 @    t         |   |       || _        || _        y r(   )r  r>   r=  rp   )r+   r=  rp   r:   r  s       r,   r>   zBitwiseAndCriterion.__init__  s    	
r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr(   )r=  r-   rp   r*   s    r,   r-   zBitwiseAndCriterion.nodes_  @     
99##%%%::$$&&& 	&&r  r\   r!   r]   c                 F    | j                   j                  ||      | _         yr  r(  r_   s      r,   r`   z!BitwiseAndCriterion.replace_table  r)  r7   r  c                     dj                   | j                  j                  di || j                        }t	        || j
                  fi |S )Nz({term} & {value}))r=  rp   r)   )r/  r=  r  rp   r   r:   r  s      r,   r  zBitwiseAndCriterion.get_sql  sM    "))""",V,** * 
  TZZ:6::r7   r(   )r3   r4   r5   r9   r   r
   rX   r>   r   r"   r-   r   r`   r  r  r  s   @r,   rq   rq     s    T # hsm t 
' '
 F8G+< FRYIZ F_t F F; ; ;r7   rq   c                        e Zd Zddedee   ddf fdZdee   fdZ	e
ded   d	ed   dd fd
       ZddededefdZ xZS )rh   Nr=  r:   r&   c                 2    t         |   |       || _        y r(   r?  r+   r=  r:   r  s      r,   r>   zNullCriterion.__init__  r  r7   c              #   \   K   |  | j                   j                         E d {    y 7 wr(   r=  r-   r*   s    r,   r-   zNullCriterion.nodes_  !     
99##%%%   ",*,r\   r!   r]   c                 F    | j                   j                  ||      | _         yr  r(  r_   s      r,   r`   zNullCriterion.replace_table  r)  r7   r
  r  c                     dj                   | j                  j                  di |      }t        || j                  fi |S )Nz{term} IS NULLrE  r)   r/  r=  r  r   r:   r  s       r,   r  zNullCriterion.get_sql  sF    %%""",V, & 
  TZZ:6::r7   r(   r  )r3   r4   r5   r9   r
   rX   r>   r   r"   r-   r   r`   rZ   r   r  r  r  s   @r,   rh   rh     s    T (3- 4 & & F8G+< FRYIZ F_n F F;$ ;# ;# ;r7   rh   c                   "    e Zd ZddededefdZy)rn   r
  r  r&   c                     dj                   | j                  j                  di |      }t        || j                  fi |S )Nz{term} IS NOT NULLrE  r)   rR  r  s       r,   r  zNotNullCriterion.get_sql  sF    "))""",V, * 
  TZZ:6::r7   Nr  )r3   r4   r5   rZ   r   rX   r  r)   r7   r,   rn   rn     s    ;$ ;# ;# ;r7   rn   c                   2    e Zd ZddededefdZdedefdZy)	r  subcriterionr  r&   c                 R   dj                  | j                  j                   | j                  j                  dd| j                  | j                        i| | j                  j                  dd| j                  | j                        i|      }|rdj                  |      S |S )Nz{left} {comparator} {right}rV  r   z({criterion}))	criterionr)   )r/  r  rp   r
  r  needs_bracketsr  )r+   rV  r  rY  s       r,   r  zComplexCriterion.get_sql  s    +22,,"""Y0C0CDII0NYRXY$$**$$\$2E2Edjj2Q\U[\ 3 
 "))C)88
r7   r=  c                 Z    t        |t              xr |j                  | j                  k(   S r(   )r0   r  r  r  s     r,   rY  zComplexCriterion.needs_brackets  s%    $ 01\$//T__:\6\\r7   Nr  )	r3   r4   r5   rZ   r   rX   r  r9   rY  r)   r7   r,   r  r    s2    
D 
C 
C 
]4 ]D ]r7   r  c                        e Zd ZdZej
                  ej                  gZddededede	e
   ddf
 fdZdee   fd	Zede	e   fd
       Zede	d   de	d   dd fd       ZdefdZdefdZddedede
fdZ xZS )r   z
    Wrapper for an arithmetic function.  Can be simple with two terms or complex with nested terms. Order of operations
    are also preserved.
    Noperatorr
  r  r:   r&   c                 N    t         |   |       || _        || _        || _        y)a  
        Wrapper for an arithmetic expression.

        :param operator:
            Type: Arithmetic
            An operator for the expression such as {quote}+{quote} or {quote}/{quote}

        :param left:
            The term on the left side of the expression.
        :param right:
            The term on the right side of the expression.
        :param alias:
            (Optional) an alias for the term which can be used inside a select statement.
        :return:
        N)r  r>   r\  r
  r  )r+   r\  r
  r  r:   r  s        r,   r>   zArithmeticExpression.__init__  s'      	 	
r7   c              #      K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr(   )r
  r-   r  r*   s    r,   r-   zArithmeticExpression.nodes_  rF  r  c                 l    t        | j                  j                  | j                  j                  g      S r(   )r   r
  r6   r  r*   s    r,   r6   z!ArithmeticExpression.is_aggregate  s(     $TYY%;%;TZZ=T=T$UVVr7   r\   r!   r]   c                     | j                   j                  ||      | _         | j                  j                  ||      | _        yaP  
        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 term with the tables replaced.
        Nr  r_   s      r,   r`   z"ArithmeticExpression.replace_table  r  r7   c                 B    |y|| j                   v ry|| j                   v S )a  
        Returns true if the expression on the left of the current operator needs to be enclosed in parentheses.

        :param current_op:
            The current operator.
        :param left_op:
            The highest level operator of the left expression.
        F)	add_order)r+   curr_opleft_ops      r,   left_needs_parensz&ArithmeticExpression.left_needs_parens  s,     ?dnn$
 $..((r7   c                 t    |y|t         j                  k(  ry|t         j                  k(  ry|| j                  v S )a  
        Returns true if the expression on the right of the current operator needs to be enclosed in parentheses.

        :param current_op:
            The current operator.
        :param right_op:
            The highest level operator of the right expression.
        FT)r   r   r   rc  )r+   rd  right_ops      r,   right_needs_parensz'ArithmeticExpression.right_needs_parens%  s<     jnn$jnn$
 4>>))r7   r
  r  c                    | j                   | j                  fD cg c]  }t        |dd        c}\  }}dj                  | j                  j
                  | j                  | j                  |      rdndj                   | j                   j                  di |      | j                  | j                  |      rdndj                   | j                  j                  di |            }|rt        || j                  fi |S |S c c}w )Nr\  z{left}{operator}{right}r  z{})r\  r
  r  r)   )r
  r  r  r/  r\  rp   rf  r  ri  r   r:   )r+   r
  r  sidere  rh  arithmetic_sqls          r,   r  zArithmeticExpression.get_sql;  s    JN))UYU_U_I`aI`WT:t<I`a299]](( 224=='J&PT\\!		!!+F+ "44T]]HM6SW__"

"",V, : 
 #NDJJI&II bs   Dr(   r  )r3   r4   r5   r(  r   r   r   rc  r   r
   rX   r>   r   r"   r-   r  rZ   r6   r   r`   rf  ri  r  r  r  s   @r,   r   r     s    
 0I 3 s 8TW= dh *' '
 Whtn W W H8G+< HRYIZ H_u H H)T )**t *,$ # # r7   r   c                        e Zd Zddee   ddf fdZdee   fdZe	dee
   fd       Zedededd fd	       Zed
ed   ded   dd fd       Zededd fd       Zdde
dedefdZ xZS )CaseNr:   r&   c                 B    t         |   |       g | _        d | _        y r  )r  r>   _cases_elser  s     r,   r>   zCase.__init__O  s!    u%
r7   c              #     K   |  | j                   D ]5  \  }}|j                         E d {    |j                         E d {    7 | j                  #| j                  j                         E d {    y y 7 N7 87 
wr(   )rp  r-   rq  r+   rX  r=  s      r,   r-   zCase.nodes_T  st     
#{{OIt ''))){{}$$  + ::!zz((*** " *$ +s3   *BA;BA=/B4A?5B=B?Bc                     t        | j                  D cg c]  \  }}|j                  xs |j                  ! c}}| j                  r| j                  j                  gz         S d gz         S c c}}w r(   )r   rp  r6   rq  rs  s      r,   r6   zCase.is_aggregate^  sx     $PTP[P[\P[_YY##8t'8'88P[\*.**tzz&&?@
 	
:>?@
 	
\s   $A.
rX  r=  c                 \    | j                   j                  || j                  |      f       y r(   )rp  appendrR   rs  s      r,   whenz	Case.whenf  s$    It'9'9$'?@Ar7   r\   r!   r]   c           	         | j                   D cg c])  \  }}|j                  ||      |j                  ||      g+ c}}| _         | j                  r"| j                  j                  ||      | _        yd| _        yc c}}w ra  )rp  r`   rq  )r+   r\   r]   rX  r=  s        r,   r`   zCase.replace_tablej  s    " $(;;

 $/	4 ''yA""=)< $/
 LP::TZZ--mYG
[_

s   .A=c                 2    | j                  |      | _        | S r(   )rR   rq  r  s     r,   else_z
Case.else_  s    ''-
r7   r
  r  c                 H   | j                   st        d      dj                  fd| j                   D              }| j                  r+dj	                   | j                  j
                  di       nd}dj	                  ||      }|rt        || j                  fi S |S )	Nz:At least one 'when' case is required for a CASE statement. c           	   3      K   | ]:  \  }}d j                   |j                  di  |j                  di        < yw)zWHEN {when} THEN {then})rw  thenNr)   )r/  r  )r  rX  r=  r  s      r,   r  zCase.get_sql.<locals>.<genexpr>  sQ      
#.	4 &,,2C)2C2C2Mf2MT`TXT`T`TjciTj,k#.s   A Az ELSE {}rO  zCASE {cases}{else_} END)casesrz  r)   )rp  r   ri  rq  r/  r  r   r:   )r+   r
  r  r  rz  case_sqls     `   r,   r  zCase.get_sql  s    {{ \]] 
#';;
 
 DH::
!!"4$**"4"4">v">?SU,33%u3M#HdjjCFCCr7   r(   r  )r3   r4   r5   r
   rX   r>   r   r"   r-   r  rZ   r6   r   r   rw  r`   rz  r  r  r  s   @r,   rn  rn  N  s    hsm t 
+ + 
htn 
 
 Bc B B B B `8G+< `RYIZ `_e ` `( # &  $ # # r7   rn  c                        e Zd Zddedee   ddf fdZdee   fdZ	dedefdZ
ed	edefd
       Zeded   ded   dd fd       Z xZS )r   Nr=  r:   r&   c                 4    t         |   |       || _        y r  r?  rK  s      r,   r>   zNot.__init__      u%	r7   c              #   \   K   |  | j                   j                         E d {    y 7 wr(   rM  r*   s    r,   r-   z
Not.nodes_  rN  rO  r  c                     d|d<   dj                   | j                  j                  di |      }t        || j                  fi |S )NTrV  z
NOT {term}rE  r)   rR  r  s      r,   r  zNot.get_sql  sJ    !%~!!'8tyy'8'8'B6'B!CTZZ:6::r7   r  c                 l    t        | j                  |      t        j                        sS fd}|S )z
        Delegate method calls to the class wrapped by Not().
        Re-wrap methods on child classes of Term (e.g. isin, eg...) to retain 'NOT <term>' output.
        c                 X     | g|i |}t        |t        f      rt        |      S |S r(   )r0   r9   r   )
inner_selfargsr  result	item_funcs       r,   innerzNot.__getattr__.<locals>.inner  s2    z;D;F;F&4'*6{"Mr7   )r  r=  inspectismethod)r+   r  r  r  s      @r,   __getattr__zNot.__getattr__  s5     DIIt,		*	 r7   r\   r!   r]   c                 F    | j                   j                  ||      | _         yr  r(  r_   s      r,   r`   zNot.replace_table  r)  r7   r(   )r3   r4   r5   r   r
   rX   r>   r   r"   r-   r  r   r  r   r`   r  r  s   @r,   r   r     s    S # $ & &; ; ;
    $ F8G+< FRYIZ F_d F Fr7   r   c                   V     e Zd Zd	dedee   ddf fdZdee   fdZ	dedefdZ
 xZS )
r   Nr=  r:   r&   c                 4    t         |   |       || _        y r  r?  rK  s      r,   r>   zAll.__init__  r  r7   c              #   \   K   |  | j                   j                         E d {    y 7 wr(   rM  r*   s    r,   r-   z
All.nodes_  rN  rO  r  c                     dj                   | j                  j                  di |      }t        || j                  fi |S )Nz
{term} ALLrE  r)   rR  r  s      r,   r  zAll.get_sql  s@    !!'8tyy'8'8'B6'B!CTZZ:6::r7   r(   )r3   r4   r5   r   r
   rX   r>   r   r"   r-   r  r  r  s   @r,   r   r     sD    S # $ & &; ; ;r7   r   c                   H    e Zd Zddedee   ddfdZdededdfd	Zd
 Z	d Z
y)CustomFunctionNr  paramsr&   c                      || _         || _        y r(   )r  r  )r+   r  r  s      r,   r>   zCustomFunction.__init__  s    	r7   r  r  Functionc           
         | j                         s&t        | j                  |j                  d            S  | j                  | s]t        dj                  | j                  dj                  d | j                  D              dj                  d |D                          t        | j                  g|d|j                  d      iS )Nr:   r<   zCFunction {name} require these arguments ({params}), ({args}) passedz, c              3   2   K   | ]  }t        |        y wr(   rX   r  ps     r,   r  z*CustomFunction.__call__.<locals>.<genexpr>  s     $A[SV[   c              3   2   K   | ]  }t        |        y wr(   r  r  s     r,   r  z*CustomFunction.__call__.<locals>.<genexpr>  s     "84a3q64r  )r  r  r  )	_has_paramsr  r  rR  _is_valid_function_callr   r/  ri  r  )r+   r  r  s      r,   __call__zCustomFunction.__call__  s    !DIIVZZ-@AA+t++T2#U\\99$AT[[$AA"84"88 ]   		DDD

70CDDr7   c                     | j                   d uS r(   )r  r*   s    r,   r  zCustomFunction._has_params  s    {{$&&r7   c                 D    t        |      t        | j                        k(  S r(   )r   r  )r+   r  s     r,   r  z&CustomFunction._is_valid_function_call  s    4yC,,,r7   r(   )r3   r4   r5   rX   r
   r   r>   r   r  r  r  r)   r7   r,   r  r    sI    S (8*<  Ec ES EZ E'-r7   r  c                        e Zd Zdedededdf fdZdee   fdZe	de
e   fd       Zed	e
d
   de
d
   dd fd       ZdedefdZed        ZdedefdZdedefdZ xZS )r  r  r  r  r&   Nc                     t         |   |j                  d             || _        |D cg c]  }| j	                  |       c}| _        |j                  d      | _        y c c}w )Nr:   schema)r  r>   rR  r  rR   r  r  )r+   r  r  r  paramr  s        r,   r>   zFunction.__init__  sW    G,-	<@AD5T''.DA	jj* Bs   A"c              #   j   K   |  | j                   D ]  }|j                         E d {     y 7 wr(   )r  r-   r   s     r,   r-   zFunction.nodes_  s+     
99Czz|## #r  c                 f    t        | j                  D cg c]  }|j                   c}      S c c}w )aa  
        This is a shortcut that assumes if a function has a single argument and that argument is aggregated, then this
        function is also aggregated. A more sophisticated approach is needed, however it is unclear how that might work.
        :returns:
            True if the function accepts one argument and that argument is aggregate.
        )r   r  r6   r   s     r,   r6   zFunction.is_aggregate  s+     $$K#S%5%5$KLL$Kr  r\   r!   r]   c                 l    | j                   D cg c]  }|j                  ||       c}| _         yc c}w r  )r  r`   )r+   r\   r]   r  s       r,   r`   zFunction.replace_table  s4     QUPYPYZPYuU((	BPYZ	Zr  c                      y r(   r)   r  s     r,   get_special_params_sqlzFunction.get_special_params_sql  r#  r7   c                 X    t        | d      r | j                  dddi|S t        |       S )Nr  r
  Fr)   hasattrr  rX   )r   r  s     r,   get_arg_sqlzFunction.get_arg_sql  s0    :A#y:Q{s{{6e6v6_WZ[^W__r7   c                        j                   di }dj                   j                  dj                   fd j                  D              |r
d|z         S d      S )Nz{name}({args}{special})rf  c              3      K   | ]8  }t        |d       r |j                  ddddn j                  |fi  : yw)r  FT)r
  r*  Nr)   )r  r  r  )r  r  r  r+   s     r,   r  z,Function.get_function_sql.<locals>.<genexpr>  sX       #A 1i( 		DUTDVD%T%%a2623 #s   >Ar|  rO  )r  r  specialr)   )r  r/  r  ri  r  )r+   r  special_params_sqls   `` r,   get_function_sqlzFunction.get_function_sql  s{    8T88B6B(//  	  3ES-- 0 	
 		
 KM 0 	
 		
r7   c                 l   |j                  dd      }|j                  dd      }|j                  dd       }|j                  dd       }| j                  |||      }| j                  0dj                   | j                  j                  d
||d||	      }|rt        || j                  fd|i|S |S )Nr
  Fr  r  r  )r  r  r  z{schema}.{function})r  r  )r  functionr)   )r  r  r  r/  r  r   r:   )r+   r  r
  r  r  r  function_sqls          r,   r  zFunction.get_sql(  s    ZZe4
$4e<ZZd3
**Y- ,,NWakr,s;;"077*t{{**\j'\U[\% 8 L
 #L$**^^W]^^r7   )r3   r4   r5   rX   r   r>   r   r"   r-   r  r
   rZ   r6   r   r`   r  r  r  r  r  r  r  s   @r,   r  r    s    +S + + + +$ $
 Mhtn M M [8G+< [RYIZ [_i [ [s s  ` `
 
 
  r7   r  c                   \     e Zd ZdZ fdZededdfd       ZdedefdZ	def fd	Z
 xZS )
AggregateFunctionTc                 P    t        t        | 
  |g|i | g | _        d| _        y r4  )r  r  r>   _filters_include_filterr+   r  r  r  r  s       r,   r>   zAggregateFunction.__init__@  s,    /FtFvF$r7   filtersr&   AnalyticFunctionc                 <    d| _         | xj                  |z  c_        y r/  )r  r  )r+   r  s     r,   filterzAggregateFunction.filterF  s    # r7   r  c                     | j                   r>dj                  t        j                  | j                        j
                  di |      S y )NzWHERE {criterions})
criterionsr)   )r  r/  r  r  r  r  r  s     r,   get_filter_sqlz AggregateFunction.get_filter_sqlK  s@    '..)--:V:^:^:hag:h.ii  r7   c                     t        t        | 
  di |} | j                  di |}| j                  r|dj                  |      z  }|S )Nz FILTER({filter_sql}))
filter_sqlr)   )r  r  r  r  r  r/  )r+   r  rY  r  r  s       r,   r  z"AggregateFunction.get_function_sqlO  sT    %t=GG(T((262
*11Z1HHC
r7   )r3   r4   r5   r6   r>   r   r   r  rX   r  r  r  r  s   @r,   r  r  =  sW    L% !s !'9 ! !js js j  r7   r  c                        e Zd ZdZdZdedededdf fdZed	edd fd
       Z	ed	ededd fd       Z
dedee   dedefdZdedefdZdedef fdZ xZS )r  FTr  r  r  r&   Nc                 r    t        |   |g|i | g | _        g | _        g | _        d| _        d| _        y r4  )r  r>   r  
_partition	_orderbysr  _include_overr  s       r,   r>   zAnalyticFunction.__init__]  s?    ///$"r7   r  c                 <    d| _         | xj                  |z  c_        y r/  )r  r  )r+   r  s     r,   overzAnalyticFunction.overe  s    !5 r7   c           	          d| _         | xj                  |D cg c]  }||j                  d      f c}z  c_        y c c}w )NTorder)r  r  rR  )r+   r  r  r=  s       r,   orderbyzAnalyticFunction.orderbyj  s8    !5I54D&**W"565IIIs   =r  orientc                     | |j                   di |S dj                   |j                   di ||j                        S )Nz{field} {orient})r  r  r)   )r  r/  rp   )r+   r  r  r  s       r,   _orderby_fieldzAnalyticFunction._orderby_fieldo  sK    > 5==*6**!((%--)&)<< ) 
 	
r7   c                 j    g } j                   rC|j                  dj                  dj                  fd j                   D                            j                  rD|j                  dj                  dj                   fd j                  D                           dj                  |      S )	NzPARTITION BY {args}rf  c              3   p   K   | ]-  }t        |d       r |j                  di n
t        |       / yw)r  Nr)   r  )r  r  r  s     r,   r  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>}  s8     !tds_`I9N)!))"5f"5TWXYTZ"Zdss   36)r  zORDER BY {orderby}c              3   L   K   | ]  \  }} j                   ||fi   y wr(   )r  )r  r  r  r  r+   s      r,   r  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  s0     $vguVcV[]c%8T%8%8%Q&%Qgus   !$)r  r|  )r  rv  r/  ri  r  )r+   r  r  s   `` r,   get_partition_sqlz"AnalyticFunction.get_partition_sqlx  s    ??LL%,,!tdhdsds!tt -  >>LL$++HH$vgkgugu$vv ,  xxr7   c                     t        t        | 
  di |} | j                  di |}|}| j                  r|dj                  |      z  }|S )Nz OVER({partition_sql}))partition_sqlr)   )r  r  r  r  r  r/  )r+   r  r  r  rY  r  s        r,   r  z!AnalyticFunction.get_function_sql  sY    -tEOO...88+222OOC
r7   )r3   r4   r5   r6   is_analyticrX   r   r>   r   r  r  rE   r
   r   r  r  r  r  r  s   @r,   r  r  Y  s    LK#S # # # # !3 !#5 ! ! Jc JS J5G J J
E 
8E? 
c 
VY 
# # $   r7   r  EdgeT WindowFrameAnalyticFunction.Edgec                        e Zd Z G d d      Zdedededdf fdZd	ed
edee   ddfdZ	e
dd
eeef   dee   dd fd       Ze
dd
eeef   dee   dd fd       ZdefdZdedef fdZ xZS )WindowFrameAnalyticFunctionc                   :    e Zd Zddeeeef      ddfdZdefdZy)r  Nrp   r&   c                     || _         y r(   r  rs   s     r,   r>   z)WindowFrameAnalyticFunction.Edge.__init__  s	    DJr7   c                 X    dj                  | j                  xs d| j                        S )Nz{value} {modifier}	UNBOUNDED)rp   modifier)r/  rp   r  r*   s    r,   r  z(WindowFrameAnalyticFunction.Edge.__str__  s-    '..jj/K /  r7   r(   )	r3   r4   r5   r
   r   rX   rY   r>   r  r)   r7   r,   Edgez WindowFrameAnalyticFunction.Edge  s.    	(5c?"; 	t 		S 	r7   r  r  r  r  r&   Nc                 H    t        |   |g|i | d | _        d | _        y r(   )r  r>   framer$   r  s       r,   r>   z$WindowFrameAnalyticFunction.__init__  s(    ///

r7   r  r$   	and_boundc                 |    | j                   s| j                  r
t               || _         |r
||f| _        y || _        y r(   )r  r$   AttributeError)r+   r  r$   r  s       r,   _set_frame_and_boundsz1WindowFrameAnalyticFunction._set_frame_and_bounds  s3    :: ""
+4eY'
%
r7   c                 *    | j                  d||       y )NROWSr  r+   r$   r  s      r,   rowsz WindowFrameAnalyticFunction.rows  s    ""65)<r7   c                 *    | j                  d||       y )NRANGEr  r  s      r,   rangez!WindowFrameAnalyticFunction.range  s    ""7E9=r7   c                     t        | j                  t              s'dj                  | j                  | j                        S | j                  \  }}dj                  | j                  ||      S )Nz{frame} {bound})r  r$   z#{frame} BETWEEN {lower} AND {upper})r  r   r   )r0   r$   rP   r/  r  r   s      r,   get_frame_sqlz)WindowFrameAnalyticFunction.get_frame_sql  s`    $**e,$++$**DJJ+OOzzu4;;** < 
 	
r7   c                     t        t        | 
  di |}| j                  s| j                  s|S dj                  || j                               S )Nz{over} {frame})r  r  r)   )r  r  r  r  r$   r/  r  )r+   r  r  r  s      r,   r  z-WindowFrameAnalyticFunction.get_partition_sql  sK    94R\U[\zz$**  &&MASASAU&VVr7   r(   )r3   r4   r5   r  rX   r   r>   r
   r  r  r   r   r  r  r  r  r  r  s   @r,   r  r    s     S    
@3 @s @xPU @[_ @ =%U
+ = =Sp = = >5e, >% >Tq > >	
s 	
W# W# W Wr7   r  c                   X     e Zd Zdedededdf fdZed	d       Zdedee   fdZ	 xZ
S )
IgnoreNullsAnalyticFunctionr  r  r  r&   Nc                 :    t        |   |g|i | d| _        y r4  )r  r>   _ignore_nullsr  s       r,   r>   z$IgnoreNullsAnalyticFunction.__init__  s"    ///"r7   c                     d| _         y r/  r  r*   s    r,   ignore_nullsz(IgnoreNullsAnalyticFunction.ignore_nulls  s
    !r7   c                     | j                   ryy )NzIGNORE NULLSr  r  s     r,   r  z2IgnoreNullsAnalyticFunction.get_special_params_sql  s    ! r7   )r&   r  )r3   r4   r5   rX   r   r>   r   r  r
   r  r  r  s   @r,   r  r    sO    #S # # # # " "s x} r7   r  c                   $   e Zd Zej                  dej
                  dej                  dej                  dej                  diZ	g dZ
g dZ ej                  d      Z	 	 	 	 	 	 	 	 	 	 ddeded	ed
ededededededee   fdZdefdZdedefdZy)rS   INTERVAL '{expr} {unit}'zINTERVAL '{expr}' {unit}yearsmonthsdayshoursminutessecondsmicroseconds)YEARMONTHDAYHOURMINUTESECONDMICROSECONDz6(^0+\.)|(\.0+$)|(^[0\-.: ]+[\-: ])|([\-:. ][0\-.: ]+$)Nr  r  r  r  r  r	  r
  quartersweeksr  c                 V   |
| _         d | _        d | _        d| _        |r|| _        y |	r|	| _        y t        | j                  | j                  |||||||g      D ]N  \  }}}|s
t        |      }t        | |t        |             | j                  || _        |dk  | _        || _        P y )NFr   )r  largestsmallestis_negativer  r  zipunitslabelsrY   setattrabs)r+   r  r  r  r  r  r	  r
  r  r  r  unitlabelrp   	int_values                  r,   r>   zInterval.__init__  s      $DMDJ"%JJKKFD%'<H#
D%
 J	dC	N3<<'#(DL'01}D$ %#
r7   r&   c                 "    | j                         S r(   r  r*   s    r,   r  zInterval.__str__  s    ||~r7   r  c                    | j                   xs |j                  d      }| j                  dk(  rt        | d      }d}nt	        | d      rt        | d      }d}nt	        | d      rt        | d      }d}ndj                  t        | d	d
      t        | dd
      t        | dd
      t        | dd
      t        | dd
      t        | dd
      t        | dd
            }| j                  j                  d|      }| j                  rd|z   }| j                  | j                  k7  r'dj                  | j                  | j                        n| j                  }|d}| j                  j                  |d      j                  ||      S )Nr  r  r
  r  QUARTERr  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}r  r   r  r  r  r  r	  r  rO  -z{largest}_{smallest})r  r  r  r  )r   r  )r  rR  r  r  r  r/  trim_patternr   r  r  	templates)r+   r  r  r   r  s        r,   r  zInterval.get_sql  s~   ,,7&**Y"7<<=(40D DT:&4,DDT7#4)DD X^^dGQ/tXq1T61-dGQ/i3i3$T>1= _ D $$((T2DTz <<4==0	 '-- LL!]] . 
 \\  |~~!!'+EFMMSW^bMccr7   )
r   r   r   r   r   r   r   r   r   N)r3   r4   r5   r   r  r  VERTICAORACLEMYSQLr&  r  r  recompiler%  rY   r
   r>   rX   r  r   r  r)   r7   r,   rS   rS     s    	75432I WEPF2::WXL &*%&%& %& 	%&
 %& %& %& %& %& %& (#%&N +d +d +dr7   rS   c            	       8     e Zd Zddededee   ddf fdZ xZS )r   Nr=  exponentr:   r&   c                 ,    t         |   d|||       y )NPOWr<   r  )r+   r=  r-  r:   r  s       r,   r>   zPow.__init__E  s    he<r7   r(   	r3   r4   r5   r9   floatr
   rX   r>   r  r  s   @r,   r   r   D  s.    =T =U =8C= =TX = =r7   r   c            	       8     e Zd Zddededee   ddf fdZ xZS )r   Nr=  modulusr:   r&   c                 ,    t         |   d|||       y )NMODr<   r  )r+   r=  r3  r:   r  s       r,   r>   zMod.__init__J  s    gU;r7   r(   r0  r  s   @r,   r   r   I  s.    <T <E <(3- <SW < <r7   r   c                   (     e Zd Zdeddf fdZ xZS )Rollupr  r&   Nc                 &    t        |   dg|  y )NROLLUPr  )r+   r  r  s     r,   r>   zRollup.__init__O  s    *E*r7   r  r  s   @r,   r7  r7  N  s    +s +t + +r7   r7  c                   <     e Zd ZdZdeddf fdZdedefdZ xZS )PseudoColumnz
    Represents a pseudo column (a "column" which yields a value when selected
    but is not actually a real table column).
    r  r&   Nc                 4    t         |   d        || _        y r  r  )r+   r  r  s     r,   r>   zPseudoColumn.__init__Y  s    t$	r7   r  c                     | j                   S r(   )r  r  s     r,   r  zPseudoColumn.get_sql]  s    yyr7   )	r3   r4   r5   r(  rX   r>   r   r  r  r  s   @r,   r;  r;  S  s.    
S T   r7   r;  c                   .     e Zd ZdZdZd fd	Zd Z xZS )
AtTimezonez|
    Generates AT TIME ZONE SQL.
    Examples:
        AT TIME ZONE 'US/Eastern'
        AT TIME ZONE INTERVAL '-06:00'
    Nc                     t         |   |       t        |t              st        |      n|| _        || _        || _        y r(   )r  r>   r0   rE   r  zoneinterval)r+   r  rA  rB  r:   r  s        r,   r>   zAtTimezone.__init__k  s4    )3E5)AU5\u
	 r7   c                     dj                   | j                  j                  di || j                  rdnd| j                        }t        || j                  fi |S )Nz&{name} AT TIME ZONE {interval}'{zone}'z	INTERVAL rO  )r  rB  rA  r)   )r/  r  r  rB  rA  r   r:   r  s      r,   r  zAtTimezone.get_sqlq  sY    8??###-f-$(MM[r @ 

  TZZ:6::r7   )FN)r3   r4   r5   r(  r6   r>   r  r  r  s   @r,   r?  r?  a  s     L!;r7   r?  )^r  r*  rU  datetimer   enumr   typingr   r   r   r   r	   r
   r   r   r   r   r   pypika.enumsr   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r   r   pypika.queriesr   r    r!   
__author__	__email__r"   r#   r9   r  r!  r*  r3  r6  r:  r   rL   rT   r  rI   rN   r  r  r  rE   r  r  rK   rJ   r  r  rb   r   r2  r8  r   r   rq   rh   rn   r  r   rn  r   r   r  r  r  r  r  r  r  rS   r   r   r7  r;  r?  r)   r7   r,   <module>rL     s    	    n n n n l l l   >> 
	 	v&J Jx$4 x$v% %Y Ey EEY Ei H	 H
Bt 
B"R4 "RJ?O4 ?ODcT cC4 C( (
/l /
$ $@Y "-It -`4D 45 &_I _B	;E 	;e 
7i 7t4Y 4n2 	 2 ji "&Y &$;~ ;2;n ;;) ;B;I ;<;} ;]~ ]"q4 qhE9 EP-F) -F`;) ;- -6Ky K\ 89( 9x 	AB0W"2 0Wf"2 "edt edP=( =
<( <
+X +
4 ; ;r7   