
    wia                    H   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j&        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 d0 d1e1          Z? G d2 d3e1          Z@ G d4 d5e1          ZA G d6 d7eA          ZB G d8 d9eA          ZC G d: d;e1          ZD G d< d=eD          ZE G d> d?eDe?          ZF G d@ dAe1          ZG G dB dCeF          ZH G dD dEeD          ZI G dF dGeI          ZJ G dH dIeI          ZK G dJ dKeD          ZL G dL dMeD          ZM G dN dOeD          ZN G dP dQeD          ZO G dR dSeD          ZP G dT dUeP          ZQ G dV dWeP          ZR G dX dYeD          ZS G dZ d[eD          ZT G d\ d]eD          ZU G d^ d_eU          ZV G d` daeM          ZW G db dce1          ZX G dd deeD          ZY G df dgeD          ZZ G dh dieD          Z[ G dj dk          Z\ G dl dmeD          Z] G dn doe]          Z^ G dp dqe^          Z_ edrds          Z` G dt due_          Za G dv dwe_          Zb G dx dye1          Zc G dz d{e]          Zd G d| d}e]          Ze G d~ de]          Zf G d de1          Zg G d de1          ZhdS )    )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dS )r&   NreturnIterator[NodeT]c              #     K   | V  d S N selfs    ?/var/www/icac/venv/lib/python3.11/site-packages/pypika/terms.pynodes_zNode.nodes_)   s      




    typetype[NodeT]list[NodeT]c                D    fd|                                  D             S )Nc                4    g | ]}t          |          |S r-   )
isinstance).0noder3   s     r0   
<listcomp>zNode.find_.<locals>.<listcomp>-   s(    III*T42H2HIIIIr2   )r1   )r/   r3   s    `r0   find_z
Node.find_,   s%    IIIIIIIIr2   r)   r*   )r3   r4   r)   r5   )__name__
__module____qualname__is_aggregater1   r<   r-   r2   r0   r&   r&   &   sG        L   J J J J J Jr2   c                  T   e Zd ZdZdodpdZedqd	            Zedrd            ZdsdZ	e
	 dodtd            Ze
	 dodud            ZdvdZdwdZdxdZdyd!Zdzd#Zd{d'Zd|d)Zdwd*Zdwd+Zdwd,Zdwd-Zdwd.Zd}d0Zd}d1Zd}d2Zd}d3Zd}d4Zd}d5Zd~d7Zd~d8Z dd<Z!dd@Z"d}dAZ#ddCZ$ddGZ%ddHZ&d~dIZ'dydJZ(ddLZ)ddMZ*dydNZ+ddOZ,ddQZ-ddRZ.ddSZ/ddTZ0ddUZ1ddWZ2ddYZ3ddZZ4dd[Z5dd\Z6dd]Z7dd^Z8dd_Z9dd`Z:ddaZ;dwdbZ<dwdcZ=dwddZ>dwdeZ?dwdfZ@dwdgZAddjZBddkZCddlZDddnZEdS )TermFNalias
str | Noner)   Nonec                    || _         d S r,   rD   r/   rD   s     r0   __init__zTerm.__init__3   s    


r2   strc                    || _         d S r,   rH   rI   s     r0   as_zTerm.as_6   s    


r2   
set[Table]c                R    ddl m} t          |                     |                    S )Nr   r$   )pypikar$   setr<   )r/   r$   s     r0   tables_zTerm.tables_:   s.          4::e$$%%%r2   
set[Field]c                P    t          |                     t                              S r,   )rR   r<   Fieldr.   s    r0   fields_zTerm.fields_@   s    4::e$$%%%r2   wrapper_clstype[Term] | None@ValueError | NodeT | LiteralValue | Array | Tuple | ValueWrapperc                    t          | t                    r| S | t                      S t          | t                    r	t	          |  S t          | t
                    r	t          |  S |p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.

        )r8   r&   	NullValuelistArraytupleTupleValueWrapper)valrX   s     r0   wrap_constantzTerm.wrap_constantC   s~    & c4   	J;;;c4   	#;c5!! 	#; "1\{3r2   rb   -Term | QueryBuilder | None | str | int | bool5Term | QueryBuilder | NullValue | ValueWrapper | JSONc                    ddl m} t          | t          |f          r| S | t	                      S t          | t
          t          t          f          r|pt          } ||           S t          |           S )N   )r"   )
queriesr"   r8   rC   r\   rK   intboolra   JSON)rb   rX   r"   s      r0   	wrap_jsonzTerm.wrap_jsonc   s     	*)))))cD,/00 	J;;;cCd+,, 	$%5K;s###Cyyr2   current_tableTable | None	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/   rm   ro   s      r0   replace_tablezTerm.replace_tables   s	     r2   otherr   BasicCriterionc                    | |k    S r,   r-   r/   rs   s     r0   eqzTerm.eq       u}r2   NullCriterionc                     t          |           S r,   )ry   r.   s    r0   isnullzTerm.isnull   s    T"""r2   Notc                N    |                                                                  S r,   )r{   negater.   s    r0   notnullzTerm.notnull   s    {{}}##%%%r2   NotNullCriterionc                     t          |           S r,   )r   r.   s    r0   	isnotnullzTerm.isnotnull   s    %%%r2   valueri   BitwiseAndCriterionc                H    t          | |                     |                    S r,   )r   rc   r/   r   s     r0   
bitwiseandzTerm.bitwiseand   s     "4););E)B)BCCCr2   BitwiseOrCriterionc                H    t          | |                     |                    S r,   )r   rc   r   s     r0   	bitwiseorzTerm.bitwiseor   s     !$(:(:5(A(ABBBr2   c                    | |k    S r,   r-   rv   s     r0   gtzTerm.gt       e|r2   c                    | |k    S r,   r-   rv   s     r0   gtezTerm.gte   rx   r2   c                    | |k     S r,   r-   rv   s     r0   ltzTerm.lt   r   r2   c                    | |k    S r,   r-   rv   s     r0   ltezTerm.lte   rx   r2   c                    | |k    S r,   r-   rv   s     r0   nezTerm.ne   rx   r2   exprc                ^    t          t          j        | |                     |                    S r,   )rt   r   globrc   r/   r   s     r0   r   z	Term.glob   $    hmT43E3Ed3K3KLLLr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   likerc   r   s     r0   r   z	Term.like   r   r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   not_likerc   r   s     r0   r   zTerm.not_like   s%    h/t7I7I$7O7OPPPr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   ilikerc   r   s     r0   r   z
Term.ilike   $    hndD4F4Ft4L4LMMMr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   	not_ilikerc   r   s     r0   r   zTerm.not_ilike   s%    h0$8J8J48P8PQQQr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   rlikerc   r   s     r0   r   z
Term.rlike   r   r2   patternc                ^    t          t          j        | |                     |                    S r,   )rt   r   regexrc   r/   r   s     r0   r   z
Term.regex   s$    hndD4F4Fw4O4OPPPr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   regexprc   r   s     r0   r   zTerm.regexp   s$    hotT5G5G5P5PQQQr2   lowerupperBetweenCriterionc                p    t          | |                     |          |                     |                    S r,   )r   rc   r/   r   r   s      r0   betweenzTerm.between   s1    d&8&8&?&?ASASTYAZAZ[[[r2   startendPeriodCriterionc                p    t          | |                     |          |                     |                    S r,   )r   rc   )r/   r   r   s      r0   from_tozTerm.from_to   s1    tT%7%7%>%>@R@RSV@W@WXXXr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   as_ofrc   r   s     r0   r   z
Term.as_of   r   r2   Allc                     t          |           S r,   )r   r.   s    r0   all_z	Term.all_       4yyr2   arg%list | tuple | set | frozenset | TermContainsCriterionc                     t          |t          t          t          t          f          r#t           t           fd|D                        S t           |          S )Nc                :    g | ]}                     |          S r-   rc   r9   r   r/   s     r0   r;   zTerm.isin.<locals>.<listcomp>   s(    2^2^2^QV43E3Ee3L3L2^2^2^r2   )r8   r]   r_   rR   	frozensetr   r`   r/   r   s   ` r0   isinz	Term.isin   sZ    cD%i899 	a$T52^2^2^2^Z]2^2^2^+_``` s+++r2   c                P    |                      |                                          S r,   )r   r~   r   s     r0   notinz
Term.notin   s    yy~~$$&&&r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   	bin_regexrc   r   s     r0   r   zTerm.bin_regex   s%    h0$8J8J78S8STTTr2   c                     t          |           S r,   r|   r.   s    r0   r~   zTerm.negate   r   r2   ArithmeticExpressionc                    | |z  S r,   r-   rv   s     r0   lshiftzTerm.lshift       u}r2   c                    | |z	  S r,   r-   rv   s     r0   rshiftzTerm.rshift   r   r2   c                     t          |           S r,   r   r.   s    r0   
__invert__zTerm.__invert__   r   r2   c                    | S r,   r-   r.   s    r0   __pos__zTerm.__pos__       r2   Negativec                     t          |           S r,   )r   r.   s    r0   __neg__zTerm.__neg__   s    ~~r2   c                ^    t          t          j        | |                     |                    S r,   r   r   addrc   rv   s     r0   __add__zTerm.__add__   $    #JND$:L:LU:S:STTTr2   c                ^    t          t          j        | |                     |                    S r,   r   r   subrc   rv   s     r0   __sub__zTerm.__sub__   r   r2   c                ^    t          t          j        | |                     |                    S r,   r   r   mulrc   rv   s     r0   __mul__zTerm.__mul__   r   r2   c                ^    t          t          j        | |                     |                    S r,   r   r   divrc   rv   s     r0   __truediv__zTerm.__truediv__   r   r2   Powc                "    t          | |          S r,   )r   rv   s     r0   __pow__zTerm.__pow__       4r2   Modc                "    t          | |          S r,   )r   rv   s     r0   __mod__zTerm.__mod__   r   r2   c                ^    t          t          j        |                     |          |           S r,   r   rv   s     r0   __radd__zTerm.__radd__   $    #JND4F4Fu4M4MtTTTr2   c                ^    t          t          j        |                     |          |           S r,   r   rv   s     r0   __rsub__zTerm.__rsub__   r   r2   c                ^    t          t          j        |                     |          |           S r,   r   rv   s     r0   __rmul__zTerm.__rmul__   r   r2   c                ^    t          t          j        |                     |          |           S r,   r   rv   s     r0   __rtruediv__zTerm.__rtruediv__   r   r2   c                ^    t          t          j        | |                     |                    S r,   r   r   r   rc   rv   s     r0   
__lshift__zTerm.__lshift__  &    #J$5tT=O=OPU=V=VWWWr2   c                ^    t          t          j        | |                     |                    S r,   r   r   r   rc   rv   s     r0   
__rshift__zTerm.__rshift__  r   r2   c                ^    t          t          j        |                     |          |           S r,   r   rv   s     r0   __rlshift__zTerm.__rlshift__  &    #J$5t7I7I%7P7PRVWWWr2   c                ^    t          t          j        |                     |          |           S r,   r  rv   s     r0   __rrshift__zTerm.__rrshift__
  r  r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   rw   rc   rv   s     r0   __eq__zTerm.__eq__  $    hk41C1CE1J1JKKKr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   r   rc   rv   s     r0   __ne__zTerm.__ne__  r
  r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   r   rc   rv   s     r0   __gt__zTerm.__gt__  r
  r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   r   rc   rv   s     r0   __ge__zTerm.__ge__  $    hlD$2D2DU2K2KLLLr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   r   rc   rv   s     r0   __lt__zTerm.__lt__  r
  r2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   r   rc   rv   s     r0   __le__zTerm.__le__  r  r2   itemslicec                    t          |t                    st          d          |                     |j        |j                  S )Nz"Field' object is not subscriptable)r8   r  	TypeErrorr   r   stop)r/   r  s     r0   __getitem__zTerm.__getitem__  s<    $&& 	B@AAA||DJ	222r2   c                0    |                      dd          S )N"'
quote_charsecondary_quote_charget_sqlr.   s    r0   __str__zTerm.__str__$  s    ||s|EEEr2   c                J    t          |                     dd                    S )NT)
with_aliaswith_namespace)hashr#  r.   s    r0   __hash__zTerm.__hash__'  s     DLLDLFFGGGr2   kwargsc                    t                      r,   NotImplementedErrorr/   r*  s     r0   r#  zTerm.get_sql*      !###r2   r,   rD   rE   r)   rF   )rD   rK   r)   rF   )r)   rN   r)   rT   )rX   rY   r)   rZ   )rb   rd   r)   re   )rm   rn   ro   rn   r)   rC   rs   r   r)   rt   )r)   ry   )r)   r|   )r)   r   )r   ri   r)   r   )r   ri   r)   r   )r   rK   r)   rt   )r   rK   r)   rt   )r   r   r   r   r)   r   )r   r   r   r   r)   r   )r)   r   )r   r   r)   r   )rs   r   r)   r   )r)   rC   )r)   r   )rs   r   r)   r   )rs   r   r)   r   )r  r  r)   r   r)   rK   )r)   ri   r*  r   r)   rK   )Fr>   r?   r@   rA   rJ   r   rM   propertyrS   rW   staticmethodrc   rl   rr   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r  r  r  r  r  r  r$  r)  r#  r-   r2   r0   rC   rC   0   s       L        W & & & X&
& & & & .2        \ > HL    \      # # # #& & & && & & &D D D DC C C C               M M M MM M M MQ Q Q QN N N NR R R RN N N NQ Q Q QR R R R\ \ \ \Y Y Y YN N N N   , , , ,
' ' ' 'U U U U                  U U U UU U U UU U U UU U U U              U U U UU U U UU U U UU U U UX X X XX X X XX X X XX X X XL L L LL L L LL L L LM M M ML L L LM M M M3 3 3 3
F F F FH H H H$ $ $ $ $ $r2   rC   idxri   r)   rK   c                &    t          | dz             S Nrg   rK   r7  s    r0   idx_placeholder_genr<  .  s    sQw<<r2   c                    d| dz    S )Nparamrg   r-   r;  s    r0   named_placeholder_genr?  2  s    37r2   c                  R     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 )	ParameterNplaceholder	str | intr)   rF   c                V    t                                                       || _        d S r,   )superrJ   _placeholderr/   rB  	__class__s     r0   rJ   zParameter.__init__9  s'    'r2   c                    | j         S r,   )rF  r.   s    r0   rB  zParameter.placeholder=  s      r2   r*  r   rK   c                *    t          | j                  S r,   )rK   rB  r.  s     r0   r#  zParameter.get_sqlA  s    4#$$$r2   	param_keyparam_valuec                    d S r,   r-   )r/   rK  rL  r*  s       r0   update_parameterszParameter.update_parametersD      r2   c                    |S r,   r-   r/   rB  r*  s      r0   get_param_keyzParameter.get_param_keyG  s    r2   )rB  rC  r)   rF   r4  )rK  r   rL  r   rB  r   )r>   r?   r@   rA   rJ   r5  rB  r#  rN  rR  __classcell__rH  s   @r0   rA  rA  6  s        L( ( ( ( ( ( ! ! X!% % % %          r2   rA  c                  J     e Zd Zefd fdZedd            Zd ZddZ xZ	S )ListParameterrB   str | int | Callable[[int], str]r)   rF   c                r    t                                          |           t                      | _        d S NrB  )rE  rJ   r]   _parametersrG  s     r0   rJ   zListParameter.__init__L  0    [11166r2   rK   c                    t          | j                  r'|                     t          | j                            S t	          | j                  S r,   callablerF  lenr\  rK   r.   s    r0   rB  zListParameter.placeholderP  E    D%&& 	<$$S)9%:%:;;;4$%%%r2   c                    | j         S r,   r\  r.  s     r0   get_parameterszListParameter.get_parametersW      r2   r   r   c                :    | j                             |           d S r,   )r\  appendr/   r   r*  s      r0   rN  zListParameter.update_parametersZ  s    &&&&&r2   rB  rX  r)   rF   r3  r   r   )
r>   r?   r@   r<  rJ   r5  rB  re  rN  rT  rU  s   @r0   rW  rW  K  s        GZ " " " " " " " & & & X&     ' ' ' ' ' ' ' 'r2   rW  c                  R     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 )DictParameterrB  rX  r)   rF   c                r    t                                          |           t                      | _        d S rZ  )rE  rJ   dictr\  rG  s     r0   rJ   zDictParameter.__init___  r]  r2   rK   c                    t          | j                  r'|                     t          | j                            S t	          | j                  S r,   r_  r.   s    r0   rB  zDictParameter.placeholderc  rb  r2   c                    | j         S r,   rd  r.  s     r0   re  zDictParameter.get_parametersj  rf  r2   r   c                    |dd          S r9  r-   rQ  s      r0   rR  zDictParameter.get_param_keym  s    122r2   rK  r   c                    || j         |<   d S r,   rd  )r/   rK  r   r*  s       r0   rN  zDictParameter.update_parametersp  s    &+###r2   rj  r3  rS  )rK  r   r   r   )r>   r?   r@   r?  rJ   r5  rB  re  rR  rN  rT  rU  s   @r0   rm  rm  ^  s        G\ " " " " " " " & & & X&        , , , , , , , ,r2   rm  c                      e Zd Zd ZdS )QmarkParameterc                    dS )N?r-   r.  s     r0   r#  zQmarkParameter.get_sqlu  s    sr2   Nr>   r?   r@   r#  r-   r2   r0   ru  ru  t  s#            r2   ru  c                      e Zd ZdZddZdS )	NumericParameterz0Numeric, positional style, e.g. ...WHERE name=:1r*  r   r)   rK   c                8    d                     | j                  S Nz:{placeholder}r[  formatrB  r.  s     r0   r#  zNumericParameter.get_sql|      &&43C&DDDr2   Nr4  r>   r?   r@   __doc__r#  r-   r2   r0   rz  rz  y  s4        ::E E E E E Er2   rz  c                      e Zd ZdZddZdS )	FormatParameterz1ANSI C printf format codes, e.g. ...WHERE name=%sr*  r   r)   rK   c                    dS )Nz%sr-   r.  s     r0   r#  zFormatParameter.get_sql  s    tr2   Nr4  r  r-   r2   r0   r  r    s.        ;;     r2   r  c                      e Zd ZdZddZdS )	NamedParameterz%Named style, e.g. ...WHERE name=:namer*  r   r)   rK   c                8    d                     | j                  S r|  r}  r.  s     r0   r#  zNamedParameter.get_sql  r  r2   Nr4  r  r-   r2   r0   r  r    s4        //E E E E E Er2   r  c                  "    e Zd ZdZd
dZddZd	S )PyformatParameterz9Python extended format codes, e.g. ...WHERE name=%(name)sr*  r   r)   rK   c                8    d                     | j                  S )Nz%({placeholder})sr[  r}  r.  s     r0   r#  zPyformatParameter.get_sql  s    "))d6F)GGGr2   rB  c                    |dd         S )N   r-   rQ  s      r0   rR  zPyformatParameter.get_param_key  s    1R4  r2   Nr4  rS  )r>   r?   r@   r  r#  rR  r-   r2   r0   r  r    sF        CCH H H H! ! ! ! ! !r2   r  c                  @     e Zd Zd fdZedd            ZddZ xZS )r   termrC   r)   rF   c                V    t                                                       || _        d S r,   rE  rJ   r  r/   r  rH  s     r0   rJ   zNegative.__init__  s$    			r2   bool | Nonec                    | j         j        S r,   r  rA   r.   s    r0   rA   zNegative.is_aggregate      y%%r2   r*  r   rK   c                N    d                      | j        j        di |          S )Nz-{term}r  r-   )r~  r  r#  r.  s     r0   r#  zNegative.get_sql  s/    %6TY%6%@%@%@%@AAAr2   )r  rC   r)   rF   r)   r  r4  )r>   r?   r@   rJ   r5  rA   r#  rT  rU  s   @r0   r   r     sy              & & & X&B B B B B B B Br2   r   c                  ^     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 )ra   Nr   r   rD   rE   r)   rF   c                X    t                                          |           || _        d S r,   rE  rJ   r   r/   r   rD   rH  s      r0   rJ   zValueWrapper.__init__  &    


r2   r*  rK   c                (     | j         | j        fi |S r,   )get_formatted_valuer   r.  s     r0   get_value_sqlzValueWrapper.get_value_sql  s    't'
==f===r2   c                   |                     d          pd}t          |t                    r |j        di |S t          |t                    r | j        |j        fi |S t          |t          t          t          f          r  | j        |
                                fi |S t          |t                    rt          ||          S t          |t                    r't                              t          |                    S t          |t          j                  r | j        t          |          fi |S |dS t          |          S )Nr!   nullr-   )getr8   rC   r#  r   r  r   r   r	   r
   	isoformatrK   r   rj   r   uuidUUID)clsr   r*  r   s       r0   r  z ValueWrapper.get_formatted_value  sJ   ZZ 677=2
eT"" 	+ 5=**6***eT"" 	B*3*5;AA&AAAedHd344 	H*3*5??+<+<GGGGGeS!! 	4 
333eT"" 	)99SZZ(((eTY'' 	A*3*3u::@@@@@=65zzr2   	parameterrA  tuple[str, str]c                P     |j         di |}|                    |          }||fS Nr[  r-   )r#  rR  r/   r  r*  	param_sqlrK  s        r0   _get_param_datazValueWrapper._get_param_data  s;    %I%////	++	+BB	)##r2   r  r   r!  c                ,   |% | 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   )rK  r   r-   )	r  r   rD   r8   r   ri   floatr  rN  )	r/   r   r!  r  r*  sql	value_sqlr  rK  s	            r0   r#  zValueWrapper.get_sql  s     $$$p
QeppioppC#CUU
UfUUU dj3,// 	L
II**KKjKFKKI3t3IHHHH	9#	#SiySSFSSS	4:WW*WPVWWWr2   r,   r   r   rD   rE   r)   rF   r4  rk  r  rA  r)   r  )Nr  N)
r   rE   r!  rK   r  rA  r*  r   r)   rK   )r>   r?   r@   rA   rJ   r  classmethodr  r  r#  rT  rU  s   @r0   ra   ra     s        L      > > > >    [&$ $ $ $ "&$'#	X X X X X X X X Xr2   ra   c                  *     e Zd Zdd fd
ZddZ xZS )ParameterValueWrapperNr  rA  r   r   rD   rE   r)   rF   c                Z    t                                          ||           || _        d S r,   )rE  rJ   
_parameter)r/   r  r   rD   rH  s       r0   rJ   zParameterValueWrapper.__init__  s(    &&&#r2   r  c                d     | j         j        di |}| j                             |          }||fS r  )r  r#  rR  r  s        r0   r  z%ParameterValueWrapper._get_param_data  s?    +DO+55f55	O11i1HH	)##r2   r,   )r  rA  r   r   rD   rE   r)   rF   r  )r>   r?   r@   rJ   r  rT  rU  s   @r0   r  r    sV        $ $ $ $ $ $ $$ $ $ $ $ $ $ $r2   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d0dZd0dZd1dZd1dZd2d!Zd2d"Zd2d#Zd3d%Zd3d&Z xZS )4rk   Nstr | Selectable | Nonetabler   r   rD   rE   r)   rF   c                X    t                                          |           || _        d S r,   r  r  s      r0   rJ   zJSON.__init__  r  r2   r*  rK   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,   )r8   ro  _get_dict_sqlr]   _get_list_sqlrK   _get_str_sqlri  s      r0   _recursive_get_sqlzJSON._recursive_get_sql  s    eT"" 	7%4%e66v666eT"" 	7%4%e66v666eS!! 	6$4$U55f5555zzr2   ro  c                      fd|                                 D             }d                    dd                    |          dg          S )Nc           
     t    g | ]4\  }}d                       j        |fi  j        |fi           5S )z{key}:{value})keyr   )r~  r  )r9   kvr*  r/   s      r0   r;   z&JSON._get_dict_sql.<locals>.<listcomp>  so     
 
 
1 ""'>t'>q'K'KF'K'KSjSWSjklSwSwpvSwSw"xx
 
 
r2   r  {,})itemsjoinr/   r   r*  pairss   ` ` r0   r  zJSON._get_dict_sql  s^    
 
 
 
 

 
 
 wwSXXe__c2333r2   r]   c                z      fd|D             }d                     dd                     |          dg          S )Nc                ,    g | ]} j         |fi S r-   )r  )r9   r  r*  r/   s     r0   r;   z&JSON._get_list_sql.<locals>.<listcomp>  s/    EEE!((55f55EEEr2   r  [r  ])r  r  s   ` ` r0   r  zJSON._get_list_sql  sC    EEEEEuEEEwwSXXe__c2333r2   r  r   c                "    t          | |          S r,   )r   )r   r   r*  s      r0   r  zJSON._get_str_sql  s    UJ///r2   r  r!  c                x    t          |                     | j                  |          }t          || j        fi |S r,   )r   r  r   r   rD   )r/   r!  r*  r  s       r0   r#  zJSON.get_sql
  s<    D33DJ??AUVVTZ::6:::r2   key_or_indexrC  rt   c                ^    t          t          j        | |                     |                    S r,   )rt   r   GET_JSON_VALUErc   r/   r  s     r0   get_json_valuezJSON.get_json_value  &    m:D$BTBTUaBbBbcccr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   GET_TEXT_VALUErc   r  s     r0   get_text_valuezJSON.get_text_value  r  r2   	path_jsonc                ^    t          t          j        | |                     |                    S r,   )rt   r   GET_PATH_JSON_VALUErl   r/   r  s     r0   get_path_json_valuezJSON.get_path_json_value  $    m?t~~V_G`G`aaar2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   GET_PATH_TEXT_VALUErl   r  s     r0   get_path_text_valuezJSON.get_path_text_value  r  r2   rs   c                ^    t          t          j        | |                     |                    S r,   )rt   r   HAS_KEYrl   rv   s     r0   has_keyzJSON.has_key  s#    m3T4>>%;P;PQQQr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   CONTAINSrl   rv   s     r0   containszJSON.contains  s#    m4dDNN5<Q<QRRRr2   c                ^    t          t          j        | |                     |                    S r,   )rt   r   CONTAINED_BYrl   rv   s     r0   contained_byzJSON.contained_by   s#    m8$u@U@UVVVr2   r   c                F    t          t          j        | t          |           S r,   )rt   r   HAS_KEYSr^   rv   s     r0   has_keyszJSON.has_keys#  s    m4dE5MJJJr2   c                F    t          t          j        | t          |           S r,   )rt   r   HAS_ANY_KEYSr^   rv   s     r0   has_any_keyszJSON.has_any_keys&  s    m8$uNNNr2   NNr  )r   r   r*  r   r)   rK   )r   ro  r*  r   r)   rK   )r   r]   r*  r   r)   rK   )r  )r   rK   r   rK   r*  r   r)   rK   )r  )r!  rK   r*  r   r)   rK   )r  rC  r)   rt   )r  rK   r)   rt   r2  )rs   r   r)   rt   )r>   r?   r@   r  __annotations__rJ   r  r  r  r6  r  r#  r  r  r  r  r  r  r  r  r  rT  rU  s   @r0   rk   rk     s        %)E))))         4 4 4 44 4 4 4 0 0 0 0 \0; ; ; ; ;d d d dd d d db b b bb b b bR R R RS S S SW W W WK K K KO O O O O O O Or2   rk   c                  *     e Zd Zd fdZdddZ xZS )Valuesfieldstr | Fieldr)   rF   c                    t                                          d            t          |t                    st          |          n|| _        d S r,   )rE  rJ   r8   rV   r  )r/   r  rH  s     r0   rJ   zValues.__init__+  s?    )3E5)A)ALU5\\\u


r2   Nr   rE   r*  r   rK   c                R    d                      | j        j        dd|i|          S )NzVALUES({value})r   r   r-   )r~  r  r#  r/   r   r*  s      r0   r#  zValues.get_sql/  s5     ''.@dj.@.a.aJ.aZ`.a.a'bbbr2   )r  r  r)   rF   r,   r   rE   r*  r   r)   rK   r>   r?   r@   rJ   r#  rT  rU  s   @r0   r  r  *  se        M M M M M Mc c c c c c c c cr2   r  c                  *     e Zd Zdd fdZdd
Z xZS )LiteralValueNrD   rE   r)   rF   c                X    t                                          |           || _        d S r,   )rE  rJ   _valuer  s      r0   rJ   zLiteralValue.__init__4  s&    r2   r*  r   rK   c                2    t          | j        | j        fi |S r,   )r   r  rD   r.  s     r0   r#  zLiteralValue.get_sql8  s    TZBB6BBBr2   r,   r0  r4  r  rU  s   @r0   r  r  3  s^              C C C C C C C Cr2   r  c                  "     e Zd Zdd fdZ xZS )	r\   NrD   rE   r)   rF   c                L    t                                          d|           d S )Nr  rE  rJ   r/   rD   rH  s     r0   rJ   zNullValue.__init__=  s#    '''''r2   r,   r0  r>   r?   r@   rJ   rT  rU  s   @r0   r\   r\   <  sB        ( ( ( ( ( ( ( ( ( ( (r2   r\   c                  "     e Zd Zdd fdZ xZS )	SystemTimeValueNrD   rE   r)   rF   c                L    t                                          d|           d S )NSYSTEM_TIMEr  r  s     r0   rJ   zSystemTimeValue.__init__B  s#    .....r2   r,   r0  r  rU  s   @r0   r  r  A  sB        / / / / / / / / / / /r2   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dS )#	Criterion
comparatorr   rs   EmptyCriterionr)   r!   c                    d S r,   r-   r/   r  rs   s      r0   _comparezCriterion._compareG  s    ORsr2   r   ComplexCriterionc                    d S r,   r-   r  s      r0   r  zCriterion._compareJ  s    PSPSr2   Self | ComplexCriterionc                R    t          |t                    r| S t          || |          S r,   )r8   r  r  r  s      r0   r  zCriterion._compareM  s+    e^,, 	K
D%888r2   c                B    |                      t          j        |          S r,   )r  r   and_rv   s     r0   __and__zCriterion.__and__R      }}W\5111r2   c                B    |                      t          j        |          S r,   )r  r   or_rv   s     r0   __or__zCriterion.__or__U  s    }}W[%000r2   c                B    |                      t          j        |          S r,   )r  r   xor_rv   s     r0   __xor__zCriterion.__xor__X  r!  r2   r-   termsIterable[Term](EmptyCriterion | Term | ComplexCriterionc                6    t                      }| D ]}||z  }|S r,   r  r(  critr  s      r0   anyzCriterion.any[  ,     	 	DDLDDr2   Iterable[Any]'EmptyCriterion | Any | ComplexCriterionc                6    t                      }| D ]}||z  }|S r,   r,  r-  s      r0   allzCriterion.alld  r0  r2   rK   c                    t                      r,   r,  r.   s    r0   r#  zCriterion.get_sqlm  r/  r2   N)r  r   rs   r  r)   r!   )r  r   rs   r   r)   r  )r  r   rs   r   r)   r  )rs   r   r)   r  )r-   )r(  r)  r)   r*  )r(  r1  r)   r2  r3  )r>   r?   r@   r   r  r   r$  r'  r6  r/  r4  r#  r-   r2   r0   r  r  F  s        RRR XRSSS XS9 9 9 9
2 2 2 21 1 1 12 2 2 2     \     \$ $ $ $ $ $r2   r  c                  N    e Zd ZdZ e            ZddZddZddZdd	Z	dd
Z
dS )r  Nr)   rT   c                    t                      S r,   )rR   r.   s    r0   rW   zEmptyCriterion.fields_u  s    uur2   rs   r   c                    |S r,   r-   rv   s     r0   r   zEmptyCriterion.__and__x      r2   c                    |S r,   r-   rv   s     r0   r$  zEmptyCriterion.__or__{  r9  r2   c                    |S r,   r-   rv   s     r0   r'  zEmptyCriterion.__xor__~  r9  r2   c                    | S r,   r-   r.   s    r0   r   zEmptyCriterion.__invert__  r   r2   r1  )rs   r   r)   r   )r)   r   )r>   r?   r@   rA   rR   rS   rW   r   r$  r'  r   r-   r2   r0   r  r  q  s        LceeG                 r2   r  c                  J     e Zd Zdd fd
ZddZedd            ZddZ xZS )rV   NnamerK   rD   rE   r  r  r)   rF   c                    t                                          |           || _        t          |t                    rddlm}  ||          }|| _        d S )NrH   r   rP   )rE  rJ   r>  r8   rK   pypika.queriesr$   r  )r/   r>  rD   r  r$   rH  s        r0   rJ   zField.__init__  sa    u%%%	eS!! 	!,,,,,,E%LLE.3


r2   r*   c              #  b   K   | V  | j         !| j                                         E d {V  d S d S r,   r  r1   r.   s    r0   r1   zField.nodes_  K      


:!z((*********** "!r2   rm   rn   ro   c                8    | j         |k    r|n| j         | _         dS )Q  
        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  rq   s      r0   rr   zField.replace_table  s!     #'*"="=YY4:


r2   r*  r   c                   |                     dd          }|                     dd          }|                     dd           }t          | j        |          }| j        rL|s| j        j        r>| j                                        }d                    t          ||          |          }t          | dd           }|rt          ||fd|i|S |S )Nr&  Fr'  r   z{namespace}.{name})	namespacer>  rD   )	popr   r>  r  rD   get_table_namer~  getattrr   )r/   r*  r&  r'  r   	field_sql
table_namefield_aliass           r0   r#  zField.get_sql  s    ZZe44
$4e<<ZZd33
!$)Z88	 : 	> 	TZ-= 	2244J,33'
J?? 4  I
 dGT22 	]#I{\\z\U[\\\r2   r  )r>  rK   rD   rE   r  r  r)   rF   r=   rm   rn   ro   rn   r)   rF   r4  	r>   r?   r@   rJ   r1   r   rr   r#  rT  rU  s   @r0   rV   rV     s        4 4 4 4 4 4 4+ + + +
 N N N WN       r2   rV   c                  ,     e Zd Zdd fdZdddZ xZS )IndexNr>  rK   rD   rE   r)   rF   c                X    t                                          |           || _        d S r,   rE  rJ   r>  )r/   r>  rD   rH  s      r0   rJ   zIndex.__init__  &    			r2   r   r*  r   c                ,    t          | j        |          S r,   )r   r>  r  s      r0   r#  zIndex.get_sql  s    TY
333r2   r,   )r>  rK   rD   rE   r)   rF   r  r  rU  s   @r0   rR  rR    s[              4 4 4 4 4 4 4 4 4r2   rR  c                  6     e Zd Zdd fdZddZ	 dddZ xZS )StarNr  r  r)   rF   c                N    t                                          d|           d S )N*rF  r  )r/   r  rH  s     r0   rJ   zStar.__init__  s&    E*****r2   r*   c              #  b   K   | V  | j         !| j                                         E d {V  d S d S r,   rB  r.   s    r0   r1   zStar.nodes_  rC  r2   Fr&  rj   r'  r   rE   r*  r   rK   c                    | j         rR|s| j         j        rD| j         j        pt          | j         d          }d                    t	          ||                    S dS )N_table_namez{}.*rZ  )r  rD   rK  r~  r   )r/   r&  r'  r   r*  rH  s         r0   r#  zStar.get_sql  s`     : 	G> 	GTZ-= 	G
(NGDJ,N,NI==y*!E!EFFFsr2   r,   )r  r  r)   rF   r=   )FFN)
r&  rj   r'  rj   r   rE   r*  r   r)   rK   r>   r?   r@   rJ   r1   r#  rT  rU  s   @r0   rX  rX    sv        + + + + + + ++ + + + `d        r2   rX  c                  `     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 )r`   valuesr   r)   rF   c                p     t                                                        fd|D              _        d S )Nc                :    g | ]}                     |          S r-   r   r   s     r0   r;   z"Tuple.__init__.<locals>.<listcomp>  s'    EEEUt))%00EEEr2   )rE  rJ   r`  )r/   r`  rH  s   ` r0   rJ   zTuple.__init__  s9    EEEEfEEEr2   r*   c              #  Z   K   | V  | j         D ]}|                                E d {V  d S r,   )r`  r1   r   s     r0   r1   zTuple.nodes_  sM      


[ 	& 	&E||~~%%%%%%%%	& 	&r2   r*  rK   c                    d                     d                    fd| j        D                                 }t          || j        fi S )N({})r  c              3  2   K   | ]} |j         di V  d S Nr-   r"  r9   r  r*  s     r0   	<genexpr>z Tuple.get_sql.<locals>.<genexpr>  s5      $T$T\T\%;%;F%;%;$T$T$T$T$T$Tr2   )r~  r  r`  r   rD   r/   r*  r  s    ` r0   r#  zTuple.get_sql  sQ    mmCHH$T$T$T$T$T$T$TTTUUTZ::6:::r2   rj   c                >    t          d | j        D                       S )Nc                    g | ]	}|j         
S r-   rA   )r9   rb   s     r0   r;   z&Tuple.is_aggregate.<locals>.<listcomp>  s    $M$M$M#S%5$M$M$Mr2   )r   r`  r.   s    r0   rA   zTuple.is_aggregate  s!    #$M$M$M$M$MNNNr2   rm   rn   ro   c                <    fd| j         D             | _         dS )rE  c                <    g | ]}|                               S r-   rr   )r9   r   rm   ro   s     r0   r;   z'Tuple.replace_table.<locals>.<listcomp>  s)    ^^^u**=)DD^^^r2   N)r`  rq   s    ``r0   rr   zTuple.replace_table  s-     _^^^^RVR]^^^r2   )r`  r   r)   rF   r=   r4  r)   rj   rO  )r>   r?   r@   rJ   r1   r#  r5  rA   r   rr   rT  rU  s   @r0   r`   r`     s        F F F F F F& & & &
; ; ; ; O O O XO _ _ _ W_ _ _ _ _r2   r`   c                      e Zd ZddZdS )r^   r*  r   r)   rK   c                R                        d          }d                    fd| j        D                       }d                    |          }|t          j        t          j        fv r*t          |          dk    rd                    |          nd}t          || j	        fi S )Ndialectr  c              3  2   K   | ]} |j         di V  d S rg  r"  rh  s     r0   ri  z Array.get_sql.<locals>.<genexpr>  s5      IIT,$,0000IIIIIIr2   z[{}]r   z	ARRAY[{}]z'{}')
r  r  r`  r~  r   
POSTGRESQLREDSHIFTra  r   rD   )r/   r*  rt  r`  r  s    `   r0   r#  zArray.get_sql  s    **Y''IIIIT[IIIIImmF##x*H,=>>>03Fa+$$V,,,VCTZ::6:::r2   Nr4  rx  r-   r2   r0   r^   r^     s(        ; ; ; ; ; ;r2   r^   c                        e Zd Zd fdZ xZS )Bracketr  r   r)   rF   c                J    t                                          |           d S r,   r  r  s     r0   rJ   zBracket.__init__  s!    r2   )r  r   r)   rF   r  rU  s   @r0   ry  ry    s=                 r2   ry  c                  f     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 )$NestedCriterionNr  r   nested_comparatorr  leftr   rightnestedrD   rE   r)   rF   c                    t                                          |           || _        || _        || _        || _        || _        d S r,   )rE  rJ   r~  r  r}  r  r  )r/   r  r}  r~  r  r  rD   rH  s          r0   rJ   zNestedCriterion.__init__  sE     		$!2
r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  | j                                        E d {V  d S r,   )r  r1   r~  r  r.   s    r0   r1   zNestedCriterion.nodes_  s      


:$$&&&&&&&&&9##%%%%%%%%%;%%'''''''''''r2   r  c                X    t          d | j        | j        | j        fD                       S )Nc                    g | ]	}|j         
S r-   rm  r9   r  s     r0   r;   z0NestedCriterion.is_aggregate.<locals>.<listcomp>  s    $h$h$h4T%6$h$h$hr2   )r   r~  r  r  r.   s    r0   rA   zNestedCriterion.is_aggregate  s.    #$h$hDItz[_[fCg$h$h$hiiir2   rm   rn   ro   c                    | j                             ||          | _         | j                            ||          | _        | j                            ||          | _        dS U  
        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~  rr   r  r  rq   s      r0   rr   zNestedCriterion.replace_table!  sS     I++M9EE	Z--mYGG
j..}iHHr2   Fr&  rj   r*  rK   c                    d                      | 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  )r  rD   r-   )
r~  r~  r#  r  r   r  r}  r  r   rD   r/   r&  r*  r  s       r0   r#  zNestedCriterion.get_sql1  s    DKK"",,V,,,$$*$..v.."4:&4;&0000 L 
 
  	I#H4:HHHHH
r2   r,   )r  r   r}  r  r~  r   r  r   r  r   rD   rE   r)   rF   r=   r  rO  Fr&  rj   r*  r   r)   rK   r>   r?   r@   rJ   r1   r5  rA   r   rr   r#  rT  rU  s   @r0   r|  r|    s         !       ( ( ( ( j j j Xj I I I WI        r2   r|  c                  d     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 )$rt   Nr  r   r~  rC   r  rD   rE   r)   rF   c                t    t                                          |           || _        || _        || _        dS )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)rE  rJ   r  r~  r  )r/   r  r~  r  rD   rH  s        r0   rJ   zBasicCriterion.__init__A  s6     	$	


r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  d S r,   )r  r1   r~  r.   s    r0   r1   zBasicCriterion.nodes_T  sa      


:$$&&&&&&&&&9##%%%%%%%%%%%r2   r  c                L    t          d | j        | j        fD                       S )Nc                    g | ]	}|j         
S r-   rm  r  s     r0   r;   z/BasicCriterion.is_aggregate.<locals>.<listcomp>[  s    $[$[$[4T%6$[$[$[r2   )r   r~  r  r.   s    r0   rA   zBasicCriterion.is_aggregateY  s(    #$[$[DItzCZ$[$[$[\\\r2   rm   rn   ro   c                    | j                             ||          | _         | j                            ||          | _        dS r  r~  rr   r  rq   s      r0   rr   zBasicCriterion.replace_table]  :     I++M9EE	Z--mYGG


r2   r  Fr   rK   r&  rj   r*  r   c           	         d                     | 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  r   r~  r#  r  r   rD   )r/   r   r&  r*  r  s        r0   r#  zBasicCriterion.get_sqll  s    )00,""CCjCFCC$$*$EE
EfEE 1 
 

  	?#C>>v>>>
r2   r,   )
r  r   r~  rC   r  rC   rD   rE   r)   rF   r=   r  rO  )r  F)r   rK   r&  rj   r*  r   r)   rK   r  rU  s   @r0   rt   rt   @  s              && & & &
 ] ] ] X] H H H WH        r2   rt   c                  |     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   Nr  r   	containerrC   rD   rE   r)   rF   c                t    t                                          |           || _        || _        d| _        dS )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)rE  rJ   r  r  _is_negated)r/   r  r  rD   rH  s       r0   rJ   zContainsCriterion.__init__x  s9     		" r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  d S r,   )r  r1   r  r.   s    r0   r1   zContainsCriterion.nodes_  sa      


9##%%%%%%%%%>((***********r2   r  c                    | j         j        S r,   r  r.   s    r0   rA   zContainsCriterion.is_aggregate  r  r2   rm   rn   ro   c                F    | j                             ||          | _         dS r  r  rr   rq   s      r0   rr   zContainsCriterion.replace_table  !     I++M9EE			r2   subqueryr*  rK   c                    d                      | 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 r  )r  r  not_r-   )r~  r  r#  r  r  r   rD   )r/   r  r*  r  s       r0   r#  zContainsCriterion.get_sql  s|    +22"",,V,,,dn,EEdEfEE+3 3 
 

  TZ::6:::r2   c                    d| _         d S NTr  r.   s    r0   r~   zContainsCriterion.negate  s    r2   r,   )r  r   r  rC   rD   rE   r)   rF   r=   r  rO  )r  r   r*  r   r)   rK   )r)   r   )r>   r?   r@   rJ   r1   r5  rA   r   rr   r#  r~   rT  rU  s   @r0   r   r   w  s        ! ! ! ! ! ! ! + + + +
 & & & X& F F F WF; ; ; ; ;       W         r2   r   c                  ,     e Zd Zd fd	Zd Zd Z xZS )ExistsCriterionNc                f    t                                          |           || _        d| _        d S NF)rE  rJ   r  r  )r/   r  rD   rH  s      r0   rJ   zExistsCriterion.__init__  s0    " r2   c                b    d                      | j        j        di || j        rdnd          S )Nz{not_}EXISTS {container}r  r  )r  r  r-   )r~  r  r#  r  r.  s     r0   r#  zExistsCriterion.get_sql  sF    )00,dn,66v66tGW=_VV]_ 1 
 
 	
r2   c                    d| _         | S r  r  r.   s    r0   r~   zExistsCriterion.negate  s    r2   r,   )r>   r?   r@   rJ   r#  r~   rT  rU  s   @r0   r  r    s[        ! ! ! ! ! !

 
 

      r2   r  c                  B     e Zd Zdd fdZddZedd            Z xZS )RangeCriterionNr  rC   r   r   r   rD   rE   r)   rK   c                t    t                                          |           || _        || _        || _        d S r,   )rE  rJ   r  r   r   )r/   r  r   r   rD   rH  s        r0   rJ   zRangeCriterion.__init__  s4    	
r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  | j                                        E d {V  d S r,   )r  r1   r   r   r.   s    r0   r1   zRangeCriterion.nodes_  s      


9##%%%%%%%%%:$$&&&&&&&&&8??$$$$$$$$$$$r2   r  c                    | j         j        S r,   r  r.   s    r0   rA   zRangeCriterion.is_aggregate  r  r2   r,   )
r  rC   r   r   r   r   rD   rE   r)   rK   r=   r  )r>   r?   r@   rJ   r1   r5  rA   rT  rU  s   @r0   r  r    sv              % % % % & & & X& & & & &r2   r  c                  .    e Zd Zedd            Zdd
ZdS )r   rm   rn   ro   r)   rF   c                F    | j                             ||          | _         dS r  r  rq   s      r0   rr   zBetweenCriterion.replace_table  r  r2   r*  r   rK   c           	         d                      | 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   rD   rj  s      r0   r#  zBetweenCriterion.get_sql  s    077"",,V,,$$*$..v..  **6** 8 
 

  TZ::6:::r2   NrO  r4  )r>   r?   r@   r   rr   r#  r-   r2   r0   r   r     sJ        F F F WF; ; ; ; ; ;r2   r   c                      e Zd ZddZdS )r   r*  r   r)   rK   c           	         d                      | 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  rj  s      r0   r#  zPeriodCriterion.get_sql  s    ,33"",,V,,$$*$..v..  **6** 4 
 

  TZ::6:::r2   Nr4  rx  r-   r2   r0   r   r     s(        ; ; ; ; ; ;r2   r   c                  J     e Zd Zdd fd
ZddZedd            ZddZ xZS )r   Nr  rC   r   r   rD   rE   r)   rF   c                f    t                                          |           || _        || _        d S r,   rE  rJ   r  r   r/   r  r   rD   rH  s       r0   rJ   zBitwiseAndCriterion.__init__  -    	


r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  d S r,   r  r1   r   r.   s    r0   r1   zBitwiseAndCriterion.nodes_  a      


9##%%%%%%%%%:$$&&&&&&&&&&&r2   rm   rn   ro   c                F    | j                             ||          | _         dS r  r  rq   s      r0   rr   z!BitwiseAndCriterion.replace_table  r  r2   r*  rK   c                    d                      | j        j        di || j                  }t	          || j        fi |S )Nz({term} & {value})r  r   r-   r~  r  r#  r   r   rD   rj  s      r0   r#  zBitwiseAndCriterion.get_sql	  U    "))"",,V,,* * 
 
  TZ::6:::r2   r,   r  rC   r   r   rD   rE   r)   rF   r=   rO  r4  rP  rU  s   @r0   r   r                   
' ' ' '
 F F F WF; ; ; ; ; ; ; ;r2   r   c                  J     e Zd Zdd fd
ZddZedd            ZddZ xZS )r   Nr  rC   r   r   rD   rE   r)   rF   c                f    t                                          |           || _        || _        d S r,   r  r  s       r0   rJ   zBitwiseOrCriterion.__init__  r  r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  d S r,   r  r.   s    r0   r1   zBitwiseOrCriterion.nodes_  r  r2   rm   rn   ro   c                F    | j                             ||          | _         dS r  r  rq   s      r0   rr   z BitwiseOrCriterion.replace_table  r  r2   r*  rK   c                    d                      | j        j        di || j                  }t	          || j        fi |S )Nz({term} | {value})r  r-   r  rj  s      r0   r#  zBitwiseOrCriterion.get_sql*  r  r2   r,   r  r=   rO  r4  rP  rU  s   @r0   r   r     r  r2   r   c                  L     e Zd Zdd fdZdd
Zedd            ZdddZ xZS )ry   Nr  rC   rD   rE   r)   rF   c                X    t                                          |           || _        d S r,   r  r/   r  rD   rH  s      r0   rJ   zNullCriterion.__init__3  rU  r2   r*   c              #  P   K   | V  | j                                         E d {V  d S r,   r  r1   r.   s    r0   r1   zNullCriterion.nodes_7  ;      


9##%%%%%%%%%%%r2   rm   rn   ro   c                F    | j                             ||          | _         dS r  r  rq   s      r0   rr   zNullCriterion.replace_table;  r  r2   Fr&  rj   r*  r   rK   c                t    d                      | j        j        di |          }t          || j        fi |S )Nz{term} IS NULLr  r-   r~  r  r#  r   rD   r  s       r0   r#  zNullCriterion.get_sqlI  sP    %%"",,V,, & 
 
  TZ::6:::r2   r,   )r  rC   rD   rE   r)   rF   r=   rO  r  r  rP  rU  s   @r0   ry   ry   2  s              & & & & F F F WF; ; ; ; ; ; ; ; ;r2   ry   c                      e Zd Zd
ddZd	S )r   Fr&  rj   r*  r   r)   rK   c                t    d                      | j        j        di |          }t          || j        fi |S )Nz{term} IS NOT NULLr  r-   r  r  s       r0   r#  zNotNullCriterion.get_sqlQ  sP    "))"",,V,, * 
 
  TZ::6:::r2   Nr  r  rx  r-   r2   r0   r   r   P  s-        ; ; ; ; ; ; ;r2   r   c                       e Zd ZdddZddZdS )r  Fsubcriterionrj   r*  r   r)   rK   c                "   d                     | j        j         | j        j        dd|                     | j                  i| | j        j        dd|                     | j                  i|          }|rd                     |          S |S )Nz{left} {comparator} {right}r  r  z({criterion}))	criterionr-   )r~  r  r   r~  r#  needs_bracketsr  )r/   r  r*  r  s       r0   r#  zComplexCriterion.get_sqlY  s    +22,""YY0C0CDI0N0NYRXYY$$*$\\$2E2Edj2Q2Q\U[\\ 3 
 
  	9"))C)888
r2   r  rC   c                N    t          |t                    o|j        | j        k     S r,   )r8   r  r  r/   r  s     r0   r  zComplexCriterion.needs_bracketse  s$    $ 011\$/T_:\6\\r2   Nr  )r  rj   r*  r   r)   rK   )r  rC   r)   rj   )r>   r?   r@   r#  r  r-   r2   r0   r  r  X  sG        
 
 
 
 
] ] ] ] ] ]r2   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.
    Noperatorr   r~  r   r  rD   rE   r)   rF   c                t    t                                          |           || _        || _        || _        dS )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)rE  rJ   r  r~  r  )r/   r  r~  r  rD   rH  s        r0   rJ   zArithmeticExpression.__init__q  s6      	 	


r2   r*   c              #     K   | V  | j                                         E d {V  | j                                        E d {V  d S r,   )r~  r1   r  r.   s    r0   r1   zArithmeticExpression.nodes_  r  r2   r  c                L    t          | j        j        | j        j        g          S r,   )r   r~  rA   r  r.   s    r0   rA   z!ArithmeticExpression.is_aggregate  s!     $TY%;TZ=T$UVVVr2   rm   rn   ro   c                    | j                             ||          | _         | j                            ||          | _        dS )P  
        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  rq   s      r0   rr   z"ArithmeticExpression.replace_table  r  r2   rj   c                2    |dS || j         v rdS || 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.
        NF)	add_order)r/   curr_opleft_ops      r0   left_needs_parensz&ArithmeticExpression.left_needs_parens  s/     ?5dn$$5
 $.((r2   c                d    |dS |t           j        k    rdS |t           j        k    rdS || 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.
        NFT)r   r   r   r  )r/   r  right_ops      r0   right_needs_parensz'ArithmeticExpression.right_needs_parens  sB     5jn$$5jn$$4
 4>))r2   Fr&  r*  rK   c                   d | j         | j        fD             \  }}d                    | j        j        |                     | j        |          rdnd                     | j         j        di |          |                     | j        |          rdnd                     | j        j        di |                    }|rt          || j	        fi |S |S )Nc                0    g | ]}t          |d d          S )r  N)rK  )r9   sides     r0   r;   z0ArithmeticExpression.get_sql.<locals>.<listcomp>  s$    aaaWT:t<<aaar2   z{left}{operator}{right}re  z{})r  r~  r  r-   )
r~  r  r~  r  r   r  r#  r  r   rD   )r/   r&  r*  r  r  arithmetic_sqls         r0   r#  zArithmeticExpression.get_sql  s   aa$)UYU_I`aaa299]( 224='JJT&&PT\\!	!++F++  "44T]HMMW66SW__"
",,V,,  : 
 
  	J#NDJII&IIIr2   r,   )
r  r   r~  r   r  r   rD   rE   r)   rF   r=   r  rO  rq  r  r  )r>   r?   r@   r  r   r   r   r  rJ   r1   r5  rA   r   rr   r  r  r#  rT  rU  s   @r0   r   r   i  s         
 0I      *' ' ' '
 W W W XW H H H WH) ) ) )** * * *,        r2   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 )#CaseNrD   rE   r)   rF   c                h    t                                          |           g | _        d | _        d S NrH   )rE  rJ   _cases_elser  s     r0   rJ   zCase.__init__  s0    u%%%


r2   r*   c              #     K   | V  | j         D ]9\  }}|                                E d {V  |                                E d {V  :| j        !| j                                        E d {V  d S d S r,   )r  r1   r  r/   r  r  s      r0   r1   zCase.nodes_  s      


#{ 	% 	%OIt ''))))))))){{}}$$$$$$$$:!z((*********** "!r2   r  c                l    t          d | j        D             | j        r| j        j        nd gz             S )Nc                0    g | ]\  }}|j         p|j         S r-   rm  )r9   r  r  s      r0   r;   z%Case.is_aggregate.<locals>.<listcomp>  s'    \\\_YY#8t'8\\\r2   )r   r  r  rA   r.   s    r0   rA   zCase.is_aggregate  sH     $\\PTP[\\\*.*>tz&&$?@
 
 	
r2   r  r   r  c                d    | j                             ||                     |          f           d S r,   )r  rh  rc   r  s      r0   whenz	Case.when  s1    It'9'9$'?'?@AAAAAr2   rm   rn   ro   c                    fd| j         D             | _         | j        r| j                                      nd| _        dS )r  c                n    g | ]1\  }}|                               |                               g2S r-   rp  )r9   r  r  rm   ro   s      r0   r;   z&Case.replace_table.<locals>.<listcomp>  sW     
 
 

  	4 ''yAA""=)<<
 
 
r2   N)r  r  rr   rq   s    ``r0   rr   zCase.replace_table  se    
 
 
 
 

 $(;
 
 
 LP:_TZ--mYGGG[_


r2   c                :    |                      |          | _        | S r,   )rc   r  r  s     r0   else_z
Case.else_  s    ''--
r2   Fr&  rj   r*  rK   c                   | j         st          d          d                    fd| j         D                       }| j        r%d                     | 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  x   K   | ]4\  }}d                       |j        di  |j        di           V  5dS )zWHEN {when} THEN {then})r  thenNr-   )r~  r#  )r9   r  r  r*  s      r0   ri  zCase.get_sql.<locals>.<genexpr>  sx       
 
	4 &,,2C)2C2M2Mf2M2MT`TXT`TjTjciTjTj,kk
 
 
 
 
 
r2   z ELSE {}r  zCASE z ENDr-   )r  r   r  r  r~  r#  r   rD   )r/   r&  r*  casesr  case_sqls     `   r0   r#  zCase.get_sql  s    { 	^ \]]] 
 
 
 
#';
 
 
 
 
 DH:U
!!"4$*"4">">v">">???SU-5-%--- 	D#HdjCCFCCCr2   r,   r0  r=   r  )r  r   r  r   r)   rF   rO  )r  r   r)   r  r  r  )r>   r?   r@   rJ   r1   r5  rA   r   r  rr   r  r#  rT  rU  s   @r0   r  r    s              
+ + + + 
 
 
 X
 B B B WB ` ` ` W`(    W        r2   r  c                  b     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|   Nr  r   rD   rE   r)   rF   c                Z    t                                          |           || _        d S r  r  r  s      r0   rJ   zNot.__init__&  )    u%%%			r2   r*   c              #  P   K   | V  | j                                         E d {V  d S r,   r  r.   s    r0   r1   z
Not.nodes_*  r  r2   r*  rK   c                ~    d|d<   d                      | j        j        di |          }t          || j        fi |S )NTr  z
NOT {term}r  r-   r  rj  s      r0   r#  zNot.get_sql.  sR    !%~!!'8ty'8'B'B6'B'B!CCTZ::6:::r2   r>  c                h    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                j     | g|R i |}t          |t          f          rt          |          S |S r,   )r8   rC   r|   )
inner_selfargsr*  result	item_funcs       r0   innerzNot.__getattr__.<locals>.inner>  sG    Yz;D;;;F;;F&4'** #6{{"Mr2   )rK  r  inspectismethod)r/   r>  r  r  s      @r0   __getattr__zNot.__getattr__3  sO     DIt,,		** 		 	 	 	 	 r2   rm   rn   ro   c                F    | j                             ||          | _         dS r  r  rq   s      r0   rr   zNot.replace_tableF  r  r2   r,   r  r   rD   rE   r)   rF   r=   r4  )r>  rK   r)   r   rO  )r>   r?   r@   rJ   r1   r#  r   r  r   rr   rT  rU  s   @r0   r|   r|   %  s              & & & &; ; ; ;
    [$ F F F WF F F F Fr2   r|   c                  2     e Zd Zdd fdZdd
ZddZ xZS )r   Nr  r   rD   rE   r)   rF   c                Z    t                                          |           || _        d S r  r  r  s      r0   rJ   zAll.__init__V  r  r2   r*   c              #  P   K   | V  | j                                         E d {V  d S r,   r  r.   s    r0   r1   z
All.nodes_Z  r  r2   r*  rK   c                t    d                      | j        j        di |          }t          || j        fi |S )Nz
{term} ALLr  r-   r  rj  s      r0   r#  zAll.get_sql^  sH    !!'8ty'8'B'B6'B'B!CCTZ::6:::r2   r,   r  r=   r4  r^  rU  s   @r0   r   r   U  sj              & & & &; ; ; ; ; ; ; ;r2   r   c                  ,    e Zd ZdddZddZd Zd ZdS )CustomFunctionNr>  rK   paramsSequence | Noner)   rF   c                "    || _         || _        d S r,   )r>  r   )r/   r>  r   s      r0   rJ   zCustomFunction.__init__d  s    	r2   r  r   r*  Functionc           
        |                                  s)t          | j        |                    d                    S  | j        | sit          d                    | j        d                    d | j        D                       d                    d |D                                           t          | j        g|R d|                    d          iS )NrD   rH   zCFunction {name} require these arguments ({params}), ({args}) passedz, c              3  4   K   | ]}t          |          V  d S r,   r:  r9   ps     r0   ri  z*CustomFunction.__call__.<locals>.<genexpr>p  s(      $A$ASVV$A$A$A$A$A$Ar2   c              3  4   K   | ]}t          |          V  d S r,   r:  r&  s     r0   ri  z*CustomFunction.__call__.<locals>.<genexpr>q  s(      "8"8a3q66"8"8"8"8"8"8r2   )r>  r   r  )	_has_paramsr#  r>  r  _is_valid_function_callr   r~  r  r   )r/   r  r*  s      r0   __call__zCustomFunction.__call__h  s    !! 	BDIVZZ-@-@AAAA+t+T2 	#U\\99$A$AT[$A$A$AAA"8"84"8"8"888 ]     	DDDDD

70C0CDDDr2   c                    | j         d uS r,   )r   r.   s    r0   r)  zCustomFunction._has_paramsw  s    {$&&r2   c                L    t          |          t          | j                  k    S r,   )ra  r   )r/   r  s     r0   r*  z&CustomFunction._is_valid_function_callz  s    4yyC,,,,r2   r,   )r>  rK   r   r!  r)   rF   )r  r   r*  r   r)   r#  )r>   r?   r@   rJ   r+  r)  r*  r-   r2   r0   r  r  c  sc            E E E E' ' '- - - - -r2   r  c                       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#  r>  rK   r  r   r*  r)   rF   c                     t                                          |                    d                     | _         fd|D              _        |                    d           _        d S )NrD   c                :    g | ]}                     |          S r-   r   )r9   r>  r/   s     r0   r;   z%Function.__init__.<locals>.<listcomp>  s'    AAA5T''..AAAr2   schema)rE  rJ   r  r>  r  r1  r/   r>  r  r*  rH  s   `   r0   rJ   zFunction.__init__  sa    G,,---	AAAADAAA	jj**r2   r*   c              #  Z   K   | V  | j         D ]}|                                E d {V  d S r,   )r  r1   r   s     r0   r1   zFunction.nodes_  sM      


9 	$ 	$Czz||########	$ 	$r2   r  c                >    t          d | j        D                       S )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.
        c                    g | ]	}|j         
S r-   rm  )r9   r   s     r0   r;   z)Function.is_aggregate.<locals>.<listcomp>  s    $K$K$K#S%5$K$K$Kr2   )r   r  r.   s    r0   rA   zFunction.is_aggregate  s#     $$K$K$K$K$KLLLr2   rm   rn   ro   c                <    fd| j         D             | _         dS )r  c                <    g | ]}|                               S r-   rp  )r9   r>  rm   ro   s     r0   r;   z*Function.replace_table.<locals>.<listcomp>  s)    ZZZuU((	BBZZZr2   Nr  rq   s    ``r0   rr   zFunction.replace_table  s-     [ZZZZPTPYZZZ			r2   c                    d S r,   r-   r.  s     r0   get_special_params_sqlzFunction.get_special_params_sql  rO  r2   c                ^    t          | d          r | j        dddi|nt          |           S )Nr#  r&  Fr-   hasattrr#  rK   )r   r*  s     r0   get_arg_sqlzFunction.get_arg_sql  s=    :A#y:Q:Q_{s{66e6v666WZ[^W_W__r2   c                       j         di }d                     j        d                     fd j        D                       |rd|z   nd          S )Nz{name}({args}{special})r  c              3  t   K   | ]2}t          |d           r |j        ddddn j        |fi V  3dS )r#  FT)r&  r  Nr-   )r=  r#  r>  )r9   r'  r*  r/   s     r0   ri  z,Function.get_function_sql.<locals>.<genexpr>  s~          q),,7IAIHHHHHH))!66v66	     r2   r  r  )r>  r  specialr-   )r:  r~  r>  r  r  )r/   r*  special_params_sqls   `` r0   get_function_sqlzFunction.get_function_sql  s    8T8BB6BB(//           3ELS---" 0 
 
 	
r2   c                v   |                     dd          }|                     dd          }|                     dd           }|                     dd           }|                     |||          }| j        *d                     | j        j        d
||d||	          }|rt          || j        fd|i|S |S )Nr&  Fr'  r   rt  )r'  r   rt  z{schema}.{function})r   rt  )r1  functionr-   )rI  rC  r1  r~  r#  r   rD   )r/   r*  r&  r'  r   rt  function_sqls          r0   r#  zFunction.get_sql  s    ZZe44
$4e<<ZZd33
**Y-- ,,NWakr,ss;"077*t{*\j'\\U[\\% 8  L
  	_#L$*^^^W]^^^r2   r>  rK   r  r   r*  r   r)   rF   r=   r  rO  )r*  r   r)   r   r4  )r>   r?   r@   rJ   r1   r5  rA   r   rr   r:  r6  r>  rC  r#  rT  rU  s   @r0   r#  r#  ~  s        + + + + + +$ $ $ $
 M M M XM [ [ [ W[    ` ` \`
 
 
 
        r2   r#  c                  N     e Zd ZdZ fdZedd            Zdd
Zd fdZ xZ	S )AggregateFunctionTc                ^     t                      j        |g|R i | g | _        d| _        d S r  )rE  rJ   _filters_include_filterr2  s       r0   rJ   zAggregateFunction.__init__  s?    ///////$r2   filtersr   r)   rF   c                4    d| _         | xj        |z  c_        d S r  )rL  rK  )r/   rM  s     r0   filterzAggregateFunction.filter  s    # r2   r*  rK   c                    | j         r=d                    t                              | j                  j        di |          S d S )NzWHERE {criterions})
criterionsr-   )rL  r~  r  r4  rK  r#  r.  s     r0   get_filter_sqlz AggregateFunction.get_filter_sql  sQ     	j'..)--:V:V:^:h:hag:h:h.iii	j 	jr2   c                     t                      j        di |} | j        di |}| j        r|d                    |          z  }|S )Nz FILTER({filter_sql}))
filter_sqlr-   )rE  rC  rR  rL  r~  )r/   r*  r  rT  rH  s       r0   rC  z"AggregateFunction.get_function_sql  sd    &egg&0000(T(22622
 	I*11Z1HHHC
r2   )rM  r   r)   rF   r4  )r*  r   )
r>   r?   r@   rA   rJ   r   rO  rR  rC  rT  rU  s   @r0   rI  rI    s        L% % % % % ! ! ! W!j j j j         r2   rI  c                  t     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 )AnalyticFunctionFTr>  rK   r  r   r*  r)   rF   c                     t                      j        |g|R i | g | _        g | _        g | _        d| _        d| _        d S r  )rE  rJ   rK  
_partition	_orderbysrL  _include_overr2  s       r0   rJ   zAnalyticFunction.__init__  sU    ///////$"r2   r(  c                4    d| _         | xj        |z  c_        d S r  )rZ  rX  )r/   r(  s     r0   overzAnalyticFunction.over  s    !5 r2   c                N    d| _         | xj        fd|D             z  c_        d S )NTc                >    g | ]}|                     d           fS )order)r  rh  s     r0   r;   z,AnalyticFunction.orderby.<locals>.<listcomp>  s*    III4D&**W"5"56IIIr2   )rZ  rY  )r/   r(  r*  s     `r0   orderbyzAnalyticFunction.orderby  s4    !IIII5IIIIr2   r  rV   orientOrder | Nonec                n    | |j         di |S d                     |j         di ||j                  S )Nz{field} {orient})r  ra  r-   )r#  r~  r   )r/   r  ra  r*  s       r0   _orderby_fieldzAnalyticFunction._orderby_field   sV    > 5=**6***!((%-))&))< ) 
 
 	
r2   c                    g } j         rM|                    d                    d                    fd j         D                                             j        rN|                    d                    d                     fd j        D                                            d                    |          S )	NzPARTITION BY {args}r  c              3  p   K   | ]0}t          |d           r |j        di nt          |          V  1dS )r#  Nr-   r<  )r9   r'  r*  s     r0   ri  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  sT      !t!t_`I9N9N"Z)!)"5"5f"5"5"5TWXYTZTZ!t!t!t!t!t!tr2   r8  zORDER BY {orderby}c              3  <   K   | ]\  }} j         ||fi V  d S r,   )rd  )r9   r  ra  r*  r/   s      r0   ri  z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  sB      $v$vVcV[]c%8T%8%Q%Q&%Q%Q$v$v$v$v$v$vr2   )r`  r  )rX  rh  r~  r  rY  )r/   r*  r(  s   `` r0   get_partition_sqlz"AnalyticFunction.get_partition_sql	  s    ? 	LL%,,!t!t!t!tdhds!t!t!ttt -     > 	LL$++HH$v$v$v$v$vgkgu$v$v$vvv ,     xxr2   c                x     t                      j        di |} | j        di |}|}| j        r	|d| dz  }|S )Nz OVER()r-   )rE  rC  rh  rZ  )r/   r*  rF  partition_sqlr  rH  s        r0   rC  z!AnalyticFunction.get_function_sql  sb    /uww/99&99..8888 	-,M,,,,C
r2   rG  r(  r   r)   rF   )r(  r   r*  r   r)   rF   )r  rV   ra  rb  r*  r   r)   rK   r4  )r>   r?   r@   rA   is_analyticrJ   r   r\  r`  rd  rh  rC  rT  rU  s   @r0   rV  rV    s        LK# # # # # # ! ! ! W! J J J WJ
 
 
 
   $         r2   rV  EdgeT WindowFrameAnalyticFunction.Edgec                       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dS )ro  Nr   str | int | Noner)   rF   c                    || _         d S r,   r  r   s     r0   rJ   z)WindowFrameAnalyticFunction.Edge.__init__+  s    DJJJr2   rK   c                H    d                     | j        pd| j                  S )Nz{value} {modifier}	UNBOUNDED)r   modifier)r~  r   rw  r.   s    r0   r$  z(WindowFrameAnalyticFunction.Edge.__str__.  s.    '..j/K /   r2   r,   )r   rs  r)   rF   r3  )r>   r?   r@   rJ   r$  r-   r2   r0   Edgez WindowFrameAnalyticFunction.Edge*  sA        	 	 	 	 		 	 	 	 	 	r2   rx  r>  rK   r  r   r*  r)   rF   c                ^     t                      j        |g|R i | d | _        d | _        d S r,   )rE  rJ   framer'   r2  s       r0   rJ   z$WindowFrameAnalyticFunction.__init__4  s<    ///////



r2   rz  r'   	and_boundEdgeT | Nonec                f    | j         s| j        rt                      || _         |r||fn|| _        d S r,   )rz  r'   AttributeError)r/   rz  r'   r{  s       r0   _set_frame_and_boundsz1WindowFrameAnalyticFunction._set_frame_and_bounds9  sB    : 	# 	# """
+4?eY''%


r2   Nstr | EdgeTc                4    |                      d||           d S )NROWSr  r/   r'   r{  s      r0   rowsz WindowFrameAnalyticFunction.rows@  s     ""65)<<<<<r2   c                4    |                      d||           d S )NRANGEr  r  s      r0   rangez!WindowFrameAnalyticFunction.rangeD  s     ""7E9=====r2   c                    t          | j        t                    s!d                    | j        | j                  S | j        \  }}d                    | j        ||          S )Nz{frame} {bound})rz  r'   z#{frame} BETWEEN {lower} AND {upper})rz  r   r   )r8   r'   r_   r~  rz  r   s      r0   get_frame_sqlz)WindowFrameAnalyticFunction.get_frame_sqlH  sg    $*e,, 	P$++$*DJ+OOOzu4;;* < 
 
 	
r2   c                     t                      j        di |}| j        s	| j        s|S d                    ||                                           S )Nz{over} {frame})r\  rz  r-   )rE  rh  rz  r'   r~  r  )r/   r*  rk  rH  s      r0   rh  z-WindowFrameAnalyticFunction.get_partition_sqlS  s]    11;;F;;z 	!$* 	!  &&MASASAUAU&VVVr2   rG  )rz  rK   r'   rK   r{  r|  r)   rF   r,   )r'   r  r{  r|  r)   rF   r3  r4  )r>   r?   r@   rx  rJ   r  r   r  r  r  rh  rT  rU  s   @r0   rq  rq  )  s                   
@ @ @ @ = = = = W= > > > > W>	
 	
 	
 	
W W W W W W W W W Wr2   rq  c                  @     e Zd Zd fdZedd	            ZddZ xZS )IgnoreNullsAnalyticFunctionr>  rK   r  r   r*  r)   rF   c                P     t                      j        |g|R i | d| _        d S r  )rE  rJ   _ignore_nullsr2  s       r0   rJ   z$IgnoreNullsAnalyticFunction.__init__]  s8    ///////"r2   c                    d| _         d S r  r  r.   s    r0   ignore_nullsz(IgnoreNullsAnalyticFunction.ignore_nullsa  s    !r2   rE   c                    | j         rdS d S )NzIGNORE NULLSr  r.  s     r0   r:  z2IgnoreNullsAnalyticFunction.get_special_params_sqle  s     	"!> tr2   rG  )r)   rF   )r*  r   r)   rE   )r>   r?   r@   rJ   r   r  r:  rT  rU  s   @r0   r  r  \  sq        # # # # # # " " " W"       r2   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dZddZddZdS )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\-.: ]+$)r   Nr  ri   r  r  r  r  r  r  quartersweeksrt  Dialects | Nonec                Z   |
| _         d | _        d | _        d| _        |r	|| _        d S |	r	|	| _        d S t          | j        | j        |||||||g          D ]U\  }}}|rMt          |          }t          | |t          |                     | j        || _        |dk     | _        || _        Vd S )NFr   )rt  largestsmallestis_negativer  r  zipunitslabelsri   setattrabs)r/   r  r  r  r  r  r  r  r  r  rt  unitlabelr   	int_values                  r0   rJ   zInterval.__init__}  s       	$DMF 	DJF"%JKFD%'<H#
 #
 	& 	&D%
  &JJ	dC	NN333<'#(DL'01}D$ %	& 	&r2   r)   rK   c                *    |                                  S r,   r"  r.   s    r0   r$  zInterval.__str__  s    ||~~r2   r*  r   c                6   | j         p|                    d          }| j        dk    rt          | d          }d}n/t	          | d          rt          | d          }d}nt	          | d          rt          | d          }d}nd                    t          | d	d
          t          | dd
          t          | dd
          t          | dd
          t          | dd
          t          | dd
          t          | dd
                    }| j                            d|          }| j        rd|z   }| j        | j	        k    r!d                    | j        | j	                  n| j        }|d}| j
                            |d                              ||          S )Nrt  r  r  r  QUARTERr  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}r  r   r  r  r  r  r  r  r  -z{largest}_{smallest})r  r  r  r  )r   r  )rt  r  r  rK  r=  r~  trim_patternr   r  r  	templates)r/   r*  rt  r   r  s        r0   r#  zInterval.get_sql  s   ,7&**Y"7"7<=((400D DDT:&& "	4,,DDDT7## 	4))DDD X^^dGQ//tXq11T61--dGQ//i33i33$T>1== _  D $((T22D "Tz <4=00	 '-- L!] .   
 \  |~!!'+EFFMMSW^bMcccr2   )
r   r   r   r   r   r   r   r   r   N)r  ri   r  ri   r  ri   r  ri   r  ri   r  ri   r  ri   r  ri   r  ri   rt  r  r3  r4  )r>   r?   r@   r   rv  rw  VERTICAORACLEMYSQLr  r  r  recompiler  rJ   r$  r#  r-   r2   r0   r  r  m  s         	75432I WVVEPPPF2:WXXL #'%& %& %& %& %&N   +d +d +d +d +d +dr2   r  c                  "     e Zd Zdd fd
Z xZS )r   Nr  rC   exponentr  rD   rE   r)   rF   c                R    t                                          d|||           d S )NPOWrH   r  )r/   r  r  rD   rH  s       r0   rJ   zPow.__init__  s*    he<<<<<r2   r,   )r  rC   r  r  rD   rE   r)   rF   r  rU  s   @r0   r   r     sB        = = = = = = = = = = =r2   r   c                  "     e Zd Zdd fd
Z xZS )r   Nr  rC   modulusr  rD   rE   r)   rF   c                R    t                                          d|||           d S )NMODrH   r  )r/   r  r  rD   rH  s       r0   rJ   zMod.__init__  s*    gU;;;;;r2   r,   )r  rC   r  r  rD   rE   r)   rF   r  rU  s   @r0   r   r     sB        < < < < < < < < < < <r2   r   c                        e Zd Zd fdZ xZS )Rollupr(  r   r)   rF   c                <     t                      j        dg|R   d S )NROLLUPr  )r/   r(  rH  s     r0   rJ   zRollup.__init__  s(    *E******r2   rl  r  rU  s   @r0   r  r    s=        + + + + + + + + + +r2   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).
    r>  rK   r)   rF   c                Z    t                                          d            || _        d S r  rT  )r/   r>  rH  s     r0   rJ   zPseudoColumn.__init__  s)    t$$$			r2   r*  r   c                    | j         S r,   )r>  r.  s     r0   r#  zPseudoColumn.get_sql  s
    yr2   )r>  rK   r)   rF   r4  )r>   r?   r@   r  rJ   r#  rT  rU  s   @r0   r  r    s[         
            r2   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'
    NFc                    t                                          |           t          |t                    st          |          n|| _        || _        || _        d S r,   )rE  rJ   r8   rV   r  zoneinterval)r/   r  r  r  rD   rH  s        r0   rJ   zAtTimezone.__init__  sM    )3E5)A)ALU5\\\u
	 r2   c                    d                      | 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-   )r~  r  r#  r  r  r   rD   rj  s      r0   r#  zAtTimezone.get_sql  sd    8??##--f--$(M9[[r @ 
 

  TZ::6:::r2   )FN)r>   r?   r@   r  rA   rJ   r#  rT  rU  s   @r0   r  r    s]          L! ! ! ! ! !; ; ; ; ; ; ;r2   r  )r7  ri   r)   rK   )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&   rC   r<  r?  rA  rW  rm  ru  rz  r  r  r  r   ra   r  rk   r  r  r\   r  r  r  rV   rR  rX  r`   r^   ry  r|  rt   r   r  r  r   r   r   r   ry   r   r  r   r  r|   r   r  r#  rI  rV  rn  rq  r  r  r   r   r  r  r  r-   r2   r0   <module>r     s   " " " " " "  				 



  B B B B B B B B B B B B ) ) ) ) ) ) ) ) ) )       8 8 8 8 8 8 8 8 8 8 8 8 l l l l l l l l l l l l l l l l l l l l                   ?
'!!*******>>>>>>>>>> 
	 	v&&&J J J J J J J J{$ {$ {$ {$ {$4 {$ {$ {$|             *' ' ' ' 'I ' ' '&, , , , ,I , , ,,    ]   
E E E E E} E E E    m   E E E E E] E E E! ! ! ! ! ! ! !
B 
B 
B 
B 
Bt 
B 
B 
B7X 7X 7X 7X 7X4 7X 7X 7Xt	$ 	$ 	$ 	$ 	$L 	$ 	$ 	$<O <O <O <O <O4 <O <O <O~c c c c cT c c cC C C C C4 C C C( ( ( ( ( ( ( (
/ / / / /l / / /
($ ($ ($ ($ ($ ($ ($ ($V    Y   (0 0 0 0 0It 0 0 0f4 4 4 4 4D 4 4 4    5   &_ _ _ _ _I _ _ _B	; 	; 	; 	; 	;E 	; 	; 	;    e   
7 7 7 7 7i 7 7 7t4 4 4 4 4Y 4 4 4n2  2  2  2  2 	 2  2  2 j    i    & & & & &Y & & &$; ; ; ; ;~ ; ; ;0; ; ; ; ;n ; ; ;; ; ; ; ;) ; ; ;B; ; ; ; ; ; ; ;B; ; ; ; ;I ; ; ;<; ; ; ; ;} ; ; ;] ] ] ] ]~ ] ] ]"q q q q q4 q q qhE E E E E9 E E EP-F -F -F -F -F) -F -F -F`; ; ; ; ;) ; ; ;- - - - - - - -6M M M M My M M M`       89 9 9 9 9( 9 9 9x 	ABBB0W 0W 0W 0W 0W"2 0W 0W 0Wf    "2   "ed ed ed ed edt ed ed edP= = = = =( = = =
< < < < <( < < <
+ + + + +X + + +
    4   ; ; ; ; ; ; ; ; ; ;r2   