
    Wia                       d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZmZ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&ejL                  d	k  rd d
l'm(Z( nd d
lm(Z( d dl)m*Z*m+Z+m,Z, dZ-dZ. edd      Z/ G d d      Z0 G d de0      Z1ddZ2ddZ3 G d de1      Z4 G d de4      Z5 G d de4      Z6 G d de5      Z7 G d de5      Z8 G d  d!e5      Z9 G d" d#e6      Z: G d$ d%e6      Z; G d& d'e1      Z< G d( d)e1      Z= G d* d+e=      Z> G d, d-e1      Z? G d. d/e1      Z@ G d0 d1e1      ZA G d2 d3eA      ZB G d4 d5eA      ZC G d6 d7e1      ZD G d8 d9eD      ZE G d: d;eDe?      ZF G d< d=e1      ZG G d> d?eF      ZH G d@ dAeD      ZI G dB dCeI      ZJ G dD dEeI      ZK G dF dGeD      ZL G dH dIeD      ZM G dJ dKeD      ZN G dL dMeD      ZO G dN dOeD      ZP G dP dQeP      ZQ G dR dSeP      ZR G dT dUeD      ZS G dV dWeD      ZT G dX dYeD      ZU G dZ d[eU      ZV G d\ d]eM      ZW G d^ d_e1      ZX G d` daeD      ZY G db dceD      ZZ G dd deeD      Z[ G df dg      Z\ G dh dieD      Z] G dj dke]      Z^ G dl dme^      Z_ edndo      Z` G dp dqe_      Za G dr dse_      Zb G dt due1      Zc G dv dwe]      Zd G dx dye]      Ze G dz d{e]      Zf G d| d}e1      Zg G d~ de1      Zhy)    )annotationsN)CallableIterableIteratorSequence)datedatetimetime)Enum)TYPE_CHECKINGAnyTypeVaroverload)
ArithmeticBoolean
ComparatorDialectsEqualityJSONOperatorsMatchingOrder)CaseExceptionFunctionExceptionbuilderformat_alias_sqlformat_quotesignore_copyresolve_is_aggregate)      )Self)QueryBuilder
SelectableTablezTimothy Heysztheys@kayak.comNodeTNode)boundc                       e Zd ZdZddZddZy)r&   Nc              #     K   |  y wN selfs    V/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/pypika/terms.pynodes_zNode.nodes_)   s     
s   c                b    | j                         D cg c]  }t        ||      s| c}S c c}w r*   )r/   
isinstance)r-   typenodes      r.   find_z
Node.find_,   s%    !%I*T42HIIIs   ,,returnzIterator[NodeT])r2   ztype[NodeT]r6   zlist[NodeT])__name__
__module____qualname__is_aggregater/   r4   r+       r.   r&   r&   &   s    LJr;   c                  F   e Zd ZdZdBdCdZedDd       ZedEd       ZdFdZ	e
	 dB	 	 	 dGd       Ze
	 dB	 	 	 dHd       ZdId	ZdJd
ZdKdZdLdZdMdZdNdZdOdZdJdZdJdZdJdZdJdZdJdZdPdZdPdZdPdZdPdZdPdZdPdZdQdZdQdZ dRdZ!dSdZ"dPdZ#dTd Z$dUd!Z%dUd"Z&dQd#Z'dLd$Z(dVd%Z)dVd&Z*dLd'Z+dWd(Z,dXd)Z-dVd*Z.dVd+Z/dVd,Z0dVd-Z1dYd.Z2dZd/Z3dVd0Z4dVd1Z5dVd2Z6dVd3Z7dVd4Z8dVd5Z9dVd6Z:dVd7Z;dJd8Z<dJd9Z=dJd:Z>dJd;Z?dJd<Z@dJd=ZAd[d>ZBd\d?ZCd]d@ZDd^dAZEy)_TermFNc                    || _         y r*   aliasr-   r@   s     r.   __init__zTerm.__init__3   s	    
r;   c                    || _         y r*   r?   rA   s     r.   as_zTerm.as_6   s	    
r;   c                B    ddl m} t        | j                  |            S )Nr   r$   )pypikar$   setr4   )r-   r$   s     r.   tables_zTerm.tables_:   s     4::e$%%r;   c                >    t        | j                  t                    S r*   )rH   r4   Fieldr,   s    r.   fields_zTerm.fields_@   s    4::e$%%r;   c                    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.

        )r1   r&   	NullValuelistArraytupleTupleValueWrapper)valwrapper_clss     r.   wrap_constantzTerm.wrap_constantC   s_    & c4 J;;c4 #;c5!#; "1\3r;   c                    ddl m} t        | t        |f      r| S | 
t	               S t        | t
        t        t        f      r|xs t        } ||       S t        |       S )N   )r"   )
queriesr"   r1   r=   rN   strintboolrS   JSON)rT   rU   r"   s      r.   	wrap_jsonzTerm.wrap_jsonc   sX     	*cD,/0J;;cCd+,%5Ks##Cyr;   c                    | 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-   current_table	new_tables      r.   replace_tablezTerm.replace_tables   s	     r;   c                    | |k(  S r*   r+   r-   others     r.   eqzTerm.eq       u}r;   c                    t        |       S r*   )NullCriterionr,   s    r.   isnullzTerm.isnull   s    T""r;   c                >    | j                         j                         S r*   )rk   negater,   s    r.   notnullzTerm.notnull   s    {{}##%%r;   c                    t        |       S r*   )NotNullCriterionr,   s    r.   	isnotnullzTerm.isnotnull   s    %%r;   c                8    t        | | j                  |            S r*   )BitwiseAndCriterionrV   r-   values     r.   
bitwiseandzTerm.bitwiseand   s    "4););E)BCCr;   c                8    t        | | j                  |            S r*   )BitwiseOrCriterionrV   rt   s     r.   	bitwiseorzTerm.bitwiseor   s    !$(:(:5(ABBr;   c                    | |kD  S r*   r+   re   s     r.   gtzTerm.gt       e|r;   c                    | |k\  S r*   r+   re   s     r.   gtezTerm.gte   rh   r;   c                    | |k  S r*   r+   re   s     r.   ltzTerm.lt   r|   r;   c                    | |k  S r*   r+   re   s     r.   ltezTerm.lte   rh   r;   c                    | |k7  S r*   r+   re   s     r.   nezTerm.ne   rh   r;   c                V    t        t        j                  | | j                  |            S r*   )BasicCriterionr   globrV   r-   exprs     r.   r   z	Term.glob        hmmT43E3Ed3KLLr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   likerV   r   s     r.   r   z	Term.like   r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   not_likerV   r   s     r.   r   zTerm.not_like   s"    h//t7I7I$7OPPr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   ilikerV   r   s     r.   r   z
Term.ilike        hnndD4F4Ft4LMMr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   	not_ilikerV   r   s     r.   r   zTerm.not_ilike   s"    h00$8J8J48PQQr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   rlikerV   r   s     r.   r   z
Term.rlike   r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   regexrV   r-   patterns     r.   r   z
Term.regex   s     hnndD4F4Fw4OPPr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   regexprV   r   s     r.   r   zTerm.regexp   s     hootT5G5G5PQQr;   c                X    t        | | j                  |      | j                  |            S r*   )BetweenCriterionrV   r-   loweruppers      r.   betweenzTerm.between   s(    d&8&8&?ASASTYAZ[[r;   c                X    t        | | j                  |      | j                  |            S r*   )PeriodCriterionrV   )r-   startends      r.   from_tozTerm.from_to   s(    tT%7%7%>@R@RSV@WXXr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   as_ofrV   r   s     r.   r   z
Term.as_of   r   r;   c                    t        |       S r*   )Allr,   s    r.   all_z	Term.all_       4yr;   c                    t        |t        t        t        t        f      r/t        | t        |D cg c]  }| j                  |       c}       S t        | |      S c c}w r*   )r1   rO   rQ   rH   	frozensetContainsCriterionrR   rV   )r-   argru   s      r.   isinz	Term.isin   sR    cD%i89$T5Z]2^QV43E3Ee3L2^+_`` s++ 3_s   Ac                @    | j                  |      j                         S r*   )r   rm   r-   r   s     r.   notinz
Term.notin   s    yy~$$&&r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   	bin_regexrV   r   s     r.   r   zTerm.bin_regex   s"    h00$8J8J78STTr;   c                    t        |       S r*   Notr,   s    r.   rm   zTerm.negate   r   r;   c                    | |z  S r*   r+   re   s     r.   lshiftzTerm.lshift   rh   r;   c                    | |z	  S r*   r+   re   s     r.   rshiftzTerm.rshift   rh   r;   c                    t        |       S r*   r   r,   s    r.   
__invert__zTerm.__invert__   r   r;   c                    | S r*   r+   r,   s    r.   __pos__zTerm.__pos__       r;   c                    t        |       S r*   )Negativer,   s    r.   __neg__zTerm.__neg__   s    ~r;   c                V    t        t        j                  | | j                  |            S r*   ArithmeticExpressionr   addrV   re   s     r.   __add__zTerm.__add__        #JNND$:L:LU:STTr;   c                V    t        t        j                  | | j                  |            S r*   r   r   subrV   re   s     r.   __sub__zTerm.__sub__   r   r;   c                V    t        t        j                  | | j                  |            S r*   r   r   mulrV   re   s     r.   __mul__zTerm.__mul__   r   r;   c                V    t        t        j                  | | j                  |            S r*   r   r   divrV   re   s     r.   __truediv__zTerm.__truediv__   r   r;   c                    t        | |      S r*   )Powre   s     r.   __pow__zTerm.__pow__       4r;   c                    t        | |      S r*   )Modre   s     r.   __mod__zTerm.__mod__   r   r;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __radd__zTerm.__radd__        #JNND4F4Fu4MtTTr;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __rsub__zTerm.__rsub__   r   r;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __rmul__zTerm.__rmul__   r   r;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __rtruediv__zTerm.__rtruediv__   r   r;   c                V    t        t        j                  | | j                  |            S r*   r   r   r   rV   re   s     r.   
__lshift__zTerm.__lshift__  #    #J$5$5tT=O=OPU=VWWr;   c                V    t        t        j                  | | j                  |            S r*   r   r   r   rV   re   s     r.   
__rshift__zTerm.__rshift__  r   r;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __rlshift__zTerm.__rlshift__  #    #J$5$5t7I7I%7PRVWWr;   c                V    t        t        j                  | j                  |      |       S r*   r   re   s     r.   __rrshift__zTerm.__rrshift__
  r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   rg   rV   re   s     r.   __eq__zTerm.__eq__       hkk41C1CE1JKKr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   r   rV   re   s     r.   __ne__zTerm.__ne__  r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   r{   rV   re   s     r.   __gt__zTerm.__gt__  r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   r~   rV   re   s     r.   __ge__zTerm.__ge__       hllD$2D2DU2KLLr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   r   rV   re   s     r.   __lt__zTerm.__lt__  r   r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   r   rV   re   s     r.   __le__zTerm.__le__  r   r;   c                    t        |t              st        d      | j                  |j                  |j
                        S )Nz"Field' object is not subscriptable)r1   slice	TypeErrorr   r   stop)r-   items     r.   __getitem__zTerm.__getitem__  s1    $&@AA||DJJ		22r;   c                (    | j                  dd      S )N"'
quote_charsecondary_quote_charget_sqlr,   s    r.   __str__zTerm.__str__$  s    ||s|EEr;   c                :    t        | j                  dd            S )NT)
with_aliaswith_namespace)hashr  r,   s    r.   __hash__zTerm.__hash__'  s    DLLDLFGGr;   c                    t               r*   NotImplementedErrorr-   kwargss     r.   r  zTerm.get_sql*      !##r;   r*   r@   
str | Noner6   None)r@   rZ   r6   r  )r6   z
set[Table]r6   z
set[Field])rU   ztype[Term] | Noner6   z@ValueError | NodeT | LiteralValue | Array | Tuple | ValueWrapper)rT   z-Term | QueryBuilder | None | str | int | boolr6   z5Term | QueryBuilder | NullValue | ValueWrapper | JSON)ra   Table | Nonerb   r   r6   r=   rf   r   r6   r   )r6   rj   )r6   r   )r6   rp   )ru   r[   r6   rs   )ru   r[   r6   rx   )r   rZ   r6   r   )r   rZ   r6   r   )r   r   r   r   r6   r   )r   r   r   r   r6   r   )r6   r   )r   z%list | tuple | set | frozenset | Termr6   r   )rf   r   r6   r   )r6   r=   )r6   r   )rf   r   r6   r   )rf   r   r6   r   )r  r  r6   r   r6   rZ   )r6   r[   r  r   r6   rZ   )Fr7   r8   r9   r:   rB   r   rD   propertyrI   rL   staticmethodrV   r^   rc   rg   rk   rn   rq   rv   ry   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   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=   0   s   L   & &
& .2 + 	I   > HL:	> #&&DCMMQNRNQR\YN,
'UUUUU  UUUUXXXXLLLMLM3
FH$r;   r=   c                    t        | dz         S NrX   rZ   idxs    r.   idx_placeholder_genr+  .  s    sQw<r;   c                    d| dz    S )NparamrX   r+   r)  s    r.   named_placeholder_genr.  2  s    37)r;   c                  L     e Zd ZdZd fdZed        ZddZd	dZd
dZ	 xZ
S )	ParameterNc                0    t         |           || _        y r*   )superrB   _placeholderr-   placeholder	__class__s     r.   rB   zParameter.__init__9  s    'r;   c                    | j                   S r*   )r3  r,   s    r.   r5  zParameter.placeholder=  s       r;   c                ,    t        | j                        S r*   )rZ   r5  r  s     r.   r  zParameter.get_sqlA  s    4##$$r;   c                     y r*   r+   )r-   	param_keyparam_valuer  s       r.   update_parameterszParameter.update_parametersD      r;   c                    |S r*   r+   r-   r5  r  s      r.   get_param_keyzParameter.get_param_keyG  s    r;   )r5  	str | intr6   r  r#  )r:  r   r;  r   r5  r   )r7   r8   r9   r:   rB   r$  r5  r  r<  r@  __classcell__r6  s   @r.   r0  r0  6  s0    L( ! !%r;   r0  c                  D     e Zd Zefd fdZedd       Zd ZddZ xZ	S )ListParameterc                D    t         |   |       t               | _        y Nr5  )r2  rB   rO   _parametersr4  s     r.   rB   zListParameter.__init__L      [16r;   c                    t        | j                        r$| j                  t        | j                              S t	        | j                        S r*   callabler3  lenrJ  rZ   r,   s    r.   r5  zListParameter.placeholderP  =    D%%&$$S)9)9%:;;4$$%%r;   c                    | j                   S r*   rJ  r  s     r.   get_parameterszListParameter.get_parametersW      r;   c                :    | j                   j                  |       y r*   )rJ  appendr-   ru   r  s      r.   r<  zListParameter.update_parametersZ  s    &r;   r5  z str | int | Callable[[int], str]r6   r  r"  ru   r   )
r7   r8   r9   r+  rB   r$  r5  rS  r<  rC  rD  s   @r.   rF  rF  K  s)    GZ " & & 'r;   rF  c                  L     e Zd Zefd fdZedd       Zd ZddZd	dZ	 xZ
S )
DictParameterc                D    t         |   |       t               | _        y rH  )r2  rB   dictrJ  r4  s     r.   rB   zDictParameter.__init___  rK  r;   c                    t        | j                        r$| j                  t        | j                              S t	        | j                        S r*   rM  r,   s    r.   r5  zDictParameter.placeholderc  rP  r;   c                    | j                   S r*   rR  r  s     r.   rS  zDictParameter.get_parametersj  rT  r;   c                    |dd  S r'  r+   r?  s      r.   r@  zDictParameter.get_param_keym  s    12r;   c                "    || j                   |<   y r*   rR  )r-   r:  ru   r  s       r.   r<  zDictParameter.update_parametersp  s    &+#r;   rX  r"  rB  )r:  r   ru   r   )r7   r8   r9   r.  rB   r$  r5  rS  r@  r<  rC  rD  s   @r.   r[  r[  ^  s.    G\ " & & ,r;   r[  c                      e Zd Zd Zy)QmarkParameterc                     y)N?r+   r  s     r.   r  zQmarkParameter.get_sqlu  s    r;   Nr7   r8   r9   r  r+   r;   r.   rc  rc  t  s    r;   rc  c                      e Zd ZdZddZy)NumericParameterz0Numeric, positional style, e.g. ...WHERE name=:1c                :    dj                  | j                        S Nz:{placeholder}rI  formatr5  r  s     r.   r  zNumericParameter.get_sql|      &&43C3C&DDr;   Nr#  r7   r8   r9   __doc__r  r+   r;   r.   rh  rh  y  s    :Er;   rh  c                      e Zd ZdZddZy)FormatParameterz1ANSI C printf format codes, e.g. ...WHERE name=%sc                     y)Nz%sr+   r  s     r.   r  zFormatParameter.get_sql  s    r;   Nr#  rn  r+   r;   r.   rq  rq    s
    ;r;   rq  c                      e Zd ZdZddZy)NamedParameterz%Named style, e.g. ...WHERE name=:namec                :    dj                  | j                        S rj  rk  r  s     r.   r  zNamedParameter.get_sql  rm  r;   Nr#  rn  r+   r;   r.   rt  rt    s    /Er;   rt  c                       e Zd ZdZddZddZy)PyformatParameterz9Python extended format codes, e.g. ...WHERE name=%(name)sc                :    dj                  | j                        S )Nz%({placeholder})srI  rk  r  s     r.   r  zPyformatParameter.get_sql  s    "))d6F6F)GGr;   c                    |dd S )N   r+   r?  s      r.   r@  zPyformatParameter.get_param_key  s    1R  r;   Nr#  rB  )r7   r8   r9   ro  r  r@  r+   r;   r.   rw  rw    s    CH!r;   rw  c                  :     e Zd Zd fdZedd       ZddZ xZS )r   c                0    t         |           || _        y r*   r2  rB   termr-   r  r6  s     r.   rB   zNegative.__init__  s    	r;   c                .    | j                   j                  S r*   r  r:   r,   s    r.   r:   zNegative.is_aggregate      yy%%%r;   c                Z    dj                   | j                  j                  di |      S )Nz-{term}r  r+   )rl  r  r  r  s     r.   r  zNegative.get_sql  s+    %6TYY%6%6%@%@AAr;   )r  r=   r6   r  r6   zbool | Noner#  )r7   r8   r9   rB   r$  r:   r  rC  rD  s   @r.   r   r     s"     & &Br;   r   c                  j     e Zd ZdZdd fdZd	dZed
d       ZddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 xZ
S )rS   Nc                2    t         |   |       || _        y r*   r2  rB   ru   r-   ru   r@   r6  s      r.   rB   zValueWrapper.__init__      
r;   c                <     | j                   | j                  fi |S r*   )get_formatted_valueru   r  s     r.   get_value_sqlzValueWrapper.get_value_sql  s    't''

=f==r;   c                ^   |j                  d      xs d}t        |t              r |j                  di |S t        |t              r | j
                  |j                  fi |S t        |t        t        t        f      r! | j
                  |j                         fi |S t        |t              rt        ||      S t        |t              rt        j                  t        |            S t        |t        j                         r | j
                  t        |      fi |S |yt        |      S )Nr   nullr+   )getr1   r=   r  r   r  ru   r   r	   r
   	isoformatrZ   r   r\   r   uuidUUID)clsru   r  r  s       r.   r  z ValueWrapper.get_formatted_value  s    ZZ 67=2
eT" 5==*6**eT"*3**5;;A&AAedHd34*3**5??+<GGGeS! 
33eT"99SZ((eTYY'*3**3u:@@@=5zr;   c                R     |j                   di |}|j                  |      }||fS NrI  r+   )r  r@  r-   	parameterr  	param_sqlr:  s        r.   _get_param_datazValueWrapper._get_param_data  s5    %I%%//	++	+B	)##r;   c                l   |. | j                   d||d|}t        || j                  fd|i|S t        | j                  t
        t        f      r| j                  }n | j                   dd|i|} | j                  |fi |\  }} |j                  d||d| t        || j                  fd|i|S )Nr  r  )r:  ru   r+   )	r  r   r@   r1   ru   r[   floatr  r<  )	r-   r  r  r  r  sql	value_sqlr  r:  s	            r.   r  zValueWrapper.get_sql  s     $$$$p
QepiopC#CU
UfUU djj3,/

I***KjKFKI3t33IHH	9#	##SiySFS	4::W*WPVWWr;   r*   ru   r   r@   r  r6   r  r#  rY  r  r0  r6   ztuple[str, str])Nr
  N)
r  r  r  rZ   r  r0  r  r   r6   rZ   )r7   r8   r9   r:   rB   r  classmethodr  r  r  rC  rD  s   @r.   rS   rS     sq    L>  &$ "&$'#	XX "X 	X
 X 
Xr;   rS   c                  *     e Zd Zdd fdZddZ xZS )ParameterValueWrapperc                4    t         |   ||       || _        y r*   )r2  rB   
_parameter)r-   r  ru   r@   r6  s       r.   rB   zParameterValueWrapper.__init__  s    &#r;   c                z     | j                   j                  di |}| j                   j                  |      }||fS r  )r  r  r@  r  s        r.   r  z%ParameterValueWrapper._get_param_data  s=    +DOO++5f5	OO11i1H	)##r;   r*   )r  r0  ru   r   r@   r  r6   r  r  )r7   r8   r9   rB   r  rC  rD  s   @r.   r  r    s    $$r;   r  c                       e Zd ZU dZded<   dd fdZddZddZddZe	ddd       Z
ddd	Zdd
ZddZddZddZddZddZddZddZddZ xZS ) r]   Nstr | Selectable | Nonetablec                2    t         |   |       || _        y r*   r  r  s      r.   rB   zJSON.__init__  r  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*   )r1   r]  _get_dict_sqlrO   _get_list_sqlrZ   _get_str_sqlrW  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r;   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})keyru   r  {,})itemsrl  r  join)r-   ru   r  kvpairss         r.   r  zJSON._get_dict_sql  s     
1 ""'>t'>'>q'KF'KSjSWSjSjklSwpvSw"x
 
 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 )Nr  [r  ])r  r  )r-   ru   r  r  r  s        r.   r  zJSON._get_list_sql  sL    ?DE!(((5f5EEwwSXXe_c233 Fs   Ac                    t        | |      S r*   )r   )ru   r  r  s      r.   r  zJSON._get_str_sql  s    UJ//r;   c                z    t        | j                  | j                        |      }t        || j                  fi |S r*   )r   r  ru   r   r@   )r-   r  r  r  s       r.   r  zJSON.get_sql
  s4    D33DJJ?AUVTZZ:6::r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   GET_JSON_VALUErV   r-   key_or_indexs     r.   get_json_valuezJSON.get_json_value  #    m::D$BTBTUaBbccr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   GET_TEXT_VALUErV   r  s     r.   get_text_valuezJSON.get_text_value  r  r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   GET_PATH_JSON_VALUEr^   r-   	path_jsons     r.   get_path_json_valuezJSON.get_path_json_value  !    m??t~~V_G`aar;   c                V    t        t        j                  | | j                  |            S r*   )r   r   GET_PATH_TEXT_VALUEr^   r  s     r.   get_path_text_valuezJSON.get_path_text_value  r  r;   c                V    t        t        j                  | | j                  |            S r*   )r   r   HAS_KEYr^   re   s     r.   has_keyzJSON.has_key  s     m33T4>>%;PQQr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   CONTAINSr^   re   s     r.   containszJSON.contains  s     m44dDNN5<QRRr;   c                V    t        t        j                  | | j                  |            S r*   )r   r   CONTAINED_BYr^   re   s     r.   contained_byzJSON.contained_by   s     m88$u@UVVr;   c                D    t        t        j                  | t        |       S r*   )r   r   HAS_KEYSrP   re   s     r.   has_keyszJSON.has_keys#  s    m44dE5MJJr;   c                D    t        t        j                  | t        |       S r*   )r   r   HAS_ANY_KEYSrP   re   s     r.   has_any_keyszJSON.has_any_keys&  s    m88$uNNr;   NNr  )ru   r   r  r   r6   rZ   )ru   r]  r  r   r6   rZ   )ru   rO   r  r   r6   rZ   )r	  )ru   rZ   r  rZ   r  r   r6   rZ   )r
  )r  rZ   r  r   r6   rZ   )r  rA  r6   r   )r  rZ   r6   r   r!  )rf   r   r6   r   )r7   r8   r9   r  __annotations__rB   r  r  r  r%  r  r  r  r  r  r  r  r  r  r  r  rC  rD  s   @r.   r]   r]     sq    %)E")44 0 0;ddbbRSWKOr;   r]   c                  *     e Zd Zd fdZdddZ xZS )Valuesc                t    t         |   d        t        |t              st        |      | _        y || _        y r*   )r2  rB   r1   rK   field)r-   r  r6  s     r.   rB   zValues.__init__+  s*    )3E5)AU5\
u
r;   c                ^    dj                   | j                  j                  dd|i|      S )NzVALUES({value})r  ru   r+   )rl  r  r  r-   r  r  s      r.   r  zValues.get_sql/  s1     ''.@djj.@.@.aJ.aZ`.a'bbr;   )r  zstr | Fieldr6   r  r*   r  r  r  r   r6   rZ   r7   r8   r9   rB   r  rC  rD  s   @r.   r  r  *  s    Mc cr;   r  c                  *     e Zd Zdd fdZddZ xZS )LiteralValuec                2    t         |   |       || _        y r*   )r2  rB   _valuer  s      r.   rB   zLiteralValue.__init__4  s    r;   c                D    t        | j                  | j                  fi |S r*   )r   r  r@   r  s     r.   r  zLiteralValue.get_sql8  s    TZZB6BBr;   r*   r  r#  r  rD  s   @r.   r  r  3  s    Cr;   r  c                  "     e Zd Zdd fdZ xZS )rN   c                &    t         |   d|       y )Nr  r2  rB   r-   r@   r6  s     r.   rB   zNullValue.__init__=  s    'r;   r*   r  r7   r8   r9   rB   rC  rD  s   @r.   rN   rN   <  s    ( (r;   rN   c                  "     e Zd Zdd fdZ xZS )SystemTimeValuec                &    t         |   d|       y )NSYSTEM_TIMEr  r  s     r.   rB   zSystemTimeValue.__init__B  s    .r;   r*   r  r  rD  s   @r.   r  r  A  s    / /r;   r  c                      e Zd Zedd       Zedd       ZddZddZddZddZeddd       Z	eddd       Z
dd	Zy
)	Criterionc                     y r*   r+   r-   
comparatorrf   s      r.   _comparezCriterion._compareG  s    ORr;   c                     y r*   r+   r  s      r.   r   zCriterion._compareJ  s    PSr;   c                @    t        |t              r| S t        || |      S r*   )r1   EmptyCriterionComplexCriterionr  s      r.   r   zCriterion._compareM  s     e^,K
D%88r;   c                B    | j                  t        j                  |      S r*   )r   r   and_re   s     r.   __and__zCriterion.__and__R      }}W\\511r;   c                B    | j                  t        j                  |      S r*   )r   r   or_re   s     r.   __or__zCriterion.__or__U  s    }}W[[%00r;   c                B    | j                  t        j                  |      S r*   )r   r   xor_re   s     r.   __xor__zCriterion.__xor__X  r  r;   c                2    t               }| D ]  }||z  }	 |S r*   r  termscritr  s      r.   anyzCriterion.any[  )     	DDLD	 r;   c                2    t               }| D ]  }||z  }	 |S r*   r  r  s      r.   allzCriterion.alld  r  r;   c                    t               r*   r  r,   s    r.   r  zCriterion.get_sqlm  r  r;   N)r  r   rf   r  r6   r!   )r  r   rf   r   r6   r  )r  r   rf   r   r6   Self | ComplexCriterion)rf   r   r6   r  )r+   )r  zIterable[Term]r6   z(EmptyCriterion | Term | ComplexCriterion)r  zIterable[Any]r6   z'EmptyCriterion | Any | ComplexCriterionr"  )r7   r8   r9   r   r   r  r  r  r%  r  r  r  r+   r;   r.   r  r  F  s_    R RS S9
212    $r;   r  c                  F    e Zd ZdZ e       ZddZddZddZddZ	d	dZ
y)
r  Nc                    t               S r*   )rH   r,   s    r.   rL   zEmptyCriterion.fields_u  s	    ur;   c                    |S r*   r+   re   s     r.   r  zEmptyCriterion.__and__x      r;   c                    |S r*   r+   re   s     r.   r  zEmptyCriterion.__or__{  r  r;   c                    |S r*   r+   re   s     r.   r  zEmptyCriterion.__xor__~  r  r;   c                    | S r*   r+   r,   s    r.   r   zEmptyCriterion.__invert__  r   r;   r  )rf   r   r6   r   )r6   r   )r7   r8   r9   r:   rH   rI   rL   r  r  r  r   r+   r;   r.   r  r  q  s'    LeGr;   r  c                  D     e Zd Zdd fdZddZedd       Zd	dZ xZS )
rK   c                ~    t         |   |       || _        t        |t              rddlm}  ||      }|| _        y )Nr?   r   rF   )r2  rB   namer1   rZ   pypika.queriesr$   r  )r-   r#  r@   r  r$   r6  s        r.   rB   zField.__init__  s7    u%	eS!,%LE.3
r;   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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.   rc   zField.replace_table  s      #'**"=Y
4::
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_namerl  getattrr   )r-   r  r  r  r  	field_sql
table_namefield_aliass           r.   r  zField.get_sql  s    ZZe4
$4e<ZZd3
!$))Z8	 ::>TZZ-=-=224J,33'
J? 4 I
 dGT2#I{\z\U[\\r;   r  )r#  rZ   r@   r  r  r  r6   r  r5   ra   r   rb   r   r6   r  r#  	r7   r8   r9   rB   r/   r   rc   r  rC  rD  s   @r.   rK   rK     s(    4+
 N Nr;   rK   c                  ,     e Zd Zdd fdZdddZ xZS )Indexc                2    t         |   |       || _        y r*   r2  rB   r#  )r-   r#  r@   r6  s      r.   rB   zIndex.__init__      	r;   c                .    t        | j                  |      S r*   )r   r#  r  s      r.   r  zIndex.get_sql  s    TYY
33r;   r*   )r#  rZ   r@   r  r6   r  r  r  rD  s   @r.   r7  r7    s    4 4r;   r7  c                  H     e Zd Zdd fdZddZ	 d	 	 	 	 	 	 	 	 	 ddZ xZS )	Starc                (    t         |   d|       y )N*r+  r  )r-   r  r6  s     r.   rB   zStar.__init__  s    E*r;   c              #  v   K   |  | j                   #| j                   j                         E d {    y y 7 wr*   r&  r,   s    r.   r/   zStar.nodes_  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@   r0  rl  r   )r-   r  r  r  r  r-  s         r.   r  zStar.get_sql  sQ     ::>TZZ-=-=

((NGDJJ,NI==y*!EFFr;   r*   )r  r  r6   r  r5   )FFN)
r  r\   r  r\   r  r  r  r   r6   rZ   r7   r8   r9   rB   r/   r  rC  rD  s   @r.   r=  r=    sA    ++ `d8<R\or	r;   r=  c                  T     e Zd Zd fdZddZddZed	d       Zed
d       Z	 xZ
S )rR   c                t    t         |           |D cg c]  }| j                  |       c}| _        y c c}w r*   )r2  rB   rV   values)r-   rF  ru   r6  s      r.   rB   zTuple.__init__  s.    >DEUt))%0EEs   5c              #  j   K   |  | j                   D ]  }|j                         E d {     y 7 wr*   )rF  r/   rt   s     r.   r/   zTuple.nodes_  s0     
[[ 	&E||~%%	&%   '313c                    dj                  dj                  fd| j                  D                    }t        || j                  fi S )N({})r  c              3  B   K   | ]  } |j                   di   y wNr+   r  .0r  r  s     r.   	<genexpr>z Tuple.get_sql.<locals>.<genexpr>  s     $T\T\\%;F%;$T   )rl  r  rF  r   r@   r-   r  r  s    ` r.   r  zTuple.get_sql  s:    mmCHH$T$TTUTZZ:6::r;   c                f    t        | j                  D cg c]  }|j                   c}      S c c}w r*   )r   rF  r:   )r-   rT   s     r.   r:   zTuple.is_aggregate  s%    #$M#S%5%5$MNN$M   .c                l    | j                   D cg c]  }|j                  ||       c}| _         yc c}w r*  )rF  rc   )r-   ra   rb   ru   s       r.   rc   zTuple.replace_table  s.     SWR]R]^u**=)D^^   1)rF  r   r6   r  r5   r#  r6   r\   r4  )r7   r8   r9   rB   r/   r  r$  r:   r   rc   rC  rD  s   @r.   rR   rR     s?    F&
; O O _ _r;   rR   c                      e Zd ZddZy)rP   c                D   j                  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dialectr  c              3  B   K   | ]  } |j                   di   y wrL  r  rM  s     r.   rO  z Array.get_sql.<locals>.<genexpr>  s     IT,$,,00IrP  z[{}]r   z	ARRAY[{}]z'{}')
r  r  rF  rl  r   
POSTGRESQLREDSHIFTrO  r   r@   )r-   r  rY  rF  r  s    `   r.   r  zArray.get_sql  s    **Y'IT[[IImmF#x**H,=,=>>03Fa+$$V,VCTZZ:6::r;   Nr#  rf  r+   r;   r.   rP   rP     s    ;r;   rP   c                        e Zd Zd fdZ xZS )Bracketc                $    t         |   |       y r*   r  r  s     r.   rB   zBracket.__init__  s    r;   )r  r   r6   r  r  rD  s   @r.   r^  r^    s     r;   r^  c                  t     e Zd Z	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZed	d       Zed
d       ZdddZ	 xZ
S )NestedCriterionc                j    t         |   |       || _        || _        || _        || _        || _        y r*   )r2  rB   leftr  nested_comparatorrightnested)r-   r  rd  rc  re  rf  r@   r6  s          r.   rB   zNestedCriterion.__init__  s6     		$!2
r;   c              #     K   |  | j                   j                         E d {    | j                  j                         E d {    | j                  j                         E d {    y 7 I7 )7 	wr*   )re  r/   rc  rf  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   rc  re  rf  r:   r-   r  s     r.   r:   zNestedCriterion.is_aggregate  s7    #DIItzz[_[f[fCg$h4T%6%6$hii$hs   A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)rc  rc   re  rf  r`   s      r.   rc   zNestedCriterion.replace_table!  sL     II++M9E	ZZ--mYG
jj..}iH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})rc  r  re  rd  rf  )r  r@   r+   )
rl  rc  r  r  ru   re  rd  rf  r   r@   r-   r  r  r  s       r.   r  zNestedCriterion.get_sql1  s    DKK""",V,,,$$**$$.v."44::&4;;&&00 L 
 #H4::HHH
r;   r*   )r  r   rd  r  rc  r   re  r   rf  r   r@   r  r6   r  r5   r  r4  Fr  r\   r  r   r6   rZ   r7   r8   r9   rB   r/   r$  r:   r   rc   r  rC  rD  s   @r.   ra  ra    s     ! , 	
    
 ( j j I I r;   ra  c                  X     e Zd Zdd fdZddZed	d       Zed
d       ZdddZ	 xZ
S )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)r2  rB   r  rc  re  )r-   r  rc  re  r@   r6  s        r.   rB   zBasicCriterion.__init__A  s'     	$	
r;   c              #     K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr*   )re  r/   rc  r,   s    r.   r/   zBasicCriterion.nodes_T  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   rc  re  r:   rj  s     r.   r:   zBasicCriterion.is_aggregateY  s.    #DIItzzCZ$[4T%6%6$[\\$[s   :c                    | j                   j                  ||      | _         | j                  j                  ||      | _        yrl  rc  rc   re  r`   s      r.   rc   zBasicCriterion.replace_table]  4     II++M9E	ZZ--mYG
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  rc  re  r+   )rl  r  ru   rc  r  re  r   r@   )r-   r  r  r  r  s        r.   r  zBasicCriterion.get_sqll  s|    )00,,"""CjCFC$$**$$E
EfE 1 

 #C>v>>
r;   r*   )
r  r   rc  r=   re  r=   r@   r  r6   r  r5   r  r4  )r	  F)r  rZ   r  r\   r  r   r6   rZ   rq  rD  s   @r.   r   r   @  sC    &&
 ] ] H H r;   r   c                  j     e Zd Zdd fdZd	dZed
d       Zedd       ZdddZ	edd       Z
 xZS )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)r2  rB   r  	container_is_negated)r-   r  r~  r@   r6  s       r.   rB   zContainsCriterion.__init__x  s(     		" r;   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##%%%>>((*** 	&*ru  c                .    | j                   j                  S r*   r  r,   s    r.   r:   zContainsCriterion.is_aggregate  r  r;   c                F    | j                   j                  ||      | _         yrl  r  rc   r`   s      r.   rc   zContainsCriterion.replace_table       II++M9E	r;   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}subqueryTNOT r  )r  r~  not_r+   )rl  r  r  r~  r  r   r@   )r-   r  r  r  s       r.   r  zContainsCriterion.get_sql  so    +22""",V,,dnn,,EdEfE++ 3 

  TZZ:6::r;   c                    d| _         y NTr  r,   s    r.   rm   zContainsCriterion.negate  s
    r;   r*   )r  r   r~  r=   r@   r  r6   r  r5   r  r4  )r  r   r  r   r6   rZ   )r6   r   )r7   r8   r9   rB   r/   r$  r:   r   rc   r  rm   rC  rD  s   @r.   r   r   w  sP    ! +
 & & F F;    r;   r   c                  ,     e Zd Zd fd	Zd Zd Z xZS )ExistsCriterionc                @    t         |   |       || _        d| _        y NF)r2  rB   r~  r  )r-   r~  r@   r6  s      r.   rB   zExistsCriterion.__init__  s    " r;   c                    dj                   | j                  j                  di || j                  rd      S d      S )Nz{not_}EXISTS {container}r  r  )r~  r  r+   )rl  r~  r  r  r  s     r.   r  zExistsCriterion.get_sql  sM    )00,dnn,,6v6tGWGWV 1 
 	
]_ 1 
 	
r;   c                    d| _         | S r  r  r,   s    r.   rm   zExistsCriterion.negate  s    r;   r*   )r7   r8   r9   rB   r  rm   rC  rD  s   @r.   r  r    s    !


r;   r  c                  <     e Zd Zdd fdZddZedd       Z xZS )RangeCriterionc                N    t         |   |       || _        || _        || _        y r*   )r2  rB   r  r   r   )r-   r  r   r   r@   r6  s        r.   rB   zRangeCriterion.__init__  s%    	
r;   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_  sX     
99##%%%::$$&&&88??$$$ 	&&$rh  c                .    | j                   j                  S r*   r  r,   s    r.   r:   zRangeCriterion.is_aggregate  r  r;   r*   )
r  r=   r   r   r   r   r@   r  r6   rZ   r5   r  )r7   r8   r9   rB   r/   r$  r:   rC  rD  s   @r.   r  r    s!    % & &r;   r  c                  &    e Zd Zedd       ZddZy)r   c                F    | j                   j                  ||      | _         yrl  r  r`   s      r.   rc   zBetweenCriterion.replace_table  r  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+   rl  r  r  r   r   r   r@   rQ  s      r.   r  zBetweenCriterion.get_sql  st    077""",V,$$**$$.v.   *6* 8 

  TZZ:6::r;   Nr4  r#  )r7   r8   r9   r   rc   r  r+   r;   r.   r   r     s    F F;r;   r   c                      e Zd ZddZy)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  rQ  s      r.   r  zPeriodCriterion.get_sql  st    ,33""",V,$$**$$.v.   *6* 4 

  TZZ:6::r;   Nr#  rf  r+   r;   r.   r   r     s    ;r;   r   c                  D     e Zd Zdd fdZddZedd       Zd	dZ xZS )
rs   c                @    t         |   |       || _        || _        y r*   r2  rB   r  ru   r-   r  ru   r@   r6  s       r.   rB   zBitwiseAndCriterion.__init__      	
r;   c              #     K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr*   r  r/   ru   r,   s    r.   r/   zBitwiseAndCriterion.nodes_  @     
99##%%%::$$&&& 	&&ru  c                F    | j                   j                  ||      | _         yrl  r  r`   s      r.   rc   z!BitwiseAndCriterion.replace_table  r  r;   c                    dj                   | j                  j                  di || j                        }t	        || j
                  fi |S )Nz({term} & {value})r  ru   r+   rl  r  r  ru   r   r@   rQ  s      r.   r  zBitwiseAndCriterion.get_sql	  M    "))""",V,** * 
  TZZ:6::r;   r*   r  r=   ru   r   r@   r  r6   r  r5   r4  r#  r5  rD  s   @r.   rs   rs     (    
'
 F F;r;   rs   c                  D     e Zd Zdd fdZddZedd       Zd	dZ xZS )
rx   c                @    t         |   |       || _        || _        y r*   r  r  s       r.   rB   zBitwiseOrCriterion.__init__  r  r;   c              #     K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr*   r  r,   s    r.   r/   zBitwiseOrCriterion.nodes_  r  ru  c                F    | j                   j                  ||      | _         yrl  r  r`   s      r.   rc   z BitwiseOrCriterion.replace_table  r  r;   c                    dj                   | j                  j                  di || j                        }t	        || j
                  fi |S )Nz({term} | {value})r  r+   r  rQ  s      r.   r  zBitwiseOrCriterion.get_sql*  r  r;   r*   r  r5   r4  r#  r5  rD  s   @r.   rx   rx     r  r;   rx   c                  F     e Zd Zdd fdZddZedd       Zd	d
dZ xZS )rj   c                2    t         |   |       || _        y r*   r~  r-   r  r@   r6  s      r.   rB   zNullCriterion.__init__3  r:  r;   c              #  \   K   |  | j                   j                         E d {    y 7 wr*   r  r/   r,   s    r.   r/   zNullCriterion.nodes_7  !     
99##%%%   ",*,c                F    | j                   j                  ||      | _         yrl  r  r`   s      r.   rc   zNullCriterion.replace_table;  r  r;   c                    dj                   | j                  j                  di |      }t        || j                  fi |S )Nz{term} IS NULLr  r+   rl  r  r  r   r@   rn  s       r.   r  zNullCriterion.get_sqlI  sF    %%""",V, & 
  TZZ:6::r;   r*   )r  r=   r@   r  r6   r  r5   r4  ro  rp  r5  rD  s   @r.   rj   rj   2  s-    & F F; ;r;   rj   c                      e Zd ZdddZy)rp   c                    dj                   | j                  j                  di |      }t        || j                  fi |S )Nz{term} IS NOT NULLr  r+   r  rn  s       r.   r  zNotNullCriterion.get_sqlQ  sF    "))""",V, * 
  TZZ:6::r;   Nro  rp  rf  r+   r;   r.   rp   rp   P  s    ;r;   rp   c                      e Zd ZdddZddZy)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}subcriterionr{  z({criterion}))	criterionr+   )rl  r  ru   rc  r  needs_bracketsre  )r-   r  r  r  s       r.   r  zComplexCriterion.get_sqlY  s    +22,,"""Y0C0CDII0NYRXY$$**$$\$2E2Edjj2Q\U[\ 3 
 "))C)88
r;   c                Z    t        |t              xr |j                  | j                  k(   S r*   )r1   r  r  rj  s     r.   r  zComplexCriterion.needs_bracketse  s%    $ 01\$//T__:\6\\r;   Nro  )r  r\   r  r   r6   rZ   )r  r=   r6   r\   )r7   r8   r9   r  r  r+   r;   r.   r  r  X  s    
]r;   r  c                       e Zd ZdZej
                  ej                  gZd	d
 fdZddZ	e
dd       Zedd       ZddZddZdd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.
    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)r2  rB   operatorrc  re  )r-   r  rc  re  r@   r6  s        r.   rB   zArithmeticExpression.__init__q  s'      	 	
r;   c              #     K   |  | j                   j                         E d {    | j                  j                         E d {    y 7 '7 wr*   )rc  r/   re  r,   s    r.   r/   zArithmeticExpression.nodes_  r  ru  c                l    t        | j                  j                  | j                  j                  g      S r*   )r   rc  r:   re  r,   s    r.   r:   z!ArithmeticExpression.is_aggregate  s(     $TYY%;%;TZZ=T=T$UVVr;   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.
        Nrx  r`   s      r.   rc   z"ArithmeticExpression.replace_table  ry  r;   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$
 $..((r;   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   r  )r-   r  right_ops      r.   right_needs_parensz'ArithmeticExpression.right_needs_parens  s<     jnn$jnn$
 4>>))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}rJ  z{})r  rc  re  r+   )rc  re  r0  rl  r  ru   r  r  r  r   r@   )r-   r  r  sider  r  arithmetic_sqls          r.   r  zArithmeticExpression.get_sql  s    JN))UYU_U_I`aWT:t<a299]](( 224=='J&PT\\!		!!+F+ "44T]]HM6SW__"

"",V, : 
 #NDJJI&II bs   Dr*   )
r  r   rc  r   re  r   r@   r  r6   r  r5   r  r4  rV  ro  rp  )r7   r8   r9   ro  r   r   r   r  rB   r/   r$  r:   r   rc   r  r  r  rC  rD  s   @r.   r   r   i  sf    
 0I*'
 W W H H)**, r;   r   c                  |     e Zd Zdd	 fdZd
dZedd       Zedd       Zedd       Z	edd       Z
dddZ xZS )Casec                B    t         |   |       g | _        d | _        y Nr?   )r2  rB   _cases_elser  s     r.   rB   zCase.__init__  s!    u%
r;   c              #    K   |  | j                   D ]5  \  }}|j                         E d {    |j                         E d {    7 | j                  #| j                  j                         E d {    y y 7 N7 87 
wr*   )r  r/   r  r-   r  r  s      r.   r/   zCase.nodes_  sy     
#{{ 	%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   r  r:   r  r  s      r.   r:   zCase.is_aggregate  sr     $PTP[P[\_YY##8t'8'88\*.**tzz&&?@
 	
:>?@
 	
\s   $A.
c                \    | j                   j                  || j                  |      f       y r*   )r  rV  rV   r  s      r.   whenz	Case.when  s$    It'9'9$'?@Ar;   c           	        | j                   D cg c])  \  }}|j                  ||      |j                  ||      g+ c}}| _         | j                  r"| j                  j                  ||      | _        yd| _        yc c}}w r  )r  rc   r  )r-   ra   rb   r  r  s        r.   rc   zCase.replace_table  sx    " $(;;

  	4 ''yA""=)<
 LP::TZZ--mYG
[_

s   .A=c                2    | j                  |      | _        | S r*   )rV   r  rj  s     r.   else_z
Case.else_  s    ''-
r;   c                2   | j                   st        d      dj                  fd| j                   D              }| j                  r+dj	                   | j                  j
                  di       nd}d| | d}|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})r  thenNr+   )rl  r  )rN  r  r  r  s      r.   rO  zCase.get_sql.<locals>.<genexpr>  sQ      
	4 &,,2C)2C2C2Mf2MT`TXT`T`TjciTj,k
s   A Az ELSE {}r  zCASE z ENDr+   )r  r   r  r  rl  r  r   r@   )r-   r  r  casesr  case_sqls     `   r.   r  zCase.get_sql  s    {{ \]] 
#';;
 
 DH::
!!"4$**"4"4">v">?SU5'%-#HdjjCFCCr;   r*   r  r5   r  )r  r   r  r   r6   r  r4  )r  r   r6   r  ro  rp  )r7   r8   r9   rB   r/   r$  r:   r   r  rc   r  r  rC  rD  s   @r.   r  r    sk    
+ 
 
 B B ` `(   r;   r  c                  V     e Zd Zdd fdZddZd	dZed
d       Zedd       Z	 xZ
S )r   c                4    t         |   |       || _        y r  r~  r  s      r.   rB   zNot.__init__&      u%	r;   c              #  \   K   |  | j                   j                         E d {    y 7 wr*   r  r,   s    r.   r/   z
Not.nodes_*  r  r  c                    d|d<   dj                   | j                  j                  di |      }t        || j                  fi |S )NTr  z
NOT {term}r  r+   r  rQ  s      r.   r  zNot.get_sql.  sJ    !%~!!'8tyy'8'8'B6'B!CTZZ:6::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*   )r1   r=   r   )
inner_selfargsr  result	item_funcs       r.   innerzNot.__getattr__.<locals>.inner>  s2    z;D;F;F&4'*6{"Mr;   )r0  r  inspectismethod)r-   r#  r  r  s      @r.   __getattr__zNot.__getattr__3  s5     DIIt,		*	 r;   c                F    | j                   j                  ||      | _         yrl  r  r`   s      r.   rc   zNot.replace_tableF  r  r;   r*   r  r   r@   r  r6   r  r5   r#  )r#  rZ   r6   r   r4  )r7   r8   r9   rB   r/   r  r   r  r   rc   rC  rD  s   @r.   r   r   %  s<    &;
  $ F Fr;   r   c                  2     e Zd Zdd fdZddZddZ xZS )r   c                4    t         |   |       || _        y r  r~  r  s      r.   rB   zAll.__init__V  r  r;   c              #  \   K   |  | j                   j                         E d {    y 7 wr*   r  r,   s    r.   r/   z
All.nodes_Z  r  r  c                    dj                   | j                  j                  di |      }t        || j                  fi |S )Nz
{term} ALLr  r+   r  rQ  s      r.   r  zAll.get_sql^  s@    !!'8tyy'8'8'B6'B!CTZZ:6::r;   r*   r  r5   r#  rC  rD  s   @r.   r   r   U  s    &;r;   r   c                  *    e Zd ZdddZddZd Zd Zy)	CustomFunctionNc                     || _         || _        y r*   )r#  params)r-   r#  r  s      r.   rB   zCustomFunction.__init__d  s    	r;   c           
        | 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*   r(  rN  ps     r.   rO  z*CustomFunction.__call__.<locals>.<genexpr>p  s     $ASV$A   c              3  2   K   | ]  }t        |        y wr*   r(  r  s     r.   rO  z*CustomFunction.__call__.<locals>.<genexpr>q  s     "8a3q6"8r  )r#  r  r  )	_has_paramsFunctionr#  r  _is_valid_function_callr   rl  r  r  )r-   r  r  s      r.   __call__zCustomFunction.__call__h  s    !DIIVZZ-@AA+t++T2#U\\99$AT[[$AA"84"88 ]   		DDD

70CDDr;   c                    | j                   d uS r*   )r  r,   s    r.   r	  zCustomFunction._has_paramsw  s    {{$&&r;   c                D    t        |      t        | j                        k(  S r*   )rO  r  )r-   r  s     r.   r  z&CustomFunction._is_valid_function_callz  s    4yC,,,r;   r*   )r#  rZ   r  zSequence | Noner6   r  )r  r   r  r   r6   r
  )r7   r8   r9   rB   r  r	  r  r+   r;   r.   r   r   c  s    E'-r;   r   c                  t     e Zd Zd	 fdZd
dZedd       Zedd       ZddZ	e
d        ZddZddZ xZS )r
  c                    t         |   |j                  d             || _        |D cg c]  }| j	                  |       c}| _        |j                  d      | _        y c c}w )Nr@   schema)r2  rB   r  r#  rV   r  r  )r-   r#  r  r  r-  r6  s        r.   rB   zFunction.__init__  sS    G,-	<@A5T''.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_  s0     
99 	$Czz|##	$#rH  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  r:   r   s     r.   r:   zFunction.is_aggregate  s'     $$K#S%5%5$KLL$KrS  c                l    | j                   D cg c]  }|j                  ||       c}| _         yc c}w rl  )r  rc   )r-   ra   rb   r-  s       r.   rc   zFunction.replace_table  s.     QUPYPYZuU((	BZ	ZrU  c                     y r*   r+   r  s     r.   get_special_params_sqlzFunction.get_special_params_sql  r=  r;   c                X    t        | d      r | j                  dddi|S t        |       S )Nr  r  Fr+   hasattrr  rZ   )r   r  s     r.   get_arg_sqlzFunction.get_arg_sql  s0    :A#y:Q{s{{6e6v6_WZ[^W__r;   c                       j                   di }dj                   j                  dj                   fd j                  D              |r
d|z         S d      S )Nz{name}({args}{special})r  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  )rN  r  r  r-   s     r.   rO  z,Function.get_function_sql.<locals>.<genexpr>  sV        q), AIIHHH)))!6v67s   >Ar  r  )r#  r  specialr+   )r  rl  r#  r  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 
 	
r;   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  rY  )r  r  rY  z{schema}.{function})r  rY  )r  functionr+   )r.  r  r  rl  r  r   r@   )r-   r  r  r  r  rY  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]^^r;   r#  rZ   r  r   r  r   r6   r  r5   r  r4  )r  r   r6   r   r#  )r7   r8   r9   rB   r/   r$  r:   r   rc   r  r%  r  r  r  rC  rD  s   @r.   r
  r
  ~  s^    +$
 M M [ [ ` `
 r;   r
  c                  H     e Zd ZdZ fdZedd       ZddZd fdZ xZ	S )	AggregateFunctionTc                H    t        |   |g|i | g | _        d| _        y r  )r2  rB   _filters_include_filterr-   r#  r  r  r6  s       r.   rB   zAggregateFunction.__init__  s)    ///$r;   c                <    d| _         | xj                  |z  c_        y r  )r(  r'  )r-   filterss     r.   filterzAggregateFunction.filter  s    # r;   c                    | j                   r>dj                  t        j                  | j                        j
                  di |      S y )NzWHERE {criterions})
criterionsr+   )r(  rl  r  r  r'  r  r  s     r.   get_filter_sqlz AggregateFunction.get_filter_sql  s@    '..)--:V:^:^:hag:h.ii  r;   c                    t        |   di |} | j                  di |}| j                  r|dj	                  |      z  }|S )Nz FILTER({filter_sql}))
filter_sqlr+   )r2  r  r/  r(  rl  )r-   r  r  r1  r6  s       r.   r  z"AggregateFunction.get_function_sql  sQ    g&00(T((262
*11Z1HHC
r;   )r+  r   r6   r  r#  )r  r   )
r7   r8   r9   r:   rB   r   r,  r/  r  rC  rD  s   @r.   r%  r%    s1    L% ! !j r;   r%  c                  h     e Zd ZdZdZd	 fdZed
d       Zedd       ZddZ	ddZ
d fdZ xZS )AnalyticFunctionFTc                r    t        |   |g|i | g | _        g | _        g | _        d| _        d| _        y r  )r2  rB   r'  
_partition	_orderbysr(  _include_overr)  s       r.   rB   zAnalyticFunction.__init__  s?    ///$"r;   c                <    d| _         | xj                  |z  c_        y r  )r7  r5  )r-   r  s     r.   overzAnalyticFunction.over  s    !5 r;   c           	         d| _         | xj                  |D cg c]  }||j                  d      f c}z  c_        y c c}w )NTorder)r7  r6  r  )r-   r  r  r  s       r.   orderbyzAnalyticFunction.orderby  s4    !5I4D&**W"56IIIs   =c                    | |j                   di |S dj                   |j                   di ||j                        S )Nz{field} {orient})r  orientr+   )r  rl  ru   )r-   r  r>  r  s       r.   _orderby_fieldzAnalyticFunction._orderby_field   sK    > 5==*6**!((%--)&)<< ) 
 	
r;   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}r  c              3  p   K   | ]-  }t        |d       r |j                  di n
t        |       / yw)r  Nr+   r  )rN  r  r  s     r.   rO  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  s5     !t_`I9N)!))"5f"5TWXYTZ"Z!ts   36)r  zORDER BY {orderby}c              3  L   K   | ]  \  }} j                   ||fi   y wr*   )r?  )rN  r  r>  r  r-   s      r.   rO  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  s-     $vVcV[]c%8T%8%8%Q&%Q$vs   !$)r<  r  )r5  rV  rl  r  r6  )r-   r  r  s   `` r.   get_partition_sqlz"AnalyticFunction.get_partition_sql	  s    ??LL%,,!tdhdsds!tt -  >>LL$++HH$vgkgugu$vv ,  xxr;   c                x    t        |   di |} | j                  di |}|}| j                  r	|d| dz  }|S )Nz OVER()r+   )r2  r  rC  r7  )r-   r  r"  partition_sqlr  r6  s        r.   r  z!AnalyticFunction.get_function_sql  sP    w/9&9...88VM?!,,C
r;   r#  r  r   r6   r  )r  r   r  r   r6   r  )r  rK   r>  zOrder | Noner  r   r6   rZ   r#  )r7   r8   r9   r:   is_analyticrB   r   r9  r<  r?  rC  r  rC  rD  s   @r.   r3  r3    sP    LK# ! ! J J
$ r;   r3  EdgeT WindowFrameAnalyticFunction.Edgec                  x     e Zd Z G d d      Zd	 fdZd
dZeddd       Zeddd       ZddZ	d fdZ
 xZS )WindowFrameAnalyticFunctionc                      e Zd ZdddZddZy)rJ  Nc                    || _         y r*   r  rt   s     r.   rB   z)WindowFrameAnalyticFunction.Edge.__init__+  s	    DJr;   c                X    dj                  | j                  xs d| j                        S )Nz{value} {modifier}	UNBOUNDED)ru   modifier)rl  ru   rQ  r,   s    r.   r  z(WindowFrameAnalyticFunction.Edge.__str__.  s-    '..jj/K /  r;   r*   )ru   zstr | int | Noner6   r  r"  )r7   r8   r9   rB   r  r+   r;   r.   Edgez WindowFrameAnalyticFunction.Edge*  s    		r;   rR  c                H    t        |   |g|i | d | _        d | _        y r*   )r2  rB   framer'   r)  s       r.   rB   z$WindowFrameAnalyticFunction.__init__4  s(    ///

r;   c                |    | j                   s| j                  r
t               || _         |r
||f| _        y || _        y r*   )rT  r'   AttributeError)r-   rT  r'   	and_bounds       r.   _set_frame_and_boundsz1WindowFrameAnalyticFunction._set_frame_and_bounds9  s3    :: ""
+4eY'
%
r;   c                *    | j                  d||       y )NROWSrX  r-   r'   rW  s      r.   rowsz WindowFrameAnalyticFunction.rows@  s    ""65)<r;   c                *    | j                  d||       y )NRANGEr[  r\  s      r.   rangez!WindowFrameAnalyticFunction.rangeD  s    ""7E9=r;   c                    t        | j                  t              s'dj                  | j                  | j                        S | j                  \  }}dj                  | j                  ||      S )Nz{frame} {bound})rT  r'   z#{frame} BETWEEN {lower} AND {upper})rT  r   r   )r1   r'   rQ   rl  rT  r   s      r.   get_frame_sqlz)WindowFrameAnalyticFunction.get_frame_sqlH  s`    $**e,$++$**DJJ+OOzzu4;;** < 
 	
r;   c                    t        |   di |}| j                  s| j                  s|S dj	                  || j                               S )Nz{over} {frame})r9  rT  r+   )r2  rC  rT  r'   rl  rb  )r-   r  rF  r6  s      r.   rC  z-WindowFrameAnalyticFunction.get_partition_sqlS  sG    1;F;zz$**  &&MASASAU&VVr;   r#  )rT  rZ   r'   rZ   rW  EdgeT | Noner6   r  r*   )r'   zstr | EdgeTrW  rd  r6   r  r"  r#  )r7   r8   r9   rR  rB   rX  r   r]  r`  rb  rC  rC  rD  s   @r.   rL  rL  )  sQ     
@ = = > >	
W Wr;   rL  c                  :     e Zd Zd fdZedd       ZddZ xZS )IgnoreNullsAnalyticFunctionc                :    t        |   |g|i | d| _        y r  )r2  rB   _ignore_nullsr)  s       r.   rB   z$IgnoreNullsAnalyticFunction.__init__]  s"    ///"r;   c                    d| _         y r  rh  r,   s    r.   ignore_nullsz(IgnoreNullsAnalyticFunction.ignore_nullsa  s
    !r;   c                    | j                   ryy )NzIGNORE NULLSrj  r  s     r.   r  z2IgnoreNullsAnalyticFunction.get_special_params_sqle  s    ! r;   r#  )r6   r  )r  r   r6   r  )r7   r8   r9   rB   r   rk  r  rC  rD  s   @r.   rf  rf  \  s!    # " "r;   rf  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dZddZdd	Zy)Interval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\-.: ]+$)Nc                V   |
| _         d | _        d | _        d| _        |r|| _        y |	r|	| _        y t        | j                  | j                  |||||||g      D ]N  \  }}}|s
t        |      }t        | |t        |             | j                  || _        |dk  | _        || _        P y )NFr   )rY  largestsmallestis_negativequartersweekszipunitslabelsr[   setattrabs)r-   rq  rr  rs  rt  ru  rv  rw  r  r  rY  unitlabelru   	int_values                  r.   rB   zInterval.__init__}  s      $DMDJ"%JJKKFD%'<H#
 	&D%
 J	dC	N3<<'#(DL'01}D$ %	&r;   c                "    | j                         S r*   r  r,   s    r.   r  zInterval.__str__  s    ||~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 )NrY  r~  rw  r  QUARTERr  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}rq  r   rr  rs  rt  ru  rv  rp  r  -z{largest}_{smallest})r  r  rz  ro  )r   r  )rY  r  r  r0  r  rl  trim_patternr   r  r  	templates)r-   r  rY  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cr;   )
r   r   r   r   r   r   r   r   r   N)rq  r[   rr  r[   rs  r[   rt  r[   ru  r[   rv  r[   rw  r[   r  r[   r  r[   rY  zDialects | Noner"  r#  )r7   r8   r9   r   r[  r\  VERTICAORACLEMYSQLr  r  r  recompiler  rB   r  r  r+   r;   r.   rn  rn  m  s     	75432I WEPF2::WXL #'%&%& %& 	%&
 %& %& %& %& %& %& !%&N+dr;   rn  c                  "     e Zd Zdd fdZ xZS )r   c                ,    t         |   d|||       y )NPOWr?   r  )r-   r  exponentr@   r6  s       r.   rB   zPow.__init__  s    he<r;   r*   )r  r=   r  r  r@   r  r6   r  r  rD  s   @r.   r   r     s    = =r;   r   c                  "     e Zd Zdd fdZ xZS )r   c                ,    t         |   d|||       y )NMODr?   r  )r-   r  modulusr@   r6  s       r.   rB   zMod.__init__  s    gU;r;   r*   )r  r=   r  r  r@   r  r6   r  r  rD  s   @r.   r   r     s    < <r;   r   c                        e Zd Zd fdZ xZS )Rollupc                &    t        |   dg|  y )NROLLUPr  )r-   r  r6  s     r.   rB   zRollup.__init__  s    *E*r;   rG  r  rD  s   @r.   r  r    s    + +r;   r  c                  ,     e Zd ZdZd fdZd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).
    c                4    t         |   d        || _        y r  r9  )r-   r#  r6  s     r.   rB   zPseudoColumn.__init__  s    t$	r;   c                    | j                   S r*   )r#  r  s     r.   r  zPseudoColumn.get_sql  s    yyr;   )r#  rZ   r6   r  r#  )r7   r8   r9   ro  rB   r  rC  rD  s   @r.   r  r    s    
r;   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*   )r2  rB   r1   rK   r  zoneinterval)r-   r  r  r  r@   r6  s        r.   rB   zAtTimezone.__init__  s4    )3E5)AU5\u
	 r;   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 r  )r#  r  r  r+   )rl  r  r  r  r  r   r@   rQ  s      r.   r  zAtTimezone.get_sql  sY    8??###-f-$(MM[r @ 

  TZZ:6::r;   )FN)r7   r8   r9   ro  r:   rB   r  rC  rD  s   @r.   r  r    s     L!;r;   r  )r*  r[   r6   rZ   )i
__future__r   r  r  sysr  collections.abcr   r   r   r   r	   r   r
   enumr   typingr   r   r   r   pypika.enumsr   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r   r   version_infotyping_extensionsr!   r$  r"   r#   r$   
__author__	__email__r%   r&   r=   r+  r.  r0  rF  r[  rc  rh  rq  rt  rw  r   rS   r  r]   r  r  rN   r  r  r  rK   r7  r=  rR   rP   r^  ra  r   r   r  r  r   r   rs   rx   rj   rp   r  r   r  r   r   r   r
  r%  r3  rI  rL  rf  rn  r   r   r  r  r  r+   r;   r.   <module>r     sR   "  	 
  B B ) )  8 8 l l l   
'!*>> 
	 	v&J J{$4 {$| *'I '&,I ,,] 
E} Em E] E! !
Bt 
B7X4 7Xt	$L 	$<O4 <O~cT cC4 C( (
/l /
($ ($VY (0It 0f4D 45 &_I _B	;E 	;e 
7i 7t4Y 4n2 	 2 ji  &Y &$;~ ;0;n ;;) ;B; ;B;I ;<;} ;]~ ]"q4 qhE9 EP-F) -F`;) ;- -6My M` 89( 9x 	AB0W"2 0Wf"2 "edt edP=( =
<( <
+X +
4 ; ;r;   