o
    Rh                     @   s
  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z# erdd dl$m%Z%m&Z&m'Z' dZ(d	Z)ed
ddZ*G dd dZ+G dd de+Z,G dd de,Z-G dd de-Z.G dd de-Z/G dd de-Z0G dd de-Z1G dd de-Z2G dd de,Z3G dd de,Z4G d d! d!e,Z5G d"d# d#e,Z6G d$d% d%e,Z7G d&d' d'e7Z8G d(d) d)e7Z9G d*d+ d+e,Z:G d,d- d-e:Z;G d.d/ d/e:e5Z<G d0d1 d1e,Z=G d2d3 d3e<Z>G d4d5 d5e:Z?G d6d7 d7e?Z@G d8d9 d9e?ZAG d:d; d;e:ZBG d<d= d=e:ZCG d>d? d?e:ZDG d@dA dAe:ZEG dBdC dCe:ZFG dDdE dEeFZGG dFdG dGeFZHG dHdI dIe:ZIG dJdK dKe:ZJG dLdM dMeJZKG dNdO dOeCZLG dPdQ dQe,ZMG dRdS dSe:ZNG dTdU dUe:ZOG dVdW dWe:ZPG dXdY dYZQG dZd[ d[e:ZRG d\d] d]eRZSG d^d_ d_eSZTed`dadZUG dbdc dceTZVG ddde deeTZWG dfdg dge+ZXG dhdi dieRZYG djdk dkeRZZG dldm dmeRZ[G dndo doe,Z\G dpdq dqe,Z]dS )r    N)date)Enum)TYPE_CHECKINGAnyIterableIteratorListOptionalSequenceSetTypeTypeVarUnion)
ArithmeticBoolean
ComparatorDialectsEqualityJSONOperatorsMatchingOrder)CaseExceptionFunctionExceptionbuilderformat_alias_sqlformat_quotesignore_copyresolve_is_aggregate)QueryBuilder
SelectableTablezTimothy Heysztheys@kayak.comNodeTNode)boundc                   @   s<   e Zd ZdZdee fddZdee dee fddZ	dS )r"   Nreturnc                 c   s    | V  d S N selfr&   r&   N/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/pypika/terms.pynodes_!   s   
zNode.nodes_typec                    s    fdd|   D S )Nc                    s   g | ]	}t | r|qS r&   )
isinstance).0noder+   r&   r)   
<listcomp>%       zNode.find_.<locals>.<listcomp>)r*   )r(   r+   r&   r/   r)   find_$      z
Node.find_)
__name__
__module____qualname__is_aggregater   r!   r*   r   r   r2   r&   r&   r&   r)   r"      s    c                   @   s  e Zd ZdZddee ddfddZededd fddZe	de
d	 fd
dZde
d fddZe	ddeed   deeeddddf fddZe	dded dddeeef ded fddZded	 ded	 dd fddZd edd!fd"d#Zdd%d&Zdd(d)Zdd+d,Zd-edd.fd/d0Zd edd!fd1d2Zd edd!fd3d4Zd edd!fd5d6Zd edd!fd7d8Z d edd!fd9d:Z!d;edd!fd<d=Z"d;edd!fd>d?Z#d;edd!fd@dAZ$d;edd!fdBdCZ%d;edd!fdDdEZ&d;edd!fdFdGZ'dHedd!fdIdJZ(dHedd!fdKdLZ)dMedNeddOfdPdQZ*dRedSeddTfdUdVZ+d;edd!fdWdXZ,ddZd[Z-d\ee.e/e0d f dd]fd^d_Z1d\ee.e/e0d f dd]fd`daZ2dHedd!fdbdcZ3ddddeZ4d eddffdgdhZ5d eddffdidjZ6ddkdlZ7ddmdnZ8ddpdqZ9d eddffdrdsZ:d eddffdtduZ;d eddffdvdwZ<d eddffdxdyZ=d eddzfd{d|Z>d edd}fd~dZ?d eddffddZ@d eddffddZAd eddffddZBd eddffddZCd eddffddZDd eddffddZEd eddffddZFd eddffddZGd edd!fddZHd edd!fddZId edd!fddZJd edd!fddZKd edd!fddZLd edd!fddZMdeNddOfddZOdefddZPdefddZQdedefddZRdS )TermFNaliasr$   c                 C   
   || _ d S r%   r9   r(   r9   r&   r&   r)   __init__+      
zTerm.__init__c                 C   r:   r%   r;   r<   r&   r&   r)   as_.      
zTerm.as_r    c                 C   s   ddl m} t| |S )Nr   )r    )pypikar    setr2   )r(   r    r&   r&   r)   tables_2   s   zTerm.tables_Fieldc                 C   s   t | tS r%   )rB   r2   rD   r'   r&   r&   r)   fields_8      zTerm.fields_wrapper_clsLiteralValueArrayTupleValueWrapperc                 C   sP   t | tr| S | du r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.

        N)r,   r"   	NullValuelistrI   tuplerJ   rK   )valrG   r&   r&   r)   wrap_constant;   s   


zTerm.wrap_constantrO   r   Interval)r8   r   rQ   rL   rK   JSONc                 C   sV   ddl m} t| t|tfr| S | d u rt S t| tttfr'|p"t	}|| S t
| S )N   )r   )queriesr   r,   r8   rQ   rL   strintboolrK   rR   )rO   rG   r   r&   r&   r)   	wrap_json[   s   zTerm.wrap_jsoncurrent_table	new_tablec                 C      | S )a  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.
        The base implementation returns self because not all terms have a table property.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            Self.
        r&   r(   rY   rZ   r&   r&   r)   replace_tablek   s   zTerm.replace_tableotherBasicCriterionc                 C   s   | |kS r%   r&   r(   r^   r&   r&   r)   eqy      zTerm.eqNullCriterionc                 C      t | S r%   )rc   r'   r&   r&   r)   isnull|   rb   zTerm.isnullNotc                 C   s   |    S r%   )re   negater'   r&   r&   r)   notnull      zTerm.notnullNotNullCriterionc                 C   rd   r%   )rj   r'   r&   r&   r)   	isnotnull   rb   zTerm.isnotnullvalueBitwiseAndCriterionc                 C   s   t | | |S r%   )rm   rP   r(   rl   r&   r&   r)   
bitwiseand      zTerm.bitwiseandc                 C   s   | |kS r%   r&   r`   r&   r&   r)   gt   rb   zTerm.gtc                 C   s   | |kS r%   r&   r`   r&   r&   r)   gte   rb   zTerm.gtec                 C   s   | |k S r%   r&   r`   r&   r&   r)   lt   rb   zTerm.ltc                 C   s   | |kS r%   r&   r`   r&   r&   r)   lte   rb   zTerm.ltec                 C   s   | |kS r%   r&   r`   r&   r&   r)   ne   rb   zTerm.neexprc                 C      t tj| | |S r%   )r_   r   globrP   r(   rv   r&   r&   r)   rx         z	Term.globc                 C   rw   r%   )r_   r   likerP   ry   r&   r&   r)   r{      rz   z	Term.likec                 C   rw   r%   )r_   r   not_likerP   ry   r&   r&   r)   r|      rz   zTerm.not_likec                 C   rw   r%   )r_   r   ilikerP   ry   r&   r&   r)   r}      rz   z
Term.ilikec                 C   rw   r%   )r_   r   	not_ilikerP   ry   r&   r&   r)   r~      rz   zTerm.not_ilikec                 C   rw   r%   )r_   r   rlikerP   ry   r&   r&   r)   r      rz   z
Term.rlikepatternc                 C   rw   r%   )r_   r   regexrP   r(   r   r&   r&   r)   r      rz   z
Term.regexc                 C   rw   r%   )r_   r   regexprP   r   r&   r&   r)   r      rz   zTerm.regexplowerupperBetweenCriterionc                 C      t | | || |S r%   )r   rP   r(   r   r   r&   r&   r)   between      zTerm.betweenstartendPeriodCriterionc                 C   r   r%   )r   rP   )r(   r   r   r&   r&   r)   from_to   r   zTerm.from_toc                 C   rw   r%   )r_   r   as_ofrP   ry   r&   r&   r)   r      rz   z
Term.as_ofAllc                 C   rd   r%   )r   r'   r&   r&   r)   all_   rb   z	Term.all_argContainsCriterionc                    s6   t |tttfrt t fdd|D  S t |S )Nc                       g | ]}  |qS r&   rP   r-   rl   r'   r&   r)   r0          zTerm.isin.<locals>.<listcomp>)r,   rM   rN   rB   r   rJ   r(   r   r&   r'   r)   isin   s   
z	Term.isinc                 C   s   |  | S r%   )r   rg   r   r&   r&   r)   notin   rF   z
Term.notinc                 C   rw   r%   )r_   r   	bin_regexrP   r   r&   r&   r)   r      rz   zTerm.bin_regexc                 C   rd   r%   rf   r'   r&   r&   r)   rg      rb   zTerm.negateArithmeticExpressionc                 C   s   | |> S r%   r&   r`   r&   r&   r)   lshift   rb   zTerm.lshiftc                 C   s   | |? S r%   r&   r`   r&   r&   r)   rshift   rb   zTerm.rshiftc                 C   rd   r%   r   r'   r&   r&   r)   
__invert__   rb   zTerm.__invert__c                 C   r[   r%   r&   r'   r&   r&   r)   __pos__      zTerm.__pos__Negativec                 C   rd   r%   )r   r'   r&   r&   r)   __neg__   rb   zTerm.__neg__c                 C   rw   r%   r   r   addrP   r`   r&   r&   r)   __add__   rz   zTerm.__add__c                 C   rw   r%   r   r   subrP   r`   r&   r&   r)   __sub__   rz   zTerm.__sub__c                 C   rw   r%   r   r   mulrP   r`   r&   r&   r)   __mul__   rz   zTerm.__mul__c                 C   rw   r%   r   r   divrP   r`   r&   r&   r)   __truediv__   rz   zTerm.__truediv__Powc                 C   
   t | |S r%   )r   r`   r&   r&   r)   __pow__   r>   zTerm.__pow__Modc                 C   r   r%   )r   r`   r&   r&   r)   __mod__   r>   zTerm.__mod__c                 C      t tj| || S r%   r   r`   r&   r&   r)   __radd__   rz   zTerm.__radd__c                 C   r   r%   r   r`   r&   r&   r)   __rsub__   rz   zTerm.__rsub__c                 C   r   r%   r   r`   r&   r&   r)   __rmul__   rz   zTerm.__rmul__c                 C   r   r%   r   r`   r&   r&   r)   __rtruediv__   rz   zTerm.__rtruediv__c                 C   rw   r%   r   r   r   rP   r`   r&   r&   r)   
__lshift__   rz   zTerm.__lshift__c                 C   rw   r%   r   r   r   rP   r`   r&   r&   r)   
__rshift__   rz   zTerm.__rshift__c                 C   r   r%   r   r`   r&   r&   r)   __rlshift__   rz   zTerm.__rlshift__c                 C   r   r%   r   r`   r&   r&   r)   __rrshift__   rz   zTerm.__rrshift__c                 C   rw   r%   )r_   r   ra   rP   r`   r&   r&   r)   __eq__  rz   zTerm.__eq__c                 C   rw   r%   )r_   r   ru   rP   r`   r&   r&   r)   __ne__  rz   zTerm.__ne__c                 C   rw   r%   )r_   r   rq   rP   r`   r&   r&   r)   __gt__  rz   zTerm.__gt__c                 C   rw   r%   )r_   r   rr   rP   r`   r&   r&   r)   __ge__  rz   zTerm.__ge__c                 C   rw   r%   )r_   r   rs   rP   r`   r&   r&   r)   __lt__  rz   zTerm.__lt__c                 C   rw   r%   )r_   r   rt   rP   r`   r&   r&   r)   __le__  rz   zTerm.__le__itemc                 C   s"   t |ts	td| |j|jS )Nz"Field' object is not subscriptable)r,   slice	TypeErrorr   r   stop)r(   r   r&   r&   r)   __getitem__  s   
zTerm.__getitem__c                 C   s   | j dddS )N"'
quote_charsecondary_quote_charget_sqlr'   r&   r&   r)   __str__  rF   zTerm.__str__c                 C   s   t | jdddS )NT)
with_aliaswith_namespace)hashr   r'   r&   r&   r)   __hash__     zTerm.__hash__kwargsc                 K      t  r%   NotImplementedErrorr(   r   r&   r&   r)   r        zTerm.get_sqlr%   )r$   rc   )r$   rf   )r$   rj   )r$   r   )r$   r8   )r$   r   )Sr4   r5   r6   r7   r	   rU   r=   r   r?   propertyr   rC   rE   staticmethodr   r   
ValueErrorr!   rP   rV   rW   rX   r]   r   ra   re   rh   rk   ro   rq   rr   rs   rt   ru   rx   r{   r|   r}   r~   r   r   r   r   r   r   r   rM   rN   rB   r   r   r   rg   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)   r8   (   s    








r8   c                       sD   e Zd ZdZdeeef ddf fddZdedefddZ	  Z
S )		ParameterNplaceholderr$   c                       t    || _d S r%   )superr=   r   )r(   r   	__class__r&   r)   r=   &     

zParameter.__init__r   c                 K   s
   t | jS r%   )rU   r   r   r&   r&   r)   r   *  r>   zParameter.get_sql)r4   r5   r6   r7   r   rU   rV   r=   r   r   __classcell__r&   r&   r   r)   r   #  s    r   c                   @   ,   e Zd ZdZd	ddZdedefddZdS )
QmarkParameterz)Question mark style, e.g. ...WHERE name=?r$   Nc                 C      d S r%   r&   r'   r&   r&   r)   r=   1  r   zQmarkParameter.__init__r   c                 K      dS )N?r&   r   r&   r&   r)   r   4  r   zQmarkParameter.get_sqlr$   Nr4   r5   r6   __doc__r=   r   rU   r   r&   r&   r&   r)   r   .      
r   c                   @   "   e Zd ZdZdedefddZdS )NumericParameterz0Numeric, positional style, e.g. ...WHERE name=:1r   r$   c                 K      dj | jdS Nz:{placeholder}r   formatr   r   r&   r&   r)   r   ;  rF   zNumericParameter.get_sqlNr4   r5   r6   r   r   rU   r   r&   r&   r&   r)   r   8      r   c                   @   r   )NamedParameterz%Named style, e.g. ...WHERE name=:namer   r$   c                 K   r   r   r   r   r&   r&   r)   r   B  rF   zNamedParameter.get_sqlNr   r&   r&   r&   r)   r   ?  r   r   c                   @   r   )
FormatParameterz1ANSI C printf format codes, e.g. ...WHERE name=%sr$   Nc                 C   r   r%   r&   r'   r&   r&   r)   r=   I  r   zFormatParameter.__init__r   c                 K   r   )Nz%sr&   r   r&   r&   r)   r   L  r   zFormatParameter.get_sqlr   r   r&   r&   r&   r)   r   F  r   r   c                   @   r   )PyformatParameterz9Python extended format codes, e.g. ...WHERE name=%(name)sr   r$   c                 K   r   )Nz%({placeholder})sr   r   r   r&   r&   r)   r   S  rF   zPyformatParameter.get_sqlNr   r&   r&   r&   r)   r   P  r   r   c                       sN   e Zd Zdeddf fddZedee fddZde	de
fd	d
Z  ZS )r   termr$   Nc                    r   r%   r   r=   r   r(   r   r   r&   r)   r=   X  r   zNegative.__init__c                 C      | j jS r%   r   r7   r'   r&   r&   r)   r7   \     zNegative.is_aggregater   c                 K   s   dj | jjdi |dS )Nz-{term}r   r&   )r   r   r   r   r&   r&   r)   r   `  s   zNegative.get_sql)r4   r5   r6   r8   r=   r   r	   rW   r7   r   rU   r   r   r&   r&   r   r)   r   W  s
    r   c                	       sx   e Zd ZdZddedee ddf fddZdedefdd	Ze	defd
dZ
ddee dededefddZ  ZS )rK   Nrl   r9   r$   c                       t  | || _d S r%   r   r=   rl   r(   rl   r9   r   r&   r)   r=   g     
zValueWrapper.__init__r   c                 K   s   | j | jfi |S r%   )get_formatted_valuerl   r   r&   r&   r)   get_value_sqlk  rz   zValueWrapper.get_value_sqlc                 K   s   | dpd}t|tr|jdi |S t|tr#| j|jfi |S t|tr3| j| fi |S t|t	rE|
||d }t||S t|trQt	t	|S t|tjrb| jt	|fi |S |d u rhdS t	|S )Nr       nullr&   )getr,   r8   r   r   r
  rl   r   	isoformatrU   replacer   rW   r   uuidUUID)clsrl   r   r   r&   r&   r)   r
  n  s"   





z ValueWrapper.get_formatted_valuer   r   r   c                 K   s.   | j d||d|}t|| jfd|i|S )Nr   r   r&   )r  r   r9   )r(   r   r   r   sqlr&   r&   r)   r     s   zValueWrapper.get_sqlr%   )Nr   )r4   r5   r6   r7   r   r	   rU   r=   r  classmethodr
  r   r   r&   r&   r   r)   rK   d  s     (rK   c                
       s`  e Zd ZdZd,dedee ddf fddZdededefdd	Zde	dedefd
dZ
dededefddZed-dedededefddZd.dededefddZdeeef ddfddZdeeef ddfddZdeddfddZdeddfdd Zd!eddfd"d#Zd!eddfd$d%Zd!eddfd&d'Zd!eddfd(d)Zd!eddfd*d+Z  ZS )/rR   Nrl   r9   r$   c                    r  r%   r  r  r   r&   r)   r=     r	  zJSON.__init__r   c                 K   s\   t |tr| j|fi |S t |tr| j|fi |S t |tr*| j|fi |S t|S r%   )r,   dict_get_dict_sqlrM   _get_list_sqlrU   _get_str_sql)r(   rl   r   r&   r&   r)   _recursive_get_sql  s   


zJSON._recursive_get_sqlc                    s.    fdd|  D }ddd|dgS )Nc                    s:   g | ]\}}d j j|fi  j|fi  dqS )z{key}:{value})keyrl   )r   r  )r-   kvr   r(   r&   r)   r0     s    z&JSON._get_dict_sql.<locals>.<listcomp>r  {,})itemsjoinr(   rl   r   pairsr&   r  r)   r    s   zJSON._get_dict_sqlc                    s*    fdd|D }d dd |dgS )Nc                    s   g | ]}j |fi  qS r&   )r  )r-   r  r  r&   r)   r0     s    z&JSON._get_list_sql.<locals>.<listcomp>r  [r!  ])r$  r%  r&   r  r)   r    s   zJSON._get_list_sqlr   r   c                 K   r   r%   )r   )rl   r   r   r&   r&   r)   r    r@   zJSON._get_str_sqlr   r   c                 K   s&   t | | j|}t|| jfi |S r%   )r   r  rl   r   r9   )r(   r   r   r  r&   r&   r)   r     s   zJSON.get_sqlkey_or_indexr_   c                 C   rw   r%   )r_   r   GET_JSON_VALUErP   r(   r)  r&   r&   r)   get_json_value  rz   zJSON.get_json_valuec                 C   rw   r%   )r_   r   GET_TEXT_VALUErP   r+  r&   r&   r)   get_text_value  rz   zJSON.get_text_value	path_jsonc                 C   rw   r%   )r_   r   GET_PATH_JSON_VALUErX   r(   r/  r&   r&   r)   get_path_json_value  rz   zJSON.get_path_json_valuec                 C   rw   r%   )r_   r   GET_PATH_TEXT_VALUErX   r1  r&   r&   r)   get_path_text_value  rz   zJSON.get_path_text_valuer^   c                 C   rw   r%   )r_   r   HAS_KEYrX   r`   r&   r&   r)   has_key  rz   zJSON.has_keyc                 C   rw   r%   )r_   r   CONTAINSrX   r`   r&   r&   r)   contains  rz   zJSON.containsc                 C   rw   r%   )r_   r   CONTAINED_BYrX   r`   r&   r&   r)   contained_by  rz   zJSON.contained_byc                 C      t tj| t| S r%   )r_   r   HAS_KEYSrI   r`   r&   r&   r)   has_keys  r   zJSON.has_keysc                 C   r;  r%   )r_   r   HAS_ANY_KEYSrI   r`   r&   r&   r)   has_any_keys  r   zJSON.has_any_keysNN)r   )r   )r4   r5   r6   tabler   r	   rU   r=   r  r  r  rM   r  r   r  r   r   rV   r,  r.  r2  r4  r6  r8  r:  r   r=  r?  r   r&   r&   r   r)   rR     s$     	
rR   c                       sJ   e Zd Zdeedf ddf fddZddee dedefd	d
Z  Z	S )ValuesfieldrD   r$   Nc                    s.   t  d  t|tst|| _d S || _d S r%   )r   r=   r,   rD   rC  )r(   rC  r   r&   r)   r=     s   "zValues.__init__r   r   c                 K   s   dj | jjdd|i|dS )NzVALUES({value})r   rl   r&   )r   rC  r   r(   r   r   r&   r&   r)   r     s   zValues.get_sqlr%   )
r4   r5   r6   r   rU   r=   r	   r   r   r   r&   r&   r   r)   rB    s    $rB  c                       s>   e Zd Zd	dee ddf fddZdedefddZ  ZS )
rH   Nr9   r$   c                    r  r%   )r   r=   _valuer  r   r&   r)   r=     r	  zLiteralValue.__init__r   c                 K   s   t | j| jfi |S r%   )r   rF  r9   r   r&   r&   r)   r     r3   zLiteralValue.get_sqlr%   )	r4   r5   r6   r	   rU   r=   r   r   r   r&   r&   r   r)   rH     s    rH   c                       ,   e Zd Zddee ddf fddZ  ZS )rL   Nr9   r$   c                       t  d| d S )NNULLr   r=   r<   r   r&   r)   r=     r   zNullValue.__init__r%   r4   r5   r6   r	   rU   r=   r   r&   r&   r   r)   rL         $rL   c                       rG  )SystemTimeValueNr9   r$   c                    rH  )NSYSTEM_TIMErJ  r<   r   r&   r)   r=     r   zSystemTimeValue.__init__r%   rK  r&   r&   r   r)   rM    rL  rM  c                   @   s   e Zd ZdeddfddZdeddfddZdeddfdd	Zeddee	 ddfddZ
eddee ddfddZdefddZdS )	Criterionr^   r$   ComplexCriterionc                 C      t tj| |S r%   )rP  r   and_r`   r&   r&   r)   __and__  rF   zCriterion.__and__c                 C   rQ  r%   )rP  r   or_r`   r&   r&   r)   __or__  rF   zCriterion.__or__c                 C   rQ  r%   )rP  r   xor_r`   r&   r&   r)   __xor__  rF   zCriterion.__xor__r&   termsEmptyCriterionc                 C   s   t  }| D ]}||O }q|S r%   rY  rX  critr   r&   r&   r)   any     
zCriterion.anyc                 C   s   t  }| D ]}||M }q|S r%   rZ  r[  r&   r&   r)   all  r^  zCriterion.allc                 C   r   r%   r   r'   r&   r&   r)   r     r   zCriterion.get_sqlN)r&   )r4   r5   r6   r   rS  rU  rW  r   r   r8   r]  r_  rU   r   r&   r&   r&   r)   rO    s    rO  c                   @   s^   e Zd ZdZe Zded fddZdedefddZ	dedefd	d
Z
dedefddZdS )rY  Nr$   rD   c                 C   s   t  S r%   )rB   r'   r&   r&   r)   rE     r   zEmptyCriterion.fields_r^   c                 C      |S r%   r&   r`   r&   r&   r)   rS    r   zEmptyCriterion.__and__c                 C   r`  r%   r&   r`   r&   r&   r)   rU    r   zEmptyCriterion.__or__c                 C   r`  r%   r&   r`   r&   r&   r)   rW    r   zEmptyCriterion.__xor__)r4   r5   r6   r7   rB   rC   r   rE   r   rS  rU  rW  r&   r&   r&   r)   rY    s    rY  c                
       s   e Zd Z	ddedee deeedf  ddf fddZdee fd	d
Z	e
ded ded dd fddZdedefddZ  ZS )rD   Nnamer9   rA  r   r$   c                    s   t  j|d || _|| _d S Nr;   )r   r=   ra  rA  )r(   ra  r9   rA  r   r&   r)   r=     s   
zField.__init__c                 c   *    | V  | j d ur| j  E d H  d S d S r%   rA  r*   r'   r&   r&   r)   r*      
   
zField.nodes_rY   r    rZ   c                 C   s    | j |kr
|| _ dS | 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rA  r\   r&   r&   r)   r]   %  s    zField.replace_tabler   c                 K   s   | dd}| dd}| dd }t| j|}| jr0|s!| jjr0| j }djt|||d}t| dd }|rCt||fd|i|S |S )Nr   Fr   r   z{namespace}.{name})	namespacera  r9   )	popr   ra  rA  r9   get_table_namer   getattrr   )r(   r   r   r   r   	field_sql
table_namefield_aliasr&   r&   r)   r   3  s   
zField.get_sqlr@  )r4   r5   r6   rU   r	   r   r=   r   r!   r*   r   r]   r   r   r   r&   r&   r   r)   rD     s     rD   c                       sL   e Zd Zddedee ddf fddZddee dedefd	d
Z  ZS )IndexNra  r9   r$   c                    r  r%   r   r=   ra  )r(   ra  r9   r   r&   r)   r=   I  r	  zIndex.__init__r   r   c                 K   s   t | j|S r%   )r   ra  rE  r&   r&   r)   r   M  ri   zIndex.get_sqlr%   )	r4   r5   r6   rU   r	   r=   r   r   r   r&   r&   r   r)   ro  H  s     $ro  c                       sl   e Zd Zddeeedf  ddf fddZdee fddZ		dd
e
de
dee dedef
ddZ  ZS )StarNrA  r   r$   c                    s   t  jd|d d S )N*rg  rJ  )r(   rA  r   r&   r)   r=   R  rz   zStar.__init__c                 c   rc  r%   rd  r'   r&   r&   r)   r*   U  re  zStar.nodes_Fr   r   r   r   c                 K   s:   | j r|s	| j jr| j jpt| j d}dt||S dS )N_table_namez{}.*rr  )rA  r9   rk  r   r   )r(   r   r   r   r   rh  r&   r&   r)   r   Z  s   zStar.get_sqlr%   )FFN)r4   r5   r6   r	   r   rU   r=   r   r!   r*   rW   r   r   r   r&   r&   r   r)   rq  Q  s    $rq  c                       s~   e Zd Zdeddf fddZdee fddZdedefd	d
Z	e
defddZeded ded dd fddZ  ZS )rJ   valuesr$   Nc                    s"   t     fdd|D  _d S )Nc                    r   r&   r   r   r'   r&   r)   r0   g  r   z"Tuple.__init__.<locals>.<listcomp>)r   r=   rt  )r(   rt  r   r'   r)   r=   e  s   
zTuple.__init__c                 c   &    | V  | j D ]	}| E d H  qd S r%   )rt  r*   rn   r&   r&   r)   r*   i  
   
zTuple.nodes_r   c                    s4   d d fdd| jD }t|| jfi  S )N({})r!  c                 3        | ]}|j di  V  qd S Nr&   r   r-   r   r   r&   r)   	<genexpr>o      z Tuple.get_sql.<locals>.<genexpr>)r   r$  rt  r   r9   r(   r   r  r&   r{  r)   r   n  s    zTuple.get_sqlc                 C      t dd | jD S )Nc                 S      g | ]}|j qS r&   r7   )r-   rO   r&   r&   r)   r0   t      z&Tuple.is_aggregate.<locals>.<listcomp>)r   rt  r'   r&   r&   r)   r7   r  s   zTuple.is_aggregaterY   r    rZ   c                        fdd| j D | _ dS )rf  c                       g | ]}|  qS r&   r]   r   rY   rZ   r&   r)   r0         z'Tuple.replace_table.<locals>.<listcomp>N)rt  r\   r&   r  r)   r]   v     zTuple.replace_table)r4   r5   r6   r   r=   r   r!   r*   rU   r   r   rW   r7   r   r	   r]   r   r&   r&   r   r)   rJ   d  s    (rJ   c                   @      e Zd ZdedefddZdS )rI   r   r$   c                    sn     dd }d fd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   rx  ry  r   rz  r{  r&   r)   r|    r}  z Array.get_sql.<locals>.<genexpr>z[{}]r   z	ARRAY[{}]z'{}')
r  r$  rt  r   r   
POSTGRESQLREDSHIFTlenr   r9   )r(   r   r  rt  r  r&   r{  r)   r     s   
zArray.get_sqlNr4   r5   r6   r   rU   r   r&   r&   r&   r)   rI         rI   c                       &   e Zd Zdeddf fddZ  ZS )Bracketr   r$   Nc                    s   t  | d S r%   rJ  r  r   r&   r)   r=     rp   zBracket.__init__r4   r5   r6   r   r=   r   r&   r&   r   r)   r        r  c                       s   e Zd Z	ddedddedededee d	df fd
dZd	ee	 fddZ
ed	ee fddZeded ded d	d fddZddeded	efddZ  ZS )NestedCriterionN
comparatornested_comparatorrP  leftrightnestedr9   r$   c                    s.   t  | || _|| _|| _|| _|| _d S r%   )r   r=   r  r  r  r  r  )r(   r  r  r  r  r  r9   r   r&   r)   r=     s   	
zNestedCriterion.__init__c                 c   <    | V  | j  E d H  | j E d H  | j E d H  d S r%   )r  r*   r  r  r'   r&   r&   r)   r*     
   zNestedCriterion.nodes_c                 C   s   t dd | j| j| jfD S )Nc                 S   r  r&   r  rz  r&   r&   r)   r0     r  z0NestedCriterion.is_aggregate.<locals>.<listcomp>)r   r  r  r  r'   r&   r&   r)   r7     s   zNestedCriterion.is_aggregaterY   r    rZ   c                 C   s4   | 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  r]   r  r  r\   r&   r&   r)   r]     s   zNestedCriterion.replace_tableFr   r   c              	   K   sd   dj | jjdi || jj| jjdi || jj| jjdi |d}|r0td|| j	d|S |S )Nz4{left}{comparator}{right}{nested_comparator}{nested})r  r  r  r  r  )r  r9   r&   )
r   r  r   r  rl   r  r  r  r   r9   r(   r   r   r  r&   r&   r)   r     s   zNestedCriterion.get_sqlr%   F)r4   r5   r6   r   r   r	   rU   r=   r   r!   r*   r   rW   r7   r   r]   r   r   r&   r&   r   r)   r    s.      r  c                       s   e Zd Zddedededee ddf
 fddZdee	 fd	d
Z
edee fddZeded ded dd fddZddedededefddZ  ZS )r_   Nr  r  r  r9   r$   c                    "   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)r   r=   r  r  r  )r(   r  r  r  r9   r   r&   r)   r=     s   
zBasicCriterion.__init__c                 c   ,    | V  | j  E d H  | j E d H  d S r%   )r  r*   r  r'   r&   r&   r)   r*        zBasicCriterion.nodes_c                 C   s   t dd | j| jfD S )Nc                 S   r  r&   r  rz  r&   r&   r)   r0     r  z/BasicCriterion.is_aggregate.<locals>.<listcomp>)r   r  r  r'   r&   r&   r)   r7        zBasicCriterion.is_aggregaterY   r    rZ   c                 C   $   | j ||| _ | j||| _dS r  r  r]   r  r\   r&   r&   r)   r]        zBasicCriterion.replace_tabler   Fr   r   r   c                 K   sT   dj | jj| jjdd|i|| jjdd|i|d}|r(t|| jfi |S |S )Nz{left}{comparator}{right}r   r  r  r  r&   )r   r  rl   r  r   r  r   r9   )r(   r   r   r   r  r&   r&   r)   r     s   zBasicCriterion.get_sqlr%   )r   F)r4   r5   r6   r   r8   r	   rU   r=   r   r!   r*   r   rW   r7   r   r]   r   r   r   r&   r&   r   r)   r_     s    ( $r_   c                	       s   e Zd Zddededee ddf fddZdee	 fdd	Z
edee fd
dZeded ded dd fddZddededefddZedddZ  ZS )r   Nr   	containerr9   r$   c                    s"   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)r   r=   r   r  _is_negated)r(   r   r  r9   r   r&   r)   r=     s   
zContainsCriterion.__init__c                 c   r  r%   )r   r*   r  r'   r&   r&   r)   r*     r  zContainsCriterion.nodes_c                 C   r  r%   r  r'   r&   r&   r)   r7     r  zContainsCriterion.is_aggregaterY   r    rZ   c                 C      | j ||| _ dS r  r   r]   r\   r&   r&   r)   r]   !     zContainsCriterion.replace_tablesubqueryr   c                 K   sN   dj | jjdi || jjdddi|| jrdnd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   r9   )r(   r  r   r  r&   r&   r)   r   /  s   zContainsCriterion.get_sqlc                 C   
   d| _ d S NTr  r'   r&   r&   r)   rg   7  r@   zContainsCriterion.negater%   )r$   r   )r4   r5   r6   r   r8   r	   rU   r=   r   r!   r*   r   rW   r7   r   r]   r   rg   r   r&   r&   r   r)   r     s    $ r   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	ExistsCriterionNc                    s    t t| | || _d| _d S NF)r   r  r=   r  r  )r(   r  r9   r   r&   r)   r=   =  s   
zExistsCriterion.__init__c                 K   s*   dj | jjdi || jrddS ddS )Nz{not_}EXISTS {container}r  r  )r  r  r&   )r   r  r   r  r   r&   r&   r)   r   B  s
   zExistsCriterion.get_sqlc                 C   s
   d| _ | S r  r  r'   r&   r&   r)   rg   H  s   zExistsCriterion.negater%   )r4   r5   r6   r=   r   rg   r   r&   r&   r   r)   r  <  s    r  c                       s`   e Zd Zddedededee def
 fddZdee	 fd	d
Z
edee fddZ  ZS )RangeCriterionNr   r   r   r9   r$   c                    s"   t  | || _|| _|| _d S r%   )r   r=   r   r   r   )r(   r   r   r   r9   r   r&   r)   r=   N  s   
zRangeCriterion.__init__c                 c   r  r%   )r   r*   r   r   r'   r&   r&   r)   r*   T  r  zRangeCriterion.nodes_c                 C   r  r%   r  r'   r&   r&   r)   r7   Z  r  zRangeCriterion.is_aggregater%   )r4   r5   r6   r8   r   r	   rU   r=   r   r!   r*   r   rW   r7   r   r&   r&   r   r)   r  M  s
    (r  c                   @   s@   e Zd Zeded ded dd fddZdedefdd	Zd
S )r   rY   r    rZ   r$   c                 C   r  r  r  r\   r&   r&   r)   r]   `  r  zBetweenCriterion.replace_tabler   c                 K   N   dj | jjdi || jjdi || jjdi |d}t|| jfi |S )Nz {term} BETWEEN {start} AND {end}r   r   r   r&   r   r   r   r   r   r   r9   r~  r&   r&   r)   r   n  s   zBetweenCriterion.get_sqlN)	r4   r5   r6   r   r	   r]   r   rU   r   r&   r&   r&   r)   r   _  s     r   c                   @   r  )r   r   r$   c                 K   r  )Nz{term} FROM {start} TO {end}r  r&   r  r~  r&   r&   r)   r   y  s   zPeriodCriterion.get_sqlNr  r&   r&   r&   r)   r   x  r  r   c                	       sz   e Zd Zddededee ddf fddZdee	 fdd	Z
ed
ed ded dd fddZdedefddZ  ZS )rm   Nr   rl   r9   r$   c                    s   t  | || _|| _d S r%   )r   r=   r   rl   )r(   r   rl   r9   r   r&   r)   r=     s   
zBitwiseAndCriterion.__init__c                 c   r  r%   )r   r*   rl   r'   r&   r&   r)   r*     r  zBitwiseAndCriterion.nodes_rY   r    rZ   c                 C   r  r  r  r\   r&   r&   r)   r]     r  z!BitwiseAndCriterion.replace_tabler   c                 K   s2   dj | jjdi || jd}t|| jfi |S )Nz({term} & {value}))r   rl   r&   )r   r   r   rl   r   r9   r~  r&   r&   r)   r     s
   zBitwiseAndCriterion.get_sqlr%   )r4   r5   r6   r8   r   r	   rU   r=   r   r!   r*   r   r]   r   r   r&   r&   r   r)   rm     s    $ rm   c                       s|   e Zd Zddedee ddf fddZdee fddZ	e
d	ed
 ded
 dd fddZddededefddZ  ZS )rc   Nr   r9   r$   c                    r  r%   r   r(   r   r9   r   r&   r)   r=     r	  zNullCriterion.__init__c                 c       | V  | j  E d H  d S r%   r   r*   r'   r&   r&   r)   r*        zNullCriterion.nodes_rY   r    rZ   c                 C   r  r  r  r\   r&   r&   r)   r]     r  zNullCriterion.replace_tableFr   r   c                 K   .   dj | jjdi |d}t|| jfi |S )Nz{term} IS NULLr  r&   r   r   r   r   r9   r  r&   r&   r)   r        zNullCriterion.get_sqlr%   r  )r4   r5   r6   r8   r	   rU   r=   r   r!   r*   r   r]   rW   r   r   r   r&   r&   r   r)   rc     s       rc   c                   @   s$   e Zd ZddededefddZdS )	rj   Fr   r   r$   c                 K   r  )Nz{term} IS NOT NULLr  r&   r  r  r&   r&   r)   r     r  zNotNullCriterion.get_sqlNr  )r4   r5   r6   rW   r   rU   r   r&   r&   r&   r)   rj     s    rj   c                   @   s6   e Zd ZddededefddZdedefdd	Zd
S )rP  Fsubcriterionr   r$   c              	   K   s\   dj | jj| jjdd| | ji|| jjdd| | ji|d}|r,dj |dS |S )Nz{left} {comparator} {right}r  r  z({criterion}))	criterionr&   )r   r  rl   r  r   needs_bracketsr  )r(   r  r   r  r&   r&   r)   r     s   zComplexCriterion.get_sqlr   c                 C   s   t |to|j| jk S r%   )r,   rP  r  r  r&   r&   r)   r    r   zComplexCriterion.needs_bracketsNr  )	r4   r5   r6   rW   r   rU   r   r8   r  r&   r&   r&   r)   rP    s    rP  c                       s   e Zd ZdZejejgZddededede	e
 ddf
 fdd	Zdee fd
dZede	e fddZede	d de	d dd fddZdefddZdefddZddedede
fddZ  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  r9   r$   c                    r  )a  
        Wrapper for an arithmetic expression.

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

        :param left:
            The term on the left side of the expression.
        :param right:
            The term on the right side of the expression.
        :param alias:
            (Optional) an alias for the term which can be used inside a select statement.
        :return:
        N)r   r=   r  r  r  )r(   r  r  r  r9   r   r&   r)   r=     s   
zArithmeticExpression.__init__c                 c   r  r%   )r  r*   r  r'   r&   r&   r)   r*     r  zArithmeticExpression.nodes_c                 C   s   t | jj| jjgS r%   )r   r  r7   r  r'   r&   r&   r)   r7     s   z!ArithmeticExpression.is_aggregaterY   r    rZ   c                 C   r  )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  r\   r&   r&   r)   r]     r  z"ArithmeticExpression.replace_tablec                 C   s$   |du r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_opr&   r&   r)   left_needs_parens  s
   	

z&ArithmeticExpression.left_needs_parensc                 C   s2   |du r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_opr&   r&   r)   right_needs_parens%  s   	


z'ArithmeticExpression.right_needs_parensFr   r   c              	   K   s   dd | j | jfD \}}dj| jj| | j|rdnd| j jdi || | j|r/dnd| jjdi |d}|rIt|| j	fi |S |S )Nc                 S   s   g | ]}t |d dqS )r  N)rk  )r-   sider&   r&   r)   r0   <  r  z0ArithmeticExpression.get_sql.<locals>.<listcomp>z{left}{operator}{right}rw  z{})r  r  r  r&   )
r  r  r   r  rl   r  r   r  r   r9   )r(   r   r   r  r  arithmetic_sqlr&   r&   r)   r   ;  s   
zArithmeticExpression.get_sqlr%   r  )r4   r5   r6   r   r   r   r   r  r   r	   rU   r=   r   r!   r*   r   rW   r7   r   r]   r  r  r   r   r&   r&   r   r)   r     s    (  r   c                       s   e Zd Zddee ddf fddZdee fddZe	dee
 fdd	Zed
ededd fddZeded ded dd fddZededd fddZdde
dedefddZ  ZS )CaseNr9   r$   c                    s   t  j|d g | _d | _d S rb  )r   r=   _cases_elser<   r   r&   r)   r=   O  s   
zCase.__init__c                 c   sV    | V  | j D ]\}}| E d H  | E d H  q| jd ur)| j E d H  d S d S r%   )r  r*   r  r(   r  r   r&   r&   r)   r*   T  s   
zCase.nodes_c                 C   s.   t dd | jD | jr| jjg S d g S )Nc                 S   s   g | ]
\}}|j p|j qS r&   r  r-   r  r   r&   r&   r)   r0   b  s    z%Case.is_aggregate.<locals>.<listcomp>)r   r  r  r7   r'   r&   r&   r)   r7   ^  s   zCase.is_aggregater  r   c                 C   s   | j || |f d S r%   )r  appendrP   r  r&   r&   r)   whenf  r  z	Case.whenrY   r    rZ   c                    s<    fdd| j D | _ | jr| j | _dS d| _dS )r  c                    s(   g | ]\}}|  |  gqS r&   r  r  r  r&   r)   r0   v  s    

z&Case.replace_table.<locals>.<listcomp>N)r  r  r]   r\   r&   r  r)   r]   j  s   $zCase.replace_tablec                 C   s   |  || _| S r%   )rP   r  r  r&   r&   r)   else_  s   z
Case.else_Fr   r   c                    st   | j stdd fdd| j D }| jr#d| jjd	i  nd}dj||d}|r8t|| jfi  S |S )
Nz:At least one 'when' case is required for a CASE statement. c                 3   s:    | ]\}}d j |jdi  |jdi  dV  qdS )zWHEN {when} THEN {then})r  thenNr&   )r   r   r  r{  r&   r)   r|    s
    $
zCase.get_sql.<locals>.<genexpr>z ELSE {}r  zCASE {cases}{else_} END)casesr  r&   )r  r   r$  r  r   r   r   r9   )r(   r   r   r  r  case_sqlr&   r{  r)   r     s   "zCase.get_sqlr%   r  )r4   r5   r6   r	   rU   r=   r   r!   r*   r   rW   r7   r   r   r  r]   r  r   r   r&   r&   r   r)   r  N  s    
  r  c                       s   e Zd Zddedee ddf fddZdee fddZ	d	edefd
dZ
ededefddZeded ded dd fddZ  ZS )rf   Nr   r9   r$   c                       t  j|d || _d S rb  r   r  r   r&   r)   r=        
zNot.__init__c                 c   r  r%   r  r'   r&   r&   r)   r*     r  z
Not.nodes_r   c                 K   s6   d|d< dj | jjdi |d}t|| jfi |S )NTr  z
NOT {term}r  r&   r  r~  r&   r&   r)   r     s   zNot.get_sqlra  c                    s*   t | j| t s S  fd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                    s.    | g|R i |}t |tfrt|S |S r%   )r,   r8   rf   )
inner_selfargsr   result	item_funcr&   r)   inner  s   zNot.__getattr__.<locals>.inner)rk  r   inspectismethod)r(   ra  r  r&   r  r)   __getattr__  s
   
zNot.__getattr__rY   r    rZ   c                 C   r  r  r  r\   r&   r&   r)   r]     r  zNot.replace_tabler%   )r4   r5   r6   r   r	   rU   r=   r   r!   r*   r   r   r  r   r]   r   r&   r&   r   r)   rf     s     (rf   c                       sT   e Zd Zddedee ddf fddZdee fddZ	d	edefd
dZ
  ZS )r   Nr   r9   r$   c                    r  rb  r   r  r   r&   r)   r=     r  zAll.__init__c                 c   r  r%   r  r'   r&   r&   r)   r*     r  z
All.nodes_r   c                 K   s.   dj | jjdi |d}t|| jfi |S )Nz
{term} ALLr  r&   r  r~  r&   r&   r)   r     s   zAll.get_sqlr%   )r4   r5   r6   r   r	   rU   r=   r   r!   r*   r   r   r&   r&   r   r)   r     s     r   c                   @   sN   e Zd Zddedee ddfddZdededd	fd
dZdd Z	dd Z
dS )CustomFunctionNra  paramsr$   c                 C   s   || _ || _d S r%   )ra  r  )r(   ra  r  r&   r&   r)   r=     s   
zCustomFunction.__init__r  r   Functionc                 O   s|   |   st| j|ddS | j| s/tdj| jddd | jD ddd |D dt| jg|R d|diS )	Nr9   r;   zCFunction {name} require these arguments ({params}), ({args}) passedz, c                 s       | ]}t |V  qd S r%   rU   r-   pr&   r&   r)   r|        z*CustomFunction.__call__.<locals>.<genexpr>c                 s   r  r%   r  r  r&   r&   r)   r|    r  )ra  r  r  )	_has_paramsr  ra  r  _is_valid_function_callr   r   r$  r  )r(   r  r   r&   r&   r)   __call__  s   
zCustomFunction.__call__c                 C   s
   | j d uS r%   )r  r'   r&   r&   r)   r    r>   zCustomFunction._has_paramsc                 G   s   t |t | jkS r%   )r  r  )r(   r  r&   r&   r)   r    r   z&CustomFunction._is_valid_function_callr%   )r4   r5   r6   rU   r	   r
   r=   r   r  r  r  r&   r&   r&   r)   r    s
    r  c                       s   e Zd Zdedededdf fddZdee fdd	Ze	de
e fd
dZede
d de
d dd fddZdedefddZedd ZdedefddZdedefddZ  ZS )r  ra  r  r   r$   Nc                    s<   t  |d | _ fdd|D  _|d _d S )Nr9   c                    r   r&   r   r-   paramr'   r&   r)   r0     r   z%Function.__init__.<locals>.<listcomp>schema)r   r=   r  ra  r  r  r(   ra  r  r   r   r'   r)   r=     s   zFunction.__init__c                 c   ru  r%   )r  r*   r   r&   r&   r)   r*     rv  zFunction.nodes_c                 C   r  )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                 S   r  r&   r  )r-   r   r&   r&   r)   r0     r  z)Function.is_aggregate.<locals>.<listcomp>)r   r  r'   r&   r&   r)   r7     s   zFunction.is_aggregaterY   r    rZ   c                    r  )r  c                    r  r&   r  r  r  r&   r)   r0     r  z*Function.replace_table.<locals>.<listcomp>Nr  r\   r&   r  r)   r]     r  zFunction.replace_tablec                 K   r   r%   r&   r   r&   r&   r)   get_special_params_sql  r   zFunction.get_special_params_sqlc                 K   s&   t | dr| jdddi|S t| S )Nr   r   Fr&   hasattrr   rU   )r   r   r&   r&   r)   get_arg_sql  s   &zFunction.get_arg_sqlc                    sJ   j di  }djjd fddjD |r!d| dS ddS )	Nz{name}({args}{special})r!  c                 3   sB    | ]}t |d r|jdddd nj|fi  V  qdS )r   FT)r   r  Nr&   )r  r   r  r  r  r&   r)   r|    s    
z,Function.get_function_sql.<locals>.<genexpr>r  r  )ra  r  specialr&   )r  r   ra  r$  r  )r(   r   special_params_sqlr&   r  r)   get_function_sql  s   
zFunction.get_function_sqlc                 K   s   | dd}| dd}| dd }| dd }| j|||d}| jd ur6dj| jjd
||d||d	}|rDt|| jfd|i|S |S )Nr   Fr   r   r  )r   r   r  z{schema}.{function})r   r  )r  functionr&   )ri  r  r  r   r   r   r9   )r(   r   r   r   r   r  function_sqlr&   r&   r)   r   (  s   
zFunction.get_sql)r4   r5   r6   rU   r   r=   r   r!   r*   r   r	   rW   r7   r   r]   r  r   r  r  r   r   r&   r&   r   r)   r    s    	 
r  c                       sZ   e Zd ZdZ fddZededdfddZd	edefd
dZ	d	ef fddZ
  ZS )AggregateFunctionTc                    s.   t t| j|g|R i | g | _d| _d S r  )r   r  r=   _filters_include_filterr  r   r&   r)   r=   @  s   
zAggregateFunction.__init__filtersr$   AnalyticFunctionc                 G      d| _ |  j|7  _d S r  )r  r  )r(   r   r&   r&   r)   filterF     zAggregateFunction.filterr   c                 K   s*   | j rdjt| jjdi |dS d S )NzWHERE {criterions})
criterionsr&   )r  r   rO  r_  r  r   r   r&   r&   r)   get_filter_sqlK  s    z AggregateFunction.get_filter_sqlc                    s@   t t| jdi |}| jdi |}| jr|dj|d7 }|S )Nz FILTER({filter_sql}))
filter_sqlr&   )r   r  r  r  r  r   )r(   r   r  r  r   r&   r)   r  O  s
   z"AggregateFunction.get_function_sql)r4   r5   r6   r7   r=   r   r   r  rU   r  r  r   r&   r&   r   r)   r  =  s    r  c                       s   e Zd ZdZdZdedededdf fdd	Zed
edd fddZ	ed
ededd fddZ
dedee dedefddZdedefddZdedef fddZ  ZS )r  FTra  r  r   r$   Nc                    s<   t  j|g|R i | g | _g | _g | _d| _d| _d S r  )r   r=   r  
_partition	_orderbysr  _include_overr  r   r&   r)   r=   ]  s   
zAnalyticFunction.__init__rX  c                 G   r  r  )r
  r  r(   rX  r&   r&   r)   overe  r  zAnalyticFunction.overc                    s&   d| _ |  j fdd|D 7  _d S )NTc                    s   g | ]	}|  d fqS )order)r  rz  r{  r&   r)   r0   m  r1   z,AnalyticFunction.orderby.<locals>.<listcomp>)r
  r	  )r(   rX  r   r&   r{  r)   orderbyj  s    zAnalyticFunction.orderbyrC  orientc                 K   s4   |d u r|j di |S dj|j di ||jdS )Nz{field} {orient})rC  r  r&   )r   r   rl   )r(   rC  r  r   r&   r&   r)   _orderby_fieldo  s   zAnalyticFunction._orderby_fieldc                    sl   g }j r|djd fddj D d jr1|djd fddjD d d	|S )
NzPARTITION BY {args}r!  c                 3   s2    | ]}t |d r|jdi  nt|V  qdS )r   Nr&   r  r  r{  r&   r)   r|  }  s   0 z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>r  zORDER BY {orderby}c                 3   s(    | ]\}}j ||fi  V  qd S r%   )r  )r-   rC  r  r  r&   r)   r|    s   & )r  r  )r  r  r   r$  r	  )r(   r   rX  r&   r  r)   get_partition_sqlx  s   
z"AnalyticFunction.get_partition_sqlc                    sD   t t| jdi |}| jdi |}|}| jr |dj|d7 }|S )Nz OVER({partition_sql}))partition_sqlr&   )r   r  r  r  r
  r   )r(   r   r  r  r  r   r&   r)   r    s   z!AnalyticFunction.get_function_sql)r4   r5   r6   r7   is_analyticrU   r   r=   r   r  r  rD   r	   r   r  r  r  r   r&   r&   r   r)   r  Y  s    	r  EdgeT WindowFrameAnalyticFunction.Edgec                       s   e Zd ZG dd dZdedededdf fdd	Zd
ededee ddfddZ	e
ddeeef dee dd fddZe
ddeeef dee dd fddZdefddZdedef fddZ  ZS )WindowFrameAnalyticFunctionc                   @   s:   e Zd Zddeeeef  ddfddZdefddZdS )	r  Nrl   r$   c                 C   r:   r%   rD  rn   r&   r&   r)   r=     r>   z)WindowFrameAnalyticFunction.Edge.__init__c                 C   s   dj | jpd| jdS )Nz{value} {modifier}	UNBOUNDED)rl   modifier)r   rl   r  r'   r&   r&   r)   r     s   z(WindowFrameAnalyticFunction.Edge.__str__r%   )	r4   r5   r6   r	   r   rU   rV   r=   r   r&   r&   r&   r)   Edge  s     r  ra  r  r   r$   Nc                    s*   t  j|g|R i | d | _d | _d S r%   )r   r=   framer#   r  r   r&   r)   r=     s   
z$WindowFrameAnalyticFunction.__init__r  r#   	and_boundc                 C   s4   | j s| jr	t || _ |r||f| _d S || _d S r%   )r  r#   AttributeError)r(   r  r#   r  r&   r&   r)   _set_frame_and_bounds  s   z1WindowFrameAnalyticFunction._set_frame_and_boundsc                 C      |  d|| d S )NROWSr  r(   r#   r  r&   r&   r)   rows     z WindowFrameAnalyticFunction.rowsc                 C   r  )NRANGEr   r!  r&   r&   r)   range  r#  z!WindowFrameAnalyticFunction.rangec                 C   s:   t | jtsdj| j| jdS | j\}}dj| j||dS )Nz{frame} {bound})r  r#   z#{frame} BETWEEN {lower} AND {upper})r  r   r   )r,   r#   rN   r   r  r   r&   r&   r)   get_frame_sql  s   
z)WindowFrameAnalyticFunction.get_frame_sqlc                    s8   t t| jdi |}| js| js|S dj||  dS )Nz{over} {frame})r  r  r&   )r   r  r  r  r#   r   r&  )r(   r   r  r   r&   r)   r    s   z-WindowFrameAnalyticFunction.get_partition_sqlr%   )r4   r5   r6   r  rU   r   r=   r	   r  r  r   r   r"  r%  r&  r  r   r&   r&   r   r)   r    s    
&&r  c                       sR   e Zd Zdedededdf fddZeddd	Zdedee fd
dZ	  Z
S )IgnoreNullsAnalyticFunctionra  r  r   r$   Nc                    s$   t  j|g|R i | d| _d S r  )r   r=   _ignore_nullsr  r   r&   r)   r=     s   
z$IgnoreNullsAnalyticFunction.__init__c                 C   r  r  r(  r'   r&   r&   r)   ignore_nulls  r@   z(IgnoreNullsAnalyticFunction.ignore_nullsc                 K   s   | j rdS d S )NzIGNORE NULLSr)  r   r&   r&   r)   r    s   z2IgnoreNullsAnalyticFunction.get_special_params_sql)r$   r'  )r4   r5   r6   rU   r   r=   r   r*  r	   r  r   r&   r&   r   r)   r'    s
    r'  c                   @   s   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dZ										dded	ed
edededededededee fddZdefddZdedefddZdS )rQ   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-  r.  r/  r0  r1  r2  r3  quartersweeksr  c              
   C   s   |
| _ d | _d | _d| _|r|| _d S |	r|	| _d S t| j| j|||||||gD ]#\}}}|rLt	|}t
| |t| | jd u rI|| _|dk | _|| _q)d S )NFr   )r  largestsmallestis_negativer;  r<  zipunitslabelsrV   setattrabs)r(   r-  r.  r/  r0  r1  r2  r3  r;  r<  r  unitlabelrl   	int_valuer&   r&   r)   r=     s0   

zInterval.__init__r$   c                 C   s   |   S r%   r   r'   r&   r&   r)   r     rb   zInterval.__str__r   c                 K   s  | j p|d}| jdkrt| d}d}nht| dr"t| d}d}n[t| dr/t| d}d}nNdjt| d	d
t| dd
t| dd
t| dd
t| dd
t| dd
t| dd
d}| jd|}| jred| }| j| j	krtdj| j| j	dn| j}|d u r}d}| j
|dj||dS )Nr  r:  r3  r;  QUARTERr<  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}r-  r   r.  r/  r0  r1  r2  r,  r  -z{largest}_{smallest})r=  r>  r6  r+  )rv   rE  )r  r  r=  rk  r  r   trim_patternr   r?  r>  	templates)r(   r   r  rv   rE  r&   r&   r)   r     s@   












	
zInterval.get_sql)
r   r   r   r   r   r   r   r   r   N)r4   r5   r6   r   r  r  VERTICAORACLEMYSQLrL  rA  rB  recompilerK  rV   r	   r=   rU   r   r   r   r&   r&   r&   r)   rQ     sV    

	

'rQ   c                	       4   e Zd Zddededee ddf fddZ  ZS )	r   Nr   exponentr9   r$   c                       t  jd|||d d S )NPOWr;   rJ  )r(   r   rS  r9   r   r&   r)   r=   E  r   zPow.__init__r%   	r4   r5   r6   r8   floatr	   rU   r=   r   r&   r&   r   r)   r   D      ,r   c                	       rR  )	r   Nr   modulusr9   r$   c                    rT  )NMODr;   rJ  )r(   r   rY  r9   r   r&   r)   r=   J  r   zMod.__init__r%   rV  r&   r&   r   r)   r   I  rX  r   c                       r  )RolluprX  r$   Nc                    s   t  jdg|R   d S )NROLLUPrJ  r  r   r&   r)   r=   O  r   zRollup.__init__r  r&   r&   r   r)   r[  N  r  r[  c                       s<   e Zd ZdZdeddf fddZdedefdd	Z  ZS )
PseudoColumnz
    Represents a pseudo column (a "column" which yields a value when selected
    but is not actually a real table column).
    ra  r$   Nc                    s   t  jd d || _d S rb  rp  )r(   ra  r   r&   r)   r=   Y  r  zPseudoColumn.__init__r   c                 K   s   | j S r%   )ra  r   r&   r&   r)   r   ]  r   zPseudoColumn.get_sql)	r4   r5   r6   r   rU   r=   r   r   r   r&   r&   r   r)   r]  S  s    r]  c                       s.   e Zd ZdZdZd fdd	Zdd Z  ZS )	
AtTimezonez|
    Generates AT TIME ZONE SQL.
    Examples:
        AT TIME ZONE 'US/Eastern'
        AT TIME ZONE INTERVAL '-06:00'
    NFc                    s4   t  | t|tst|n|| _|| _|| _d S r%   )r   r=   r,   rD   rC  zoneinterval)r(   rC  r_  r`  r9   r   r&   r)   r=   k  s   
zAtTimezone.__init__c                 K   s>   dj | jjdi || jrdnd| jd}t|| jfi |S )Nz&{name} AT TIME ZONE {interval}'{zone}'z	INTERVAL r  )ra  r`  r_  r&   )r   rC  r   r`  r_  r   r9   r~  r&   r&   r)   r   q  s   zAtTimezone.get_sql)FN)r4   r5   r6   r   r7   r=   r   r   r&   r&   r   r)   r^  a  s
    r^  )^r  rP  r  datetimer   enumr   typingr   r   r   r   r   r	   r
   r   r   r   r   pypika.enumsr   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r   r   pypika.queriesr   r   r    
__author__	__email__r!   r"   r8   r   r   r   r   r   r   r   rK   rR   rB  rH   rL   rM  rO  rY  rD   ro  rq  rJ   rI   r  r  r_   r   r  r  r   r   rm   rc   rj   rP  r   r  rf   r   r  r  r  r  r  r  r'  rQ   r   r   r[  r]  r^  r&   r&   r&   r)   <module>   s    4($

 |

%B		 0	!:75
!tH0N<3h